Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

devlink: introduce devlink_port_attrs_set

Change existing setter for split port information into more generic
attrs setter. Alongside with that, allow to set port number and subport
number for split ports.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jiri Pirko and committed by
David S. Miller
b9ffcbaf eb38401c

+64 -25
+4 -3
drivers/net/ethernet/mellanox/mlxsw/core.c
··· 1714 1714 1715 1715 void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port, 1716 1716 void *port_driver_priv, struct net_device *dev, 1717 - bool split, u32 split_group) 1717 + u32 port_number, bool split, 1718 + u32 split_port_subnumber) 1718 1719 { 1719 1720 struct mlxsw_core_port *mlxsw_core_port = 1720 1721 &mlxsw_core->ports[local_port]; 1721 1722 struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port; 1722 1723 1723 1724 mlxsw_core_port->port_driver_priv = port_driver_priv; 1724 - if (split) 1725 - devlink_port_split_set(devlink_port, split_group); 1725 + devlink_port_attrs_set(devlink_port, port_number, 1726 + split, split_port_subnumber); 1726 1727 devlink_port_type_eth_set(devlink_port, dev); 1727 1728 } 1728 1729 EXPORT_SYMBOL(mlxsw_core_port_eth_set);
+2 -1
drivers/net/ethernet/mellanox/mlxsw/core.h
··· 201 201 void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port); 202 202 void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port, 203 203 void *port_driver_priv, struct net_device *dev, 204 - bool split, u32 split_group); 204 + u32 port_number, bool split, 205 + u32 split_port_subnumber); 205 206 void mlxsw_core_port_ib_set(struct mlxsw_core *mlxsw_core, u8 local_port, 206 207 void *port_driver_priv); 207 208 void mlxsw_core_port_clear(struct mlxsw_core *mlxsw_core, u8 local_port,
+2 -2
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
··· 2927 2927 } 2928 2928 2929 2929 mlxsw_core_port_eth_set(mlxsw_sp->core, mlxsw_sp_port->local_port, 2930 - mlxsw_sp_port, dev, mlxsw_sp_port->split, 2931 - module); 2930 + mlxsw_sp_port, dev, module + 1, 2931 + mlxsw_sp_port->split, lane / width); 2932 2932 mlxsw_core_schedule_dw(&mlxsw_sp_port->periodic_hw_stats.update_dw, 0); 2933 2933 return 0; 2934 2934
+1 -1
drivers/net/ethernet/mellanox/mlxsw/switchx2.c
··· 1149 1149 } 1150 1150 1151 1151 mlxsw_core_port_eth_set(mlxsw_sx->core, mlxsw_sx_port->local_port, 1152 - mlxsw_sx_port, dev, false, 0); 1152 + mlxsw_sx_port, dev, module + 1, false, 0); 1153 1153 mlxsw_sx->ports[local_port] = mlxsw_sx_port; 1154 1154 return 0; 1155 1155
+2 -2
drivers/net/ethernet/netronome/nfp/nfp_devlink.c
··· 175 175 return ret; 176 176 177 177 devlink_port_type_eth_set(&port->dl_port, port->netdev); 178 - if (eth_port.is_split) 179 - devlink_port_split_set(&port->dl_port, eth_port.label_port); 178 + devlink_port_attrs_set(&port->dl_port, eth_port.label_port, 179 + eth_port.is_split, eth_port.label_subport); 180 180 181 181 devlink = priv_to_devlink(app->pf); 182 182
+14 -6
include/net/devlink.h
··· 35 35 char priv[0] __aligned(NETDEV_ALIGN); 36 36 }; 37 37 38 + struct devlink_port_attrs { 39 + bool set; 40 + u32 port_number; /* same value as "split group" */ 41 + bool split; 42 + u32 split_subport_number; 43 + }; 44 + 38 45 struct devlink_port { 39 46 struct list_head list; 40 47 struct devlink *devlink; ··· 50 43 enum devlink_port_type type; 51 44 enum devlink_port_type desired_type; 52 45 void *type_dev; 53 - bool split; 54 - u32 split_group; 46 + struct devlink_port_attrs attrs; 55 47 }; 56 48 57 49 struct devlink_sb_pool_info { ··· 373 367 void devlink_port_type_ib_set(struct devlink_port *devlink_port, 374 368 struct ib_device *ibdev); 375 369 void devlink_port_type_clear(struct devlink_port *devlink_port); 376 - void devlink_port_split_set(struct devlink_port *devlink_port, 377 - u32 split_group); 370 + void devlink_port_attrs_set(struct devlink_port *devlink_port, 371 + u32 port_number, bool split, 372 + u32 split_subport_number); 378 373 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, 379 374 u32 size, u16 ingress_pools_count, 380 375 u16 egress_pools_count, u16 ingress_tc_count, ··· 473 466 { 474 467 } 475 468 476 - static inline void devlink_port_split_set(struct devlink_port *devlink_port, 477 - u32 split_group) 469 + static inline void devlink_port_attrs_set(struct devlink_port *devlink_port, 470 + u32 port_number, bool split, 471 + u32 split_subport_number) 478 472 { 479 473 } 480 474
+3
include/uapi/linux/devlink.h
··· 224 224 DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID, /* u64 */ 225 225 DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */ 226 226 227 + DEVLINK_ATTR_PORT_NUMBER, /* u32 */ 228 + DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, /* u32 */ 229 + 227 230 /* add new attributes above here, update the policy in devlink.c */ 228 231 229 232 __DEVLINK_ATTR_MAX,
+36 -10
net/core/devlink.c
··· 453 453 msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); 454 454 } 455 455 456 + static int devlink_nl_port_attrs_put(struct sk_buff *msg, 457 + struct devlink_port *devlink_port) 458 + { 459 + struct devlink_port_attrs *attrs = &devlink_port->attrs; 460 + 461 + if (!attrs->set) 462 + return 0; 463 + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER, attrs->port_number)) 464 + return -EMSGSIZE; 465 + if (!attrs->split) 466 + return 0; 467 + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP, attrs->port_number)) 468 + return -EMSGSIZE; 469 + if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, 470 + attrs->split_subport_number)) 471 + return -EMSGSIZE; 472 + return 0; 473 + } 474 + 456 475 static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, 457 476 struct devlink_port *devlink_port, 458 477 enum devlink_command cmd, u32 portid, ··· 511 492 ibdev->name)) 512 493 goto nla_put_failure; 513 494 } 514 - if (devlink_port->split && 515 - nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP, 516 - devlink_port->split_group)) 495 + if (devlink_nl_port_attrs_put(msg, devlink_port)) 517 496 goto nla_put_failure; 518 497 519 498 genlmsg_end(msg, hdr); ··· 2988 2971 EXPORT_SYMBOL_GPL(devlink_port_type_clear); 2989 2972 2990 2973 /** 2991 - * devlink_port_split_set - Set port is split 2974 + * devlink_port_attrs_set - Set port attributes 2992 2975 * 2993 2976 * @devlink_port: devlink port 2994 - * @split_group: split group - identifies group split port is part of 2977 + * @port_number: number of the port that is facing user, for example 2978 + * the front panel port number 2979 + * @split: indicates if this is split port 2980 + * @split_subport_number: if the port is split, this is the number 2981 + * of subport. 2995 2982 */ 2996 - void devlink_port_split_set(struct devlink_port *devlink_port, 2997 - u32 split_group) 2983 + void devlink_port_attrs_set(struct devlink_port *devlink_port, 2984 + u32 port_number, bool split, 2985 + u32 split_subport_number) 2998 2986 { 2999 - devlink_port->split = true; 3000 - devlink_port->split_group = split_group; 2987 + struct devlink_port_attrs *attrs = &devlink_port->attrs; 2988 + 2989 + attrs->set = true; 2990 + attrs->port_number = port_number; 2991 + attrs->split = split; 2992 + attrs->split_subport_number = split_subport_number; 3001 2993 devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); 3002 2994 } 3003 - EXPORT_SYMBOL_GPL(devlink_port_split_set); 2995 + EXPORT_SYMBOL_GPL(devlink_port_attrs_set); 3004 2996 3005 2997 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, 3006 2998 u32 size, u16 ingress_pools_count,