Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[linux-2.6.git] / drivers / net / wireless / ath / ath9k / rc.c
index e697bd9..2880507 100644 (file)
@@ -668,7 +668,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
        struct ieee80211_tx_rate *rates = tx_info->control.rates;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
        __le16 fc = hdr->frame_control;
-       u8 try_per_rate, i = 0, rix, nrix;
+       u8 try_per_rate, i = 0, rix;
        int is_probe = 0;
 
        if (rate_control_send_low(sta, priv_sta, txrc))
@@ -678,48 +678,47 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
         * For Multi Rate Retry we use a different number of
         * retry attempt counts. This ends up looking like this:
         *
-        * MRR[0] = 2
-        * MRR[1] = 2
-        * MRR[2] = 2
-        * MRR[3] = 4
+        * MRR[0] = 4
+        * MRR[1] = 4
+        * MRR[2] = 4
+        * MRR[3] = 8
         *
         */
-       try_per_rate = sc->hw->max_rate_tries;
+       try_per_rate = 4;
 
        rate_table = sc->cur_rate_table;
        rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe);
-       nrix = rix;
 
        if (is_probe) {
                /* set one try for probe rates. For the
                 * probes don't enable rts */
                ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
-                                      1, nrix, 0);
+                                      1, rix, 0);
 
                /* Get the next tried/allowed rate. No RTS for the next series
                 * after the probe rate
                 */
-               ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix);
+               ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);
                ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
-                                      try_per_rate, nrix, 0);
+                                      try_per_rate, rix, 0);
 
                tx_info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
        } else {
                /* Set the choosen rate. No RTS for first series entry. */
                ath_rc_rate_set_series(rate_table, &rates[i++], txrc,
-                                      try_per_rate, nrix, 0);
+                                      try_per_rate, rix, 0);
        }
 
        /* Fill in the other rates for multirate retry */
        for ( ; i < 4; i++) {
                /* Use twice the number of tries for the last MRR segment. */
                if (i + 1 == 4)
-                       try_per_rate = 4;
+                       try_per_rate = 8;
 
-               ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &nrix);
+               ath_rc_get_lower_rix(rate_table, ath_rc_priv, rix, &rix);
                /* All other rates in the series have RTS enabled */
                ath_rc_rate_set_series(rate_table, &rates[i], txrc,
-                                      try_per_rate, nrix, 1);
+                                      try_per_rate, rix, 1);
        }
 
        /*
@@ -1235,10 +1234,14 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
                return;
 
        /*
-        * If underrun error is seen assume it as an excessive retry only
-        * if prefetch trigger level have reached the max (0x3f for 5416)
-        * Adjust the long retry as if the frame was tried hw->max_rate_tries
-        * times. This affects how ratectrl updates PER for the failed rate.
+        * 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)) {