mac80211: fix AP mode scanning issues
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 16 Dec 2013 15:45:57 +0000 (15:45 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Mon, 16 Dec 2013 15:45:57 +0000 (15:45 +0000)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@39098 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/kernel/mac80211/patches/300-pending_work.patch

index ec4fd49..b1b5f47 100644 (file)
  
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -1728,8 +1728,7 @@ netdev_tx_t ieee80211_monitor_start_xmit
+@@ -463,7 +463,6 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
+ {
+       struct sta_info *sta = tx->sta;
+       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
+-      struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
+       struct ieee80211_local *local = tx->local;
+       if (unlikely(!sta))
+@@ -474,15 +473,6 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
+                    !(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) {
+               int ac = skb_get_queue_mapping(tx->skb);
+-              /* only deauth, disassoc and action are bufferable MMPDUs */
+-              if (ieee80211_is_mgmt(hdr->frame_control) &&
+-                  !ieee80211_is_deauth(hdr->frame_control) &&
+-                  !ieee80211_is_disassoc(hdr->frame_control) &&
+-                  !ieee80211_is_action(hdr->frame_control)) {
+-                      info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
+-                      return TX_CONTINUE;
+-              }
+-
+               ps_dbg(sta->sdata, "STA %pM aid %d: PS buffer for AC %d\n",
+                      sta->sta.addr, sta->sta.aid, ac);
+               if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER)
+@@ -525,9 +515,21 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
+ static ieee80211_tx_result debug_noinline
+ ieee80211_tx_h_ps_buf(struct ieee80211_tx_data *tx)
+ {
++      struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
++      struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
++
+       if (unlikely(tx->flags & IEEE80211_TX_PS_BUFFERED))
+               return TX_CONTINUE;
++      /* only deauth, disassoc and action are bufferable MMPDUs */
++      if (ieee80211_is_mgmt(hdr->frame_control) &&
++          !ieee80211_is_deauth(hdr->frame_control) &&
++          !ieee80211_is_disassoc(hdr->frame_control) &&
++          !ieee80211_is_action(hdr->frame_control)) {
++              info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
++              return TX_CONTINUE;
++      }
++
+       if (tx->flags & IEEE80211_TX_UNICAST)
+               return ieee80211_tx_h_unicast_ps_buf(tx);
+       else
+@@ -1728,8 +1730,7 @@ netdev_tx_t ieee80211_monitor_start_xmit
         * radar detection by itself. We can do that later by adding a
         * monitor flag interfaces used for AP support.
         */