|
@@ -414,6 +414,9 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
|
|
|
if (ieee80211_has_order(hdr->frame_control))
|
|
|
return TX_CONTINUE;
|
|
|
|
|
|
+ if (ieee80211_is_probe_req(hdr->frame_control))
|
|
|
+ return TX_CONTINUE;
|
|
|
+
|
|
|
if (tx->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)
|
|
|
info->hw_queue = tx->sdata->vif.cab_queue;
|
|
|
|
|
@@ -463,6 +466,7 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
|
|
|
{
|
|
|
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))
|
|
@@ -473,6 +477,12 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
|
|
|
!(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) {
|
|
|
int ac = skb_get_queue_mapping(tx->skb);
|
|
|
|
|
|
+ if (ieee80211_is_mgmt(hdr->frame_control) &&
|
|
|
+ !ieee80211_is_bufferable_mmpdu(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)
|
|
@@ -531,19 +541,9 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
|
|
|
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;
|
|
|
|
|
|
- if (ieee80211_is_mgmt(hdr->frame_control) &&
|
|
|
- !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) {
|
|
|
- if (tx->flags & IEEE80211_TX_UNICAST)
|
|
|
- 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
|