|
@@ -703,6 +703,7 @@ static void ixgbe_update_xoff_received(struct ixgbe_adapter *adapter)
|
|
|
struct ixgbe_hw *hw = &adapter->hw;
|
|
|
struct ixgbe_hw_stats *hwstats = &adapter->stats;
|
|
|
u32 xoff[8] = {0};
|
|
|
+ u8 tc;
|
|
|
int i;
|
|
|
bool pfc_en = adapter->dcb_cfg.pfc_mode_enable;
|
|
|
|
|
@@ -716,21 +717,26 @@ static void ixgbe_update_xoff_received(struct ixgbe_adapter *adapter)
|
|
|
|
|
|
/* update stats for each tc, only valid with PFC enabled */
|
|
|
for (i = 0; i < MAX_TX_PACKET_BUFFERS; i++) {
|
|
|
+ u32 pxoffrxc;
|
|
|
+
|
|
|
switch (hw->mac.type) {
|
|
|
case ixgbe_mac_82598EB:
|
|
|
- xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
|
|
|
+ pxoffrxc = IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
|
|
|
break;
|
|
|
default:
|
|
|
- xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i));
|
|
|
+ pxoffrxc = IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i));
|
|
|
}
|
|
|
- hwstats->pxoffrxc[i] += xoff[i];
|
|
|
+ hwstats->pxoffrxc[i] += pxoffrxc;
|
|
|
+ /* Get the TC for given UP */
|
|
|
+ tc = netdev_get_prio_tc_map(adapter->netdev, i);
|
|
|
+ xoff[tc] += pxoffrxc;
|
|
|
}
|
|
|
|
|
|
/* disarm tx queues that have received xoff frames */
|
|
|
for (i = 0; i < adapter->num_tx_queues; i++) {
|
|
|
struct ixgbe_ring *tx_ring = adapter->tx_ring[i];
|
|
|
- u8 tc = tx_ring->dcb_tc;
|
|
|
|
|
|
+ tc = tx_ring->dcb_tc;
|
|
|
if (xoff[tc])
|
|
|
clear_bit(__IXGBE_HANG_CHECK_ARMED, &tx_ring->state);
|
|
|
}
|