staging: brcm80211: corrected tx status feedback for non AMPDU packets
authorRoland Vossen <rvossen@broadcom.com>
Wed, 29 Jun 2011 23:46:47 +0000 (16:46 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 5 Jul 2011 16:57:12 +0000 (09:57 -0700)
Code still contained a 'FIXME' label that said tx status feedback (consumed by
the rate control algorithm) was not yet taking RTS/CTS into account.

Signed-off-by: Roland Vossen <rvossen@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/brcm80211/brcmsmac/main.c

index f7ebaf18d0444af37c1940e5f88788dada32a843..3063ba5999213694034b66a06e7a5e8fe872bab2 100644 (file)
@@ -4370,8 +4370,18 @@ brcms_c_dotxstatus(struct brcms_c_info *wlc, tx_status_t *txs, u32 frm_tx2)
        if (!lastframe) {
                wiphy_err(wlc->wiphy, "Not last frame!\n");
        } else {
-               u16 sfbl, lfbl;
-               ieee80211_tx_info_clear_status(tx_info);
+               /*
+                * Set information to be consumed by Minstrel ht.
+                *
+                * The "fallback limit" is the number of tx attempts a given
+                * MPDU is sent at the "primary" rate. Tx attempts beyond that
+                * limit are sent at the "secondary" rate.
+                * A 'short frame' does not exceed RTS treshold.
+                */
+               u16 sfbl,       /* Short Frame Rate Fallback Limit */
+                   lfbl,       /* Long Frame Rate Fallback Limit */
+                   fbl;
+
                if (queue < AC_COUNT) {
                        sfbl = WLC_WME_RETRY_SFB_GET(wlc, wme_fifo2ac[queue]);
                        lfbl = WLC_WME_RETRY_LFB_GET(wlc, wme_fifo2ac[queue]);
@@ -4381,14 +4391,20 @@ brcms_c_dotxstatus(struct brcms_c_info *wlc, tx_status_t *txs, u32 frm_tx2)
                }
 
                txrate = tx_info->status.rates;
-               /* FIXME: this should use a combination of sfbl, lfbl depending on frame length and RTS setting */
-               if ((tx_frame_count > sfbl) && (txrate[1].idx >= 0)) {
+               if (txrate[0].flags & IEEE80211_TX_RC_USE_RTS_CTS)
+                       fbl = lfbl;
+               else
+                       fbl = sfbl;
+
+               ieee80211_tx_info_clear_status(tx_info);
+
+               if ((tx_frame_count > fbl) && (txrate[1].idx >= 0)) {
                        /* rate selection requested a fallback rate and we used it */
-                       txrate->count = lfbl;
-                       txrate[1].count = tx_frame_count - lfbl;
+                       txrate[0].count = fbl;
+                       txrate[1].count = tx_frame_count - fbl;
                } else {
                        /* rate selection did not request fallback rate, or we didn't need it */
-                       txrate->count = tx_frame_count;
+                       txrate[0].count = tx_frame_count;
                        /* rc80211_minstrel.c:minstrel_tx_status() expects unused rates to be marked with idx = -1 */
                        txrate[1].idx = -1;
                        txrate[1].count = 0;