]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bnxt_en: Unregister PTP during PCI shutdown and suspend
authorMichael Chan <michael.chan@broadcom.com>
Fri, 22 Nov 2024 22:45:46 +0000 (14:45 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2024 12:54:00 +0000 (13:54 +0100)
[ 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: a521c8a01d26 ("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>
drivers/net/ethernet/broadcom/bnxt/bnxt.c

index f999c10cefac6693f021e86a16aac379aa14e140..68e6e202d4ecdc4371b6c27d173edd7eee54f69b 100644 (file)
@@ -15933,6 +15933,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);
 
@@ -15960,6 +15961,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();
@@ -16001,6 +16003,10 @@ static int bnxt_resume(struct device *device)
                goto resume_exit;
        }
 
+       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);