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