If a peer or some local agent (rate control, ...) decides to start
an aggregation session but doesn't support HT (which also implies
QoS), reject it.
This is mostly a corner case as such peers normally won't try to
use block-ack sessions and rate control wouldn't start them, but
technically QoS stations could request it according to the spec.
However, since drivers don't really support such non-HT sessions
it's better to reject them.
Also, while at it, move the tracing for TX sessions earlier so it
captures the error cases as well.
Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
        int i, ret = -EOPNOTSUPP;
        u16 status = WLAN_STATUS_REQUEST_DECLINED;
 
+       if (!sta->sta.ht_cap.ht_supported) {
+               ht_dbg(sta->sdata,
+                      "STA %pM erroneously requests BA session on tid %d w/o QoS\n",
+                      sta->sta.addr, tid);
+               /* send a response anyway, it's an error case if we get here */
+               goto end_no_lock;
+       }
+
        if (test_sta_flag(sta, WLAN_STA_BLOCK_BA)) {
                ht_dbg(sta->sdata,
                       "Suspend in progress - Denying ADDBA request (%pM tid %d)\n",
 
        struct tid_ampdu_tx *tid_tx;
        int ret = 0;
 
+       trace_api_start_tx_ba_session(pubsta, tid);
+
        if (WARN(sta->reserved_tid == tid,
                 "Requested to start BA session on reserved tid=%d", tid))
                return -EINVAL;
 
-       trace_api_start_tx_ba_session(pubsta, tid);
+       if (!pubsta->ht_cap.ht_supported)
+               return -EINVAL;
 
        if (WARN_ON_ONCE(!local->ops->ampdu_action))
                return -EINVAL;