GNU Linux-libre 6.8.7-gnu
[releases.git] / net / devlink / port.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
4  * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
5  */
6
7 #include "devl_internal.h"
8
9 #define DEVLINK_PORT_FN_CAPS_VALID_MASK \
10         (_BITUL(__DEVLINK_PORT_FN_ATTR_CAPS_MAX) - 1)
11
12 static const struct nla_policy devlink_function_nl_policy[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1] = {
13         [DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] = { .type = NLA_BINARY },
14         [DEVLINK_PORT_FN_ATTR_STATE] =
15                 NLA_POLICY_RANGE(NLA_U8, DEVLINK_PORT_FN_STATE_INACTIVE,
16                                  DEVLINK_PORT_FN_STATE_ACTIVE),
17         [DEVLINK_PORT_FN_ATTR_CAPS] =
18                 NLA_POLICY_BITFIELD32(DEVLINK_PORT_FN_CAPS_VALID_MASK),
19 };
20
21 #define ASSERT_DEVLINK_PORT_REGISTERED(devlink_port)                            \
22         WARN_ON_ONCE(!(devlink_port)->registered)
23 #define ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port)                        \
24         WARN_ON_ONCE((devlink_port)->registered)
25
26 struct devlink_port *devlink_port_get_by_index(struct devlink *devlink,
27                                                unsigned int port_index)
28 {
29         return xa_load(&devlink->ports, port_index);
30 }
31
32 struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink,
33                                                  struct nlattr **attrs)
34 {
35         if (attrs[DEVLINK_ATTR_PORT_INDEX]) {
36                 u32 port_index = nla_get_u32(attrs[DEVLINK_ATTR_PORT_INDEX]);
37                 struct devlink_port *devlink_port;
38
39                 devlink_port = devlink_port_get_by_index(devlink, port_index);
40                 if (!devlink_port)
41                         return ERR_PTR(-ENODEV);
42                 return devlink_port;
43         }
44         return ERR_PTR(-EINVAL);
45 }
46
47 struct devlink_port *devlink_port_get_from_info(struct devlink *devlink,
48                                                 struct genl_info *info)
49 {
50         return devlink_port_get_from_attrs(devlink, info->attrs);
51 }
52
53 static void devlink_port_fn_cap_fill(struct nla_bitfield32 *caps,
54                                      u32 cap, bool is_enable)
55 {
56         caps->selector |= cap;
57         if (is_enable)
58                 caps->value |= cap;
59 }
60
61 static int devlink_port_fn_roce_fill(struct devlink_port *devlink_port,
62                                      struct nla_bitfield32 *caps,
63                                      struct netlink_ext_ack *extack)
64 {
65         bool is_enable;
66         int err;
67
68         if (!devlink_port->ops->port_fn_roce_get)
69                 return 0;
70
71         err = devlink_port->ops->port_fn_roce_get(devlink_port, &is_enable,
72                                                   extack);
73         if (err) {
74                 if (err == -EOPNOTSUPP)
75                         return 0;
76                 return err;
77         }
78
79         devlink_port_fn_cap_fill(caps, DEVLINK_PORT_FN_CAP_ROCE, is_enable);
80         return 0;
81 }
82
83 static int devlink_port_fn_migratable_fill(struct devlink_port *devlink_port,
84                                            struct nla_bitfield32 *caps,
85                                            struct netlink_ext_ack *extack)
86 {
87         bool is_enable;
88         int err;
89
90         if (!devlink_port->ops->port_fn_migratable_get ||
91             devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF)
92                 return 0;
93
94         err = devlink_port->ops->port_fn_migratable_get(devlink_port,
95                                                         &is_enable, extack);
96         if (err) {
97                 if (err == -EOPNOTSUPP)
98                         return 0;
99                 return err;
100         }
101
102         devlink_port_fn_cap_fill(caps, DEVLINK_PORT_FN_CAP_MIGRATABLE, is_enable);
103         return 0;
104 }
105
106 static int devlink_port_fn_ipsec_crypto_fill(struct devlink_port *devlink_port,
107                                              struct nla_bitfield32 *caps,
108                                              struct netlink_ext_ack *extack)
109 {
110         bool is_enable;
111         int err;
112
113         if (!devlink_port->ops->port_fn_ipsec_crypto_get ||
114             devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF)
115                 return 0;
116
117         err = devlink_port->ops->port_fn_ipsec_crypto_get(devlink_port, &is_enable, extack);
118         if (err) {
119                 if (err == -EOPNOTSUPP)
120                         return 0;
121                 return err;
122         }
123
124         devlink_port_fn_cap_fill(caps, DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO, is_enable);
125         return 0;
126 }
127
128 static int devlink_port_fn_ipsec_packet_fill(struct devlink_port *devlink_port,
129                                              struct nla_bitfield32 *caps,
130                                              struct netlink_ext_ack *extack)
131 {
132         bool is_enable;
133         int err;
134
135         if (!devlink_port->ops->port_fn_ipsec_packet_get ||
136             devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF)
137                 return 0;
138
139         err = devlink_port->ops->port_fn_ipsec_packet_get(devlink_port, &is_enable, extack);
140         if (err) {
141                 if (err == -EOPNOTSUPP)
142                         return 0;
143                 return err;
144         }
145
146         devlink_port_fn_cap_fill(caps, DEVLINK_PORT_FN_CAP_IPSEC_PACKET, is_enable);
147         return 0;
148 }
149
150 static int devlink_port_fn_caps_fill(struct devlink_port *devlink_port,
151                                      struct sk_buff *msg,
152                                      struct netlink_ext_ack *extack,
153                                      bool *msg_updated)
154 {
155         struct nla_bitfield32 caps = {};
156         int err;
157
158         err = devlink_port_fn_roce_fill(devlink_port, &caps, extack);
159         if (err)
160                 return err;
161
162         err = devlink_port_fn_migratable_fill(devlink_port, &caps, extack);
163         if (err)
164                 return err;
165
166         err = devlink_port_fn_ipsec_crypto_fill(devlink_port, &caps, extack);
167         if (err)
168                 return err;
169
170         err = devlink_port_fn_ipsec_packet_fill(devlink_port, &caps, extack);
171         if (err)
172                 return err;
173
174         if (!caps.selector)
175                 return 0;
176         err = nla_put_bitfield32(msg, DEVLINK_PORT_FN_ATTR_CAPS, caps.value,
177                                  caps.selector);
178         if (err)
179                 return err;
180
181         *msg_updated = true;
182         return 0;
183 }
184
185 int devlink_nl_port_handle_fill(struct sk_buff *msg, struct devlink_port *devlink_port)
186 {
187         if (devlink_nl_put_handle(msg, devlink_port->devlink))
188                 return -EMSGSIZE;
189         if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index))
190                 return -EMSGSIZE;
191         return 0;
192 }
193
194 size_t devlink_nl_port_handle_size(struct devlink_port *devlink_port)
195 {
196         struct devlink *devlink = devlink_port->devlink;
197
198         return nla_total_size(strlen(devlink->dev->bus->name) + 1) /* DEVLINK_ATTR_BUS_NAME */
199              + nla_total_size(strlen(dev_name(devlink->dev)) + 1) /* DEVLINK_ATTR_DEV_NAME */
200              + nla_total_size(4); /* DEVLINK_ATTR_PORT_INDEX */
201 }
202
203 static int devlink_nl_port_attrs_put(struct sk_buff *msg,
204                                      struct devlink_port *devlink_port)
205 {
206         struct devlink_port_attrs *attrs = &devlink_port->attrs;
207
208         if (!devlink_port->attrs_set)
209                 return 0;
210         if (attrs->lanes) {
211                 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_LANES, attrs->lanes))
212                         return -EMSGSIZE;
213         }
214         if (nla_put_u8(msg, DEVLINK_ATTR_PORT_SPLITTABLE, attrs->splittable))
215                 return -EMSGSIZE;
216         if (nla_put_u16(msg, DEVLINK_ATTR_PORT_FLAVOUR, attrs->flavour))
217                 return -EMSGSIZE;
218         switch (devlink_port->attrs.flavour) {
219         case DEVLINK_PORT_FLAVOUR_PCI_PF:
220                 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,
221                                 attrs->pci_pf.controller) ||
222                     nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, attrs->pci_pf.pf))
223                         return -EMSGSIZE;
224                 if (nla_put_u8(msg, DEVLINK_ATTR_PORT_EXTERNAL, attrs->pci_pf.external))
225                         return -EMSGSIZE;
226                 break;
227         case DEVLINK_PORT_FLAVOUR_PCI_VF:
228                 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,
229                                 attrs->pci_vf.controller) ||
230                     nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, attrs->pci_vf.pf) ||
231                     nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_VF_NUMBER, attrs->pci_vf.vf))
232                         return -EMSGSIZE;
233                 if (nla_put_u8(msg, DEVLINK_ATTR_PORT_EXTERNAL, attrs->pci_vf.external))
234                         return -EMSGSIZE;
235                 break;
236         case DEVLINK_PORT_FLAVOUR_PCI_SF:
237                 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,
238                                 attrs->pci_sf.controller) ||
239                     nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER,
240                                 attrs->pci_sf.pf) ||
241                     nla_put_u32(msg, DEVLINK_ATTR_PORT_PCI_SF_NUMBER,
242                                 attrs->pci_sf.sf))
243                         return -EMSGSIZE;
244                 break;
245         case DEVLINK_PORT_FLAVOUR_PHYSICAL:
246         case DEVLINK_PORT_FLAVOUR_CPU:
247         case DEVLINK_PORT_FLAVOUR_DSA:
248                 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER,
249                                 attrs->phys.port_number))
250                         return -EMSGSIZE;
251                 if (!attrs->split)
252                         return 0;
253                 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP,
254                                 attrs->phys.port_number))
255                         return -EMSGSIZE;
256                 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER,
257                                 attrs->phys.split_subport_number))
258                         return -EMSGSIZE;
259                 break;
260         default:
261                 break;
262         }
263         return 0;
264 }
265
266 static int devlink_port_fn_hw_addr_fill(struct devlink_port *port,
267                                         struct sk_buff *msg,
268                                         struct netlink_ext_ack *extack,
269                                         bool *msg_updated)
270 {
271         u8 hw_addr[MAX_ADDR_LEN];
272         int hw_addr_len;
273         int err;
274
275         if (!port->ops->port_fn_hw_addr_get)
276                 return 0;
277
278         err = port->ops->port_fn_hw_addr_get(port, hw_addr, &hw_addr_len,
279                                              extack);
280         if (err) {
281                 if (err == -EOPNOTSUPP)
282                         return 0;
283                 return err;
284         }
285         err = nla_put(msg, DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR, hw_addr_len, hw_addr);
286         if (err)
287                 return err;
288         *msg_updated = true;
289         return 0;
290 }
291
292 static bool
293 devlink_port_fn_state_valid(enum devlink_port_fn_state state)
294 {
295         return state == DEVLINK_PORT_FN_STATE_INACTIVE ||
296                state == DEVLINK_PORT_FN_STATE_ACTIVE;
297 }
298
299 static bool
300 devlink_port_fn_opstate_valid(enum devlink_port_fn_opstate opstate)
301 {
302         return opstate == DEVLINK_PORT_FN_OPSTATE_DETACHED ||
303                opstate == DEVLINK_PORT_FN_OPSTATE_ATTACHED;
304 }
305
306 static int devlink_port_fn_state_fill(struct devlink_port *port,
307                                       struct sk_buff *msg,
308                                       struct netlink_ext_ack *extack,
309                                       bool *msg_updated)
310 {
311         enum devlink_port_fn_opstate opstate;
312         enum devlink_port_fn_state state;
313         int err;
314
315         if (!port->ops->port_fn_state_get)
316                 return 0;
317
318         err = port->ops->port_fn_state_get(port, &state, &opstate, extack);
319         if (err) {
320                 if (err == -EOPNOTSUPP)
321                         return 0;
322                 return err;
323         }
324         if (!devlink_port_fn_state_valid(state)) {
325                 WARN_ON_ONCE(1);
326                 NL_SET_ERR_MSG(extack, "Invalid state read from driver");
327                 return -EINVAL;
328         }
329         if (!devlink_port_fn_opstate_valid(opstate)) {
330                 WARN_ON_ONCE(1);
331                 NL_SET_ERR_MSG(extack, "Invalid operational state read from driver");
332                 return -EINVAL;
333         }
334         if (nla_put_u8(msg, DEVLINK_PORT_FN_ATTR_STATE, state) ||
335             nla_put_u8(msg, DEVLINK_PORT_FN_ATTR_OPSTATE, opstate))
336                 return -EMSGSIZE;
337         *msg_updated = true;
338         return 0;
339 }
340
341 static int
342 devlink_port_fn_mig_set(struct devlink_port *devlink_port, bool enable,
343                         struct netlink_ext_ack *extack)
344 {
345         return devlink_port->ops->port_fn_migratable_set(devlink_port, enable,
346                                                          extack);
347 }
348
349 static int
350 devlink_port_fn_roce_set(struct devlink_port *devlink_port, bool enable,
351                          struct netlink_ext_ack *extack)
352 {
353         return devlink_port->ops->port_fn_roce_set(devlink_port, enable,
354                                                    extack);
355 }
356
357 static int
358 devlink_port_fn_ipsec_crypto_set(struct devlink_port *devlink_port, bool enable,
359                                  struct netlink_ext_ack *extack)
360 {
361         return devlink_port->ops->port_fn_ipsec_crypto_set(devlink_port, enable, extack);
362 }
363
364 static int
365 devlink_port_fn_ipsec_packet_set(struct devlink_port *devlink_port, bool enable,
366                                  struct netlink_ext_ack *extack)
367 {
368         return devlink_port->ops->port_fn_ipsec_packet_set(devlink_port, enable, extack);
369 }
370
371 static int devlink_port_fn_caps_set(struct devlink_port *devlink_port,
372                                     const struct nlattr *attr,
373                                     struct netlink_ext_ack *extack)
374 {
375         struct nla_bitfield32 caps;
376         u32 caps_value;
377         int err;
378
379         caps = nla_get_bitfield32(attr);
380         caps_value = caps.value & caps.selector;
381         if (caps.selector & DEVLINK_PORT_FN_CAP_ROCE) {
382                 err = devlink_port_fn_roce_set(devlink_port,
383                                                caps_value & DEVLINK_PORT_FN_CAP_ROCE,
384                                                extack);
385                 if (err)
386                         return err;
387         }
388         if (caps.selector & DEVLINK_PORT_FN_CAP_MIGRATABLE) {
389                 err = devlink_port_fn_mig_set(devlink_port, caps_value &
390                                               DEVLINK_PORT_FN_CAP_MIGRATABLE,
391                                               extack);
392                 if (err)
393                         return err;
394         }
395         if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO) {
396                 err = devlink_port_fn_ipsec_crypto_set(devlink_port, caps_value &
397                                                        DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO,
398                                                        extack);
399                 if (err)
400                         return err;
401         }
402         if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_PACKET) {
403                 err = devlink_port_fn_ipsec_packet_set(devlink_port, caps_value &
404                                                        DEVLINK_PORT_FN_CAP_IPSEC_PACKET,
405                                                        extack);
406                 if (err)
407                         return err;
408         }
409         return 0;
410 }
411
412 static int
413 devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *port,
414                                    struct netlink_ext_ack *extack)
415 {
416         struct nlattr *function_attr;
417         bool msg_updated = false;
418         int err;
419
420         function_attr = nla_nest_start_noflag(msg, DEVLINK_ATTR_PORT_FUNCTION);
421         if (!function_attr)
422                 return -EMSGSIZE;
423
424         err = devlink_port_fn_hw_addr_fill(port, msg, extack, &msg_updated);
425         if (err)
426                 goto out;
427         err = devlink_port_fn_caps_fill(port, msg, extack, &msg_updated);
428         if (err)
429                 goto out;
430         err = devlink_port_fn_state_fill(port, msg, extack, &msg_updated);
431         if (err)
432                 goto out;
433         err = devlink_rel_devlink_handle_put(msg, port->devlink,
434                                              port->rel_index,
435                                              DEVLINK_PORT_FN_ATTR_DEVLINK,
436                                              &msg_updated);
437
438 out:
439         if (err || !msg_updated)
440                 nla_nest_cancel(msg, function_attr);
441         else
442                 nla_nest_end(msg, function_attr);
443         return err;
444 }
445
446 static int devlink_nl_port_fill(struct sk_buff *msg,
447                                 struct devlink_port *devlink_port,
448                                 enum devlink_command cmd, u32 portid, u32 seq,
449                                 int flags, struct netlink_ext_ack *extack)
450 {
451         struct devlink *devlink = devlink_port->devlink;
452         void *hdr;
453
454         hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
455         if (!hdr)
456                 return -EMSGSIZE;
457
458         if (devlink_nl_put_handle(msg, devlink))
459                 goto nla_put_failure;
460         if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index))
461                 goto nla_put_failure;
462
463         spin_lock_bh(&devlink_port->type_lock);
464         if (nla_put_u16(msg, DEVLINK_ATTR_PORT_TYPE, devlink_port->type))
465                 goto nla_put_failure_type_locked;
466         if (devlink_port->desired_type != DEVLINK_PORT_TYPE_NOTSET &&
467             nla_put_u16(msg, DEVLINK_ATTR_PORT_DESIRED_TYPE,
468                         devlink_port->desired_type))
469                 goto nla_put_failure_type_locked;
470         if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) {
471                 if (devlink_port->type_eth.netdev &&
472                     (nla_put_u32(msg, DEVLINK_ATTR_PORT_NETDEV_IFINDEX,
473                                  devlink_port->type_eth.ifindex) ||
474                      nla_put_string(msg, DEVLINK_ATTR_PORT_NETDEV_NAME,
475                                     devlink_port->type_eth.ifname)))
476                         goto nla_put_failure_type_locked;
477         }
478         if (devlink_port->type == DEVLINK_PORT_TYPE_IB) {
479                 struct ib_device *ibdev = devlink_port->type_ib.ibdev;
480
481                 if (ibdev &&
482                     nla_put_string(msg, DEVLINK_ATTR_PORT_IBDEV_NAME,
483                                    ibdev->name))
484                         goto nla_put_failure_type_locked;
485         }
486         spin_unlock_bh(&devlink_port->type_lock);
487         if (devlink_nl_port_attrs_put(msg, devlink_port))
488                 goto nla_put_failure;
489         if (devlink_nl_port_function_attrs_put(msg, devlink_port, extack))
490                 goto nla_put_failure;
491         if (devlink_port->linecard &&
492             nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX,
493                         devlink_linecard_index(devlink_port->linecard)))
494                 goto nla_put_failure;
495
496         genlmsg_end(msg, hdr);
497         return 0;
498
499 nla_put_failure_type_locked:
500         spin_unlock_bh(&devlink_port->type_lock);
501 nla_put_failure:
502         genlmsg_cancel(msg, hdr);
503         return -EMSGSIZE;
504 }
505
506 static void devlink_port_notify(struct devlink_port *devlink_port,
507                                 enum devlink_command cmd)
508 {
509         struct devlink *devlink = devlink_port->devlink;
510         struct devlink_obj_desc desc;
511         struct sk_buff *msg;
512         int err;
513
514         WARN_ON(cmd != DEVLINK_CMD_PORT_NEW && cmd != DEVLINK_CMD_PORT_DEL);
515
516         if (!__devl_is_registered(devlink) || !devlink_nl_notify_need(devlink))
517                 return;
518
519         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
520         if (!msg)
521                 return;
522
523         err = devlink_nl_port_fill(msg, devlink_port, cmd, 0, 0, 0, NULL);
524         if (err) {
525                 nlmsg_free(msg);
526                 return;
527         }
528
529         devlink_nl_obj_desc_init(&desc, devlink);
530         devlink_nl_obj_desc_port_set(&desc, devlink_port);
531         devlink_nl_notify_send_desc(devlink, msg, &desc);
532 }
533
534 static void devlink_ports_notify(struct devlink *devlink,
535                                  enum devlink_command cmd)
536 {
537         struct devlink_port *devlink_port;
538         unsigned long port_index;
539
540         xa_for_each(&devlink->ports, port_index, devlink_port)
541                 devlink_port_notify(devlink_port, cmd);
542 }
543
544 void devlink_ports_notify_register(struct devlink *devlink)
545 {
546         devlink_ports_notify(devlink, DEVLINK_CMD_PORT_NEW);
547 }
548
549 void devlink_ports_notify_unregister(struct devlink *devlink)
550 {
551         devlink_ports_notify(devlink, DEVLINK_CMD_PORT_DEL);
552 }
553
554 int devlink_nl_port_get_doit(struct sk_buff *skb, struct genl_info *info)
555 {
556         struct devlink_port *devlink_port = info->user_ptr[1];
557         struct sk_buff *msg;
558         int err;
559
560         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
561         if (!msg)
562                 return -ENOMEM;
563
564         err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_PORT_NEW,
565                                    info->snd_portid, info->snd_seq, 0,
566                                    info->extack);
567         if (err) {
568                 nlmsg_free(msg);
569                 return err;
570         }
571
572         return genlmsg_reply(msg, info);
573 }
574
575 static int
576 devlink_nl_port_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
577                              struct netlink_callback *cb, int flags)
578 {
579         struct devlink_nl_dump_state *state = devlink_dump_state(cb);
580         struct devlink_port *devlink_port;
581         unsigned long port_index;
582         int err = 0;
583
584         xa_for_each_start(&devlink->ports, port_index, devlink_port, state->idx) {
585                 err = devlink_nl_port_fill(msg, devlink_port,
586                                            DEVLINK_CMD_PORT_NEW,
587                                            NETLINK_CB(cb->skb).portid,
588                                            cb->nlh->nlmsg_seq, flags,
589                                            cb->extack);
590                 if (err) {
591                         state->idx = port_index;
592                         break;
593                 }
594         }
595
596         return err;
597 }
598
599 int devlink_nl_port_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
600 {
601         return devlink_nl_dumpit(skb, cb, devlink_nl_port_get_dump_one);
602 }
603
604 static int devlink_port_type_set(struct devlink_port *devlink_port,
605                                  enum devlink_port_type port_type)
606
607 {
608         int err;
609
610         if (!devlink_port->ops->port_type_set)
611                 return -EOPNOTSUPP;
612
613         if (port_type == devlink_port->type)
614                 return 0;
615
616         err = devlink_port->ops->port_type_set(devlink_port, port_type);
617         if (err)
618                 return err;
619
620         devlink_port->desired_type = port_type;
621         devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
622         return 0;
623 }
624
625 static int devlink_port_function_hw_addr_set(struct devlink_port *port,
626                                              const struct nlattr *attr,
627                                              struct netlink_ext_ack *extack)
628 {
629         const u8 *hw_addr;
630         int hw_addr_len;
631
632         hw_addr = nla_data(attr);
633         hw_addr_len = nla_len(attr);
634         if (hw_addr_len > MAX_ADDR_LEN) {
635                 NL_SET_ERR_MSG(extack, "Port function hardware address too long");
636                 return -EINVAL;
637         }
638         if (port->type == DEVLINK_PORT_TYPE_ETH) {
639                 if (hw_addr_len != ETH_ALEN) {
640                         NL_SET_ERR_MSG(extack, "Address must be 6 bytes for Ethernet device");
641                         return -EINVAL;
642                 }
643                 if (!is_unicast_ether_addr(hw_addr)) {
644                         NL_SET_ERR_MSG(extack, "Non-unicast hardware address unsupported");
645                         return -EINVAL;
646                 }
647         }
648
649         return port->ops->port_fn_hw_addr_set(port, hw_addr, hw_addr_len,
650                                               extack);
651 }
652
653 static int devlink_port_fn_state_set(struct devlink_port *port,
654                                      const struct nlattr *attr,
655                                      struct netlink_ext_ack *extack)
656 {
657         enum devlink_port_fn_state state;
658
659         state = nla_get_u8(attr);
660         return port->ops->port_fn_state_set(port, state, extack);
661 }
662
663 static int devlink_port_function_validate(struct devlink_port *devlink_port,
664                                           struct nlattr **tb,
665                                           struct netlink_ext_ack *extack)
666 {
667         const struct devlink_port_ops *ops = devlink_port->ops;
668         struct nlattr *attr;
669
670         if (tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] &&
671             !ops->port_fn_hw_addr_set) {
672                 NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR],
673                                     "Port doesn't support function attributes");
674                 return -EOPNOTSUPP;
675         }
676         if (tb[DEVLINK_PORT_FN_ATTR_STATE] && !ops->port_fn_state_set) {
677                 NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FN_ATTR_STATE],
678                                     "Function does not support state setting");
679                 return -EOPNOTSUPP;
680         }
681         attr = tb[DEVLINK_PORT_FN_ATTR_CAPS];
682         if (attr) {
683                 struct nla_bitfield32 caps;
684
685                 caps = nla_get_bitfield32(attr);
686                 if (caps.selector & DEVLINK_PORT_FN_CAP_ROCE &&
687                     !ops->port_fn_roce_set) {
688                         NL_SET_ERR_MSG_ATTR(extack, attr,
689                                             "Port doesn't support RoCE function attribute");
690                         return -EOPNOTSUPP;
691                 }
692                 if (caps.selector & DEVLINK_PORT_FN_CAP_MIGRATABLE) {
693                         if (!ops->port_fn_migratable_set) {
694                                 NL_SET_ERR_MSG_ATTR(extack, attr,
695                                                     "Port doesn't support migratable function attribute");
696                                 return -EOPNOTSUPP;
697                         }
698                         if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
699                                 NL_SET_ERR_MSG_ATTR(extack, attr,
700                                                     "migratable function attribute supported for VFs only");
701                                 return -EOPNOTSUPP;
702                         }
703                 }
704                 if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO) {
705                         if (!ops->port_fn_ipsec_crypto_set) {
706                                 NL_SET_ERR_MSG_ATTR(extack, attr,
707                                                     "Port doesn't support ipsec_crypto function attribute");
708                                 return -EOPNOTSUPP;
709                         }
710                         if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
711                                 NL_SET_ERR_MSG_ATTR(extack, attr,
712                                                     "ipsec_crypto function attribute supported for VFs only");
713                                 return -EOPNOTSUPP;
714                         }
715                 }
716                 if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_PACKET) {
717                         if (!ops->port_fn_ipsec_packet_set) {
718                                 NL_SET_ERR_MSG_ATTR(extack, attr,
719                                                     "Port doesn't support ipsec_packet function attribute");
720                                 return -EOPNOTSUPP;
721                         }
722                         if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
723                                 NL_SET_ERR_MSG_ATTR(extack, attr,
724                                                     "ipsec_packet function attribute supported for VFs only");
725                                 return -EOPNOTSUPP;
726                         }
727                 }
728         }
729         return 0;
730 }
731
732 static int devlink_port_function_set(struct devlink_port *port,
733                                      const struct nlattr *attr,
734                                      struct netlink_ext_ack *extack)
735 {
736         struct nlattr *tb[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1];
737         int err;
738
739         err = nla_parse_nested(tb, DEVLINK_PORT_FUNCTION_ATTR_MAX, attr,
740                                devlink_function_nl_policy, extack);
741         if (err < 0) {
742                 NL_SET_ERR_MSG(extack, "Fail to parse port function attributes");
743                 return err;
744         }
745
746         err = devlink_port_function_validate(port, tb, extack);
747         if (err)
748                 return err;
749
750         attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR];
751         if (attr) {
752                 err = devlink_port_function_hw_addr_set(port, attr, extack);
753                 if (err)
754                         return err;
755         }
756
757         attr = tb[DEVLINK_PORT_FN_ATTR_CAPS];
758         if (attr) {
759                 err = devlink_port_fn_caps_set(port, attr, extack);
760                 if (err)
761                         return err;
762         }
763
764         /* Keep this as the last function attribute set, so that when
765          * multiple port function attributes are set along with state,
766          * Those can be applied first before activating the state.
767          */
768         attr = tb[DEVLINK_PORT_FN_ATTR_STATE];
769         if (attr)
770                 err = devlink_port_fn_state_set(port, attr, extack);
771
772         if (!err)
773                 devlink_port_notify(port, DEVLINK_CMD_PORT_NEW);
774         return err;
775 }
776
777 int devlink_nl_port_set_doit(struct sk_buff *skb, struct genl_info *info)
778 {
779         struct devlink_port *devlink_port = info->user_ptr[1];
780         int err;
781
782         if (info->attrs[DEVLINK_ATTR_PORT_TYPE]) {
783                 enum devlink_port_type port_type;
784
785                 port_type = nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_TYPE]);
786                 err = devlink_port_type_set(devlink_port, port_type);
787                 if (err)
788                         return err;
789         }
790
791         if (info->attrs[DEVLINK_ATTR_PORT_FUNCTION]) {
792                 struct nlattr *attr = info->attrs[DEVLINK_ATTR_PORT_FUNCTION];
793                 struct netlink_ext_ack *extack = info->extack;
794
795                 err = devlink_port_function_set(devlink_port, attr, extack);
796                 if (err)
797                         return err;
798         }
799
800         return 0;
801 }
802
803 int devlink_nl_port_split_doit(struct sk_buff *skb, struct genl_info *info)
804 {
805         struct devlink_port *devlink_port = info->user_ptr[1];
806         struct devlink *devlink = info->user_ptr[0];
807         u32 count;
808
809         if (GENL_REQ_ATTR_CHECK(info, DEVLINK_ATTR_PORT_SPLIT_COUNT))
810                 return -EINVAL;
811         if (!devlink_port->ops->port_split)
812                 return -EOPNOTSUPP;
813
814         count = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_SPLIT_COUNT]);
815
816         if (!devlink_port->attrs.splittable) {
817                 /* Split ports cannot be split. */
818                 if (devlink_port->attrs.split)
819                         NL_SET_ERR_MSG(info->extack, "Port cannot be split further");
820                 else
821                         NL_SET_ERR_MSG(info->extack, "Port cannot be split");
822                 return -EINVAL;
823         }
824
825         if (count < 2 || !is_power_of_2(count) || count > devlink_port->attrs.lanes) {
826                 NL_SET_ERR_MSG(info->extack, "Invalid split count");
827                 return -EINVAL;
828         }
829
830         return devlink_port->ops->port_split(devlink, devlink_port, count,
831                                              info->extack);
832 }
833
834 int devlink_nl_port_unsplit_doit(struct sk_buff *skb, struct genl_info *info)
835 {
836         struct devlink_port *devlink_port = info->user_ptr[1];
837         struct devlink *devlink = info->user_ptr[0];
838
839         if (!devlink_port->ops->port_unsplit)
840                 return -EOPNOTSUPP;
841         return devlink_port->ops->port_unsplit(devlink, devlink_port, info->extack);
842 }
843
844 int devlink_nl_port_new_doit(struct sk_buff *skb, struct genl_info *info)
845 {
846         struct netlink_ext_ack *extack = info->extack;
847         struct devlink_port_new_attrs new_attrs = {};
848         struct devlink *devlink = info->user_ptr[0];
849         struct devlink_port *devlink_port;
850         struct sk_buff *msg;
851         int err;
852
853         if (!devlink->ops->port_new)
854                 return -EOPNOTSUPP;
855
856         if (!info->attrs[DEVLINK_ATTR_PORT_FLAVOUR] ||
857             !info->attrs[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]) {
858                 NL_SET_ERR_MSG(extack, "Port flavour or PCI PF are not specified");
859                 return -EINVAL;
860         }
861         new_attrs.flavour = nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_FLAVOUR]);
862         new_attrs.pfnum =
863                 nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]);
864
865         if (info->attrs[DEVLINK_ATTR_PORT_INDEX]) {
866                 /* Port index of the new port being created by driver. */
867                 new_attrs.port_index =
868                         nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_INDEX]);
869                 new_attrs.port_index_valid = true;
870         }
871         if (info->attrs[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER]) {
872                 new_attrs.controller =
873                         nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER]);
874                 new_attrs.controller_valid = true;
875         }
876         if (new_attrs.flavour == DEVLINK_PORT_FLAVOUR_PCI_SF &&
877             info->attrs[DEVLINK_ATTR_PORT_PCI_SF_NUMBER]) {
878                 new_attrs.sfnum = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_PCI_SF_NUMBER]);
879                 new_attrs.sfnum_valid = true;
880         }
881
882         err = devlink->ops->port_new(devlink, &new_attrs,
883                                      extack, &devlink_port);
884         if (err)
885                 return err;
886
887         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
888         if (!msg) {
889                 err = -ENOMEM;
890                 goto err_out_port_del;
891         }
892         err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_PORT_NEW,
893                                    info->snd_portid, info->snd_seq, 0, NULL);
894         if (WARN_ON_ONCE(err))
895                 goto err_out_msg_free;
896         err = genlmsg_reply(msg, info);
897         if (err)
898                 goto err_out_port_del;
899         return 0;
900
901 err_out_msg_free:
902         nlmsg_free(msg);
903 err_out_port_del:
904         devlink_port->ops->port_del(devlink, devlink_port, NULL);
905         return err;
906 }
907
908 int devlink_nl_port_del_doit(struct sk_buff *skb, struct genl_info *info)
909 {
910         struct devlink_port *devlink_port = info->user_ptr[1];
911         struct netlink_ext_ack *extack = info->extack;
912         struct devlink *devlink = info->user_ptr[0];
913
914         if (!devlink_port->ops->port_del)
915                 return -EOPNOTSUPP;
916
917         return devlink_port->ops->port_del(devlink, devlink_port, extack);
918 }
919
920 static void devlink_port_type_warn(struct work_struct *work)
921 {
922         struct devlink_port *port = container_of(to_delayed_work(work),
923                                                  struct devlink_port,
924                                                  type_warn_dw);
925         dev_warn(port->devlink->dev, "Type was not set for devlink port.");
926 }
927
928 static bool devlink_port_type_should_warn(struct devlink_port *devlink_port)
929 {
930         /* Ignore CPU and DSA flavours. */
931         return devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_CPU &&
932                devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_DSA &&
933                devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_UNUSED;
934 }
935
936 #define DEVLINK_PORT_TYPE_WARN_TIMEOUT (HZ * 3600)
937
938 static void devlink_port_type_warn_schedule(struct devlink_port *devlink_port)
939 {
940         if (!devlink_port_type_should_warn(devlink_port))
941                 return;
942         /* Schedule a work to WARN in case driver does not set port
943          * type within timeout.
944          */
945         schedule_delayed_work(&devlink_port->type_warn_dw,
946                               DEVLINK_PORT_TYPE_WARN_TIMEOUT);
947 }
948
949 static void devlink_port_type_warn_cancel(struct devlink_port *devlink_port)
950 {
951         if (!devlink_port_type_should_warn(devlink_port))
952                 return;
953         cancel_delayed_work_sync(&devlink_port->type_warn_dw);
954 }
955
956 /**
957  * devlink_port_init() - Init devlink port
958  *
959  * @devlink: devlink
960  * @devlink_port: devlink port
961  *
962  * Initialize essential stuff that is needed for functions
963  * that may be called before devlink port registration.
964  * Call to this function is optional and not needed
965  * in case the driver does not use such functions.
966  */
967 void devlink_port_init(struct devlink *devlink,
968                        struct devlink_port *devlink_port)
969 {
970         if (devlink_port->initialized)
971                 return;
972         devlink_port->devlink = devlink;
973         INIT_LIST_HEAD(&devlink_port->region_list);
974         devlink_port->initialized = true;
975 }
976 EXPORT_SYMBOL_GPL(devlink_port_init);
977
978 /**
979  * devlink_port_fini() - Deinitialize devlink port
980  *
981  * @devlink_port: devlink port
982  *
983  * Deinitialize essential stuff that is in use for functions
984  * that may be called after devlink port unregistration.
985  * Call to this function is optional and not needed
986  * in case the driver does not use such functions.
987  */
988 void devlink_port_fini(struct devlink_port *devlink_port)
989 {
990         WARN_ON(!list_empty(&devlink_port->region_list));
991 }
992 EXPORT_SYMBOL_GPL(devlink_port_fini);
993
994 static const struct devlink_port_ops devlink_port_dummy_ops = {};
995
996 /**
997  * devl_port_register_with_ops() - Register devlink port
998  *
999  * @devlink: devlink
1000  * @devlink_port: devlink port
1001  * @port_index: driver-specific numerical identifier of the port
1002  * @ops: port ops
1003  *
1004  * Register devlink port with provided port index. User can use
1005  * any indexing, even hw-related one. devlink_port structure
1006  * is convenient to be embedded inside user driver private structure.
1007  * Note that the caller should take care of zeroing the devlink_port
1008  * structure.
1009  */
1010 int devl_port_register_with_ops(struct devlink *devlink,
1011                                 struct devlink_port *devlink_port,
1012                                 unsigned int port_index,
1013                                 const struct devlink_port_ops *ops)
1014 {
1015         int err;
1016
1017         devl_assert_locked(devlink);
1018
1019         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1020
1021         devlink_port_init(devlink, devlink_port);
1022         devlink_port->registered = true;
1023         devlink_port->index = port_index;
1024         devlink_port->ops = ops ? ops : &devlink_port_dummy_ops;
1025         spin_lock_init(&devlink_port->type_lock);
1026         INIT_LIST_HEAD(&devlink_port->reporter_list);
1027         err = xa_insert(&devlink->ports, port_index, devlink_port, GFP_KERNEL);
1028         if (err) {
1029                 devlink_port->registered = false;
1030                 return err;
1031         }
1032
1033         INIT_DELAYED_WORK(&devlink_port->type_warn_dw, &devlink_port_type_warn);
1034         devlink_port_type_warn_schedule(devlink_port);
1035         devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
1036         return 0;
1037 }
1038 EXPORT_SYMBOL_GPL(devl_port_register_with_ops);
1039
1040 /**
1041  *      devlink_port_register_with_ops - Register devlink port
1042  *
1043  *      @devlink: devlink
1044  *      @devlink_port: devlink port
1045  *      @port_index: driver-specific numerical identifier of the port
1046  *      @ops: port ops
1047  *
1048  *      Register devlink port with provided port index. User can use
1049  *      any indexing, even hw-related one. devlink_port structure
1050  *      is convenient to be embedded inside user driver private structure.
1051  *      Note that the caller should take care of zeroing the devlink_port
1052  *      structure.
1053  *
1054  *      Context: Takes and release devlink->lock <mutex>.
1055  */
1056 int devlink_port_register_with_ops(struct devlink *devlink,
1057                                    struct devlink_port *devlink_port,
1058                                    unsigned int port_index,
1059                                    const struct devlink_port_ops *ops)
1060 {
1061         int err;
1062
1063         devl_lock(devlink);
1064         err = devl_port_register_with_ops(devlink, devlink_port,
1065                                           port_index, ops);
1066         devl_unlock(devlink);
1067         return err;
1068 }
1069 EXPORT_SYMBOL_GPL(devlink_port_register_with_ops);
1070
1071 /**
1072  * devl_port_unregister() - Unregister devlink port
1073  *
1074  * @devlink_port: devlink port
1075  */
1076 void devl_port_unregister(struct devlink_port *devlink_port)
1077 {
1078         lockdep_assert_held(&devlink_port->devlink->lock);
1079         WARN_ON(devlink_port->type != DEVLINK_PORT_TYPE_NOTSET);
1080
1081         devlink_port_type_warn_cancel(devlink_port);
1082         devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_DEL);
1083         xa_erase(&devlink_port->devlink->ports, devlink_port->index);
1084         WARN_ON(!list_empty(&devlink_port->reporter_list));
1085         devlink_port->registered = false;
1086 }
1087 EXPORT_SYMBOL_GPL(devl_port_unregister);
1088
1089 /**
1090  *      devlink_port_unregister - Unregister devlink port
1091  *
1092  *      @devlink_port: devlink port
1093  *
1094  *      Context: Takes and release devlink->lock <mutex>.
1095  */
1096 void devlink_port_unregister(struct devlink_port *devlink_port)
1097 {
1098         struct devlink *devlink = devlink_port->devlink;
1099
1100         devl_lock(devlink);
1101         devl_port_unregister(devlink_port);
1102         devl_unlock(devlink);
1103 }
1104 EXPORT_SYMBOL_GPL(devlink_port_unregister);
1105
1106 static void devlink_port_type_netdev_checks(struct devlink_port *devlink_port,
1107                                             struct net_device *netdev)
1108 {
1109         const struct net_device_ops *ops = netdev->netdev_ops;
1110
1111         /* If driver registers devlink port, it should set devlink port
1112          * attributes accordingly so the compat functions are called
1113          * and the original ops are not used.
1114          */
1115         if (ops->ndo_get_phys_port_name) {
1116                 /* Some drivers use the same set of ndos for netdevs
1117                  * that have devlink_port registered and also for
1118                  * those who don't. Make sure that ndo_get_phys_port_name
1119                  * returns -EOPNOTSUPP here in case it is defined.
1120                  * Warn if not.
1121                  */
1122                 char name[IFNAMSIZ];
1123                 int err;
1124
1125                 err = ops->ndo_get_phys_port_name(netdev, name, sizeof(name));
1126                 WARN_ON(err != -EOPNOTSUPP);
1127         }
1128         if (ops->ndo_get_port_parent_id) {
1129                 /* Some drivers use the same set of ndos for netdevs
1130                  * that have devlink_port registered and also for
1131                  * those who don't. Make sure that ndo_get_port_parent_id
1132                  * returns -EOPNOTSUPP here in case it is defined.
1133                  * Warn if not.
1134                  */
1135                 struct netdev_phys_item_id ppid;
1136                 int err;
1137
1138                 err = ops->ndo_get_port_parent_id(netdev, &ppid);
1139                 WARN_ON(err != -EOPNOTSUPP);
1140         }
1141 }
1142
1143 static void __devlink_port_type_set(struct devlink_port *devlink_port,
1144                                     enum devlink_port_type type,
1145                                     void *type_dev)
1146 {
1147         struct net_device *netdev = type_dev;
1148
1149         ASSERT_DEVLINK_PORT_REGISTERED(devlink_port);
1150
1151         if (type == DEVLINK_PORT_TYPE_NOTSET) {
1152                 devlink_port_type_warn_schedule(devlink_port);
1153         } else {
1154                 devlink_port_type_warn_cancel(devlink_port);
1155                 if (type == DEVLINK_PORT_TYPE_ETH && netdev)
1156                         devlink_port_type_netdev_checks(devlink_port, netdev);
1157         }
1158
1159         spin_lock_bh(&devlink_port->type_lock);
1160         devlink_port->type = type;
1161         switch (type) {
1162         case DEVLINK_PORT_TYPE_ETH:
1163                 devlink_port->type_eth.netdev = netdev;
1164                 if (netdev) {
1165                         ASSERT_RTNL();
1166                         devlink_port->type_eth.ifindex = netdev->ifindex;
1167                         BUILD_BUG_ON(sizeof(devlink_port->type_eth.ifname) !=
1168                                      sizeof(netdev->name));
1169                         strcpy(devlink_port->type_eth.ifname, netdev->name);
1170                 }
1171                 break;
1172         case DEVLINK_PORT_TYPE_IB:
1173                 devlink_port->type_ib.ibdev = type_dev;
1174                 break;
1175         default:
1176                 break;
1177         }
1178         spin_unlock_bh(&devlink_port->type_lock);
1179         devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
1180 }
1181
1182 /**
1183  *      devlink_port_type_eth_set - Set port type to Ethernet
1184  *
1185  *      @devlink_port: devlink port
1186  *
1187  *      If driver is calling this, most likely it is doing something wrong.
1188  */
1189 void devlink_port_type_eth_set(struct devlink_port *devlink_port)
1190 {
1191         dev_warn(devlink_port->devlink->dev,
1192                  "devlink port type for port %d set to Ethernet without a software interface reference, device type not supported by the kernel?\n",
1193                  devlink_port->index);
1194         __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, NULL);
1195 }
1196 EXPORT_SYMBOL_GPL(devlink_port_type_eth_set);
1197
1198 /**
1199  *      devlink_port_type_ib_set - Set port type to InfiniBand
1200  *
1201  *      @devlink_port: devlink port
1202  *      @ibdev: related IB device
1203  */
1204 void devlink_port_type_ib_set(struct devlink_port *devlink_port,
1205                               struct ib_device *ibdev)
1206 {
1207         __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_IB, ibdev);
1208 }
1209 EXPORT_SYMBOL_GPL(devlink_port_type_ib_set);
1210
1211 /**
1212  *      devlink_port_type_clear - Clear port type
1213  *
1214  *      @devlink_port: devlink port
1215  *
1216  *      If driver is calling this for clearing Ethernet type, most likely
1217  *      it is doing something wrong.
1218  */
1219 void devlink_port_type_clear(struct devlink_port *devlink_port)
1220 {
1221         if (devlink_port->type == DEVLINK_PORT_TYPE_ETH)
1222                 dev_warn(devlink_port->devlink->dev,
1223                          "devlink port type for port %d cleared without a software interface reference, device type not supported by the kernel?\n",
1224                          devlink_port->index);
1225         __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET, NULL);
1226 }
1227 EXPORT_SYMBOL_GPL(devlink_port_type_clear);
1228
1229 int devlink_port_netdevice_event(struct notifier_block *nb,
1230                                  unsigned long event, void *ptr)
1231 {
1232         struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
1233         struct devlink_port *devlink_port = netdev->devlink_port;
1234         struct devlink *devlink;
1235
1236         if (!devlink_port)
1237                 return NOTIFY_OK;
1238         devlink = devlink_port->devlink;
1239
1240         switch (event) {
1241         case NETDEV_POST_INIT:
1242                 /* Set the type but not netdev pointer. It is going to be set
1243                  * later on by NETDEV_REGISTER event. Happens once during
1244                  * netdevice register
1245                  */
1246                 __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH,
1247                                         NULL);
1248                 break;
1249         case NETDEV_REGISTER:
1250         case NETDEV_CHANGENAME:
1251                 if (devlink_net(devlink) != dev_net(netdev))
1252                         return NOTIFY_OK;
1253                 /* Set the netdev on top of previously set type. Note this
1254                  * event happens also during net namespace change so here
1255                  * we take into account netdev pointer appearing in this
1256                  * namespace.
1257                  */
1258                 __devlink_port_type_set(devlink_port, devlink_port->type,
1259                                         netdev);
1260                 break;
1261         case NETDEV_UNREGISTER:
1262                 if (devlink_net(devlink) != dev_net(netdev))
1263                         return NOTIFY_OK;
1264                 /* Clear netdev pointer, but not the type. This event happens
1265                  * also during net namespace change so we need to clear
1266                  * pointer to netdev that is going to another net namespace.
1267                  */
1268                 __devlink_port_type_set(devlink_port, devlink_port->type,
1269                                         NULL);
1270                 break;
1271         case NETDEV_PRE_UNINIT:
1272                 /* Clear the type and the netdev pointer. Happens one during
1273                  * netdevice unregister.
1274                  */
1275                 __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET,
1276                                         NULL);
1277                 break;
1278         }
1279
1280         return NOTIFY_OK;
1281 }
1282
1283 static int __devlink_port_attrs_set(struct devlink_port *devlink_port,
1284                                     enum devlink_port_flavour flavour)
1285 {
1286         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1287
1288         devlink_port->attrs_set = true;
1289         attrs->flavour = flavour;
1290         if (attrs->switch_id.id_len) {
1291                 devlink_port->switch_port = true;
1292                 if (WARN_ON(attrs->switch_id.id_len > MAX_PHYS_ITEM_ID_LEN))
1293                         attrs->switch_id.id_len = MAX_PHYS_ITEM_ID_LEN;
1294         } else {
1295                 devlink_port->switch_port = false;
1296         }
1297         return 0;
1298 }
1299
1300 /**
1301  *      devlink_port_attrs_set - Set port attributes
1302  *
1303  *      @devlink_port: devlink port
1304  *      @attrs: devlink port attrs
1305  */
1306 void devlink_port_attrs_set(struct devlink_port *devlink_port,
1307                             struct devlink_port_attrs *attrs)
1308 {
1309         int ret;
1310
1311         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1312
1313         devlink_port->attrs = *attrs;
1314         ret = __devlink_port_attrs_set(devlink_port, attrs->flavour);
1315         if (ret)
1316                 return;
1317         WARN_ON(attrs->splittable && attrs->split);
1318 }
1319 EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
1320
1321 /**
1322  *      devlink_port_attrs_pci_pf_set - Set PCI PF port attributes
1323  *
1324  *      @devlink_port: devlink port
1325  *      @controller: associated controller number for the devlink port instance
1326  *      @pf: associated PF for the devlink port instance
1327  *      @external: indicates if the port is for an external controller
1328  */
1329 void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 controller,
1330                                    u16 pf, bool external)
1331 {
1332         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1333         int ret;
1334
1335         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1336
1337         ret = __devlink_port_attrs_set(devlink_port,
1338                                        DEVLINK_PORT_FLAVOUR_PCI_PF);
1339         if (ret)
1340                 return;
1341         attrs->pci_pf.controller = controller;
1342         attrs->pci_pf.pf = pf;
1343         attrs->pci_pf.external = external;
1344 }
1345 EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set);
1346
1347 /**
1348  *      devlink_port_attrs_pci_vf_set - Set PCI VF port attributes
1349  *
1350  *      @devlink_port: devlink port
1351  *      @controller: associated controller number for the devlink port instance
1352  *      @pf: associated PF for the devlink port instance
1353  *      @vf: associated VF of a PF for the devlink port instance
1354  *      @external: indicates if the port is for an external controller
1355  */
1356 void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller,
1357                                    u16 pf, u16 vf, bool external)
1358 {
1359         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1360         int ret;
1361
1362         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1363
1364         ret = __devlink_port_attrs_set(devlink_port,
1365                                        DEVLINK_PORT_FLAVOUR_PCI_VF);
1366         if (ret)
1367                 return;
1368         attrs->pci_vf.controller = controller;
1369         attrs->pci_vf.pf = pf;
1370         attrs->pci_vf.vf = vf;
1371         attrs->pci_vf.external = external;
1372 }
1373 EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set);
1374
1375 /**
1376  *      devlink_port_attrs_pci_sf_set - Set PCI SF port attributes
1377  *
1378  *      @devlink_port: devlink port
1379  *      @controller: associated controller number for the devlink port instance
1380  *      @pf: associated PF for the devlink port instance
1381  *      @sf: associated SF of a PF for the devlink port instance
1382  *      @external: indicates if the port is for an external controller
1383  */
1384 void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port, u32 controller,
1385                                    u16 pf, u32 sf, bool external)
1386 {
1387         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1388         int ret;
1389
1390         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1391
1392         ret = __devlink_port_attrs_set(devlink_port,
1393                                        DEVLINK_PORT_FLAVOUR_PCI_SF);
1394         if (ret)
1395                 return;
1396         attrs->pci_sf.controller = controller;
1397         attrs->pci_sf.pf = pf;
1398         attrs->pci_sf.sf = sf;
1399         attrs->pci_sf.external = external;
1400 }
1401 EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_sf_set);
1402
1403 static void devlink_port_rel_notify_cb(struct devlink *devlink, u32 port_index)
1404 {
1405         struct devlink_port *devlink_port;
1406
1407         devlink_port = devlink_port_get_by_index(devlink, port_index);
1408         if (!devlink_port)
1409                 return;
1410         devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
1411 }
1412
1413 static void devlink_port_rel_cleanup_cb(struct devlink *devlink, u32 port_index,
1414                                         u32 rel_index)
1415 {
1416         struct devlink_port *devlink_port;
1417
1418         devlink_port = devlink_port_get_by_index(devlink, port_index);
1419         if (devlink_port && devlink_port->rel_index == rel_index)
1420                 devlink_port->rel_index = 0;
1421 }
1422
1423 /**
1424  * devl_port_fn_devlink_set - Attach peer devlink
1425  *                            instance to port function.
1426  * @devlink_port: devlink port
1427  * @fn_devlink: devlink instance to attach
1428  */
1429 int devl_port_fn_devlink_set(struct devlink_port *devlink_port,
1430                              struct devlink *fn_devlink)
1431 {
1432         ASSERT_DEVLINK_PORT_REGISTERED(devlink_port);
1433
1434         if (WARN_ON(devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_SF ||
1435                     devlink_port->attrs.pci_sf.external))
1436                 return -EINVAL;
1437
1438         return devlink_rel_nested_in_add(&devlink_port->rel_index,
1439                                          devlink_port->devlink->index,
1440                                          devlink_port->index,
1441                                          devlink_port_rel_notify_cb,
1442                                          devlink_port_rel_cleanup_cb,
1443                                          fn_devlink);
1444 }
1445 EXPORT_SYMBOL_GPL(devl_port_fn_devlink_set);
1446
1447 /**
1448  *      devlink_port_linecard_set - Link port with a linecard
1449  *
1450  *      @devlink_port: devlink port
1451  *      @linecard: devlink linecard
1452  */
1453 void devlink_port_linecard_set(struct devlink_port *devlink_port,
1454                                struct devlink_linecard *linecard)
1455 {
1456         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1457
1458         devlink_port->linecard = linecard;
1459 }
1460 EXPORT_SYMBOL_GPL(devlink_port_linecard_set);
1461
1462 static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
1463                                              char *name, size_t len)
1464 {
1465         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1466         int n = 0;
1467
1468         if (!devlink_port->attrs_set)
1469                 return -EOPNOTSUPP;
1470
1471         switch (attrs->flavour) {
1472         case DEVLINK_PORT_FLAVOUR_PHYSICAL:
1473                 if (devlink_port->linecard)
1474                         n = snprintf(name, len, "l%u",
1475                                      devlink_linecard_index(devlink_port->linecard));
1476                 if (n < len)
1477                         n += snprintf(name + n, len - n, "p%u",
1478                                       attrs->phys.port_number);
1479                 if (n < len && attrs->split)
1480                         n += snprintf(name + n, len - n, "s%u",
1481                                       attrs->phys.split_subport_number);
1482                 break;
1483         case DEVLINK_PORT_FLAVOUR_CPU:
1484         case DEVLINK_PORT_FLAVOUR_DSA:
1485         case DEVLINK_PORT_FLAVOUR_UNUSED:
1486                 /* As CPU and DSA ports do not have a netdevice associated
1487                  * case should not ever happen.
1488                  */
1489                 WARN_ON(1);
1490                 return -EINVAL;
1491         case DEVLINK_PORT_FLAVOUR_PCI_PF:
1492                 if (attrs->pci_pf.external) {
1493                         n = snprintf(name, len, "c%u", attrs->pci_pf.controller);
1494                         if (n >= len)
1495                                 return -EINVAL;
1496                         len -= n;
1497                         name += n;
1498                 }
1499                 n = snprintf(name, len, "pf%u", attrs->pci_pf.pf);
1500                 break;
1501         case DEVLINK_PORT_FLAVOUR_PCI_VF:
1502                 if (attrs->pci_vf.external) {
1503                         n = snprintf(name, len, "c%u", attrs->pci_vf.controller);
1504                         if (n >= len)
1505                                 return -EINVAL;
1506                         len -= n;
1507                         name += n;
1508                 }
1509                 n = snprintf(name, len, "pf%uvf%u",
1510                              attrs->pci_vf.pf, attrs->pci_vf.vf);
1511                 break;
1512         case DEVLINK_PORT_FLAVOUR_PCI_SF:
1513                 if (attrs->pci_sf.external) {
1514                         n = snprintf(name, len, "c%u", attrs->pci_sf.controller);
1515                         if (n >= len)
1516                                 return -EINVAL;
1517                         len -= n;
1518                         name += n;
1519                 }
1520                 n = snprintf(name, len, "pf%usf%u", attrs->pci_sf.pf,
1521                              attrs->pci_sf.sf);
1522                 break;
1523         case DEVLINK_PORT_FLAVOUR_VIRTUAL:
1524                 return -EOPNOTSUPP;
1525         }
1526
1527         if (n >= len)
1528                 return -EINVAL;
1529
1530         return 0;
1531 }
1532
1533 int devlink_compat_phys_port_name_get(struct net_device *dev,
1534                                       char *name, size_t len)
1535 {
1536         struct devlink_port *devlink_port;
1537
1538         /* RTNL mutex is held here which ensures that devlink_port
1539          * instance cannot disappear in the middle. No need to take
1540          * any devlink lock as only permanent values are accessed.
1541          */
1542         ASSERT_RTNL();
1543
1544         devlink_port = dev->devlink_port;
1545         if (!devlink_port)
1546                 return -EOPNOTSUPP;
1547
1548         return __devlink_port_phys_port_name_get(devlink_port, name, len);
1549 }
1550
1551 int devlink_compat_switch_id_get(struct net_device *dev,
1552                                  struct netdev_phys_item_id *ppid)
1553 {
1554         struct devlink_port *devlink_port;
1555
1556         /* Caller must hold RTNL mutex or reference to dev, which ensures that
1557          * devlink_port instance cannot disappear in the middle. No need to take
1558          * any devlink lock as only permanent values are accessed.
1559          */
1560         devlink_port = dev->devlink_port;
1561         if (!devlink_port || !devlink_port->switch_port)
1562                 return -EOPNOTSUPP;
1563
1564         memcpy(ppid, &devlink_port->attrs.switch_id, sizeof(*ppid));
1565
1566         return 0;
1567 }