diff options
author | Mitch Williams <mitch.a.williams@intel.com> | 2014-06-04 04:45:19 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2014-07-02 22:02:19 -0400 |
commit | 164ec1bfa13d34834a72b2ace3ecb521234f444f (patch) | |
tree | fef205968d621147fc1e62105a526d36ac4f49ab /drivers/net/ethernet/intel/i40evf/i40evf_main.c | |
parent | 56497978bcbcde7a310ebaf2b67a936c66397593 (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.c | 7 |
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) |