iwlwifi: mvm: move queue reconfiguration into new function

If TVQM is used we skip over this, move the code into a new
function to get rid of the label.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
This commit is contained in:
Johannes Berg 2018-07-04 16:11:14 +02:00 committed by Luca Coelho
parent 459ab04592
commit b342228d6b
1 changed files with 33 additions and 31 deletions

View File

@ -1351,6 +1351,33 @@ static void iwl_mvm_remove_inactive_tids(struct iwl_mvm *mvm,
} }
} }
static void iwl_mvm_reconfigure_queue(struct iwl_mvm *mvm, int queue)
{
bool reconfig;
bool change_owner;
spin_lock_bh(&mvm->queue_info_lock);
reconfig = mvm->queue_info[queue].status == IWL_MVM_QUEUE_RECONFIGURING;
/*
* We need to take into account a situation in which a TXQ was
* allocated to TID x, and then turned shared by adding TIDs y
* and z. If TID x becomes inactive and is removed from the TXQ,
* ownership must be given to one of the remaining TIDs.
* This is mainly because if TID x continues - a new queue can't
* be allocated for it as long as it is an owner of another TXQ.
*/
change_owner = !(mvm->queue_info[queue].tid_bitmap &
BIT(mvm->queue_info[queue].txq_tid)) &&
(mvm->queue_info[queue].status == IWL_MVM_QUEUE_SHARED);
spin_unlock_bh(&mvm->queue_info_lock);
if (reconfig)
iwl_mvm_unshare_queue(mvm, queue);
else if (change_owner)
iwl_mvm_change_queue_owner(mvm, queue);
}
static void iwl_mvm_inactivity_check(struct iwl_mvm *mvm) static void iwl_mvm_inactivity_check(struct iwl_mvm *mvm)
{ {
unsigned long now = jiffies; unsigned long now = jiffies;
@ -1504,7 +1531,7 @@ void iwl_mvm_add_new_dqa_stream_wk(struct work_struct *wk)
struct ieee80211_sta *sta; struct ieee80211_sta *sta;
struct iwl_mvm_sta *mvmsta; struct iwl_mvm_sta *mvmsta;
unsigned long deferred_tid_traffic; unsigned long deferred_tid_traffic;
int queue, sta_id, tid; int sta_id, tid;
/* Check inactivity of queues */ /* Check inactivity of queues */
iwl_mvm_inactivity_check(mvm); iwl_mvm_inactivity_check(mvm);
@ -1512,39 +1539,14 @@ void iwl_mvm_add_new_dqa_stream_wk(struct work_struct *wk)
mutex_lock(&mvm->mutex); mutex_lock(&mvm->mutex);
/* No queue reconfiguration in TVQM mode */ /* No queue reconfiguration in TVQM mode */
if (iwl_mvm_has_new_tx_api(mvm)) if (!iwl_mvm_has_new_tx_api(mvm)) {
goto alloc_queues; int queue;
/* Reconfigure queues requiring reconfiguation */ /* Reconfigure queues requiring reconfiguation */
for (queue = 0; queue < ARRAY_SIZE(mvm->queue_info); queue++) { for (queue = 0; queue < ARRAY_SIZE(mvm->queue_info); queue++)
bool reconfig; iwl_mvm_reconfigure_queue(mvm, queue);
bool change_owner;
spin_lock_bh(&mvm->queue_info_lock);
reconfig = (mvm->queue_info[queue].status ==
IWL_MVM_QUEUE_RECONFIGURING);
/*
* We need to take into account a situation in which a TXQ was
* allocated to TID x, and then turned shared by adding TIDs y
* and z. If TID x becomes inactive and is removed from the TXQ,
* ownership must be given to one of the remaining TIDs.
* This is mainly because if TID x continues - a new queue can't
* be allocated for it as long as it is an owner of another TXQ.
*/
change_owner = !(mvm->queue_info[queue].tid_bitmap &
BIT(mvm->queue_info[queue].txq_tid)) &&
(mvm->queue_info[queue].status ==
IWL_MVM_QUEUE_SHARED);
spin_unlock_bh(&mvm->queue_info_lock);
if (reconfig)
iwl_mvm_unshare_queue(mvm, queue);
else if (change_owner)
iwl_mvm_change_queue_owner(mvm, queue);
} }
alloc_queues:
/* Go over all stations with deferred traffic */ /* Go over all stations with deferred traffic */
for_each_set_bit(sta_id, mvm->sta_deferred_frames, for_each_set_bit(sta_id, mvm->sta_deferred_frames,
IWL_MVM_STATION_COUNT) { IWL_MVM_STATION_COUNT) {