bnxt_en: Unregister PTP during PCI shutdown and suspend
[ Upstream commit 3661c05c54e8db7064aa96a0774654740974dffc ]
If we go through the PCI shutdown or suspend path, we shutdown the
NIC but PTP remains registered. If the kernel continues to run for
a little bit, the periodic PTP .do_aux_work() function may be called
and it will read the PHC from the BAR register. Since the device
has already been disabled, it will cause a PCIe completion timeout.
Fix it by calling bnxt_ptp_clear() in the PCI shutdown/suspend
handlers. bnxt_ptp_clear() will unregister from PTP and
.do_aux_work() will be canceled.
In bnxt_resume(), we need to re-initialize PTP.
Fixes: a521c8a01d ("bnxt_en: Move bnxt_ptp_init() from bnxt_open() back to bnxt_init_one()")
Cc: Richard Cochran <richardcochran@gmail.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2ef2038f26
commit
39497f45ff
@@ -15999,6 +15999,7 @@ static void bnxt_shutdown(struct pci_dev *pdev)
|
||||
if (netif_running(dev))
|
||||
dev_close(dev);
|
||||
|
||||
bnxt_ptp_clear(bp);
|
||||
bnxt_clear_int_mode(bp);
|
||||
pci_disable_device(pdev);
|
||||
|
||||
@@ -16026,6 +16027,7 @@ static int bnxt_suspend(struct device *device)
|
||||
rc = bnxt_close(dev);
|
||||
}
|
||||
bnxt_hwrm_func_drv_unrgtr(bp);
|
||||
bnxt_ptp_clear(bp);
|
||||
pci_disable_device(bp->pdev);
|
||||
bnxt_free_ctx_mem(bp);
|
||||
rtnl_unlock();
|
||||
@@ -16069,6 +16071,10 @@ static int bnxt_resume(struct device *device)
|
||||
if (bp->fw_crash_mem)
|
||||
bnxt_hwrm_crash_dump_mem_cfg(bp);
|
||||
|
||||
if (bnxt_ptp_init(bp)) {
|
||||
kfree(bp->ptp_cfg);
|
||||
bp->ptp_cfg = NULL;
|
||||
}
|
||||
bnxt_get_wol_settings(bp);
|
||||
if (netif_running(dev)) {
|
||||
rc = bnxt_open(dev);
|
||||
|
||||
Reference in New Issue
Block a user