net: axienet: stop interface during shutdown
authorRobert Hancock <hancock@sedsystems.ca>
Thu, 6 Jun 2019 22:28:19 +0000 (16:28 -0600)
committerDavid S. Miller <davem@davemloft.net>
Thu, 6 Jun 2019 23:24:30 +0000 (16:24 -0700)
On some platforms, such as iMX6 with PCIe devices, crashes or hangs can
occur if the axienet device continues to perform DMA transfers after
parent devices/busses have been shut down. Shut down the axienet
interface during its shutdown callback in order to avoid this.

Signed-off-by: Robert Hancock <hancock@sedsystems.ca>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/xilinx/xilinx_axienet_main.c

index 6e75c4320f80b11d5d2082db872192cf11232cff..d138db8d6e7aab79749cf7cff4c320e33a65cf00 100644 (file)
@@ -1797,9 +1797,23 @@ static int axienet_remove(struct platform_device *pdev)
        return 0;
 }
 
+static void axienet_shutdown(struct platform_device *pdev)
+{
+       struct net_device *ndev = platform_get_drvdata(pdev);
+
+       rtnl_lock();
+       netif_device_detach(ndev);
+
+       if (netif_running(ndev))
+               dev_close(ndev);
+
+       rtnl_unlock();
+}
+
 static struct platform_driver axienet_driver = {
        .probe = axienet_probe,
        .remove = axienet_remove,
+       .shutdown = axienet_shutdown,
        .driver = {
                 .name = "xilinx_axienet",
                 .of_match_table = axienet_of_match,