mac80211: reply only once to each PS-poll
[pandora-kernel.git] / net / mac80211 / sta_info.c
index d9cb56f..5732e4d 100644 (file)
@@ -1217,13 +1217,12 @@ static void ieee80211_send_null_response(struct ieee80211_sub_if_data *sdata,
        /*
         * Tell TX path to send this frame even though the
         * STA may still remain is PS mode after this frame
-        * exchange.
+        * exchange. Also set EOSP to indicate this packet
+        * ends the poll/service period.
         */
-       info->flags |= IEEE80211_TX_CTL_POLL_RESPONSE;
-
-       if (uapsd)
-               info->flags |= IEEE80211_TX_STATUS_EOSP |
-                              IEEE80211_TX_CTL_REQ_TX_STATUS;
+       info->flags |= IEEE80211_TX_CTL_POLL_RESPONSE |
+                      IEEE80211_TX_STATUS_EOSP |
+                      IEEE80211_TX_CTL_REQ_TX_STATUS;
 
        ieee80211_xmit(sdata, skb);
 }
@@ -1241,6 +1240,9 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
        unsigned long driver_release_tids = 0;
        struct sk_buff_head frames;
 
+       /* Service or PS-Poll period starts */
+       set_sta_flags(sta, WLAN_STA_SP);
+
        __skb_queue_head_init(&frames);
 
        /*
@@ -1357,10 +1359,11 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
                                /* set EOSP for the frame */
                                u8 *p = ieee80211_get_qos_ctl(hdr);
                                *p |= IEEE80211_QOS_CTL_EOSP;
-                               info->flags |= IEEE80211_TX_STATUS_EOSP |
-                                              IEEE80211_TX_CTL_REQ_TX_STATUS;
                        }
 
+                       info->flags |= IEEE80211_TX_STATUS_EOSP |
+                                      IEEE80211_TX_CTL_REQ_TX_STATUS;
+
                        __skb_queue_tail(&pending, skb);
                }
 
@@ -1422,9 +1425,6 @@ void ieee80211_sta_ps_deliver_uapsd(struct sta_info *sta)
        if (!delivery_enabled)
                return;
 
-       /* Ohh, finally, the service period starts :-) */
-       set_sta_flags(sta, WLAN_STA_SP);
-
        switch (sta->sta.max_sp) {
        case 1:
                n_frames = 2;