Since the driver now implements ndo_open and ndo_close with full link management, the shutdown callback must mirror the close sequence to ensure the device is brought down cleanly. Signed-off-by: Vikas Gupta Reviewed-by: Dharmender Garg Reviewed-by: Rahul Gupta --- .../net/ethernet/broadcom/bnge/bnge_core.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_core.c b/drivers/net/ethernet/broadcom/bnge/bnge_core.c index 68b74eb2c3a2..9846d29b4fe3 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_core.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_core.c @@ -5,12 +5,14 @@ #include #include #include +#include #include "bnge.h" #include "bnge_devlink.h" #include "bnge_hwrm.h" #include "bnge_hwrm_lib.h" #include "bnge_link.h" +#include "bnge_resc.h" MODULE_LICENSE("GPL"); MODULE_DESCRIPTION(DRV_SUMMARY); @@ -406,12 +408,34 @@ static void bnge_remove_one(struct pci_dev *pdev) static void bnge_shutdown(struct pci_dev *pdev) { + struct bnge_dev *bd = pci_get_drvdata(pdev); + struct net_device *dev; + + dev = bd ? bd->netdev : NULL; + if (!dev) + return; + + rtnl_lock(); + netdev_lock(dev); + + if (netif_running(dev)) + netif_close(dev); + + if (bnge_hwrm_func_drv_unrgtr(bd)) { + pcie_flr(pdev); + goto shutdown_exit; + } + bnge_free_irqs(bd); pci_disable_device(pdev); if (system_state == SYSTEM_POWER_OFF) { pci_wake_from_d3(pdev, 0); pci_set_power_state(pdev, PCI_D3hot); } + +shutdown_exit: + netdev_unlock(dev); + rtnl_unlock(); } static struct pci_driver bnge_driver = { -- 2.47.1