diff options
author | Manish Chopra <manish.chopra@qlogic.com> | 2013-07-19 16:56:34 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-07-19 20:08:16 -0400 |
commit | 2f0a9afaefcedfdb803e1347b0fe429cbd84d525 (patch) | |
tree | b8745b1840e87588fc3b234944cb2b0b49746d80 /drivers/net/ethernet/qlogic/qlcnic | |
parent | b662eca098184184a4d9df09835c3740401fb6a0 (diff) |
qlcnic: Fix guest VLAN
o Clear cached vport vlan variable(vp->vlan) in PF on PCI FLR and
back-channel termination which will allow to configure guest VLAN
on VF after force off/shut down the guest VM.
Signed-off-by: Manish Chopra <manish.chopra@qlogic.com>
Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlcnic')
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c index b9b88f3a7b51..46aeb593fd52 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | |||
@@ -635,10 +635,12 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans, | |||
635 | struct qlcnic_cmd_args *cmd) | 635 | struct qlcnic_cmd_args *cmd) |
636 | { | 636 | { |
637 | struct qlcnic_vf_info *vf = trans->vf; | 637 | struct qlcnic_vf_info *vf = trans->vf; |
638 | struct qlcnic_adapter *adapter = vf->adapter; | 638 | struct qlcnic_vport *vp = vf->vp; |
639 | int err; | 639 | struct qlcnic_adapter *adapter; |
640 | u16 func = vf->pci_func; | 640 | u16 func = vf->pci_func; |
641 | int err; | ||
641 | 642 | ||
643 | adapter = vf->adapter; | ||
642 | cmd->rsp.arg[0] = trans->req_hdr->cmd_op; | 644 | cmd->rsp.arg[0] = trans->req_hdr->cmd_op; |
643 | cmd->rsp.arg[0] |= (1 << 16); | 645 | cmd->rsp.arg[0] |= (1 << 16); |
644 | 646 | ||
@@ -650,6 +652,8 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans, | |||
650 | qlcnic_sriov_pf_config_vport(adapter, 0, func); | 652 | qlcnic_sriov_pf_config_vport(adapter, 0, func); |
651 | } | 653 | } |
652 | } else { | 654 | } else { |
655 | if (vp->vlan_mode == QLC_GUEST_VLAN_MODE) | ||
656 | vp->vlan = 0; | ||
653 | err = qlcnic_sriov_pf_config_vport(adapter, 0, func); | 657 | err = qlcnic_sriov_pf_config_vport(adapter, 0, func); |
654 | } | 658 | } |
655 | 659 | ||
@@ -1561,6 +1565,7 @@ void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov, | |||
1561 | struct qlcnic_vf_info *vf) | 1565 | struct qlcnic_vf_info *vf) |
1562 | { | 1566 | { |
1563 | struct net_device *dev = vf->adapter->netdev; | 1567 | struct net_device *dev = vf->adapter->netdev; |
1568 | struct qlcnic_vport *vp = vf->vp; | ||
1564 | 1569 | ||
1565 | if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) { | 1570 | if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) { |
1566 | clear_bit(QLC_BC_VF_FLR, &vf->state); | 1571 | clear_bit(QLC_BC_VF_FLR, &vf->state); |
@@ -1573,6 +1578,9 @@ void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov, | |||
1573 | return; | 1578 | return; |
1574 | } | 1579 | } |
1575 | 1580 | ||
1581 | if (vp->vlan_mode == QLC_GUEST_VLAN_MODE) | ||
1582 | vp->vlan = 0; | ||
1583 | |||
1576 | qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr); | 1584 | qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr); |
1577 | netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func); | 1585 | netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func); |
1578 | } | 1586 | } |