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