tx_info->status.ampdu_len = 1;
        }
 
-       /*
-        * If an underrun error is seen assume it as an excessive retry only
-        * if max frame trigger level has been reached (2 KB for singel stream,
-        * and 4 KB for dual stream). Adjust the long retry as if the frame was
-        * tried hw->max_rate_tries times to affect how ratectrl updates PER for
-        * the failed rate. In case of congestion on the bus penalizing these
-        * type of underruns should help hardware actually transmit new frames
-        * successfully by eventually preferring slower rates. This itself
-        * should also alleviate congestion on the bus.
-        */
-       if ((tx_info->pad[0] & ATH_TX_INFO_UNDERRUN) &&
-           (sc->sc_ah->tx_trig_level >= ath_rc_priv->tx_triglevel_max)) {
-               tx_status = 1;
-               is_underrun = 1;
-       }
-
        if (!(tx_info->flags & IEEE80211_TX_STAT_ACK))
                tx_status = 1;
 
                return NULL;
        }
 
-       rate_priv->tx_triglevel_max = sc->sc_ah->caps.tx_triglevel_max;
-
        return rate_priv;
 }
 
 
        u32 per_down_time;
        u32 probe_interval;
        u32 prev_data_rix;
-       u32 tx_triglevel_max;
        struct ath_rateset neg_rates;
        struct ath_rateset neg_ht_rates;
        struct ath_rate_softc *asc;
 
 #define ATH_TX_INFO_FRAME_TYPE_INTERNAL        (1 << 0)
 #define ATH_TX_INFO_FRAME_TYPE_PAUSE   (1 << 1)
-#define ATH_TX_INFO_UNDERRUN           (1 << 4)
 
 enum ath9k_internal_frame_type {
        ATH9K_IFT_NOT_INTERNAL,
 
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
        struct ieee80211_hw *hw = bf->aphy->hw;
+       struct ath_softc *sc = bf->aphy->sc;
+       struct ath_hw *ah = sc->sc_ah;
        u8 i, tx_rateindex;
 
        if (txok)
 
        if ((ts->ts_status & ATH9K_TXERR_FILT) == 0 &&
            (bf->bf_flags & ATH9K_TXDESC_NOACK) == 0 && update_rc) {
-               if (ieee80211_is_data(hdr->frame_control)) {
-                       if (ts->ts_flags &
-                           (ATH9K_TX_DATA_UNDERRUN | ATH9K_TX_DELIM_UNDERRUN))
-                               tx_info->pad[0] |= ATH_TX_INFO_UNDERRUN;
-               }
+               /*
+                * If an underrun error is seen assume it as an excessive
+                * retry only if max frame trigger level has been reached
+                * (2 KB for single stream, and 4 KB for dual stream).
+                * Adjust the long retry as if the frame was tried
+                * hw->max_rate_tries times to affect how rate control updates
+                * PER for the failed rate.
+                * In case of congestion on the bus penalizing this type of
+                * underruns should help hardware actually transmit new frames
+                * successfully by eventually preferring slower rates.
+                * This itself should also alleviate congestion on the bus.
+                */
+               if (ieee80211_is_data(hdr->frame_control) &&
+                   (ts->ts_flags & (ATH9K_TX_DATA_UNDERRUN |
+                                    ATH9K_TX_DELIM_UNDERRUN)) &&
+                   ah->tx_trig_level >= sc->sc_ah->caps.tx_triglevel_max)
+                       tx_info->status.rates[tx_rateindex].count =
+                               hw->max_rate_tries;
        }
 
        for (i = tx_rateindex + 1; i < hw->max_rates; i++) {