cxgb4vf: Turn off SGE RX/TX Callback Timers and interrupts in PCI shutdown routine
authorHariprasad Shenai <hariprasad@chelsio.com>
Tue, 5 Aug 2014 10:11:28 +0000 (15:41 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 5 Aug 2014 23:40:40 +0000 (16:40 -0700)
Need to turn off  SGE RX/TX Callback Timers & interrupt in cxgb4vf PCI Shutdown
routine in order to prevent crashes during reboot/poweroff when traffic is
running.

Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c

index f002af190a65b9c480bed607459fbf9aae3fac42..d8d28e82ade16fa1918546536288d1fcceccb953 100644 (file)
@@ -2876,24 +2876,24 @@ static void cxgb4vf_pci_shutdown(struct pci_dev *pdev)
        if (!adapter)
                return;
 
-       /*
-        * Disable all Virtual Interfaces.  This will shut down the
+       /* Disable all Virtual Interfaces.  This will shut down the
         * delivery of all ingress packets into the chip for these
         * Virtual Interfaces.
         */
-       for_each_port(adapter, pidx) {
-               struct net_device *netdev;
-               struct port_info *pi;
-
-               if (!test_bit(pidx, &adapter->registered_device_map))
-                       continue;
-
-               netdev = adapter->port[pidx];
-               if (!netdev)
-                       continue;
+       for_each_port(adapter, pidx)
+               if (test_bit(pidx, &adapter->registered_device_map))
+                       unregister_netdev(adapter->port[pidx]);
 
-               pi = netdev_priv(netdev);
-               t4vf_enable_vi(adapter, pi->viid, false, false);
+       /* Free up all Queues which will prevent further DMA and
+        * Interrupts allowing various internal pathways to drain.
+        */
+       t4vf_sge_stop(adapter);
+       if (adapter->flags & USING_MSIX) {
+               pci_disable_msix(adapter->pdev);
+               adapter->flags &= ~USING_MSIX;
+       } else if (adapter->flags & USING_MSI) {
+               pci_disable_msi(adapter->pdev);
+               adapter->flags &= ~USING_MSI;
        }
 
        /*
@@ -2901,6 +2901,7 @@ static void cxgb4vf_pci_shutdown(struct pci_dev *pdev)
         * Interrupts allowing various internal pathways to drain.
         */
        t4vf_free_sge_resources(adapter);
+       pci_set_drvdata(pdev, NULL);
 }
 
 /*