Merge branch 'bnxt_en-Bug-fixes'

Michael Chan says:

====================
bnxt_en: Bug fixes.

Four fixes related to the bnxt_en driver's resume path, AER reset, and
the timer function.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2020-06-15 13:28:33 -07:00
commit 7c6cdf6376
1 changed files with 17 additions and 18 deletions

View File

@ -10037,7 +10037,7 @@ static void bnxt_timer(struct timer_list *t)
struct bnxt *bp = from_timer(bp, t, timer); struct bnxt *bp = from_timer(bp, t, timer);
struct net_device *dev = bp->dev; struct net_device *dev = bp->dev;
if (!netif_running(dev)) if (!netif_running(dev) || !test_bit(BNXT_STATE_OPEN, &bp->state))
return; return;
if (atomic_read(&bp->intr_sem) != 0) if (atomic_read(&bp->intr_sem) != 0)
@ -12133,19 +12133,9 @@ static int bnxt_resume(struct device *device)
goto resume_exit; goto resume_exit;
} }
if (bnxt_hwrm_queue_qportcfg(bp)) { rc = bnxt_hwrm_func_qcaps(bp);
rc = -ENODEV; if (rc)
goto resume_exit; goto resume_exit;
}
if (bp->hwrm_spec_code >= 0x10803) {
if (bnxt_alloc_ctx_mem(bp)) {
rc = -ENODEV;
goto resume_exit;
}
}
if (BNXT_NEW_RM(bp))
bnxt_hwrm_func_resc_qcaps(bp, false);
if (bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, false)) { if (bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, false)) {
rc = -ENODEV; rc = -ENODEV;
@ -12161,6 +12151,8 @@ static int bnxt_resume(struct device *device)
resume_exit: resume_exit:
bnxt_ulp_start(bp, rc); bnxt_ulp_start(bp, rc);
if (!rc)
bnxt_reenable_sriov(bp);
rtnl_unlock(); rtnl_unlock();
return rc; return rc;
} }
@ -12204,6 +12196,9 @@ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,
bnxt_close(netdev); bnxt_close(netdev);
pci_disable_device(pdev); pci_disable_device(pdev);
bnxt_free_ctx_mem(bp);
kfree(bp->ctx);
bp->ctx = NULL;
rtnl_unlock(); rtnl_unlock();
/* Request a slot slot reset. */ /* Request a slot slot reset. */
@ -12237,12 +12232,16 @@ static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev)
pci_set_master(pdev); pci_set_master(pdev);
err = bnxt_hwrm_func_reset(bp); err = bnxt_hwrm_func_reset(bp);
if (!err) {
err = bnxt_hwrm_func_qcaps(bp);
if (!err && netif_running(netdev)) if (!err && netif_running(netdev))
err = bnxt_open(netdev); err = bnxt_open(netdev);
}
if (!err)
result = PCI_ERS_RESULT_RECOVERED;
bnxt_ulp_start(bp, err); bnxt_ulp_start(bp, err);
if (!err) {
bnxt_reenable_sriov(bp);
result = PCI_ERS_RESULT_RECOVERED;
}
} }
if (result != PCI_ERS_RESULT_RECOVERED) { if (result != PCI_ERS_RESULT_RECOVERED) {