|
@@ -1129,13 +1129,14 @@ static void iwl_mvm_check_ratid_empty(struct iwl_mvm *mvm,
|
|
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
|
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
|
struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
|
|
struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
|
|
struct ieee80211_vif *vif = mvmsta->vif;
|
|
struct ieee80211_vif *vif = mvmsta->vif;
|
|
|
|
+ u16 normalized_ssn;
|
|
|
|
|
|
lockdep_assert_held(&mvmsta->lock);
|
|
lockdep_assert_held(&mvmsta->lock);
|
|
|
|
|
|
if ((tid_data->state == IWL_AGG_ON ||
|
|
if ((tid_data->state == IWL_AGG_ON ||
|
|
tid_data->state == IWL_EMPTYING_HW_QUEUE_DELBA ||
|
|
tid_data->state == IWL_EMPTYING_HW_QUEUE_DELBA ||
|
|
iwl_mvm_is_dqa_supported(mvm)) &&
|
|
iwl_mvm_is_dqa_supported(mvm)) &&
|
|
- iwl_mvm_tid_queued(tid_data) == 0) {
|
|
|
|
|
|
+ iwl_mvm_tid_queued(mvm, tid_data) == 0) {
|
|
/*
|
|
/*
|
|
* Now that this aggregation or DQA queue is empty tell
|
|
* Now that this aggregation or DQA queue is empty tell
|
|
* mac80211 so it knows we no longer have frames buffered for
|
|
* mac80211 so it knows we no longer have frames buffered for
|
|
@@ -1144,7 +1145,15 @@ static void iwl_mvm_check_ratid_empty(struct iwl_mvm *mvm,
|
|
ieee80211_sta_set_buffered(sta, tid, false);
|
|
ieee80211_sta_set_buffered(sta, tid, false);
|
|
}
|
|
}
|
|
|
|
|
|
- if (tid_data->ssn != tid_data->next_reclaimed)
|
|
|
|
|
|
+ /*
|
|
|
|
+ * In A000 HW, the next_reclaimed index is only 8 bit, so we'll need
|
|
|
|
+ * to align the wrap around of ssn so we compare relevant values.
|
|
|
|
+ */
|
|
|
|
+ normalized_ssn = tid_data->ssn;
|
|
|
|
+ if (mvm->trans->cfg->gen2)
|
|
|
|
+ normalized_ssn &= 0xff;
|
|
|
|
+
|
|
|
|
+ if (normalized_ssn != tid_data->next_reclaimed)
|
|
return;
|
|
return;
|
|
|
|
|
|
switch (tid_data->state) {
|
|
switch (tid_data->state) {
|
|
@@ -1488,7 +1497,7 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
|
|
if (mvmsta->sleep_tx_count) {
|
|
if (mvmsta->sleep_tx_count) {
|
|
mvmsta->sleep_tx_count--;
|
|
mvmsta->sleep_tx_count--;
|
|
if (mvmsta->sleep_tx_count &&
|
|
if (mvmsta->sleep_tx_count &&
|
|
- !iwl_mvm_tid_queued(tid_data)) {
|
|
|
|
|
|
+ !iwl_mvm_tid_queued(mvm, tid_data)) {
|
|
/*
|
|
/*
|
|
* The number of frames in the queue
|
|
* The number of frames in the queue
|
|
* dropped to 0 even if we sent less
|
|
* dropped to 0 even if we sent less
|