|
@@ -2861,6 +2861,46 @@ static void __devexit cxgb4vf_pci_remove(struct pci_dev *pdev)
|
|
|
pci_release_regions(pdev);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * "Shutdown" quiesce the device, stopping Ingress Packet and Interrupt
|
|
|
+ * delivery.
|
|
|
+ */
|
|
|
+static void __devexit cxgb4vf_pci_shutdown(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ struct adapter *adapter;
|
|
|
+ int pidx;
|
|
|
+
|
|
|
+ adapter = pci_get_drvdata(pdev);
|
|
|
+ if (!adapter)
|
|
|
+ return;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 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;
|
|
|
+
|
|
|
+ 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_free_sge_resources(adapter);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* PCI Device registration data structures.
|
|
|
*/
|
|
@@ -2894,6 +2934,7 @@ static struct pci_driver cxgb4vf_driver = {
|
|
|
.id_table = cxgb4vf_pci_tbl,
|
|
|
.probe = cxgb4vf_pci_probe,
|
|
|
.remove = __devexit_p(cxgb4vf_pci_remove),
|
|
|
+ .shutdown = __devexit_p(cxgb4vf_pci_shutdown),
|
|
|
};
|
|
|
|
|
|
/*
|