]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iwlwifi: mvm: clean up SSN incrementation
authorSara Sharon <sara.sharon@intel.com>
Wed, 22 Aug 2018 07:50:49 +0000 (10:50 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 20 Dec 2018 07:08:49 +0000 (09:08 +0200)
Sometimes, due to SCD bug, we need to start the queue with an
higher SSN. The queue allocation function currently increments
the SSN in the packet itself, but it is pointless, since this
value is overridden later by iwl_mvm_tx_mpdu with the value
from mvmsta->tid_data[tid].seq_number. Updating tid data is
sufficient.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/intel/iwlwifi/mvm/sta.c

index e82194836f0327a06071f478df98fc665e1aedcb..e28009832da09c5b5a75c2b400c7e1bb34c6b16d 100644 (file)
@@ -1254,6 +1254,7 @@ static int iwl_mvm_sta_alloc_queue(struct iwl_mvm *mvm,
 
        spin_lock_bh(&mvmsta->lock);
        tfd_queue_mask = mvmsta->tfd_queue_msk;
+       ssn = IEEE80211_SEQ_TO_SN(mvmsta->tid_data[tid].seq_number);
        spin_unlock_bh(&mvmsta->lock);
 
        /*
@@ -1340,13 +1341,8 @@ static int iwl_mvm_sta_alloc_queue(struct iwl_mvm *mvm,
                }
        }
 
-       ssn = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
        inc_ssn = iwl_mvm_enable_txq(mvm, queue, mac_queue,
                                     ssn, &cfg, wdg_timeout);
-       if (inc_ssn) {
-               ssn = (ssn + 1) & IEEE80211_SCTL_SEQ;
-               le16_add_cpu(&hdr->seq_ctrl, 0x10);
-       }
 
        /*
         * Mark queue as shared in transport if shared
@@ -1363,8 +1359,10 @@ static int iwl_mvm_sta_alloc_queue(struct iwl_mvm *mvm,
         * this ra/tid in our Tx path since we stop the Qdisc when we
         * need to allocate a new TFD queue.
         */
-       if (inc_ssn)
+       if (inc_ssn) {
                mvmsta->tid_data[tid].seq_number += 0x10;
+               ssn = (ssn + 1) & IEEE80211_SCTL_SEQ;
+       }
        mvmsta->tid_data[tid].txq_id = queue;
        mvmsta->tfd_queue_msk |= BIT(queue);
        queue_state = mvmsta->tid_data[tid].state;