diff options
author | Don Skidmore <donald.c.skidmore@intel.com> | 2013-10-01 07:33:50 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-01 12:49:48 -0400 |
commit | 858c3dda5ea3519a3799a147904ae1d6e6c4e7c1 (patch) | |
tree | d511de350f3ec90069f54145971521d4c21272dd /drivers/net/ethernet/intel | |
parent | c7bb417dbb8888cfd20824d54f9af9c92b9ff43d (diff) |
ixgbevf: add wait for Rx queue disable
New function was added to wait for Rx queues to be disabled before
disabling NAPI. This function also allows us to modify
ixgbevf_rx_desc_queue_enable() to better match ixgbe. I also cleaned up
some msleep calls to usleep_range while I was in this code anyway.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Don Skidmore <donald.c.skidmore@intel.com>
Tested-by: Stephen Ko <stephen.s.ko@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/intel')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index b9a78a2d486d..e3493b0e5348 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
@@ -1302,27 +1302,51 @@ static void ixgbevf_configure(struct ixgbevf_adapter *adapter) | |||
1302 | } | 1302 | } |
1303 | } | 1303 | } |
1304 | 1304 | ||
1305 | #define IXGBE_MAX_RX_DESC_POLL 10 | 1305 | #define IXGBEVF_MAX_RX_DESC_POLL 10 |
1306 | static inline void ixgbevf_rx_desc_queue_enable(struct ixgbevf_adapter *adapter, | 1306 | static void ixgbevf_rx_desc_queue_enable(struct ixgbevf_adapter *adapter, |
1307 | int rxr) | 1307 | int rxr) |
1308 | { | 1308 | { |
1309 | struct ixgbe_hw *hw = &adapter->hw; | 1309 | struct ixgbe_hw *hw = &adapter->hw; |
1310 | int wait_loop = IXGBEVF_MAX_RX_DESC_POLL; | ||
1311 | u32 rxdctl; | ||
1310 | int j = adapter->rx_ring[rxr].reg_idx; | 1312 | int j = adapter->rx_ring[rxr].reg_idx; |
1311 | int k; | ||
1312 | 1313 | ||
1313 | for (k = 0; k < IXGBE_MAX_RX_DESC_POLL; k++) { | 1314 | do { |
1314 | if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) & IXGBE_RXDCTL_ENABLE) | 1315 | usleep_range(1000, 2000); |
1315 | break; | 1316 | rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)); |
1316 | else | 1317 | } while (--wait_loop && !(rxdctl & IXGBE_RXDCTL_ENABLE)); |
1317 | msleep(1); | 1318 | |
1318 | } | 1319 | if (!wait_loop) |
1319 | if (k >= IXGBE_MAX_RX_DESC_POLL) { | 1320 | hw_dbg(hw, "RXDCTL.ENABLE queue %d not set while polling\n", |
1320 | hw_dbg(hw, "RXDCTL.ENABLE on Rx queue %d " | 1321 | rxr); |
1321 | "not set within the polling period\n", rxr); | 1322 | |
1322 | } | 1323 | ixgbevf_release_rx_desc(&adapter->hw, &adapter->rx_ring[rxr], |
1324 | (adapter->rx_ring[rxr].count - 1)); | ||
1325 | } | ||
1323 | 1326 | ||
1324 | ixgbevf_release_rx_desc(hw, &adapter->rx_ring[rxr], | 1327 | static void ixgbevf_disable_rx_queue(struct ixgbevf_adapter *adapter, |
1325 | adapter->rx_ring[rxr].count - 1); | 1328 | struct ixgbevf_ring *ring) |
1329 | { | ||
1330 | struct ixgbe_hw *hw = &adapter->hw; | ||
1331 | int wait_loop = IXGBEVF_MAX_RX_DESC_POLL; | ||
1332 | u32 rxdctl; | ||
1333 | u8 reg_idx = ring->reg_idx; | ||
1334 | |||
1335 | rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(reg_idx)); | ||
1336 | rxdctl &= ~IXGBE_RXDCTL_ENABLE; | ||
1337 | |||
1338 | /* write value back with RXDCTL.ENABLE bit cleared */ | ||
1339 | IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(reg_idx), rxdctl); | ||
1340 | |||
1341 | /* the hardware may take up to 100us to really disable the rx queue */ | ||
1342 | do { | ||
1343 | udelay(10); | ||
1344 | rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(reg_idx)); | ||
1345 | } while (--wait_loop && (rxdctl & IXGBE_RXDCTL_ENABLE)); | ||
1346 | |||
1347 | if (!wait_loop) | ||
1348 | hw_dbg(hw, "RXDCTL.ENABLE queue %d not cleared while polling\n", | ||
1349 | reg_idx); | ||
1326 | } | 1350 | } |
1327 | 1351 | ||
1328 | static void ixgbevf_save_reset_stats(struct ixgbevf_adapter *adapter) | 1352 | static void ixgbevf_save_reset_stats(struct ixgbevf_adapter *adapter) |
@@ -1654,7 +1678,10 @@ void ixgbevf_down(struct ixgbevf_adapter *adapter) | |||
1654 | 1678 | ||
1655 | /* signal that we are down to the interrupt handler */ | 1679 | /* signal that we are down to the interrupt handler */ |
1656 | set_bit(__IXGBEVF_DOWN, &adapter->state); | 1680 | set_bit(__IXGBEVF_DOWN, &adapter->state); |
1657 | /* disable receives */ | 1681 | |
1682 | /* disable all enabled rx queues */ | ||
1683 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
1684 | ixgbevf_disable_rx_queue(adapter, &adapter->rx_ring[i]); | ||
1658 | 1685 | ||
1659 | netif_tx_disable(netdev); | 1686 | netif_tx_disable(netdev); |
1660 | 1687 | ||