| From 42a45ef3d7d3d61b3950be7c4cb7e29b30af6082 Mon Sep 17 00:00:00 2001 |
| From: Jack Morgenstein <jackm@dev.mellanox.co.il> |
| Date: Mon, 16 Jan 2017 18:31:38 +0200 |
| Subject: [PATCH] net/mlx4_core: Fix when to save some qp context flags for |
| dynamic VST to VGT transitions |
| |
| commit 7c3945bc2073554bb2ecf983e073dee686679c53 upstream. |
| |
| Save the qp context flags byte containing the flag disabling vlan stripping |
| in the RESET to INIT qp transition, rather than in the INIT to RTR |
| transition. Per the firmware spec, the flags in this byte are active |
| in the RESET to INIT transition. |
| |
| As a result of saving the flags in the incorrect qp transition, when |
| switching dynamically from VGT to VST and back to VGT, the vlan |
| remained stripped (as is required for VST) and did not return to |
| not-stripped (as is required for VGT). |
| |
| Fixes: f0f829bf42cd ("net/mlx4_core: Add immediate activate for VGT->VST->VGT") |
| Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> |
| Signed-off-by: Tariq Toukan <tariqt@mellanox.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c |
| index 8b81114bdc72..8fd47ab39237 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c |
| +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c |
| @@ -2963,6 +2963,9 @@ int mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave, |
| put_res(dev, slave, srqn, RES_SRQ); |
| qp->srq = srq; |
| } |
| + |
| + /* Save param3 for dynamic changes from VST back to VGT */ |
| + qp->param3 = qpc->param3; |
| put_res(dev, slave, rcqn, RES_CQ); |
| put_res(dev, slave, mtt_base, RES_MTT); |
| res_end_move(dev, slave, RES_QP, qpn); |
| @@ -3755,7 +3758,6 @@ int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave, |
| int qpn = vhcr->in_modifier & 0x7fffff; |
| struct res_qp *qp; |
| u8 orig_sched_queue; |
| - __be32 orig_param3 = qpc->param3; |
| u8 orig_vlan_control = qpc->pri_path.vlan_control; |
| u8 orig_fvl_rx = qpc->pri_path.fvl_rx; |
| u8 orig_pri_path_fl = qpc->pri_path.fl; |
| @@ -3797,7 +3799,6 @@ out: |
| */ |
| if (!err) { |
| qp->sched_queue = orig_sched_queue; |
| - qp->param3 = orig_param3; |
| qp->vlan_control = orig_vlan_control; |
| qp->fvl_rx = orig_fvl_rx; |
| qp->pri_path_fl = orig_pri_path_fl; |
| -- |
| 2.12.0 |
| |