|
@@ -1709,29 +1709,29 @@ void iwl_mvm_dealloc_int_sta(struct iwl_mvm *mvm, struct iwl_mvm_int_sta *sta)
|
|
|
sta->sta_id = IWL_MVM_INVALID_STA;
|
|
|
}
|
|
|
|
|
|
-static void iwl_mvm_enable_aux_queue(struct iwl_mvm *mvm)
|
|
|
+static void iwl_mvm_enable_aux_snif_queue(struct iwl_mvm *mvm, u16 *queue,
|
|
|
+ u8 sta_id, u8 fifo)
|
|
|
{
|
|
|
unsigned int wdg_timeout = iwlmvm_mod_params.tfd_q_hang_detect ?
|
|
|
mvm->cfg->base_params->wd_timeout :
|
|
|
IWL_WATCHDOG_DISABLED;
|
|
|
|
|
|
if (iwl_mvm_has_new_tx_api(mvm)) {
|
|
|
- int queue = iwl_mvm_tvqm_enable_txq(mvm, mvm->aux_queue,
|
|
|
- mvm->aux_sta.sta_id,
|
|
|
- IWL_MAX_TID_COUNT,
|
|
|
- wdg_timeout);
|
|
|
- mvm->aux_queue = queue;
|
|
|
+ int tvqm_queue =
|
|
|
+ iwl_mvm_tvqm_enable_txq(mvm, *queue, sta_id,
|
|
|
+ IWL_MAX_TID_COUNT,
|
|
|
+ wdg_timeout);
|
|
|
+ *queue = tvqm_queue;
|
|
|
} else {
|
|
|
struct iwl_trans_txq_scd_cfg cfg = {
|
|
|
- .fifo = IWL_MVM_TX_FIFO_MCAST,
|
|
|
- .sta_id = mvm->aux_sta.sta_id,
|
|
|
+ .fifo = fifo,
|
|
|
+ .sta_id = sta_id,
|
|
|
.tid = IWL_MAX_TID_COUNT,
|
|
|
.aggregate = false,
|
|
|
.frame_limit = IWL_FRAME_LIMIT,
|
|
|
};
|
|
|
|
|
|
- iwl_mvm_enable_txq(mvm, mvm->aux_queue, mvm->aux_queue, 0, &cfg,
|
|
|
- wdg_timeout);
|
|
|
+ iwl_mvm_enable_txq(mvm, *queue, *queue, 0, &cfg, wdg_timeout);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1750,7 +1750,9 @@ int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
|
|
|
|
|
|
/* Map Aux queue to fifo - needs to happen before adding Aux station */
|
|
|
if (!iwl_mvm_has_new_tx_api(mvm))
|
|
|
- iwl_mvm_enable_aux_queue(mvm);
|
|
|
+ iwl_mvm_enable_aux_snif_queue(mvm, &mvm->aux_queue,
|
|
|
+ mvm->aux_sta.sta_id,
|
|
|
+ IWL_MVM_TX_FIFO_MCAST);
|
|
|
|
|
|
ret = iwl_mvm_add_int_sta_common(mvm, &mvm->aux_sta, NULL,
|
|
|
MAC_INDEX_AUX, 0);
|
|
@@ -1764,7 +1766,9 @@ int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
|
|
|
* to firmware so enable queue here - after the station was added
|
|
|
*/
|
|
|
if (iwl_mvm_has_new_tx_api(mvm))
|
|
|
- iwl_mvm_enable_aux_queue(mvm);
|
|
|
+ iwl_mvm_enable_aux_snif_queue(mvm, &mvm->aux_queue,
|
|
|
+ mvm->aux_sta.sta_id,
|
|
|
+ IWL_MVM_TX_FIFO_MCAST);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1772,10 +1776,31 @@ int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
|
|
|
int iwl_mvm_add_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|
|
{
|
|
|
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
|
|
+ int ret;
|
|
|
|
|
|
lockdep_assert_held(&mvm->mutex);
|
|
|
- return iwl_mvm_add_int_sta_common(mvm, &mvm->snif_sta, vif->addr,
|
|
|
+
|
|
|
+ /* Map snif queue to fifo - must happen before adding snif station */
|
|
|
+ if (!iwl_mvm_has_new_tx_api(mvm))
|
|
|
+ iwl_mvm_enable_aux_snif_queue(mvm, &mvm->snif_queue,
|
|
|
+ mvm->snif_sta.sta_id,
|
|
|
+ IWL_MVM_TX_FIFO_BE);
|
|
|
+
|
|
|
+ ret = iwl_mvm_add_int_sta_common(mvm, &mvm->snif_sta, vif->addr,
|
|
|
mvmvif->id, 0);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * For 22000 firmware and on we cannot add queue to a station unknown
|
|
|
+ * to firmware so enable queue here - after the station was added
|
|
|
+ */
|
|
|
+ if (iwl_mvm_has_new_tx_api(mvm))
|
|
|
+ iwl_mvm_enable_aux_snif_queue(mvm, &mvm->snif_queue,
|
|
|
+ mvm->snif_sta.sta_id,
|
|
|
+ IWL_MVM_TX_FIFO_BE);
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
int iwl_mvm_rm_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|
@@ -1784,6 +1809,8 @@ int iwl_mvm_rm_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|
|
|
|
|
lockdep_assert_held(&mvm->mutex);
|
|
|
|
|
|
+ iwl_mvm_disable_txq(mvm, mvm->snif_queue, mvm->snif_queue,
|
|
|
+ IWL_MAX_TID_COUNT, 0);
|
|
|
ret = iwl_mvm_rm_sta_common(mvm, mvm->snif_sta.sta_id);
|
|
|
if (ret)
|
|
|
IWL_WARN(mvm, "Failed sending remove station\n");
|