i40e/i40evf: always set the CLEARPBA flag when re-enabling interrupts
In the past we changed driver behavior to not clear the PBA when
re-enabling interrupts. This change was motivated by the flawed belief
that clearing the PBA would cause a lost interrupt if a receive
interrupt occurred while interrupts were disabled.
According to empirical testing this isn't the case. Additionally, the
data sheet specifically says that we should set the CLEARPBA bit when
re-enabling interrupts in a polling setup.
This reverts commit 40d72a5098 ("i40e/i40evf: don't lose interrupts")
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
committed by
Jeff Kirsher
parent
4270255929
commit
dbadbbe235
@@ -3403,15 +3403,14 @@ void i40e_irq_dynamic_disable_icr0(struct i40e_pf *pf)
|
||||
/**
|
||||
* i40e_irq_dynamic_enable_icr0 - Enable default interrupt generation for icr0
|
||||
* @pf: board private structure
|
||||
* @clearpba: true when all pending interrupt events should be cleared
|
||||
**/
|
||||
void i40e_irq_dynamic_enable_icr0(struct i40e_pf *pf, bool clearpba)
|
||||
void i40e_irq_dynamic_enable_icr0(struct i40e_pf *pf)
|
||||
{
|
||||
struct i40e_hw *hw = &pf->hw;
|
||||
u32 val;
|
||||
|
||||
val = I40E_PFINT_DYN_CTL0_INTENA_MASK |
|
||||
(clearpba ? I40E_PFINT_DYN_CTL0_CLEARPBA_MASK : 0) |
|
||||
I40E_PFINT_DYN_CTL0_CLEARPBA_MASK |
|
||||
(I40E_ITR_NONE << I40E_PFINT_DYN_CTL0_ITR_INDX_SHIFT);
|
||||
|
||||
wr32(hw, I40E_PFINT_DYN_CTL0, val);
|
||||
@@ -3597,7 +3596,7 @@ static int i40e_vsi_enable_irq(struct i40e_vsi *vsi)
|
||||
for (i = 0; i < vsi->num_q_vectors; i++)
|
||||
i40e_irq_dynamic_enable(vsi, i);
|
||||
} else {
|
||||
i40e_irq_dynamic_enable_icr0(pf, true);
|
||||
i40e_irq_dynamic_enable_icr0(pf);
|
||||
}
|
||||
|
||||
i40e_flush(&pf->hw);
|
||||
@@ -3746,7 +3745,7 @@ enable_intr:
|
||||
wr32(hw, I40E_PFINT_ICR0_ENA, ena_mask);
|
||||
if (!test_bit(__I40E_DOWN, pf->state)) {
|
||||
i40e_service_event_schedule(pf);
|
||||
i40e_irq_dynamic_enable_icr0(pf, false);
|
||||
i40e_irq_dynamic_enable_icr0(pf);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@@ -8455,7 +8454,7 @@ static int i40e_setup_misc_vector(struct i40e_pf *pf)
|
||||
|
||||
i40e_flush(hw);
|
||||
|
||||
i40e_irq_dynamic_enable_icr0(pf, true);
|
||||
i40e_irq_dynamic_enable_icr0(pf);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user