aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/qlcnic
diff options
context:
space:
mode:
authorManish Chopra <manish.chopra@qlogic.com>2013-07-19 16:56:34 -0400
committerDavid S. Miller <davem@davemloft.net>2013-07-19 20:08:16 -0400
commit2f0a9afaefcedfdb803e1347b0fe429cbd84d525 (patch)
treeb8745b1840e87588fc3b234944cb2b0b49746d80 /drivers/net/ethernet/qlogic/qlcnic
parentb662eca098184184a4d9df09835c3740401fb6a0 (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.c12
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}