diff options
author | Shannon Nelson <shannon.nelson@intel.com> | 2013-09-28 03:13:59 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2013-10-22 09:23:00 -0400 |
commit | 116a57d4ae92729b343d6ebb4a1eec24672022ab (patch) | |
tree | 0cff70aede2d1786c1f8963e2735cd61fb871400 /drivers/net/ethernet/intel/i40e | |
parent | eaefbd06ede2f4c2d83b5d9addb111c254b265f9 (diff) |
i40e: tweaking icr0 handling for legacy irq
Fix the overactive irq issue seen in testing and allow use of
the legacy interrupt.
Signed-off-by: Shannon Nelson <shannon.nelson@intel.com>
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Kavindya Deegala <kavindya.s.deegala@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/i40e')
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 12 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_txrx.c | 3 |
3 files changed, 8 insertions, 8 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index c06a76ca9aaa..49572dcdba87 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h | |||
@@ -545,6 +545,7 @@ static inline void i40e_dbg_init(void) {} | |||
545 | static inline void i40e_dbg_exit(void) {} | 545 | static inline void i40e_dbg_exit(void) {} |
546 | #endif /* CONFIG_DEBUG_FS*/ | 546 | #endif /* CONFIG_DEBUG_FS*/ |
547 | void i40e_irq_dynamic_enable(struct i40e_vsi *vsi, int vector); | 547 | void i40e_irq_dynamic_enable(struct i40e_vsi *vsi, int vector); |
548 | void i40e_irq_dynamic_enable_icr0(struct i40e_pf *pf); | ||
548 | int i40e_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); | 549 | int i40e_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); |
549 | void i40e_vlan_stripping_disable(struct i40e_vsi *vsi); | 550 | void i40e_vlan_stripping_disable(struct i40e_vsi *vsi); |
550 | int i40e_vsi_add_vlan(struct i40e_vsi *vsi, s16 vid); | 551 | int i40e_vsi_add_vlan(struct i40e_vsi *vsi, s16 vid); |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 270190ad7faa..727d14df89ce 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | |||
@@ -2532,7 +2532,7 @@ static void i40e_configure_msi_and_legacy(struct i40e_vsi *vsi) | |||
2532 | * i40e_irq_dynamic_enable_icr0 - Enable default interrupt generation for icr0 | 2532 | * i40e_irq_dynamic_enable_icr0 - Enable default interrupt generation for icr0 |
2533 | * @pf: board private structure | 2533 | * @pf: board private structure |
2534 | **/ | 2534 | **/ |
2535 | static void i40e_irq_dynamic_enable_icr0(struct i40e_pf *pf) | 2535 | void i40e_irq_dynamic_enable_icr0(struct i40e_pf *pf) |
2536 | { | 2536 | { |
2537 | struct i40e_hw *hw = &pf->hw; | 2537 | struct i40e_hw *hw = &pf->hw; |
2538 | u32 val; | 2538 | u32 val; |
@@ -2742,14 +2742,14 @@ static irqreturn_t i40e_intr(int irq, void *data) | |||
2742 | 2742 | ||
2743 | icr0 = rd32(hw, I40E_PFINT_ICR0); | 2743 | icr0 = rd32(hw, I40E_PFINT_ICR0); |
2744 | 2744 | ||
2745 | /* if sharing a legacy IRQ, we might get called w/o an intr pending */ | ||
2746 | if ((icr0 & I40E_PFINT_ICR0_INTEVENT_MASK) == 0) | ||
2747 | return IRQ_NONE; | ||
2748 | |||
2749 | val = rd32(hw, I40E_PFINT_DYN_CTL0); | 2745 | val = rd32(hw, I40E_PFINT_DYN_CTL0); |
2750 | val = val | I40E_PFINT_DYN_CTL0_CLEARPBA_MASK; | 2746 | val = val | I40E_PFINT_DYN_CTL0_CLEARPBA_MASK; |
2751 | wr32(hw, I40E_PFINT_DYN_CTL0, val); | 2747 | wr32(hw, I40E_PFINT_DYN_CTL0, val); |
2752 | 2748 | ||
2749 | /* if sharing a legacy IRQ, we might get called w/o an intr pending */ | ||
2750 | if ((icr0 & I40E_PFINT_ICR0_INTEVENT_MASK) == 0) | ||
2751 | return IRQ_NONE; | ||
2752 | |||
2753 | ena_mask = rd32(hw, I40E_PFINT_ICR0_ENA); | 2753 | ena_mask = rd32(hw, I40E_PFINT_ICR0_ENA); |
2754 | 2754 | ||
2755 | /* only q0 is used in MSI/Legacy mode, and none are used in MSIX */ | 2755 | /* only q0 is used in MSI/Legacy mode, and none are used in MSIX */ |
@@ -2763,7 +2763,6 @@ static irqreturn_t i40e_intr(int irq, void *data) | |||
2763 | qval = rd32(hw, I40E_QINT_TQCTL(0)); | 2763 | qval = rd32(hw, I40E_QINT_TQCTL(0)); |
2764 | qval &= ~I40E_QINT_TQCTL_CAUSE_ENA_MASK; | 2764 | qval &= ~I40E_QINT_TQCTL_CAUSE_ENA_MASK; |
2765 | wr32(hw, I40E_QINT_TQCTL(0), qval); | 2765 | wr32(hw, I40E_QINT_TQCTL(0), qval); |
2766 | i40e_flush(hw); | ||
2767 | 2766 | ||
2768 | if (!test_bit(__I40E_DOWN, &pf->state)) | 2767 | if (!test_bit(__I40E_DOWN, &pf->state)) |
2769 | napi_schedule(&pf->vsi[pf->lan_vsi]->q_vectors[0]->napi); | 2768 | napi_schedule(&pf->vsi[pf->lan_vsi]->q_vectors[0]->napi); |
@@ -2825,7 +2824,6 @@ static irqreturn_t i40e_intr(int irq, void *data) | |||
2825 | 2824 | ||
2826 | /* re-enable interrupt causes */ | 2825 | /* re-enable interrupt causes */ |
2827 | wr32(hw, I40E_PFINT_ICR0_ENA, ena_mask); | 2826 | wr32(hw, I40E_PFINT_ICR0_ENA, ena_mask); |
2828 | i40e_flush(hw); | ||
2829 | if (!test_bit(__I40E_DOWN, &pf->state)) { | 2827 | if (!test_bit(__I40E_DOWN, &pf->state)) { |
2830 | i40e_service_event_schedule(pf); | 2828 | i40e_service_event_schedule(pf); |
2831 | i40e_irq_dynamic_enable_icr0(pf); | 2829 | i40e_irq_dynamic_enable_icr0(pf); |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index 41be7a7c5ffa..f1f03bc5c729 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c | |||
@@ -1142,7 +1142,8 @@ int i40e_napi_poll(struct napi_struct *napi, int budget) | |||
1142 | qval = rd32(hw, I40E_QINT_TQCTL(0)); | 1142 | qval = rd32(hw, I40E_QINT_TQCTL(0)); |
1143 | qval |= I40E_QINT_TQCTL_CAUSE_ENA_MASK; | 1143 | qval |= I40E_QINT_TQCTL_CAUSE_ENA_MASK; |
1144 | wr32(hw, I40E_QINT_TQCTL(0), qval); | 1144 | wr32(hw, I40E_QINT_TQCTL(0), qval); |
1145 | i40e_flush(hw); | 1145 | |
1146 | i40e_irq_dynamic_enable_icr0(vsi->back); | ||
1146 | } | 1147 | } |
1147 | } | 1148 | } |
1148 | 1149 | ||