fm10k: re-map all possible VF queues after a VFLR
authorJacob Keller <jacob.e.keller@intel.com>
Wed, 3 Jun 2015 23:31:08 +0000 (16:31 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 17 Jun 2015 21:21:18 +0000 (14:21 -0700)
During initialization, the VF counts its rings by walking the TQDLOC
registers. This works only if the TQMAP/RQMAP registers are set to map
all of the out-of-bound rings back to the first one. This allows the VF
to cleanly detect when it has run out of queues. Update the PF code so
that it resets the empty TQMAP/RQMAP registers post-VFLR to prevent
innocent VF drivers from triggering malicious driver events.

Signed-off-by: Matthew Vick <matthew.vick@intel.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Krishneil Singh <Krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/fm10k/fm10k_pf.c

index 891e21874b2a164fb329a0697129d432c8ebc04f..49c8ad6476804782f368aeac7f4ee7621b1a2b5e 100644 (file)
@@ -1046,6 +1046,12 @@ static s32 fm10k_iov_reset_resources_pf(struct fm10k_hw *hw,
                fm10k_write_reg(hw, FM10K_RQMAP(qmap_idx + i), vf_q_idx + i);
        }
 
+       /* repeat the first ring for all the remaining VF rings */
+       for (i = queues_per_pool; i < qmap_stride; i++) {
+               fm10k_write_reg(hw, FM10K_TQMAP(qmap_idx + i), vf_q_idx);
+               fm10k_write_reg(hw, FM10K_RQMAP(qmap_idx + i), vf_q_idx);
+       }
+
        return 0;
 }