]> Pileus Git - ~andy/linux/blobdiff - drivers/net/ethernet/sfc/efx.c
Merge branch 'pl022' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux...
[~andy/linux] / drivers / net / ethernet / sfc / efx.c
index 3cbfbffe3f006b00d598c57b5b46fa977248f2ad..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) {
@@ -1349,7 +1354,7 @@ static int efx_probe_interrupts(struct efx_nic *efx)
        }
 
        /* RSS might be usable on VFs even if it is disabled on the PF */
-       efx->rss_spread = (efx->n_rx_channels > 1 ?
+       efx->rss_spread = ((efx->n_rx_channels > 1 || !efx_sriov_wanted(efx)) ?
                           efx->n_rx_channels : efx_vf_size(efx));
 
        return 0;
@@ -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);