wifi: iwlwifi: move TXQ bytecount limit to queue code
authorJohannes Berg <johannes.berg@intel.com>
Wed, 5 Jun 2024 11:05:00 +0000 (14:05 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 12 Jun 2024 11:04:26 +0000 (13:04 +0200)
This really isn't correct to be in the opmode, do the clamping
(and power-of-2 fixup that may be necessary due to this, or even
otherwise) in the queue code. Also move down the retrying of the
allocation, it should be after all the size fixups, but also it
just makes sense, and avoids retrying same-size allocations in
the case of the BZ-family A-step workaround.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240605140327.000a0a1e807d.Ib822590d5aca76ff3168418ae2c139b3d43d81ed@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/sta.c
drivers/net/wireless/intel/iwlwifi/queue/tx.c

index 2a8ad718ce789347ce53eb94f0a7f97ab0e1f0a8..c57755e5ff5e98937c512045412b97ff383cac11 100644 (file)
@@ -857,12 +857,6 @@ int iwl_mvm_tvqm_enable_txq(struct iwl_mvm *mvm,
                size = iwl_mvm_get_queue_size(sta);
        }
 
-       /* take the min with bc tbl entries allowed */
-       size = min_t(u32, size, mvm->trans->txqs.bc_tbl_size / sizeof(u16));
-
-       /* size needs to be power of 2 values for calculating read/write pointers */
-       size = rounddown_pow_of_two(size);
-
        if (sta) {
                struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
                struct ieee80211_link_sta *link_sta;
@@ -887,22 +881,13 @@ int iwl_mvm_tvqm_enable_txq(struct iwl_mvm *mvm,
        if (!sta_mask)
                return -EINVAL;
 
-       do {
-               queue = iwl_trans_txq_alloc(mvm->trans, 0, sta_mask,
-                                           tid, size, timeout);
-
-               if (queue < 0)
-                       IWL_DEBUG_TX_QUEUES(mvm,
-                                           "Failed allocating TXQ of size %d for sta mask %x tid %d, ret: %d\n",
-                                           size, sta_mask, tid, queue);
-               size /= 2;
-       } while (queue < 0 && size >= 16);
-
-       if (queue < 0)
-               return queue;
+       queue = iwl_trans_txq_alloc(mvm->trans, 0, sta_mask,
+                                   tid, size, timeout);
 
-       IWL_DEBUG_TX_QUEUES(mvm, "Enabling TXQ #%d for sta mask 0x%x tid %d\n",
-                           queue, sta_mask, tid);
+       if (queue >= 0)
+               IWL_DEBUG_TX_QUEUES(mvm,
+                                   "Enabling TXQ #%d for sta mask 0x%x tid %d\n",
+                                   queue, sta_mask, tid);
 
        return queue;
 }
index 6229c785c8457616834cac32fc19c59b31f5c24e..726035dfa5cd8629a0895f0a2676ecdfc0130ac8 100644 (file)
@@ -1237,11 +1237,29 @@ int iwl_txq_dyn_alloc(struct iwl_trans *trans, u32 flags, u32 sta_mask,
        };
        int ret;
 
+       /* take the min with bytecount table entries allowed */
+       size = min_t(u32, size, trans->txqs.bc_tbl_size / sizeof(u16));
+       /* but must be power of 2 values for calculating read/write pointers */
+       size = rounddown_pow_of_two(size);
+
        if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_BZ &&
-           trans->hw_rev_step == SILICON_A_STEP)
+           trans->hw_rev_step == SILICON_A_STEP) {
                size = 4096;
+               txq = iwl_txq_dyn_alloc_dma(trans, size, timeout);
+       } else {
+               do {
+                       txq = iwl_txq_dyn_alloc_dma(trans, size, timeout);
+                       if (!IS_ERR(txq))
+                               break;
+
+                       IWL_DEBUG_TX_QUEUES(trans,
+                                           "Failed allocating TXQ of size %d for sta mask %x tid %d, ret: %ld\n",
+                                           size, sta_mask, tid,
+                                           PTR_ERR(txq));
+                       size /= 2;
+               } while (size >= 16);
+       }
 
-       txq = iwl_txq_dyn_alloc_dma(trans, size, timeout);
        if (IS_ERR(txq))
                return PTR_ERR(txq);