Commit b9ffcbaf authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

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: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent eb38401c
...@@ -1714,15 +1714,16 @@ EXPORT_SYMBOL(mlxsw_core_port_fini); ...@@ -1714,15 +1714,16 @@ EXPORT_SYMBOL(mlxsw_core_port_fini);
void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port, void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
void *port_driver_priv, struct net_device *dev, void *port_driver_priv, struct net_device *dev,
bool split, u32 split_group) u32 port_number, bool split,
u32 split_port_subnumber)
{ {
struct mlxsw_core_port *mlxsw_core_port = struct mlxsw_core_port *mlxsw_core_port =
&mlxsw_core->ports[local_port]; &mlxsw_core->ports[local_port];
struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port; struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
mlxsw_core_port->port_driver_priv = port_driver_priv; mlxsw_core_port->port_driver_priv = port_driver_priv;
if (split) devlink_port_attrs_set(devlink_port, port_number,
devlink_port_split_set(devlink_port, split_group); split, split_port_subnumber);
devlink_port_type_eth_set(devlink_port, dev); devlink_port_type_eth_set(devlink_port, dev);
} }
EXPORT_SYMBOL(mlxsw_core_port_eth_set); EXPORT_SYMBOL(mlxsw_core_port_eth_set);
......
...@@ -201,7 +201,8 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port); ...@@ -201,7 +201,8 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 local_port);
void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port); void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port);
void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port, void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
void *port_driver_priv, struct net_device *dev, void *port_driver_priv, struct net_device *dev,
bool split, u32 split_group); u32 port_number, bool split,
u32 split_port_subnumber);
void mlxsw_core_port_ib_set(struct mlxsw_core *mlxsw_core, u8 local_port, void mlxsw_core_port_ib_set(struct mlxsw_core *mlxsw_core, u8 local_port,
void *port_driver_priv); void *port_driver_priv);
void mlxsw_core_port_clear(struct mlxsw_core *mlxsw_core, u8 local_port, void mlxsw_core_port_clear(struct mlxsw_core *mlxsw_core, u8 local_port,
......
...@@ -2927,8 +2927,8 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port, ...@@ -2927,8 +2927,8 @@ static int mlxsw_sp_port_create(struct mlxsw_sp *mlxsw_sp, u8 local_port,
} }
mlxsw_core_port_eth_set(mlxsw_sp->core, mlxsw_sp_port->local_port, mlxsw_core_port_eth_set(mlxsw_sp->core, mlxsw_sp_port->local_port,
mlxsw_sp_port, dev, mlxsw_sp_port->split, mlxsw_sp_port, dev, module + 1,
module); mlxsw_sp_port->split, lane / width);
mlxsw_core_schedule_dw(&mlxsw_sp_port->periodic_hw_stats.update_dw, 0); mlxsw_core_schedule_dw(&mlxsw_sp_port->periodic_hw_stats.update_dw, 0);
return 0; return 0;
......
...@@ -1149,7 +1149,7 @@ static int __mlxsw_sx_port_eth_create(struct mlxsw_sx *mlxsw_sx, u8 local_port, ...@@ -1149,7 +1149,7 @@ static int __mlxsw_sx_port_eth_create(struct mlxsw_sx *mlxsw_sx, u8 local_port,
} }
mlxsw_core_port_eth_set(mlxsw_sx->core, mlxsw_sx_port->local_port, mlxsw_core_port_eth_set(mlxsw_sx->core, mlxsw_sx_port->local_port,
mlxsw_sx_port, dev, false, 0); mlxsw_sx_port, dev, module + 1, false, 0);
mlxsw_sx->ports[local_port] = mlxsw_sx_port; mlxsw_sx->ports[local_port] = mlxsw_sx_port;
return 0; return 0;
......
...@@ -175,8 +175,8 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port) ...@@ -175,8 +175,8 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
return ret; return ret;
devlink_port_type_eth_set(&port->dl_port, port->netdev); devlink_port_type_eth_set(&port->dl_port, port->netdev);
if (eth_port.is_split) devlink_port_attrs_set(&port->dl_port, eth_port.label_port,
devlink_port_split_set(&port->dl_port, eth_port.label_port); eth_port.is_split, eth_port.label_subport);
devlink = priv_to_devlink(app->pf); devlink = priv_to_devlink(app->pf);
......
...@@ -35,6 +35,13 @@ struct devlink { ...@@ -35,6 +35,13 @@ struct devlink {
char priv[0] __aligned(NETDEV_ALIGN); char priv[0] __aligned(NETDEV_ALIGN);
}; };
struct devlink_port_attrs {
bool set;
u32 port_number; /* same value as "split group" */
bool split;
u32 split_subport_number;
};
struct devlink_port { struct devlink_port {
struct list_head list; struct list_head list;
struct devlink *devlink; struct devlink *devlink;
...@@ -43,8 +50,7 @@ struct devlink_port { ...@@ -43,8 +50,7 @@ struct devlink_port {
enum devlink_port_type type; enum devlink_port_type type;
enum devlink_port_type desired_type; enum devlink_port_type desired_type;
void *type_dev; void *type_dev;
bool split; struct devlink_port_attrs attrs;
u32 split_group;
}; };
struct devlink_sb_pool_info { struct devlink_sb_pool_info {
...@@ -367,8 +373,9 @@ void devlink_port_type_eth_set(struct devlink_port *devlink_port, ...@@ -367,8 +373,9 @@ void devlink_port_type_eth_set(struct devlink_port *devlink_port,
void devlink_port_type_ib_set(struct devlink_port *devlink_port, void devlink_port_type_ib_set(struct devlink_port *devlink_port,
struct ib_device *ibdev); struct ib_device *ibdev);
void devlink_port_type_clear(struct devlink_port *devlink_port); void devlink_port_type_clear(struct devlink_port *devlink_port);
void devlink_port_split_set(struct devlink_port *devlink_port, void devlink_port_attrs_set(struct devlink_port *devlink_port,
u32 split_group); u32 port_number, bool split,
u32 split_subport_number);
int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
u32 size, u16 ingress_pools_count, u32 size, u16 ingress_pools_count,
u16 egress_pools_count, u16 ingress_tc_count, u16 egress_pools_count, u16 ingress_tc_count,
...@@ -466,8 +473,9 @@ static inline void devlink_port_type_clear(struct devlink_port *devlink_port) ...@@ -466,8 +473,9 @@ static inline void devlink_port_type_clear(struct devlink_port *devlink_port)
{ {
} }
static inline void devlink_port_split_set(struct devlink_port *devlink_port, static inline void devlink_port_attrs_set(struct devlink_port *devlink_port,
u32 split_group) u32 port_number, bool split,
u32 split_subport_number)
{ {
} }
......
...@@ -224,6 +224,9 @@ enum devlink_attr { ...@@ -224,6 +224,9 @@ enum devlink_attr {
DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID, /* u64 */ DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID, /* u64 */
DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */ DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */
DEVLINK_ATTR_PORT_NUMBER, /* u32 */
DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, /* u32 */
/* add new attributes above here, update the policy in devlink.c */ /* add new attributes above here, update the policy in devlink.c */
__DEVLINK_ATTR_MAX, __DEVLINK_ATTR_MAX,
......
...@@ -453,6 +453,25 @@ static void devlink_notify(struct devlink *devlink, enum devlink_command cmd) ...@@ -453,6 +453,25 @@ static void devlink_notify(struct devlink *devlink, enum devlink_command cmd)
msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL); msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL);
} }
static int devlink_nl_port_attrs_put(struct sk_buff *msg,
struct devlink_port *devlink_port)
{
struct devlink_port_attrs *attrs = &devlink_port->attrs;
if (!attrs->set)
return 0;
if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER, attrs->port_number))
return -EMSGSIZE;
if (!attrs->split)
return 0;
if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP, attrs->port_number))
return -EMSGSIZE;
if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER,
attrs->split_subport_number))
return -EMSGSIZE;
return 0;
}
static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
struct devlink_port *devlink_port, struct devlink_port *devlink_port,
enum devlink_command cmd, u32 portid, enum devlink_command cmd, u32 portid,
...@@ -492,9 +511,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink, ...@@ -492,9 +511,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
ibdev->name)) ibdev->name))
goto nla_put_failure; goto nla_put_failure;
} }
if (devlink_port->split && if (devlink_nl_port_attrs_put(msg, devlink_port))
nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP,
devlink_port->split_group))
goto nla_put_failure; goto nla_put_failure;
genlmsg_end(msg, hdr); genlmsg_end(msg, hdr);
...@@ -2971,19 +2988,28 @@ void devlink_port_type_clear(struct devlink_port *devlink_port) ...@@ -2971,19 +2988,28 @@ void devlink_port_type_clear(struct devlink_port *devlink_port)
EXPORT_SYMBOL_GPL(devlink_port_type_clear); EXPORT_SYMBOL_GPL(devlink_port_type_clear);
/** /**
* devlink_port_split_set - Set port is split * devlink_port_attrs_set - Set port attributes
* *
* @devlink_port: devlink port * @devlink_port: devlink port
* @split_group: split group - identifies group split port is part of * @port_number: number of the port that is facing user, for example
* the front panel port number
* @split: indicates if this is split port
* @split_subport_number: if the port is split, this is the number
* of subport.
*/ */
void devlink_port_split_set(struct devlink_port *devlink_port, void devlink_port_attrs_set(struct devlink_port *devlink_port,
u32 split_group) u32 port_number, bool split,
u32 split_subport_number)
{ {
devlink_port->split = true; struct devlink_port_attrs *attrs = &devlink_port->attrs;
devlink_port->split_group = split_group;
attrs->set = true;
attrs->port_number = port_number;
attrs->split = split;
attrs->split_subport_number = split_subport_number;
devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW); devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
} }
EXPORT_SYMBOL_GPL(devlink_port_split_set); EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
u32 size, u16 ingress_pools_count, u32 size, u16 ingress_pools_count,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment