net/mlx4_core: Fix register/unreg vlan flow
The reg/unreg vlan code was broken: 1. a wrapped function called another wrapped function, causing a deadlock. 2. unregister_vlan called cmd_box instead of cmd_box_imm, leading to incorrectly passed parameters. Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
3b4c5cbf42
commit
162226a1dc
@@ -284,7 +284,7 @@ static int mlx4_set_port_vlan_table(struct mlx4_dev *dev, u8 port,
|
|||||||
memcpy(mailbox->buf, entries, MLX4_VLAN_TABLE_SIZE);
|
memcpy(mailbox->buf, entries, MLX4_VLAN_TABLE_SIZE);
|
||||||
in_mod = MLX4_SET_PORT_VLAN_TABLE << 8 | port;
|
in_mod = MLX4_SET_PORT_VLAN_TABLE << 8 | port;
|
||||||
err = mlx4_cmd(dev, mailbox->dma, in_mod, 1, MLX4_CMD_SET_PORT,
|
err = mlx4_cmd(dev, mailbox->dma, in_mod, 1, MLX4_CMD_SET_PORT,
|
||||||
MLX4_CMD_TIME_CLASS_B, MLX4_CMD_WRAPPED);
|
MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE);
|
||||||
|
|
||||||
mlx4_free_cmd_mailbox(dev, mailbox);
|
mlx4_free_cmd_mailbox(dev, mailbox);
|
||||||
|
|
||||||
@@ -370,6 +370,9 @@ int mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index)
|
|||||||
u64 out_param = 0;
|
u64 out_param = 0;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (vlan > 4095)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (mlx4_is_mfunc(dev)) {
|
if (mlx4_is_mfunc(dev)) {
|
||||||
set_param_l(&out_param, port);
|
set_param_l(&out_param, port);
|
||||||
err = mlx4_cmd_imm(dev, vlan, &out_param, RES_VLAN,
|
err = mlx4_cmd_imm(dev, vlan, &out_param, RES_VLAN,
|
||||||
@@ -412,18 +415,14 @@ out:
|
|||||||
|
|
||||||
void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index)
|
void mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, int index)
|
||||||
{
|
{
|
||||||
u64 in_param = 0;
|
u64 out_param = 0;
|
||||||
int err;
|
|
||||||
|
|
||||||
if (mlx4_is_mfunc(dev)) {
|
if (mlx4_is_mfunc(dev)) {
|
||||||
set_param_l(&in_param, port);
|
set_param_l(&out_param, port);
|
||||||
err = mlx4_cmd(dev, in_param, RES_VLAN, RES_OP_RESERVE_AND_MAP,
|
(void) mlx4_cmd_imm(dev, index, &out_param, RES_VLAN,
|
||||||
MLX4_CMD_FREE_RES, MLX4_CMD_TIME_CLASS_A,
|
RES_OP_RESERVE_AND_MAP,
|
||||||
MLX4_CMD_WRAPPED);
|
MLX4_CMD_FREE_RES, MLX4_CMD_TIME_CLASS_A,
|
||||||
if (!err)
|
MLX4_CMD_WRAPPED);
|
||||||
mlx4_warn(dev, "Failed freeing vlan at index:%d\n",
|
|
||||||
index);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
__mlx4_unregister_vlan(dev, port, index);
|
__mlx4_unregister_vlan(dev, port, index);
|
||||||
|
Reference in New Issue
Block a user