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