Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[deliverable/linux.git] / drivers / net / ethernet / sfc / efx.c
index 4a0005342e65f2c117b3c14a5fbf23b14feda87e..b95f2e1b33f0c378c0f6a41fb9f815739b85b356 100644 (file)
@@ -656,25 +656,30 @@ static void efx_stop_datapath(struct efx_nic *efx)
        struct efx_channel *channel;
        struct efx_tx_queue *tx_queue;
        struct efx_rx_queue *rx_queue;
+       struct pci_dev *dev = efx->pci_dev;
        int rc;
 
        EFX_ASSERT_RESET_SERIALISED(efx);
        BUG_ON(efx->port_enabled);
 
-       rc = efx_nic_flush_queues(efx);
-       if (rc && EFX_WORKAROUND_7803(efx)) {
-               /* Schedule a reset to recover from the flush failure. The
-                * descriptor caches reference memory we're about to free,
-                * but falcon_reconfigure_mac_wrapper() won't reconnect
-                * the MACs because of the pending reset. */
-               netif_err(efx, drv, efx->net_dev,
-                         "Resetting to recover from flush failure\n");
-               efx_schedule_reset(efx, RESET_TYPE_ALL);
-       } else if (rc) {
-               netif_err(efx, drv, efx->net_dev, "failed to flush queues\n");
-       } else {
-               netif_dbg(efx, drv, efx->net_dev,
-                         "successfully flushed all queues\n");
+       /* Only perform flush if dma is enabled */
+       if (dev->is_busmaster) {
+               rc = efx_nic_flush_queues(efx);
+
+               if (rc && EFX_WORKAROUND_7803(efx)) {
+                       /* Schedule a reset to recover from the flush failure. The
+                        * descriptor caches reference memory we're about to free,
+                        * but falcon_reconfigure_mac_wrapper() won't reconnect
+                        * the MACs because of the pending reset. */
+                       netif_err(efx, drv, efx->net_dev,
+                                 "Resetting to recover from flush failure\n");
+                       efx_schedule_reset(efx, RESET_TYPE_ALL);
+               } else if (rc) {
+                       netif_err(efx, drv, efx->net_dev, "failed to flush queues\n");
+               } else {
+                       netif_dbg(efx, drv, efx->net_dev,
+                                 "successfully flushed all queues\n");
+               }
        }
 
        efx_for_each_channel(channel, efx) {
@@ -2492,8 +2497,8 @@ static void efx_pci_remove(struct pci_dev *pci_dev)
        efx_fini_io(efx);
        netif_dbg(efx, drv, efx->net_dev, "shutdown successful\n");
 
-       pci_set_drvdata(pci_dev, NULL);
        efx_fini_struct(efx);
+       pci_set_drvdata(pci_dev, NULL);
        free_netdev(efx->net_dev);
 };
 
@@ -2695,6 +2700,7 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
  fail2:
        efx_fini_struct(efx);
  fail1:
+       pci_set_drvdata(pci_dev, NULL);
        WARN_ON(rc > 0);
        netif_dbg(efx, drv, efx->net_dev, "initialisation failed. rc=%d\n", rc);
        free_netdev(net_dev);
This page took 0.029403 seconds and 5 git commands to generate.