|
@@ -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) {
|