Commit 82041634 authored by Parav Pandit's avatar Parav Pandit Committed by Saeed Mahameed

net/mlx5: SF, Fix show state inactive when its inactivated

When a SF is inactivated and when it is in a TEARDOWN_REQUEST
state, driver still returns its state as active. This is incorrect.
Fix it by treating TEARDOWN_REQEUST as inactive state. When a SF
is still attached to the driver, on user request to reactivate EINVAL
error is returned. Inform user about it with better code EBUSY and
informative error message.

Fixes: 6a327321 ("net/mlx5: SF, Port function state change support")
Signed-off-by: default avatarParav Pandit <parav@nvidia.com>
Reviewed-by: default avatarVu Pham <vuhuong@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent fca08661
...@@ -136,10 +136,10 @@ static enum devlink_port_fn_state mlx5_sf_to_devlink_state(u8 hw_state) ...@@ -136,10 +136,10 @@ static enum devlink_port_fn_state mlx5_sf_to_devlink_state(u8 hw_state)
switch (hw_state) { switch (hw_state) {
case MLX5_VHCA_STATE_ACTIVE: case MLX5_VHCA_STATE_ACTIVE:
case MLX5_VHCA_STATE_IN_USE: case MLX5_VHCA_STATE_IN_USE:
case MLX5_VHCA_STATE_TEARDOWN_REQUEST:
return DEVLINK_PORT_FN_STATE_ACTIVE; return DEVLINK_PORT_FN_STATE_ACTIVE;
case MLX5_VHCA_STATE_INVALID: case MLX5_VHCA_STATE_INVALID:
case MLX5_VHCA_STATE_ALLOCATED: case MLX5_VHCA_STATE_ALLOCATED:
case MLX5_VHCA_STATE_TEARDOWN_REQUEST:
default: default:
return DEVLINK_PORT_FN_STATE_INACTIVE; return DEVLINK_PORT_FN_STATE_INACTIVE;
} }
...@@ -192,14 +192,17 @@ int mlx5_devlink_sf_port_fn_state_get(struct devlink *devlink, struct devlink_po ...@@ -192,14 +192,17 @@ int mlx5_devlink_sf_port_fn_state_get(struct devlink *devlink, struct devlink_po
return err; return err;
} }
static int mlx5_sf_activate(struct mlx5_core_dev *dev, struct mlx5_sf *sf) static int mlx5_sf_activate(struct mlx5_core_dev *dev, struct mlx5_sf *sf,
struct netlink_ext_ack *extack)
{ {
int err; int err;
if (mlx5_sf_is_active(sf)) if (mlx5_sf_is_active(sf))
return 0; return 0;
if (sf->hw_state != MLX5_VHCA_STATE_ALLOCATED) if (sf->hw_state != MLX5_VHCA_STATE_ALLOCATED) {
return -EINVAL; NL_SET_ERR_MSG_MOD(extack, "SF is inactivated but it is still attached");
return -EBUSY;
}
err = mlx5_cmd_sf_enable_hca(dev, sf->hw_fn_id); err = mlx5_cmd_sf_enable_hca(dev, sf->hw_fn_id);
if (err) if (err)
...@@ -226,7 +229,8 @@ static int mlx5_sf_deactivate(struct mlx5_core_dev *dev, struct mlx5_sf *sf) ...@@ -226,7 +229,8 @@ static int mlx5_sf_deactivate(struct mlx5_core_dev *dev, struct mlx5_sf *sf)
static int mlx5_sf_state_set(struct mlx5_core_dev *dev, struct mlx5_sf_table *table, static int mlx5_sf_state_set(struct mlx5_core_dev *dev, struct mlx5_sf_table *table,
struct mlx5_sf *sf, struct mlx5_sf *sf,
enum devlink_port_fn_state state) enum devlink_port_fn_state state,
struct netlink_ext_ack *extack)
{ {
int err = 0; int err = 0;
...@@ -234,7 +238,7 @@ static int mlx5_sf_state_set(struct mlx5_core_dev *dev, struct mlx5_sf_table *ta ...@@ -234,7 +238,7 @@ static int mlx5_sf_state_set(struct mlx5_core_dev *dev, struct mlx5_sf_table *ta
if (state == mlx5_sf_to_devlink_state(sf->hw_state)) if (state == mlx5_sf_to_devlink_state(sf->hw_state))
goto out; goto out;
if (state == DEVLINK_PORT_FN_STATE_ACTIVE) if (state == DEVLINK_PORT_FN_STATE_ACTIVE)
err = mlx5_sf_activate(dev, sf); err = mlx5_sf_activate(dev, sf, extack);
else if (state == DEVLINK_PORT_FN_STATE_INACTIVE) else if (state == DEVLINK_PORT_FN_STATE_INACTIVE)
err = mlx5_sf_deactivate(dev, sf); err = mlx5_sf_deactivate(dev, sf);
else else
...@@ -265,7 +269,7 @@ int mlx5_devlink_sf_port_fn_state_set(struct devlink *devlink, struct devlink_po ...@@ -265,7 +269,7 @@ int mlx5_devlink_sf_port_fn_state_set(struct devlink *devlink, struct devlink_po
goto out; goto out;
} }
err = mlx5_sf_state_set(dev, table, sf, state); err = mlx5_sf_state_set(dev, table, sf, state, extack);
out: out:
mlx5_sf_table_put(table); mlx5_sf_table_put(table);
return err; return err;
......
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