carl9170: fix tx_ampdu_upload counter
authorChristian Lamparter <chunkeey@googlemail.com>
Sun, 26 Sep 2010 20:49:34 +0000 (22:49 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 28 Sep 2010 19:47:56 +0000 (15:47 -0400)
tx_ampdu_upload was not decreased when an a-MPDU
frame had to be kicked out from the tx_pending
queues.

This broke ampdu aggregation, because the scheduler
waits until tx_ampdu_upload drops to zero, before
making the next aggregate.

Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/carl9170/main.c

index d28b4ff8d281d05004b6a850bdcbcf27c2cd0c57..a8b0cec78b3263db0513a0ca5fffd6e50787aaee 100644 (file)
@@ -230,8 +230,15 @@ static void carl9170_flush(struct ar9170 *ar, bool drop_queued)
                for (i = 0; i < ar->hw->queues; i++) {
                        struct sk_buff *skb;
 
-                       while ((skb = skb_dequeue(&ar->tx_pending[i])))
+                       while ((skb = skb_dequeue(&ar->tx_pending[i]))) {
+                               struct ieee80211_tx_info *info;
+
+                               info = IEEE80211_SKB_CB(skb);
+                               if (info->flags & IEEE80211_TX_CTL_AMPDU)
+                                       atomic_dec(&ar->tx_ampdu_upload);
+
                                carl9170_tx_status(ar, skb, false);
+                       }
                }
        }
 
@@ -1462,6 +1469,7 @@ static void carl9170_op_sta_notify(struct ieee80211_hw *hw,
                        skb_queue_walk_safe(&ar->tx_pending[i], skb, tmp) {
                                struct _carl9170_tx_superframe *super;
                                struct ieee80211_hdr *hdr;
+                               struct ieee80211_tx_info *info;
 
                                super = (void *) skb->data;
                                hdr = (void *) super->frame_data;
@@ -1470,6 +1478,11 @@ static void carl9170_op_sta_notify(struct ieee80211_hw *hw,
                                        continue;
 
                                __skb_unlink(skb, &ar->tx_pending[i]);
+
+                               info = IEEE80211_SKB_CB(skb);
+                               if (info->flags & IEEE80211_TX_CTL_AMPDU)
+                                       atomic_dec(&ar->tx_ampdu_upload);
+
                                carl9170_tx_status(ar, skb, false);
                        }
                        spin_unlock_bh(&ar->tx_pending[i].lock);