|
@@ -162,40 +162,6 @@ static void ixgbevf_unmap_and_free_tx_resource(struct ixgbevf_adapter *adapter,
|
|
|
/* tx_buffer_info must be completely set up in the transmit path */
|
|
|
}
|
|
|
|
|
|
-static inline bool ixgbevf_check_tx_hang(struct ixgbevf_adapter *adapter,
|
|
|
- struct ixgbevf_ring *tx_ring,
|
|
|
- unsigned int eop)
|
|
|
-{
|
|
|
- struct ixgbe_hw *hw = &adapter->hw;
|
|
|
- u32 head, tail;
|
|
|
-
|
|
|
- /* Detect a transmit hang in hardware, this serializes the
|
|
|
- * check with the clearing of time_stamp and movement of eop */
|
|
|
- head = readl(hw->hw_addr + tx_ring->head);
|
|
|
- tail = readl(hw->hw_addr + tx_ring->tail);
|
|
|
- adapter->detect_tx_hung = false;
|
|
|
- if ((head != tail) &&
|
|
|
- tx_ring->tx_buffer_info[eop].time_stamp &&
|
|
|
- time_after(jiffies, tx_ring->tx_buffer_info[eop].time_stamp + HZ)) {
|
|
|
- /* detected Tx unit hang */
|
|
|
- printk(KERN_ERR "Detected Tx Unit Hang\n"
|
|
|
- " Tx Queue <%d>\n"
|
|
|
- " TDH, TDT <%x>, <%x>\n"
|
|
|
- " next_to_use <%x>\n"
|
|
|
- " next_to_clean <%x>\n"
|
|
|
- "tx_buffer_info[next_to_clean]\n"
|
|
|
- " time_stamp <%lx>\n"
|
|
|
- " jiffies <%lx>\n",
|
|
|
- tx_ring->queue_index,
|
|
|
- head, tail,
|
|
|
- tx_ring->next_to_use, eop,
|
|
|
- tx_ring->tx_buffer_info[eop].time_stamp, jiffies);
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
#define IXGBE_MAX_TXD_PWR 14
|
|
|
#define IXGBE_MAX_DATA_PER_TXD (1 << IXGBE_MAX_TXD_PWR)
|
|
|
|
|
@@ -291,16 +257,6 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter,
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
- if (adapter->detect_tx_hung) {
|
|
|
- if (ixgbevf_check_tx_hang(adapter, tx_ring, i)) {
|
|
|
- /* schedule immediate reset if we believe we hung */
|
|
|
- printk(KERN_INFO
|
|
|
- "tx hang %d detected, resetting adapter\n",
|
|
|
- adapter->tx_timeout_count + 1);
|
|
|
- ixgbevf_tx_timeout(adapter->netdev);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/* re-arm the interrupt */
|
|
|
if ((count >= tx_ring->work_limit) &&
|
|
|
(!test_bit(__IXGBEVF_DOWN, &adapter->state))) {
|
|
@@ -2412,9 +2368,6 @@ static void ixgbevf_watchdog_task(struct work_struct *work)
|
|
|
10 : 1);
|
|
|
netif_carrier_on(netdev);
|
|
|
netif_tx_wake_all_queues(netdev);
|
|
|
- } else {
|
|
|
- /* Force detection of hung controller */
|
|
|
- adapter->detect_tx_hung = true;
|
|
|
}
|
|
|
} else {
|
|
|
adapter->link_up = false;
|
|
@@ -2429,9 +2382,6 @@ static void ixgbevf_watchdog_task(struct work_struct *work)
|
|
|
ixgbevf_update_stats(adapter);
|
|
|
|
|
|
pf_has_reset:
|
|
|
- /* Force detection of hung controller every watchdog period */
|
|
|
- adapter->detect_tx_hung = true;
|
|
|
-
|
|
|
/* Reset the timer */
|
|
|
if (!test_bit(__IXGBEVF_DOWN, &adapter->state))
|
|
|
mod_timer(&adapter->watchdog_timer,
|