iwlwifi: mvm: attempt to allocate smaller queues
authorJohannes Berg <johannes.berg@intel.com>
Sat, 25 Apr 2020 10:04:50 +0000 (13:04 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 8 May 2020 06:52:44 +0000 (09:52 +0300)
We currently attempt to allocate queues that are 512 entries long,
but that requires 32 KiB memory, which may not be available, at
least not contiguously. If we fail to allocate, attempt to use a
smaller queue all the way down to 16 entries (which fit into a
single page).

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20200425130140.c8548d7cc08a.I5059c410e628726cbce98d6311b690c632d00f97@changeid
drivers/net/wireless/intel/iwlwifi/mvm/sta.c

index ca5dcd7643e0fdacbe53b5a199d26c6c8d650300..b36aef1d61b04a0bcada1e70404ac241a32fbe20 100644 (file)
@@ -749,16 +749,23 @@ static int iwl_mvm_tvqm_enable_txq(struct iwl_mvm *mvm,
                size = max_t(u32, IWL_MGMT_QUEUE_SIZE,
                             mvm->trans->cfg->min_txq_size);
        }
-       queue = iwl_trans_txq_alloc(mvm->trans,
-                                   cpu_to_le16(TX_QUEUE_CFG_ENABLE_QUEUE),
-                                   sta_id, tid, SCD_QUEUE_CFG, size, timeout);
 
-       if (queue < 0) {
-               IWL_DEBUG_TX_QUEUES(mvm,
-                                   "Failed allocating TXQ for sta %d tid %d, ret: %d\n",
-                                   sta_id, tid, queue);
+       do {
+               __le16 enable = cpu_to_le16(TX_QUEUE_CFG_ENABLE_QUEUE);
+
+               queue = iwl_trans_txq_alloc(mvm->trans, enable,
+                                           sta_id, tid, SCD_QUEUE_CFG,
+                                           size, timeout);
+
+               if (queue < 0)
+                       IWL_DEBUG_TX_QUEUES(mvm,
+                                           "Failed allocating TXQ of size %d for sta %d tid %d, ret: %d\n",
+                                           size, sta_id, tid, queue);
+               size /= 2;
+       } while (queue < 0 && size >= 16);
+
+       if (queue < 0)
                return queue;
-       }
 
        IWL_DEBUG_TX_QUEUES(mvm, "Enabling TXQ #%d for sta %d tid %d\n",
                            queue, sta_id, tid);