aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel
diff options
context:
space:
mode:
authorDon Skidmore <donald.c.skidmore@intel.com>2013-10-01 07:33:50 -0400
committerDavid S. Miller <davem@davemloft.net>2013-10-01 12:49:48 -0400
commit858c3dda5ea3519a3799a147904ae1d6e6c4e7c1 (patch)
treed511de350f3ec90069f54145971521d4c21272dd /drivers/net/ethernet/intel
parentc7bb417dbb8888cfd20824d54f9af9c92b9ff43d (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.c61
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
1306static inline void ixgbevf_rx_desc_queue_enable(struct ixgbevf_adapter *adapter, 1306static 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], 1327static 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
1328static void ixgbevf_save_reset_stats(struct ixgbevf_adapter *adapter) 1352static 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