mac80211: Don't wake up from PS for offchannel TX
authorAndrei Otcheretianski <andrei.otcheretianski@intel.com>
Wed, 5 Sep 2018 05:06:14 +0000 (08:06 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 5 Sep 2018 08:05:02 +0000 (10:05 +0200)
Otherwise the offchannel frame might be queued due to
IEEE80211_QUEUE_STOP_REASON_PS and later dropped (in
ieee80211_tx_frags()).  Anyway, it doesn't make much sense to wake up
the device during ROC.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/tx.c

index f353d9d..1315425 100644 (file)
@@ -214,6 +214,7 @@ ieee80211_tx_h_dynamic_ps(struct ieee80211_tx_data *tx)
 {
        struct ieee80211_local *local = tx->local;
        struct ieee80211_if_managed *ifmgd;
+       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
 
        /* driver doesn't support power save */
        if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS))
@@ -242,6 +243,9 @@ ieee80211_tx_h_dynamic_ps(struct ieee80211_tx_data *tx)
        if (tx->sdata->vif.type != NL80211_IFTYPE_STATION)
                return TX_CONTINUE;
 
+       if (unlikely(info->flags & IEEE80211_TX_INTFL_OFFCHAN_TX_OK))
+               return TX_CONTINUE;
+
        ifmgd = &tx->sdata->u.mgd;
 
        /*