Merge tag 'counter-fixes-for-6.6a' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/kernel/linux-rpi.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 out:
432         if (err || !msg_updated)
433                 nla_nest_cancel(msg, function_attr);
434         else
435                 nla_nest_end(msg, function_attr);
436         return err;
437 }
438
439 static int devlink_nl_port_fill(struct sk_buff *msg,
440                                 struct devlink_port *devlink_port,
441                                 enum devlink_command cmd, u32 portid, u32 seq,
442                                 int flags, struct netlink_ext_ack *extack)
443 {
444         struct devlink *devlink = devlink_port->devlink;
445         void *hdr;
446
447         hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
448         if (!hdr)
449                 return -EMSGSIZE;
450
451         if (devlink_nl_put_handle(msg, devlink))
452                 goto nla_put_failure;
453         if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index))
454                 goto nla_put_failure;
455
456         spin_lock_bh(&devlink_port->type_lock);
457         if (nla_put_u16(msg, DEVLINK_ATTR_PORT_TYPE, devlink_port->type))
458                 goto nla_put_failure_type_locked;
459         if (devlink_port->desired_type != DEVLINK_PORT_TYPE_NOTSET &&
460             nla_put_u16(msg, DEVLINK_ATTR_PORT_DESIRED_TYPE,
461                         devlink_port->desired_type))
462                 goto nla_put_failure_type_locked;
463         if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) {
464                 if (devlink_port->type_eth.netdev &&
465                     (nla_put_u32(msg, DEVLINK_ATTR_PORT_NETDEV_IFINDEX,
466                                  devlink_port->type_eth.ifindex) ||
467                      nla_put_string(msg, DEVLINK_ATTR_PORT_NETDEV_NAME,
468                                     devlink_port->type_eth.ifname)))
469                         goto nla_put_failure_type_locked;
470         }
471         if (devlink_port->type == DEVLINK_PORT_TYPE_IB) {
472                 struct ib_device *ibdev = devlink_port->type_ib.ibdev;
473
474                 if (ibdev &&
475                     nla_put_string(msg, DEVLINK_ATTR_PORT_IBDEV_NAME,
476                                    ibdev->name))
477                         goto nla_put_failure_type_locked;
478         }
479         spin_unlock_bh(&devlink_port->type_lock);
480         if (devlink_nl_port_attrs_put(msg, devlink_port))
481                 goto nla_put_failure;
482         if (devlink_nl_port_function_attrs_put(msg, devlink_port, extack))
483                 goto nla_put_failure;
484         if (devlink_port->linecard &&
485             nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX,
486                         devlink_port->linecard->index))
487                 goto nla_put_failure;
488
489         genlmsg_end(msg, hdr);
490         return 0;
491
492 nla_put_failure_type_locked:
493         spin_unlock_bh(&devlink_port->type_lock);
494 nla_put_failure:
495         genlmsg_cancel(msg, hdr);
496         return -EMSGSIZE;
497 }
498
499 static void devlink_port_notify(struct devlink_port *devlink_port,
500                                 enum devlink_command cmd)
501 {
502         struct devlink *devlink = devlink_port->devlink;
503         struct sk_buff *msg;
504         int err;
505
506         WARN_ON(cmd != DEVLINK_CMD_PORT_NEW && cmd != DEVLINK_CMD_PORT_DEL);
507
508         if (!xa_get_mark(&devlinks, devlink->index, DEVLINK_REGISTERED))
509                 return;
510
511         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
512         if (!msg)
513                 return;
514
515         err = devlink_nl_port_fill(msg, devlink_port, cmd, 0, 0, 0, NULL);
516         if (err) {
517                 nlmsg_free(msg);
518                 return;
519         }
520
521         genlmsg_multicast_netns(&devlink_nl_family, devlink_net(devlink), msg,
522                                 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL);
523 }
524
525 static void devlink_ports_notify(struct devlink *devlink,
526                                  enum devlink_command cmd)
527 {
528         struct devlink_port *devlink_port;
529         unsigned long port_index;
530
531         xa_for_each(&devlink->ports, port_index, devlink_port)
532                 devlink_port_notify(devlink_port, cmd);
533 }
534
535 void devlink_ports_notify_register(struct devlink *devlink)
536 {
537         devlink_ports_notify(devlink, DEVLINK_CMD_PORT_NEW);
538 }
539
540 void devlink_ports_notify_unregister(struct devlink *devlink)
541 {
542         devlink_ports_notify(devlink, DEVLINK_CMD_PORT_DEL);
543 }
544
545 int devlink_nl_port_get_doit(struct sk_buff *skb, struct genl_info *info)
546 {
547         struct devlink_port *devlink_port = info->user_ptr[1];
548         struct sk_buff *msg;
549         int err;
550
551         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
552         if (!msg)
553                 return -ENOMEM;
554
555         err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_PORT_NEW,
556                                    info->snd_portid, info->snd_seq, 0,
557                                    info->extack);
558         if (err) {
559                 nlmsg_free(msg);
560                 return err;
561         }
562
563         return genlmsg_reply(msg, info);
564 }
565
566 static int
567 devlink_nl_port_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
568                              struct netlink_callback *cb, int flags)
569 {
570         struct devlink_nl_dump_state *state = devlink_dump_state(cb);
571         struct devlink_port *devlink_port;
572         unsigned long port_index;
573         int err = 0;
574
575         xa_for_each_start(&devlink->ports, port_index, devlink_port, state->idx) {
576                 err = devlink_nl_port_fill(msg, devlink_port,
577                                            DEVLINK_CMD_NEW,
578                                            NETLINK_CB(cb->skb).portid,
579                                            cb->nlh->nlmsg_seq, flags,
580                                            cb->extack);
581                 if (err) {
582                         state->idx = port_index;
583                         break;
584                 }
585         }
586
587         return err;
588 }
589
590 int devlink_nl_port_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
591 {
592         return devlink_nl_dumpit(skb, cb, devlink_nl_port_get_dump_one);
593 }
594
595 static int devlink_port_type_set(struct devlink_port *devlink_port,
596                                  enum devlink_port_type port_type)
597
598 {
599         int err;
600
601         if (!devlink_port->ops->port_type_set)
602                 return -EOPNOTSUPP;
603
604         if (port_type == devlink_port->type)
605                 return 0;
606
607         err = devlink_port->ops->port_type_set(devlink_port, port_type);
608         if (err)
609                 return err;
610
611         devlink_port->desired_type = port_type;
612         devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
613         return 0;
614 }
615
616 static int devlink_port_function_hw_addr_set(struct devlink_port *port,
617                                              const struct nlattr *attr,
618                                              struct netlink_ext_ack *extack)
619 {
620         const u8 *hw_addr;
621         int hw_addr_len;
622
623         hw_addr = nla_data(attr);
624         hw_addr_len = nla_len(attr);
625         if (hw_addr_len > MAX_ADDR_LEN) {
626                 NL_SET_ERR_MSG(extack, "Port function hardware address too long");
627                 return -EINVAL;
628         }
629         if (port->type == DEVLINK_PORT_TYPE_ETH) {
630                 if (hw_addr_len != ETH_ALEN) {
631                         NL_SET_ERR_MSG(extack, "Address must be 6 bytes for Ethernet device");
632                         return -EINVAL;
633                 }
634                 if (!is_unicast_ether_addr(hw_addr)) {
635                         NL_SET_ERR_MSG(extack, "Non-unicast hardware address unsupported");
636                         return -EINVAL;
637                 }
638         }
639
640         return port->ops->port_fn_hw_addr_set(port, hw_addr, hw_addr_len,
641                                               extack);
642 }
643
644 static int devlink_port_fn_state_set(struct devlink_port *port,
645                                      const struct nlattr *attr,
646                                      struct netlink_ext_ack *extack)
647 {
648         enum devlink_port_fn_state state;
649
650         state = nla_get_u8(attr);
651         return port->ops->port_fn_state_set(port, state, extack);
652 }
653
654 static int devlink_port_function_validate(struct devlink_port *devlink_port,
655                                           struct nlattr **tb,
656                                           struct netlink_ext_ack *extack)
657 {
658         const struct devlink_port_ops *ops = devlink_port->ops;
659         struct nlattr *attr;
660
661         if (tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] &&
662             !ops->port_fn_hw_addr_set) {
663                 NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR],
664                                     "Port doesn't support function attributes");
665                 return -EOPNOTSUPP;
666         }
667         if (tb[DEVLINK_PORT_FN_ATTR_STATE] && !ops->port_fn_state_set) {
668                 NL_SET_ERR_MSG_ATTR(extack, tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR],
669                                     "Function does not support state setting");
670                 return -EOPNOTSUPP;
671         }
672         attr = tb[DEVLINK_PORT_FN_ATTR_CAPS];
673         if (attr) {
674                 struct nla_bitfield32 caps;
675
676                 caps = nla_get_bitfield32(attr);
677                 if (caps.selector & DEVLINK_PORT_FN_CAP_ROCE &&
678                     !ops->port_fn_roce_set) {
679                         NL_SET_ERR_MSG_ATTR(extack, attr,
680                                             "Port doesn't support RoCE function attribute");
681                         return -EOPNOTSUPP;
682                 }
683                 if (caps.selector & DEVLINK_PORT_FN_CAP_MIGRATABLE) {
684                         if (!ops->port_fn_migratable_set) {
685                                 NL_SET_ERR_MSG_ATTR(extack, attr,
686                                                     "Port doesn't support migratable function attribute");
687                                 return -EOPNOTSUPP;
688                         }
689                         if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
690                                 NL_SET_ERR_MSG_ATTR(extack, attr,
691                                                     "migratable function attribute supported for VFs only");
692                                 return -EOPNOTSUPP;
693                         }
694                 }
695                 if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_CRYPTO) {
696                         if (!ops->port_fn_ipsec_crypto_set) {
697                                 NL_SET_ERR_MSG_ATTR(extack, attr,
698                                                     "Port doesn't support ipsec_crypto function attribute");
699                                 return -EOPNOTSUPP;
700                         }
701                         if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
702                                 NL_SET_ERR_MSG_ATTR(extack, attr,
703                                                     "ipsec_crypto function attribute supported for VFs only");
704                                 return -EOPNOTSUPP;
705                         }
706                 }
707                 if (caps.selector & DEVLINK_PORT_FN_CAP_IPSEC_PACKET) {
708                         if (!ops->port_fn_ipsec_packet_set) {
709                                 NL_SET_ERR_MSG_ATTR(extack, attr,
710                                                     "Port doesn't support ipsec_packet function attribute");
711                                 return -EOPNOTSUPP;
712                         }
713                         if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
714                                 NL_SET_ERR_MSG_ATTR(extack, attr,
715                                                     "ipsec_packet function attribute supported for VFs only");
716                                 return -EOPNOTSUPP;
717                         }
718                 }
719         }
720         return 0;
721 }
722
723 static int devlink_port_function_set(struct devlink_port *port,
724                                      const struct nlattr *attr,
725                                      struct netlink_ext_ack *extack)
726 {
727         struct nlattr *tb[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1];
728         int err;
729
730         err = nla_parse_nested(tb, DEVLINK_PORT_FUNCTION_ATTR_MAX, attr,
731                                devlink_function_nl_policy, extack);
732         if (err < 0) {
733                 NL_SET_ERR_MSG(extack, "Fail to parse port function attributes");
734                 return err;
735         }
736
737         err = devlink_port_function_validate(port, tb, extack);
738         if (err)
739                 return err;
740
741         attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR];
742         if (attr) {
743                 err = devlink_port_function_hw_addr_set(port, attr, extack);
744                 if (err)
745                         return err;
746         }
747
748         attr = tb[DEVLINK_PORT_FN_ATTR_CAPS];
749         if (attr) {
750                 err = devlink_port_fn_caps_set(port, attr, extack);
751                 if (err)
752                         return err;
753         }
754
755         /* Keep this as the last function attribute set, so that when
756          * multiple port function attributes are set along with state,
757          * Those can be applied first before activating the state.
758          */
759         attr = tb[DEVLINK_PORT_FN_ATTR_STATE];
760         if (attr)
761                 err = devlink_port_fn_state_set(port, attr, extack);
762
763         if (!err)
764                 devlink_port_notify(port, DEVLINK_CMD_PORT_NEW);
765         return err;
766 }
767
768 int devlink_nl_cmd_port_set_doit(struct sk_buff *skb, struct genl_info *info)
769 {
770         struct devlink_port *devlink_port = info->user_ptr[1];
771         int err;
772
773         if (info->attrs[DEVLINK_ATTR_PORT_TYPE]) {
774                 enum devlink_port_type port_type;
775
776                 port_type = nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_TYPE]);
777                 err = devlink_port_type_set(devlink_port, port_type);
778                 if (err)
779                         return err;
780         }
781
782         if (info->attrs[DEVLINK_ATTR_PORT_FUNCTION]) {
783                 struct nlattr *attr = info->attrs[DEVLINK_ATTR_PORT_FUNCTION];
784                 struct netlink_ext_ack *extack = info->extack;
785
786                 err = devlink_port_function_set(devlink_port, attr, extack);
787                 if (err)
788                         return err;
789         }
790
791         return 0;
792 }
793
794 int devlink_nl_cmd_port_split_doit(struct sk_buff *skb, struct genl_info *info)
795 {
796         struct devlink_port *devlink_port = info->user_ptr[1];
797         struct devlink *devlink = info->user_ptr[0];
798         u32 count;
799
800         if (GENL_REQ_ATTR_CHECK(info, DEVLINK_ATTR_PORT_SPLIT_COUNT))
801                 return -EINVAL;
802         if (!devlink_port->ops->port_split)
803                 return -EOPNOTSUPP;
804
805         count = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_SPLIT_COUNT]);
806
807         if (!devlink_port->attrs.splittable) {
808                 /* Split ports cannot be split. */
809                 if (devlink_port->attrs.split)
810                         NL_SET_ERR_MSG(info->extack, "Port cannot be split further");
811                 else
812                         NL_SET_ERR_MSG(info->extack, "Port cannot be split");
813                 return -EINVAL;
814         }
815
816         if (count < 2 || !is_power_of_2(count) || count > devlink_port->attrs.lanes) {
817                 NL_SET_ERR_MSG(info->extack, "Invalid split count");
818                 return -EINVAL;
819         }
820
821         return devlink_port->ops->port_split(devlink, devlink_port, count,
822                                              info->extack);
823 }
824
825 int devlink_nl_cmd_port_unsplit_doit(struct sk_buff *skb,
826                                      struct genl_info *info)
827 {
828         struct devlink_port *devlink_port = info->user_ptr[1];
829         struct devlink *devlink = info->user_ptr[0];
830
831         if (!devlink_port->ops->port_unsplit)
832                 return -EOPNOTSUPP;
833         return devlink_port->ops->port_unsplit(devlink, devlink_port, info->extack);
834 }
835
836 int devlink_nl_cmd_port_new_doit(struct sk_buff *skb, struct genl_info *info)
837 {
838         struct netlink_ext_ack *extack = info->extack;
839         struct devlink_port_new_attrs new_attrs = {};
840         struct devlink *devlink = info->user_ptr[0];
841         struct devlink_port *devlink_port;
842         struct sk_buff *msg;
843         int err;
844
845         if (!devlink->ops->port_new)
846                 return -EOPNOTSUPP;
847
848         if (!info->attrs[DEVLINK_ATTR_PORT_FLAVOUR] ||
849             !info->attrs[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]) {
850                 NL_SET_ERR_MSG(extack, "Port flavour or PCI PF are not specified");
851                 return -EINVAL;
852         }
853         new_attrs.flavour = nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_FLAVOUR]);
854         new_attrs.pfnum =
855                 nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]);
856
857         if (info->attrs[DEVLINK_ATTR_PORT_INDEX]) {
858                 /* Port index of the new port being created by driver. */
859                 new_attrs.port_index =
860                         nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_INDEX]);
861                 new_attrs.port_index_valid = true;
862         }
863         if (info->attrs[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER]) {
864                 new_attrs.controller =
865                         nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_CONTROLLER_NUMBER]);
866                 new_attrs.controller_valid = true;
867         }
868         if (new_attrs.flavour == DEVLINK_PORT_FLAVOUR_PCI_SF &&
869             info->attrs[DEVLINK_ATTR_PORT_PCI_SF_NUMBER]) {
870                 new_attrs.sfnum = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_PCI_SF_NUMBER]);
871                 new_attrs.sfnum_valid = true;
872         }
873
874         err = devlink->ops->port_new(devlink, &new_attrs,
875                                      extack, &devlink_port);
876         if (err)
877                 return err;
878
879         msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
880         if (!msg) {
881                 err = -ENOMEM;
882                 goto err_out_port_del;
883         }
884         err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_NEW,
885                                    info->snd_portid, info->snd_seq, 0, NULL);
886         if (WARN_ON_ONCE(err))
887                 goto err_out_msg_free;
888         err = genlmsg_reply(msg, info);
889         if (err)
890                 goto err_out_port_del;
891         return 0;
892
893 err_out_msg_free:
894         nlmsg_free(msg);
895 err_out_port_del:
896         devlink_port->ops->port_del(devlink, devlink_port, NULL);
897         return err;
898 }
899
900 int devlink_nl_cmd_port_del_doit(struct sk_buff *skb, struct genl_info *info)
901 {
902         struct devlink_port *devlink_port = info->user_ptr[1];
903         struct netlink_ext_ack *extack = info->extack;
904         struct devlink *devlink = info->user_ptr[0];
905
906         if (!devlink_port->ops->port_del)
907                 return -EOPNOTSUPP;
908
909         return devlink_port->ops->port_del(devlink, devlink_port, extack);
910 }
911
912 static void devlink_port_type_warn(struct work_struct *work)
913 {
914         struct devlink_port *port = container_of(to_delayed_work(work),
915                                                  struct devlink_port,
916                                                  type_warn_dw);
917         dev_warn(port->devlink->dev, "Type was not set for devlink port.");
918 }
919
920 static bool devlink_port_type_should_warn(struct devlink_port *devlink_port)
921 {
922         /* Ignore CPU and DSA flavours. */
923         return devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_CPU &&
924                devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_DSA &&
925                devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_UNUSED;
926 }
927
928 #define DEVLINK_PORT_TYPE_WARN_TIMEOUT (HZ * 3600)
929
930 static void devlink_port_type_warn_schedule(struct devlink_port *devlink_port)
931 {
932         if (!devlink_port_type_should_warn(devlink_port))
933                 return;
934         /* Schedule a work to WARN in case driver does not set port
935          * type within timeout.
936          */
937         schedule_delayed_work(&devlink_port->type_warn_dw,
938                               DEVLINK_PORT_TYPE_WARN_TIMEOUT);
939 }
940
941 static void devlink_port_type_warn_cancel(struct devlink_port *devlink_port)
942 {
943         if (!devlink_port_type_should_warn(devlink_port))
944                 return;
945         cancel_delayed_work_sync(&devlink_port->type_warn_dw);
946 }
947
948 /**
949  * devlink_port_init() - Init devlink port
950  *
951  * @devlink: devlink
952  * @devlink_port: devlink port
953  *
954  * Initialize essential stuff that is needed for functions
955  * that may be called before devlink port registration.
956  * Call to this function is optional and not needed
957  * in case the driver does not use such functions.
958  */
959 void devlink_port_init(struct devlink *devlink,
960                        struct devlink_port *devlink_port)
961 {
962         if (devlink_port->initialized)
963                 return;
964         devlink_port->devlink = devlink;
965         INIT_LIST_HEAD(&devlink_port->region_list);
966         devlink_port->initialized = true;
967 }
968 EXPORT_SYMBOL_GPL(devlink_port_init);
969
970 /**
971  * devlink_port_fini() - Deinitialize devlink port
972  *
973  * @devlink_port: devlink port
974  *
975  * Deinitialize essential stuff that is in use for functions
976  * that may be called after devlink port unregistration.
977  * Call to this function is optional and not needed
978  * in case the driver does not use such functions.
979  */
980 void devlink_port_fini(struct devlink_port *devlink_port)
981 {
982         WARN_ON(!list_empty(&devlink_port->region_list));
983 }
984 EXPORT_SYMBOL_GPL(devlink_port_fini);
985
986 static const struct devlink_port_ops devlink_port_dummy_ops = {};
987
988 /**
989  * devl_port_register_with_ops() - Register devlink port
990  *
991  * @devlink: devlink
992  * @devlink_port: devlink port
993  * @port_index: driver-specific numerical identifier of the port
994  * @ops: port ops
995  *
996  * Register devlink port with provided port index. User can use
997  * any indexing, even hw-related one. devlink_port structure
998  * is convenient to be embedded inside user driver private structure.
999  * Note that the caller should take care of zeroing the devlink_port
1000  * structure.
1001  */
1002 int devl_port_register_with_ops(struct devlink *devlink,
1003                                 struct devlink_port *devlink_port,
1004                                 unsigned int port_index,
1005                                 const struct devlink_port_ops *ops)
1006 {
1007         int err;
1008
1009         devl_assert_locked(devlink);
1010
1011         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1012
1013         devlink_port_init(devlink, devlink_port);
1014         devlink_port->registered = true;
1015         devlink_port->index = port_index;
1016         devlink_port->ops = ops ? ops : &devlink_port_dummy_ops;
1017         spin_lock_init(&devlink_port->type_lock);
1018         INIT_LIST_HEAD(&devlink_port->reporter_list);
1019         err = xa_insert(&devlink->ports, port_index, devlink_port, GFP_KERNEL);
1020         if (err) {
1021                 devlink_port->registered = false;
1022                 return err;
1023         }
1024
1025         INIT_DELAYED_WORK(&devlink_port->type_warn_dw, &devlink_port_type_warn);
1026         devlink_port_type_warn_schedule(devlink_port);
1027         devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
1028         return 0;
1029 }
1030 EXPORT_SYMBOL_GPL(devl_port_register_with_ops);
1031
1032 /**
1033  *      devlink_port_register_with_ops - Register devlink port
1034  *
1035  *      @devlink: devlink
1036  *      @devlink_port: devlink port
1037  *      @port_index: driver-specific numerical identifier of the port
1038  *      @ops: port ops
1039  *
1040  *      Register devlink port with provided port index. User can use
1041  *      any indexing, even hw-related one. devlink_port structure
1042  *      is convenient to be embedded inside user driver private structure.
1043  *      Note that the caller should take care of zeroing the devlink_port
1044  *      structure.
1045  *
1046  *      Context: Takes and release devlink->lock <mutex>.
1047  */
1048 int devlink_port_register_with_ops(struct devlink *devlink,
1049                                    struct devlink_port *devlink_port,
1050                                    unsigned int port_index,
1051                                    const struct devlink_port_ops *ops)
1052 {
1053         int err;
1054
1055         devl_lock(devlink);
1056         err = devl_port_register_with_ops(devlink, devlink_port,
1057                                           port_index, ops);
1058         devl_unlock(devlink);
1059         return err;
1060 }
1061 EXPORT_SYMBOL_GPL(devlink_port_register_with_ops);
1062
1063 /**
1064  * devl_port_unregister() - Unregister devlink port
1065  *
1066  * @devlink_port: devlink port
1067  */
1068 void devl_port_unregister(struct devlink_port *devlink_port)
1069 {
1070         lockdep_assert_held(&devlink_port->devlink->lock);
1071         WARN_ON(devlink_port->type != DEVLINK_PORT_TYPE_NOTSET);
1072
1073         devlink_port_type_warn_cancel(devlink_port);
1074         devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_DEL);
1075         xa_erase(&devlink_port->devlink->ports, devlink_port->index);
1076         WARN_ON(!list_empty(&devlink_port->reporter_list));
1077         devlink_port->registered = false;
1078 }
1079 EXPORT_SYMBOL_GPL(devl_port_unregister);
1080
1081 /**
1082  *      devlink_port_unregister - Unregister devlink port
1083  *
1084  *      @devlink_port: devlink port
1085  *
1086  *      Context: Takes and release devlink->lock <mutex>.
1087  */
1088 void devlink_port_unregister(struct devlink_port *devlink_port)
1089 {
1090         struct devlink *devlink = devlink_port->devlink;
1091
1092         devl_lock(devlink);
1093         devl_port_unregister(devlink_port);
1094         devl_unlock(devlink);
1095 }
1096 EXPORT_SYMBOL_GPL(devlink_port_unregister);
1097
1098 static void devlink_port_type_netdev_checks(struct devlink_port *devlink_port,
1099                                             struct net_device *netdev)
1100 {
1101         const struct net_device_ops *ops = netdev->netdev_ops;
1102
1103         /* If driver registers devlink port, it should set devlink port
1104          * attributes accordingly so the compat functions are called
1105          * and the original ops are not used.
1106          */
1107         if (ops->ndo_get_phys_port_name) {
1108                 /* Some drivers use the same set of ndos for netdevs
1109                  * that have devlink_port registered and also for
1110                  * those who don't. Make sure that ndo_get_phys_port_name
1111                  * returns -EOPNOTSUPP here in case it is defined.
1112                  * Warn if not.
1113                  */
1114                 char name[IFNAMSIZ];
1115                 int err;
1116
1117                 err = ops->ndo_get_phys_port_name(netdev, name, sizeof(name));
1118                 WARN_ON(err != -EOPNOTSUPP);
1119         }
1120         if (ops->ndo_get_port_parent_id) {
1121                 /* Some drivers use the same set of ndos for netdevs
1122                  * that have devlink_port registered and also for
1123                  * those who don't. Make sure that ndo_get_port_parent_id
1124                  * returns -EOPNOTSUPP here in case it is defined.
1125                  * Warn if not.
1126                  */
1127                 struct netdev_phys_item_id ppid;
1128                 int err;
1129
1130                 err = ops->ndo_get_port_parent_id(netdev, &ppid);
1131                 WARN_ON(err != -EOPNOTSUPP);
1132         }
1133 }
1134
1135 static void __devlink_port_type_set(struct devlink_port *devlink_port,
1136                                     enum devlink_port_type type,
1137                                     void *type_dev)
1138 {
1139         struct net_device *netdev = type_dev;
1140
1141         ASSERT_DEVLINK_PORT_REGISTERED(devlink_port);
1142
1143         if (type == DEVLINK_PORT_TYPE_NOTSET) {
1144                 devlink_port_type_warn_schedule(devlink_port);
1145         } else {
1146                 devlink_port_type_warn_cancel(devlink_port);
1147                 if (type == DEVLINK_PORT_TYPE_ETH && netdev)
1148                         devlink_port_type_netdev_checks(devlink_port, netdev);
1149         }
1150
1151         spin_lock_bh(&devlink_port->type_lock);
1152         devlink_port->type = type;
1153         switch (type) {
1154         case DEVLINK_PORT_TYPE_ETH:
1155                 devlink_port->type_eth.netdev = netdev;
1156                 if (netdev) {
1157                         ASSERT_RTNL();
1158                         devlink_port->type_eth.ifindex = netdev->ifindex;
1159                         BUILD_BUG_ON(sizeof(devlink_port->type_eth.ifname) !=
1160                                      sizeof(netdev->name));
1161                         strcpy(devlink_port->type_eth.ifname, netdev->name);
1162                 }
1163                 break;
1164         case DEVLINK_PORT_TYPE_IB:
1165                 devlink_port->type_ib.ibdev = type_dev;
1166                 break;
1167         default:
1168                 break;
1169         }
1170         spin_unlock_bh(&devlink_port->type_lock);
1171         devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
1172 }
1173
1174 /**
1175  *      devlink_port_type_eth_set - Set port type to Ethernet
1176  *
1177  *      @devlink_port: devlink port
1178  *
1179  *      If driver is calling this, most likely it is doing something wrong.
1180  */
1181 void devlink_port_type_eth_set(struct devlink_port *devlink_port)
1182 {
1183         dev_warn(devlink_port->devlink->dev,
1184                  "devlink port type for port %d set to Ethernet without a software interface reference, device type not supported by the kernel?\n",
1185                  devlink_port->index);
1186         __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, NULL);
1187 }
1188 EXPORT_SYMBOL_GPL(devlink_port_type_eth_set);
1189
1190 /**
1191  *      devlink_port_type_ib_set - Set port type to InfiniBand
1192  *
1193  *      @devlink_port: devlink port
1194  *      @ibdev: related IB device
1195  */
1196 void devlink_port_type_ib_set(struct devlink_port *devlink_port,
1197                               struct ib_device *ibdev)
1198 {
1199         __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_IB, ibdev);
1200 }
1201 EXPORT_SYMBOL_GPL(devlink_port_type_ib_set);
1202
1203 /**
1204  *      devlink_port_type_clear - Clear port type
1205  *
1206  *      @devlink_port: devlink port
1207  *
1208  *      If driver is calling this for clearing Ethernet type, most likely
1209  *      it is doing something wrong.
1210  */
1211 void devlink_port_type_clear(struct devlink_port *devlink_port)
1212 {
1213         if (devlink_port->type == DEVLINK_PORT_TYPE_ETH)
1214                 dev_warn(devlink_port->devlink->dev,
1215                          "devlink port type for port %d cleared without a software interface reference, device type not supported by the kernel?\n",
1216                          devlink_port->index);
1217         __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET, NULL);
1218 }
1219 EXPORT_SYMBOL_GPL(devlink_port_type_clear);
1220
1221 int devlink_port_netdevice_event(struct notifier_block *nb,
1222                                  unsigned long event, void *ptr)
1223 {
1224         struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
1225         struct devlink_port *devlink_port = netdev->devlink_port;
1226         struct devlink *devlink;
1227
1228         if (!devlink_port)
1229                 return NOTIFY_OK;
1230         devlink = devlink_port->devlink;
1231
1232         switch (event) {
1233         case NETDEV_POST_INIT:
1234                 /* Set the type but not netdev pointer. It is going to be set
1235                  * later on by NETDEV_REGISTER event. Happens once during
1236                  * netdevice register
1237                  */
1238                 __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH,
1239                                         NULL);
1240                 break;
1241         case NETDEV_REGISTER:
1242         case NETDEV_CHANGENAME:
1243                 if (devlink_net(devlink) != dev_net(netdev))
1244                         return NOTIFY_OK;
1245                 /* Set the netdev on top of previously set type. Note this
1246                  * event happens also during net namespace change so here
1247                  * we take into account netdev pointer appearing in this
1248                  * namespace.
1249                  */
1250                 __devlink_port_type_set(devlink_port, devlink_port->type,
1251                                         netdev);
1252                 break;
1253         case NETDEV_UNREGISTER:
1254                 if (devlink_net(devlink) != dev_net(netdev))
1255                         return NOTIFY_OK;
1256                 /* Clear netdev pointer, but not the type. This event happens
1257                  * also during net namespace change so we need to clear
1258                  * pointer to netdev that is going to another net namespace.
1259                  */
1260                 __devlink_port_type_set(devlink_port, devlink_port->type,
1261                                         NULL);
1262                 break;
1263         case NETDEV_PRE_UNINIT:
1264                 /* Clear the type and the netdev pointer. Happens one during
1265                  * netdevice unregister.
1266                  */
1267                 __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET,
1268                                         NULL);
1269                 break;
1270         }
1271
1272         return NOTIFY_OK;
1273 }
1274
1275 static int __devlink_port_attrs_set(struct devlink_port *devlink_port,
1276                                     enum devlink_port_flavour flavour)
1277 {
1278         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1279
1280         devlink_port->attrs_set = true;
1281         attrs->flavour = flavour;
1282         if (attrs->switch_id.id_len) {
1283                 devlink_port->switch_port = true;
1284                 if (WARN_ON(attrs->switch_id.id_len > MAX_PHYS_ITEM_ID_LEN))
1285                         attrs->switch_id.id_len = MAX_PHYS_ITEM_ID_LEN;
1286         } else {
1287                 devlink_port->switch_port = false;
1288         }
1289         return 0;
1290 }
1291
1292 /**
1293  *      devlink_port_attrs_set - Set port attributes
1294  *
1295  *      @devlink_port: devlink port
1296  *      @attrs: devlink port attrs
1297  */
1298 void devlink_port_attrs_set(struct devlink_port *devlink_port,
1299                             struct devlink_port_attrs *attrs)
1300 {
1301         int ret;
1302
1303         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1304
1305         devlink_port->attrs = *attrs;
1306         ret = __devlink_port_attrs_set(devlink_port, attrs->flavour);
1307         if (ret)
1308                 return;
1309         WARN_ON(attrs->splittable && attrs->split);
1310 }
1311 EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
1312
1313 /**
1314  *      devlink_port_attrs_pci_pf_set - Set PCI PF port attributes
1315  *
1316  *      @devlink_port: devlink port
1317  *      @controller: associated controller number for the devlink port instance
1318  *      @pf: associated PF for the devlink port instance
1319  *      @external: indicates if the port is for an external controller
1320  */
1321 void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 controller,
1322                                    u16 pf, bool external)
1323 {
1324         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1325         int ret;
1326
1327         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1328
1329         ret = __devlink_port_attrs_set(devlink_port,
1330                                        DEVLINK_PORT_FLAVOUR_PCI_PF);
1331         if (ret)
1332                 return;
1333         attrs->pci_pf.controller = controller;
1334         attrs->pci_pf.pf = pf;
1335         attrs->pci_pf.external = external;
1336 }
1337 EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set);
1338
1339 /**
1340  *      devlink_port_attrs_pci_vf_set - Set PCI VF port attributes
1341  *
1342  *      @devlink_port: devlink port
1343  *      @controller: associated controller number for the devlink port instance
1344  *      @pf: associated PF for the devlink port instance
1345  *      @vf: associated VF of a PF for the devlink port instance
1346  *      @external: indicates if the port is for an external controller
1347  */
1348 void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller,
1349                                    u16 pf, u16 vf, bool external)
1350 {
1351         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1352         int ret;
1353
1354         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1355
1356         ret = __devlink_port_attrs_set(devlink_port,
1357                                        DEVLINK_PORT_FLAVOUR_PCI_VF);
1358         if (ret)
1359                 return;
1360         attrs->pci_vf.controller = controller;
1361         attrs->pci_vf.pf = pf;
1362         attrs->pci_vf.vf = vf;
1363         attrs->pci_vf.external = external;
1364 }
1365 EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set);
1366
1367 /**
1368  *      devlink_port_attrs_pci_sf_set - Set PCI SF port attributes
1369  *
1370  *      @devlink_port: devlink port
1371  *      @controller: associated controller number for the devlink port instance
1372  *      @pf: associated PF for the devlink port instance
1373  *      @sf: associated SF of a PF for the devlink port instance
1374  *      @external: indicates if the port is for an external controller
1375  */
1376 void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port, u32 controller,
1377                                    u16 pf, u32 sf, bool external)
1378 {
1379         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1380         int ret;
1381
1382         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1383
1384         ret = __devlink_port_attrs_set(devlink_port,
1385                                        DEVLINK_PORT_FLAVOUR_PCI_SF);
1386         if (ret)
1387                 return;
1388         attrs->pci_sf.controller = controller;
1389         attrs->pci_sf.pf = pf;
1390         attrs->pci_sf.sf = sf;
1391         attrs->pci_sf.external = external;
1392 }
1393 EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_sf_set);
1394
1395 /**
1396  *      devlink_port_linecard_set - Link port with a linecard
1397  *
1398  *      @devlink_port: devlink port
1399  *      @linecard: devlink linecard
1400  */
1401 void devlink_port_linecard_set(struct devlink_port *devlink_port,
1402                                struct devlink_linecard *linecard)
1403 {
1404         ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1405
1406         devlink_port->linecard = linecard;
1407 }
1408 EXPORT_SYMBOL_GPL(devlink_port_linecard_set);
1409
1410 static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
1411                                              char *name, size_t len)
1412 {
1413         struct devlink_port_attrs *attrs = &devlink_port->attrs;
1414         int n = 0;
1415
1416         if (!devlink_port->attrs_set)
1417                 return -EOPNOTSUPP;
1418
1419         switch (attrs->flavour) {
1420         case DEVLINK_PORT_FLAVOUR_PHYSICAL:
1421                 if (devlink_port->linecard)
1422                         n = snprintf(name, len, "l%u",
1423                                      devlink_port->linecard->index);
1424                 if (n < len)
1425                         n += snprintf(name + n, len - n, "p%u",
1426                                       attrs->phys.port_number);
1427                 if (n < len && attrs->split)
1428                         n += snprintf(name + n, len - n, "s%u",
1429                                       attrs->phys.split_subport_number);
1430                 break;
1431         case DEVLINK_PORT_FLAVOUR_CPU:
1432         case DEVLINK_PORT_FLAVOUR_DSA:
1433         case DEVLINK_PORT_FLAVOUR_UNUSED:
1434                 /* As CPU and DSA ports do not have a netdevice associated
1435                  * case should not ever happen.
1436                  */
1437                 WARN_ON(1);
1438                 return -EINVAL;
1439         case DEVLINK_PORT_FLAVOUR_PCI_PF:
1440                 if (attrs->pci_pf.external) {
1441                         n = snprintf(name, len, "c%u", attrs->pci_pf.controller);
1442                         if (n >= len)
1443                                 return -EINVAL;
1444                         len -= n;
1445                         name += n;
1446                 }
1447                 n = snprintf(name, len, "pf%u", attrs->pci_pf.pf);
1448                 break;
1449         case DEVLINK_PORT_FLAVOUR_PCI_VF:
1450                 if (attrs->pci_vf.external) {
1451                         n = snprintf(name, len, "c%u", attrs->pci_vf.controller);
1452                         if (n >= len)
1453                                 return -EINVAL;
1454                         len -= n;
1455                         name += n;
1456                 }
1457                 n = snprintf(name, len, "pf%uvf%u",
1458                              attrs->pci_vf.pf, attrs->pci_vf.vf);
1459                 break;
1460         case DEVLINK_PORT_FLAVOUR_PCI_SF:
1461                 if (attrs->pci_sf.external) {
1462                         n = snprintf(name, len, "c%u", attrs->pci_sf.controller);
1463                         if (n >= len)
1464                                 return -EINVAL;
1465                         len -= n;
1466                         name += n;
1467                 }
1468                 n = snprintf(name, len, "pf%usf%u", attrs->pci_sf.pf,
1469                              attrs->pci_sf.sf);
1470                 break;
1471         case DEVLINK_PORT_FLAVOUR_VIRTUAL:
1472                 return -EOPNOTSUPP;
1473         }
1474
1475         if (n >= len)
1476                 return -EINVAL;
1477
1478         return 0;
1479 }
1480
1481 int devlink_compat_phys_port_name_get(struct net_device *dev,
1482                                       char *name, size_t len)
1483 {
1484         struct devlink_port *devlink_port;
1485
1486         /* RTNL mutex is held here which ensures that devlink_port
1487          * instance cannot disappear in the middle. No need to take
1488          * any devlink lock as only permanent values are accessed.
1489          */
1490         ASSERT_RTNL();
1491
1492         devlink_port = dev->devlink_port;
1493         if (!devlink_port)
1494                 return -EOPNOTSUPP;
1495
1496         return __devlink_port_phys_port_name_get(devlink_port, name, len);
1497 }
1498
1499 int devlink_compat_switch_id_get(struct net_device *dev,
1500                                  struct netdev_phys_item_id *ppid)
1501 {
1502         struct devlink_port *devlink_port;
1503
1504         /* Caller must hold RTNL mutex or reference to dev, which ensures that
1505          * devlink_port instance cannot disappear in the middle. No need to take
1506          * any devlink lock as only permanent values are accessed.
1507          */
1508         devlink_port = dev->devlink_port;
1509         if (!devlink_port || !devlink_port->switch_port)
1510                 return -EOPNOTSUPP;
1511
1512         memcpy(ppid, &devlink_port->attrs.switch_id, sizeof(*ppid));
1513
1514         return 0;
1515 }