mac80211: fix endian issues and comments for BAR failure handling
authorFelix Fietkau <nbd@openwrt.org>
Thu, 15 Sep 2011 07:37:46 +0000 (09:37 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 16 Sep 2011 20:45:42 +0000 (16:45 -0400)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Cc: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/status.c

index 1426846..d50358c 100644 (file)
@@ -278,17 +278,19 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
                }
 
                if (!acked && ieee80211_is_back_req(fc)) {
+                       u16 control;
+
                        /*
-                        * BAR failed, let's tear down the BA session as a
-                        * last resort as some STAs (Intel 5100 on Windows)
-                        * can get stuck when the BA window isn't flushed
-                        * correctly.
+                        * BAR failed, store the last SSN and retry sending
+                        * the BAR when the next unicast transmission on the
+                        * same TID succeeds.
                         */
                        bar = (struct ieee80211_bar *) skb->data;
-                       if (!(bar->control & IEEE80211_BAR_CTRL_MULTI_TID)) {
+                       control = le16_to_cpu(bar->control);
+                       if (!(control & IEEE80211_BAR_CTRL_MULTI_TID)) {
                                u16 ssn = le16_to_cpu(bar->start_seq_num);
 
-                               tid = (bar->control &
+                               tid = (control &
                                       IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
                                      IEEE80211_BAR_CTRL_TID_INFO_SHIFT;