Commit 5e823066 authored by Anjali Singhai Jain's avatar Anjali Singhai Jain Committed by Jeff Kirsher

i40e: Re-enable interrupt on ICR0

The hardware can occasionally give an interrupt on the misc
queue for which there is no driver work to do.  In that case
the driver was not re-enabling interrupts even though they
were auto masked by hardware.  This left interrupts disabled
on this queue.

Re-enable the interrupt whenever leaving this function.
Signed-off-by: default avatarAnjali Singhai Jain <anjali.singhai@intel.com>
Signed-off-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: default avatarKavindya Deegala <kavindya.s.deegala@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 54b553e2
...@@ -2758,16 +2758,16 @@ static irqreturn_t i40e_intr(int irq, void *data) ...@@ -2758,16 +2758,16 @@ static irqreturn_t i40e_intr(int irq, void *data)
{ {
struct i40e_pf *pf = (struct i40e_pf *)data; struct i40e_pf *pf = (struct i40e_pf *)data;
struct i40e_hw *hw = &pf->hw; struct i40e_hw *hw = &pf->hw;
irqreturn_t ret = IRQ_NONE;
u32 icr0, icr0_remaining; u32 icr0, icr0_remaining;
u32 val, ena_mask; u32 val, ena_mask;
icr0 = rd32(hw, I40E_PFINT_ICR0); icr0 = rd32(hw, I40E_PFINT_ICR0);
ena_mask = rd32(hw, I40E_PFINT_ICR0_ENA);
/* if sharing a legacy IRQ, we might get called w/o an intr pending */ /* if sharing a legacy IRQ, we might get called w/o an intr pending */
if ((icr0 & I40E_PFINT_ICR0_INTEVENT_MASK) == 0) if ((icr0 & I40E_PFINT_ICR0_INTEVENT_MASK) == 0)
return IRQ_NONE; goto enable_intr;
ena_mask = rd32(hw, I40E_PFINT_ICR0_ENA);
/* if interrupt but no bits showing, must be SWINT */ /* if interrupt but no bits showing, must be SWINT */
if (((icr0 & ~I40E_PFINT_ICR0_INTEVENT_MASK) == 0) || if (((icr0 & ~I40E_PFINT_ICR0_INTEVENT_MASK) == 0) ||
...@@ -2843,7 +2843,9 @@ static irqreturn_t i40e_intr(int irq, void *data) ...@@ -2843,7 +2843,9 @@ static irqreturn_t i40e_intr(int irq, void *data)
} }
ena_mask &= ~icr0_remaining; ena_mask &= ~icr0_remaining;
} }
ret = IRQ_HANDLED;
enable_intr:
/* re-enable interrupt causes */ /* re-enable interrupt causes */
wr32(hw, I40E_PFINT_ICR0_ENA, ena_mask); wr32(hw, I40E_PFINT_ICR0_ENA, ena_mask);
if (!test_bit(__I40E_DOWN, &pf->state)) { if (!test_bit(__I40E_DOWN, &pf->state)) {
...@@ -2851,7 +2853,7 @@ static irqreturn_t i40e_intr(int irq, void *data) ...@@ -2851,7 +2853,7 @@ static irqreturn_t i40e_intr(int irq, void *data)
i40e_irq_dynamic_enable_icr0(pf); i40e_irq_dynamic_enable_icr0(pf);
} }
return IRQ_HANDLED; return ret;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment