aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/i40e
diff options
context:
space:
mode:
authorShannon Nelson <shannon.nelson@intel.com>2013-09-28 03:13:59 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-10-22 09:23:00 -0400
commit116a57d4ae92729b343d6ebb4a1eec24672022ab (patch)
tree0cff70aede2d1786c1f8963e2735cd61fb871400 /drivers/net/ethernet/intel/i40e
parenteaefbd06ede2f4c2d83b5d9addb111c254b265f9 (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.h1
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_main.c12
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_txrx.c3
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) {}
545static inline void i40e_dbg_exit(void) {} 545static inline void i40e_dbg_exit(void) {}
546#endif /* CONFIG_DEBUG_FS*/ 546#endif /* CONFIG_DEBUG_FS*/
547void i40e_irq_dynamic_enable(struct i40e_vsi *vsi, int vector); 547void i40e_irq_dynamic_enable(struct i40e_vsi *vsi, int vector);
548void i40e_irq_dynamic_enable_icr0(struct i40e_pf *pf);
548int i40e_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); 549int i40e_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
549void i40e_vlan_stripping_disable(struct i40e_vsi *vsi); 550void i40e_vlan_stripping_disable(struct i40e_vsi *vsi);
550int i40e_vsi_add_vlan(struct i40e_vsi *vsi, s16 vid); 551int 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 **/
2535static void i40e_irq_dynamic_enable_icr0(struct i40e_pf *pf) 2535void 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