i40e: acknowledge VFLR when disabling SR-IOV
authorMitch Williams <mitch.a.williams@intel.com>
Thu, 28 Nov 2013 06:39:40 +0000 (06:39 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Mon, 6 Jan 2014 10:39:10 +0000 (02:39 -0800)
When SR-IOV is disabled, the (now nonexistent) virtual function
devices undergo a VFLR event. We don't need to handle this event
because the VFs are gone, but we do need to tell the HW that they are
complete. This fixes an issue with a phantom VFLR and broken VFs when
SR-IOV is re-enabled.

Change-Id: I7580b49ded0158172a85b14661ec212af77000c8
Signed-off-by: Mitch Williams <mitch.a.williams@intel.com>
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Sibai Li <sibai.li@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c

index f92404c8646e48356958bdbbf6d1361d6e8ee362..e91f9d73dc4834c182379f190833ae3ec48a84dd 100644 (file)
@@ -726,7 +726,9 @@ static bool i40e_vfs_are_assigned(struct i40e_pf *pf)
  **/
 void i40e_free_vfs(struct i40e_pf *pf)
 {
-       int i, tmp;
+       struct i40e_hw *hw = &pf->hw;
+       u32 reg_idx, bit_idx;
+       int i, tmp, vf_id;
 
        if (!pf->vf)
                return;
@@ -748,8 +750,17 @@ void i40e_free_vfs(struct i40e_pf *pf)
        kfree(pf->vf);
        pf->vf = NULL;
 
-       if (!i40e_vfs_are_assigned(pf))
+       if (!i40e_vfs_are_assigned(pf)) {
                pci_disable_sriov(pf->pdev);
+               /* Acknowledge VFLR for all VFS. Without this, VFs will fail to
+                * work correctly when SR-IOV gets re-enabled.
+                */
+               for (vf_id = 0; vf_id < tmp; vf_id++) {
+                       reg_idx = (hw->func_caps.vf_base_id + vf_id) / 32;
+                       bit_idx = (hw->func_caps.vf_base_id + vf_id) % 32;
+                       wr32(hw, I40E_GLGEN_VFLRSTAT(reg_idx), (1 << bit_idx));
+               }
+       }
        else
                dev_warn(&pf->pdev->dev,
                         "unable to disable SR-IOV because VFs are assigned.\n");