iwlwifi: mvm: remove DQA non-STA client mode special case
authorJohannes Berg <johannes.berg@intel.com>
Thu, 22 Jun 2017 11:06:21 +0000 (13:06 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Thu, 29 Jun 2017 17:42:18 +0000 (20:42 +0300)
When we get a non-STA frame to transmit in client mode, we try to use
the IWL_MVM_DQA_BSS_CLIENT_QUEUE queue (queue #4). However, at this
point, the queue might not be allocated at all, causing warnings. The
scenario on which this happened was a race condition between mac80211
and our queue allocation work:
 * mac80211 sends auth
 * we stop mac80211 queues to allocate a hw queue
 * authentication is aborted
 * we allocate HW queue and start mac80211 queues
 * mac80211 removes station
 * mac80211 hands us the auth frame from the pending queue

At this point, since mac80211 has already removed the station, we try
to transmit the frame through this special non-station case on queue
4 anyway.

In order to really use it properly, we'd have to again go through the
hw queue allocation work, and attach it to a station, etc. In this
case that isn't possible (there's no station anymore), but if this
special case were needed, then we'd have to do it this way.

However, the special case is documented to exist for TDLS, but can't
trigger there because the TDLS setup frames etc. are normal to-DS
frames going to the peer through the AP. Testing also confirms that
this code path isn't triggered in TDLS.

Therefore, remove the code path to avoid using an unused queue. The
erroneous frame described above will still be transmitted on the AUX
queue, but arguably that's a mac80211 problem, which will eventually
be fixed by moving everything there to TXQs.

Fixes: e3118ad74d7e ("iwlwifi: mvm: support tdls in dqa mode")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/tx.c

index 584ddc39d5f7edb8bf04a05c560b0b25fe655430..73967790f7e4714430820392f828f45423a341d4 100644 (file)
@@ -631,10 +631,6 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
         * (this is not possible for unicast packets as a TLDS discovery
         * response are sent without a station entry); otherwise use the
         * AUX station.
-        * In DQA mode, if vif is of type STATION and frames are not multicast
-        * or offchannel, they should be sent from the BSS queue.
-        * For example, TDLS setup frames should be sent on this queue,
-        * as they go through the AP.
         */
        sta_id = mvm->aux_sta.sta_id;
        if (info.control.vif) {
@@ -655,10 +651,6 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
 
                        if (ap_sta_id != IWL_MVM_INVALID_STA)
                                sta_id = ap_sta_id;
-               } else if (iwl_mvm_is_dqa_supported(mvm) &&
-                          info.control.vif->type == NL80211_IFTYPE_STATION &&
-                          queue != mvm->aux_queue) {
-                       queue = IWL_MVM_DQA_BSS_CLIENT_QUEUE;
                } else if (iwl_mvm_is_dqa_supported(mvm) &&
                           info.control.vif->type == NL80211_IFTYPE_MONITOR) {
                        queue = mvm->aux_queue;