Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.10.11.
   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_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}