ath9k: Send legacy rated frames as unaggregated
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Tue, 23 Aug 2011 07:02:57 +0000 (12:32 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 26 Aug 2011 14:47:55 +0000 (10:47 -0400)
Currently the aggregation is formed till the aggregation limit
is reached and the rate lookup is done for the first frame alone.
But there can be a legacy rated frames in tid queue. This patch
limits the subframe addition based on presence of legacy rate and
sends the legacy rated frames as unaggregated one.

Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/xmit.c

index 2062672..5e29829 100644 (file)
@@ -571,6 +571,25 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
                ath_reset(sc, false);
 }
 
+static bool ath_lookup_legacy(struct ath_buf *bf)
+{
+       struct sk_buff *skb;
+       struct ieee80211_tx_info *tx_info;
+       struct ieee80211_tx_rate *rates;
+       int i;
+
+       skb = bf->bf_mpdu;
+       tx_info = IEEE80211_SKB_CB(skb);
+       rates = tx_info->control.rates;
+
+       for (i = 3; i >= 0; i--) {
+               if (!(rates[i].flags & IEEE80211_TX_RC_MCS))
+                       return true;
+       }
+
+       return false;
+}
+
 static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
                           struct ath_atx_tid *tid)
 {
@@ -750,7 +769,8 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc,
                al_delta = ATH_AGGR_DELIM_SZ + fi->framelen;
 
                if (nframes &&
-                   (aggr_limit < (al + bpad + al_delta + prev_al))) {
+                   ((aggr_limit < (al + bpad + al_delta + prev_al)) ||
+                    ath_lookup_legacy(bf))) {
                        status = ATH_AGGR_LIMITED;
                        break;
                }