From c6979463550117e7ea6e48b5225143a9ee581a70 Mon Sep 17 00:00:00 2001 From: Steve Hodgson Date: Mon, 23 May 2011 12:18:45 +0100 Subject: [PATCH] --- yaml --- r: 290174 b: refs/heads/master c: a606f4325dca6950996abbae452d33f2af095f39 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/ethernet/sfc/mcdi_mac.c | 2 ++ trunk/drivers/net/ethernet/sfc/net_driver.h | 4 ++++ trunk/drivers/net/ethernet/sfc/nic.c | 3 +++ 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index ee6315dfb9d7..2b4489f73181 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 90893000e21e2d52a0a9d5aa0c4234c90bcd9470 +refs/heads/master: a606f4325dca6950996abbae452d33f2af095f39 diff --git a/trunk/drivers/net/ethernet/sfc/mcdi_mac.c b/trunk/drivers/net/ethernet/sfc/mcdi_mac.c index f67cf921bd1b..98afe1c1165d 100644 --- a/trunk/drivers/net/ethernet/sfc/mcdi_mac.c +++ b/trunk/drivers/net/ethernet/sfc/mcdi_mac.c @@ -44,6 +44,8 @@ static int efx_mcdi_set_mac(struct efx_nic *efx) } if (efx->wanted_fc & EFX_FC_AUTO) fcntl = MC_CMD_FCNTL_AUTO; + if (efx->fc_disable) + fcntl = MC_CMD_FCNTL_OFF; MCDI_SET_DWORD(cmdbytes, SET_MAC_IN_FCNTL, fcntl); diff --git a/trunk/drivers/net/ethernet/sfc/net_driver.h b/trunk/drivers/net/ethernet/sfc/net_driver.h index 18c4b3c245e2..f52687741508 100644 --- a/trunk/drivers/net/ethernet/sfc/net_driver.h +++ b/trunk/drivers/net/ethernet/sfc/net_driver.h @@ -670,6 +670,9 @@ struct efx_filter_state; * @promiscuous: Promiscuous flag. Protected by netif_tx_lock. * @multicast_hash: Multicast hash table * @wanted_fc: Wanted flow control flags + * @fc_disable: When non-zero flow control is disabled. Typically used to + * ensure that network back pressure doesn't delay dma queue flushes. + * Serialised by the rtnl lock. * @mac_work: Work item for changing MAC promiscuity and multicast hash * @loopback_mode: Loopback status * @loopback_modes: Supported loopback mode bitmask @@ -769,6 +772,7 @@ struct efx_nic { bool promiscuous; union efx_multicast_hash multicast_hash; u8 wanted_fc; + unsigned fc_disable; atomic_t rx_reset; enum efx_loopback_mode loopback_mode; diff --git a/trunk/drivers/net/ethernet/sfc/nic.c b/trunk/drivers/net/ethernet/sfc/nic.c index 539b57441e80..1bb41fff3edc 100644 --- a/trunk/drivers/net/ethernet/sfc/nic.c +++ b/trunk/drivers/net/ethernet/sfc/nic.c @@ -677,6 +677,7 @@ int efx_nic_flush_queues(struct efx_nic *efx) struct efx_tx_queue *tx_queue; int rc = 0; + efx->fc_disable++; efx->type->prepare_flush(efx); efx_for_each_channel(channel, efx) { @@ -727,6 +728,8 @@ int efx_nic_flush_queues(struct efx_nic *efx) atomic_set(&efx->rxq_flush_outstanding, 0); } + efx->fc_disable--; + return rc; }