diff options
author | Rony Efraim <ronye@mellanox.com> | 2013-11-07 05:19:51 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-11-07 19:22:47 -0500 |
commit | f0f829bf42cdeb027234a1d0e1e5f62d77380a4d (patch) | |
tree | a34783b75f12d3136073ab3a13dfdf734cfe8fba /drivers/net/ethernet/mellanox/mlx4/cmd.c | |
parent | 571b8b92c7d4cddd899cf19f11f14fb149968898 (diff) |
net/mlx4_core: Add immediate activate for VGT->VST->VGT
Allow immediate activate of VGT->VST and VST->VGT transitions, without
the need of rebinding in mlx4_master_immediate_activate_vlan_qos().
Also in struct res_qp: add qp parameters (vlan_index,fvl,vlan_cntrol..)
to the saved set, in order to restore when move to VGT.
- Clear at mlx4_RST2INIT_QP_wrapper()
- Save at mlx4_INIT2RTR_QP_wrapper()
- Restore at mlx4_vf_immed_vlan_work_handler()
Update mlx4_vf_immed_vlan_work_handler() to support VGT.
Signed-off-by: Rony Efraim <ronye@mellanox.com>
Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Reviewed-by: Hadar Hen Zion <hadarh@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4/cmd.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/cmd.c | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index 7207dcd05759..1e9970d2f0f3 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | |||
@@ -1539,11 +1539,6 @@ out: | |||
1539 | return ret; | 1539 | return ret; |
1540 | } | 1540 | } |
1541 | 1541 | ||
1542 | static int calculate_transition(u16 oper_vlan, u16 admin_vlan) | ||
1543 | { | ||
1544 | return (2 * (oper_vlan == MLX4_VGT) + (admin_vlan == MLX4_VGT)); | ||
1545 | } | ||
1546 | |||
1547 | static int mlx4_master_immediate_activate_vlan_qos(struct mlx4_priv *priv, | 1542 | static int mlx4_master_immediate_activate_vlan_qos(struct mlx4_priv *priv, |
1548 | int slave, int port) | 1543 | int slave, int port) |
1549 | { | 1544 | { |
@@ -1553,7 +1548,6 @@ static int mlx4_master_immediate_activate_vlan_qos(struct mlx4_priv *priv, | |||
1553 | struct mlx4_dev *dev = &(priv->dev); | 1548 | struct mlx4_dev *dev = &(priv->dev); |
1554 | int err; | 1549 | int err; |
1555 | int admin_vlan_ix = NO_INDX; | 1550 | int admin_vlan_ix = NO_INDX; |
1556 | enum mlx4_vlan_transition vlan_trans; | ||
1557 | 1551 | ||
1558 | vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port]; | 1552 | vp_oper = &priv->mfunc.master.vf_oper[slave].vport[port]; |
1559 | vp_admin = &priv->mfunc.master.vf_admin[slave].vport[port]; | 1553 | vp_admin = &priv->mfunc.master.vf_admin[slave].vport[port]; |
@@ -1563,12 +1557,8 @@ static int mlx4_master_immediate_activate_vlan_qos(struct mlx4_priv *priv, | |||
1563 | vp_oper->state.link_state == vp_admin->link_state) | 1557 | vp_oper->state.link_state == vp_admin->link_state) |
1564 | return 0; | 1558 | return 0; |
1565 | 1559 | ||
1566 | vlan_trans = calculate_transition(vp_oper->state.default_vlan, | ||
1567 | vp_admin->default_vlan); | ||
1568 | |||
1569 | if (!(priv->mfunc.master.slave_state[slave].active && | 1560 | if (!(priv->mfunc.master.slave_state[slave].active && |
1570 | dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_UPDATE_QP && | 1561 | dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_UPDATE_QP)) { |
1571 | vlan_trans == MLX4_VLAN_TRANSITION_VST_VST)) { | ||
1572 | /* even if the UPDATE_QP command isn't supported, we still want | 1562 | /* even if the UPDATE_QP command isn't supported, we still want |
1573 | * to set this VF link according to the admin directive | 1563 | * to set this VF link according to the admin directive |
1574 | */ | 1564 | */ |
@@ -1586,15 +1576,19 @@ static int mlx4_master_immediate_activate_vlan_qos(struct mlx4_priv *priv, | |||
1586 | return -ENOMEM; | 1576 | return -ENOMEM; |
1587 | 1577 | ||
1588 | if (vp_oper->state.default_vlan != vp_admin->default_vlan) { | 1578 | if (vp_oper->state.default_vlan != vp_admin->default_vlan) { |
1589 | err = __mlx4_register_vlan(&priv->dev, port, | 1579 | if (MLX4_VGT != vp_admin->default_vlan) { |
1590 | vp_admin->default_vlan, | 1580 | err = __mlx4_register_vlan(&priv->dev, port, |
1591 | &admin_vlan_ix); | 1581 | vp_admin->default_vlan, |
1592 | if (err) { | 1582 | &admin_vlan_ix); |
1593 | kfree(work); | 1583 | if (err) { |
1594 | mlx4_warn((&priv->dev), | 1584 | kfree(work); |
1595 | "No vlan resources slave %d, port %d\n", | 1585 | mlx4_warn((&priv->dev), |
1596 | slave, port); | 1586 | "No vlan resources slave %d, port %d\n", |
1597 | return err; | 1587 | slave, port); |
1588 | return err; | ||
1589 | } | ||
1590 | } else { | ||
1591 | admin_vlan_ix = NO_INDX; | ||
1598 | } | 1592 | } |
1599 | work->flags |= MLX4_VF_IMMED_VLAN_FLAG_VLAN; | 1593 | work->flags |= MLX4_VF_IMMED_VLAN_FLAG_VLAN; |
1600 | mlx4_dbg((&(priv->dev)), | 1594 | mlx4_dbg((&(priv->dev)), |