|
@@ -1496,9 +1496,31 @@ int iwl_mvm_rm_sta(struct iwl_mvm *mvm,
|
|
|
ret = iwl_mvm_drain_sta(mvm, mvm_sta, false);
|
|
|
|
|
|
/* If DQA is supported - the queues can be disabled now */
|
|
|
- if (iwl_mvm_is_dqa_supported(mvm))
|
|
|
+ if (iwl_mvm_is_dqa_supported(mvm)) {
|
|
|
+ u8 reserved_txq = mvm_sta->reserved_queue;
|
|
|
+ enum iwl_mvm_queue_status *status;
|
|
|
+
|
|
|
iwl_mvm_disable_sta_queues(mvm, vif, mvm_sta);
|
|
|
|
|
|
+ /*
|
|
|
+ * If no traffic has gone through the reserved TXQ - it
|
|
|
+ * is still marked as IWL_MVM_QUEUE_RESERVED, and
|
|
|
+ * should be manually marked as free again
|
|
|
+ */
|
|
|
+ spin_lock_bh(&mvm->queue_info_lock);
|
|
|
+ status = &mvm->queue_info[reserved_txq].status;
|
|
|
+ if (WARN((*status != IWL_MVM_QUEUE_RESERVED) &&
|
|
|
+ (*status != IWL_MVM_QUEUE_FREE),
|
|
|
+ "sta_id %d reserved txq %d status %d",
|
|
|
+ mvm_sta->sta_id, reserved_txq, *status)) {
|
|
|
+ spin_unlock_bh(&mvm->queue_info_lock);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ *status = IWL_MVM_QUEUE_FREE;
|
|
|
+ spin_unlock_bh(&mvm->queue_info_lock);
|
|
|
+ }
|
|
|
+
|
|
|
if (vif->type == NL80211_IFTYPE_STATION &&
|
|
|
mvmvif->ap_sta_id == mvm_sta->sta_id) {
|
|
|
/* if associated - we can't remove the AP STA now */
|