xref: /linux/net/devlink/port.c (revision b1a54551dd9ed5ef1763b97b35a0999ca002b95c)
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_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_FUNCTION_ATTR_HW_ADDR],
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_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 }
1568