Skip to content

Commit 45bf3b7

Browse files
Jiri Pirkodavem330
Jiri Pirko
authored andcommitted
mlxsw: core: Extend driver ops by remove selected ports op
In case of line card implementation, the core has to have a way to remove relevant ports manually. Extend the Spectrum driver ops by an op that implements port removal of selected ports upon request. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: Ido Schimmel <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ee7a70f commit 45bf3b7

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

drivers/net/ethernet/mellanox/mlxsw/core.c

+9
Original file line numberDiff line numberDiff line change
@@ -3143,6 +3143,15 @@ bool mlxsw_core_port_is_xm(const struct mlxsw_core *mlxsw_core, u16 local_port)
31433143
}
31443144
EXPORT_SYMBOL(mlxsw_core_port_is_xm);
31453145

3146+
void mlxsw_core_ports_remove_selected(struct mlxsw_core *mlxsw_core,
3147+
bool (*selector)(void *priv, u16 local_port),
3148+
void *priv)
3149+
{
3150+
if (WARN_ON_ONCE(!mlxsw_core->driver->ports_remove_selected))
3151+
return;
3152+
mlxsw_core->driver->ports_remove_selected(mlxsw_core, selector, priv);
3153+
}
3154+
31463155
struct mlxsw_env *mlxsw_core_env(const struct mlxsw_core *mlxsw_core)
31473156
{
31483157
return mlxsw_core->env;

drivers/net/ethernet/mellanox/mlxsw/core.h

+8
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ struct devlink_port *
258258
mlxsw_core_port_devlink_port_get(struct mlxsw_core *mlxsw_core,
259259
u16 local_port);
260260
bool mlxsw_core_port_is_xm(const struct mlxsw_core *mlxsw_core, u16 local_port);
261+
void mlxsw_core_ports_remove_selected(struct mlxsw_core *mlxsw_core,
262+
bool (*selector)(void *priv,
263+
u16 local_port),
264+
void *priv);
261265
struct mlxsw_env *mlxsw_core_env(const struct mlxsw_core *mlxsw_core);
262266

263267
int mlxsw_core_schedule_dw(struct delayed_work *dwork, unsigned long delay);
@@ -331,6 +335,10 @@ struct mlxsw_driver {
331335
unsigned int count, struct netlink_ext_ack *extack);
332336
int (*port_unsplit)(struct mlxsw_core *mlxsw_core, u16 local_port,
333337
struct netlink_ext_ack *extack);
338+
void (*ports_remove_selected)(struct mlxsw_core *mlxsw_core,
339+
bool (*selector)(void *priv,
340+
u16 local_port),
341+
void *priv);
334342
int (*sb_pool_get)(struct mlxsw_core *mlxsw_core,
335343
unsigned int sb_index, u16 pool_index,
336344
struct devlink_sb_pool_info *pool_info);

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

+17
Original file line numberDiff line numberDiff line change
@@ -1999,6 +1999,20 @@ static void mlxsw_sp_ports_remove(struct mlxsw_sp *mlxsw_sp)
19991999
mlxsw_sp->ports = NULL;
20002000
}
20012001

2002+
static void
2003+
mlxsw_sp_ports_remove_selected(struct mlxsw_core *mlxsw_core,
2004+
bool (*selector)(void *priv, u16 local_port),
2005+
void *priv)
2006+
{
2007+
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
2008+
unsigned int max_ports = mlxsw_core_max_ports(mlxsw_core);
2009+
int i;
2010+
2011+
for (i = 1; i < max_ports; i++)
2012+
if (mlxsw_sp_port_created(mlxsw_sp, i) && selector(priv, i))
2013+
mlxsw_sp_port_remove(mlxsw_sp, i);
2014+
}
2015+
20022016
static int mlxsw_sp_ports_create(struct mlxsw_sp *mlxsw_sp)
20032017
{
20042018
unsigned int max_ports = mlxsw_core_max_ports(mlxsw_sp->core);
@@ -3785,6 +3799,7 @@ static struct mlxsw_driver mlxsw_sp2_driver = {
37853799
.fini = mlxsw_sp_fini,
37863800
.port_split = mlxsw_sp_port_split,
37873801
.port_unsplit = mlxsw_sp_port_unsplit,
3802+
.ports_remove_selected = mlxsw_sp_ports_remove_selected,
37883803
.sb_pool_get = mlxsw_sp_sb_pool_get,
37893804
.sb_pool_set = mlxsw_sp_sb_pool_set,
37903805
.sb_port_pool_get = mlxsw_sp_sb_port_pool_get,
@@ -3822,6 +3837,7 @@ static struct mlxsw_driver mlxsw_sp3_driver = {
38223837
.fini = mlxsw_sp_fini,
38233838
.port_split = mlxsw_sp_port_split,
38243839
.port_unsplit = mlxsw_sp_port_unsplit,
3840+
.ports_remove_selected = mlxsw_sp_ports_remove_selected,
38253841
.sb_pool_get = mlxsw_sp_sb_pool_get,
38263842
.sb_pool_set = mlxsw_sp_sb_pool_set,
38273843
.sb_port_pool_get = mlxsw_sp_sb_port_pool_get,
@@ -3857,6 +3873,7 @@ static struct mlxsw_driver mlxsw_sp4_driver = {
38573873
.fini = mlxsw_sp_fini,
38583874
.port_split = mlxsw_sp_port_split,
38593875
.port_unsplit = mlxsw_sp_port_unsplit,
3876+
.ports_remove_selected = mlxsw_sp_ports_remove_selected,
38603877
.sb_pool_get = mlxsw_sp_sb_pool_get,
38613878
.sb_pool_set = mlxsw_sp_sb_pool_set,
38623879
.sb_port_pool_get = mlxsw_sp_sb_port_pool_get,

0 commit comments

Comments
 (0)