|
@@ -3604,14 +3604,20 @@ static int i40e_vsi_enable_irq(struct i40e_vsi *vsi)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * i40e_stop_misc_vector - Stop the vector that handles non-queue events
|
|
|
+ * i40e_free_misc_vector - Free the vector that handles non-queue events
|
|
|
* @pf: board private structure
|
|
|
**/
|
|
|
-static void i40e_stop_misc_vector(struct i40e_pf *pf)
|
|
|
+static void i40e_free_misc_vector(struct i40e_pf *pf)
|
|
|
{
|
|
|
/* Disable ICR 0 */
|
|
|
wr32(&pf->hw, I40E_PFINT_ICR0_ENA, 0);
|
|
|
i40e_flush(&pf->hw);
|
|
|
+
|
|
|
+ if (pf->flags & I40E_FLAG_MSIX_ENABLED && pf->msix_entries) {
|
|
|
+ synchronize_irq(pf->msix_entries[0].vector);
|
|
|
+ free_irq(pf->msix_entries[0].vector, pf);
|
|
|
+ clear_bit(__I40E_MISC_IRQ_REQUESTED, pf->state);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -4466,11 +4472,7 @@ static void i40e_clear_interrupt_scheme(struct i40e_pf *pf)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
- i40e_stop_misc_vector(pf);
|
|
|
- if (pf->flags & I40E_FLAG_MSIX_ENABLED && pf->msix_entries) {
|
|
|
- synchronize_irq(pf->msix_entries[0].vector);
|
|
|
- free_irq(pf->msix_entries[0].vector, pf);
|
|
|
- }
|
|
|
+ i40e_free_misc_vector(pf);
|
|
|
|
|
|
i40e_put_lump(pf->irq_pile, pf->iwarp_base_vector,
|
|
|
I40E_IWARP_IRQ_PILE_ID);
|
|
@@ -8365,13 +8367,12 @@ static int i40e_setup_misc_vector(struct i40e_pf *pf)
|
|
|
struct i40e_hw *hw = &pf->hw;
|
|
|
int err = 0;
|
|
|
|
|
|
- /* Only request the irq if this is the first time through, and
|
|
|
- * not when we're rebuilding after a Reset
|
|
|
- */
|
|
|
- if (!test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) {
|
|
|
+ /* Only request the IRQ once, the first time through. */
|
|
|
+ if (!test_and_set_bit(__I40E_MISC_IRQ_REQUESTED, pf->state)) {
|
|
|
err = request_irq(pf->msix_entries[0].vector,
|
|
|
i40e_intr, 0, pf->int_name, pf);
|
|
|
if (err) {
|
|
|
+ clear_bit(__I40E_MISC_IRQ_REQUESTED, pf->state);
|
|
|
dev_info(&pf->pdev->dev,
|
|
|
"request_irq for %s failed: %d\n",
|
|
|
pf->int_name, err);
|
|
@@ -12069,11 +12070,8 @@ static int i40e_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
|
wr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0));
|
|
|
wr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0));
|
|
|
|
|
|
- i40e_stop_misc_vector(pf);
|
|
|
- if (pf->msix_entries) {
|
|
|
- synchronize_irq(pf->msix_entries[0].vector);
|
|
|
- free_irq(pf->msix_entries[0].vector, pf);
|
|
|
- }
|
|
|
+ i40e_free_misc_vector(pf);
|
|
|
+
|
|
|
retval = pci_save_state(pdev);
|
|
|
if (retval)
|
|
|
return retval;
|
|
@@ -12113,15 +12111,6 @@ static int i40e_resume(struct pci_dev *pdev)
|
|
|
/* handling the reset will rebuild the device state */
|
|
|
if (test_and_clear_bit(__I40E_SUSPENDED, pf->state)) {
|
|
|
clear_bit(__I40E_DOWN, pf->state);
|
|
|
- if (pf->msix_entries) {
|
|
|
- err = request_irq(pf->msix_entries[0].vector,
|
|
|
- i40e_intr, 0, pf->int_name, pf);
|
|
|
- if (err) {
|
|
|
- dev_err(&pf->pdev->dev,
|
|
|
- "request_irq for %s failed: %d\n",
|
|
|
- pf->int_name, err);
|
|
|
- }
|
|
|
- }
|
|
|
i40e_reset_and_rebuild(pf, false, false);
|
|
|
}
|
|
|
|