Skip to content

Commit fae60f7

Browse files
jmberg-intelgregkh
authored andcommitted
iwlwifi: mvm: fix flushing not started aggregation sessions
commit b6658ff upstream. When a not fully started aggregation session is destroyed and flushed, we get a warning, e.g. WARNING: at drivers/net/wireless/iwlwifi/pcie/tx.c:1142 iwl_trans_pcie_txq_disable+0x11c/0x160 queue 16 not used Modules linked in: [...] Pid: 5135, comm: hostapd Tainted: G W O 3.5.0 #10 Call Trace: wlan0: driver sets block=0 for sta 00:03:7f:10:44:d3 [<ffffffff81036492>] warn_slowpath_common+0x72/0xa0 [<ffffffff81036577>] warn_slowpath_fmt+0x47/0x50 [<ffffffffa0368d6c>] iwl_trans_pcie_txq_disable+0x11c/0x160 [iwlwifi] [<ffffffffa03a2099>] iwl_mvm_sta_tx_agg_flush+0xe9/0x150 [iwlmvm] [<ffffffffa0396c43>] iwl_mvm_mac_ampdu_action+0xf3/0x1e0 [iwlmvm] [<ffffffffa0293ad3>] ___ieee80211_stop_tx_ba_session+0x193/0x920 [mac80211] [<ffffffffa0294ed8>] __ieee80211_stop_tx_ba_session+0x48/0x70 [mac80211] [<ffffffffa029159f>] ieee80211_sta_tear_down_BA_sessions+0x4f/0x80 [mac80211] [<ffffffffa028a686>] __sta_info_destroy+0x66/0x370 [mac80211] [<ffffffffa028abb4>] sta_info_destroy_addr_bss+0x44/0x70 [mac80211] [<ffffffffa02a3e26>] ieee80211_del_station+0x26/0x50 [mac80211] [<ffffffffa01e6395>] nl80211_del_station+0x85/0x200 [cfg80211] when a station deauthenticated from us without fully setting up the aggregation session. Fix this by checking the aggregation state before removing the hardware queue. Reviewed-by: Emmanuel Grumbach <[email protected]> Signed-off-by: Johannes Berg <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 19a646b commit fae60f7

File tree

1 file changed

+8
-3
lines changed
  • drivers/net/wireless/iwlwifi/mvm

1 file changed

+8
-3
lines changed

drivers/net/wireless/iwlwifi/mvm/sta.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,7 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
898898
struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv;
899899
struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
900900
u16 txq_id;
901+
enum iwl_mvm_agg_state old_state;
901902

902903
/*
903904
* First set the agg state to OFF to avoid calling
@@ -907,13 +908,17 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
907908
txq_id = tid_data->txq_id;
908909
IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n",
909910
mvmsta->sta_id, tid, txq_id, tid_data->state);
911+
old_state = tid_data->state;
910912
tid_data->state = IWL_AGG_OFF;
911913
spin_unlock_bh(&mvmsta->lock);
912914

913-
if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
914-
IWL_ERR(mvm, "Couldn't flush the AGG queue\n");
915+
if (old_state >= IWL_AGG_ON) {
916+
if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
917+
IWL_ERR(mvm, "Couldn't flush the AGG queue\n");
918+
919+
iwl_trans_txq_disable(mvm->trans, tid_data->txq_id);
920+
}
915921

916-
iwl_trans_txq_disable(mvm->trans, tid_data->txq_id);
917922
mvm->queue_to_mac80211[tid_data->txq_id] =
918923
IWL_INVALID_MAC80211_QUEUE;
919924

0 commit comments

Comments
 (0)