aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/i40evf/i40evf_main.c
diff options
context:
space:
mode:
authorMitch Williams <mitch.a.williams@intel.com>2014-06-04 04:45:19 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-07-02 22:02:19 -0400
commit164ec1bfa13d34834a72b2ace3ecb521234f444f (patch)
treefef205968d621147fc1e62105a526d36ac4f49ab /drivers/net/ethernet/intel/i40evf/i40evf_main.c
parent56497978bcbcde7a310ebaf2b67a936c66397593 (diff)
i40evf: invite vector 0 to the interrupt party
The i40evf_irq_enable and i40evf_fire_sw_interrupt functions were unfairly discriminating against MSI-X vector 0, just because it doesn't handle traffic. That doesn't mean it's not essential to the operation of the driver. This change allows the watchdog to fire vector 0 via software, which makes the driver tolerant of dropped interrupts on that vector. Buck up, vector 0! You can be part of our gang! Change-ID: I37131d955018a6b3e711e1732d21428acd0d767e Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> Tested-by: Jim Young <jamesx.m.young@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/i40evf/i40evf_main.c')
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40evf_main.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
index 5f29e58bf5ea..6186149a279e 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
@@ -260,6 +260,12 @@ static void i40evf_fire_sw_int(struct i40evf_adapter *adapter,
260 int i; 260 int i;
261 uint32_t dyn_ctl; 261 uint32_t dyn_ctl;
262 262
263 if (mask & 1) {
264 dyn_ctl = rd32(hw, I40E_VFINT_DYN_CTL01);
265 dyn_ctl |= I40E_VFINT_DYN_CTLN_SWINT_TRIG_MASK |
266 I40E_VFINT_DYN_CTLN_CLEARPBA_MASK;
267 wr32(hw, I40E_VFINT_DYN_CTL01, dyn_ctl);
268 }
263 for (i = 1; i < adapter->num_msix_vectors; i++) { 269 for (i = 1; i < adapter->num_msix_vectors; i++) {
264 if (mask & (1 << i)) { 270 if (mask & (1 << i)) {
265 dyn_ctl = rd32(hw, I40E_VFINT_DYN_CTLN1(i - 1)); 271 dyn_ctl = rd32(hw, I40E_VFINT_DYN_CTLN1(i - 1));
@@ -278,6 +284,7 @@ void i40evf_irq_enable(struct i40evf_adapter *adapter, bool flush)
278{ 284{
279 struct i40e_hw *hw = &adapter->hw; 285 struct i40e_hw *hw = &adapter->hw;
280 286
287 i40evf_misc_irq_enable(adapter);
281 i40evf_irq_enable_queues(adapter, ~0); 288 i40evf_irq_enable_queues(adapter, ~0);
282 289
283 if (flush) 290 if (flush)