]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
iwlwifi: mvm: apply RX diversity per PHY context
authorJohannes Berg <johannes.berg@intel.com>
Thu, 17 Jun 2021 07:08:43 +0000 (10:08 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 22 Jun 2021 12:11:31 +0000 (15:11 +0300)
SMPS requests may differ per interfaces due to e.g. Bluetooth
only interfering on 2.4 GHz, so if that's the case we should,
in the case of multiple PHY contexts, still allow RX diversity
on PHY context that have no interfaces with SMPS requests.

Fix the code to pass through the PHY context in question and
skip interfaces with non-matching PHY context while iterating.

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.20210617100544.123c6b05809d.I992e3d1c6a29850d02eeec01712b5b685b963a87@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c
drivers/net/wireless/intel/iwlwifi/mvm/utils.c

index b137f8130b6ddadba143303488a908d541396080..0b8658c7d088dbba0d6d80594c5572bba4c341b0 100644 (file)
@@ -1830,7 +1830,8 @@ int iwl_mvm_disable_beacon_filter(struct iwl_mvm *mvm,
 void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                                enum iwl_mvm_smps_type_request req_type,
                                enum ieee80211_smps_mode smps_request);
-bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm);
+bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm,
+                                 struct iwl_mvm_phy_ctxt *ctxt);
 
 /* Low latency */
 int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
index 0fd51f6aa2061b5ceb1c608bf753629af5d018fc..4ed2338027d1355b214c87ad875ad29f1590f064 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2012-2014, 2018-2020 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2021 Intel Corporation
  * Copyright (C) 2013-2014 Intel Mobile Communications GmbH
  * Copyright (C) 2017 Intel Deutschland GmbH
  */
@@ -76,6 +76,7 @@ static void iwl_mvm_phy_ctxt_cmd_hdr(struct iwl_mvm_phy_ctxt *ctxt,
 }
 
 static void iwl_mvm_phy_ctxt_set_rxchain(struct iwl_mvm *mvm,
+                                        struct iwl_mvm_phy_ctxt *ctxt,
                                         __le32 *rxchain_info,
                                         u8 chains_static,
                                         u8 chains_dynamic)
@@ -93,7 +94,7 @@ static void iwl_mvm_phy_ctxt_set_rxchain(struct iwl_mvm *mvm,
         * between the two antennas is sufficiently different to impact
         * performance.
         */
-       if (active_cnt == 1 && iwl_mvm_rx_diversity_allowed(mvm)) {
+       if (active_cnt == 1 && iwl_mvm_rx_diversity_allowed(mvm, ctxt)) {
                idle_cnt = 2;
                active_cnt = 2;
        }
@@ -113,6 +114,7 @@ static void iwl_mvm_phy_ctxt_set_rxchain(struct iwl_mvm *mvm,
  * Add the phy configuration to the PHY context command
  */
 static void iwl_mvm_phy_ctxt_cmd_data_v1(struct iwl_mvm *mvm,
+                                        struct iwl_mvm_phy_ctxt *ctxt,
                                         struct iwl_phy_context_cmd_v1 *cmd,
                                         struct cfg80211_chan_def *chandef,
                                         u8 chains_static, u8 chains_dynamic)
@@ -123,7 +125,7 @@ static void iwl_mvm_phy_ctxt_cmd_data_v1(struct iwl_mvm *mvm,
        /* Set the channel info data */
        iwl_mvm_set_chan_info_chandef(mvm, &cmd->ci, chandef);
 
-       iwl_mvm_phy_ctxt_set_rxchain(mvm, &tail->rxchain_info,
+       iwl_mvm_phy_ctxt_set_rxchain(mvm, ctxt, &tail->rxchain_info,
                                     chains_static, chains_dynamic);
 
        tail->txchain_info = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm));
@@ -133,6 +135,7 @@ static void iwl_mvm_phy_ctxt_cmd_data_v1(struct iwl_mvm *mvm,
  * Add the phy configuration to the PHY context command
  */
 static void iwl_mvm_phy_ctxt_cmd_data(struct iwl_mvm *mvm,
+                                     struct iwl_mvm_phy_ctxt *ctxt,
                                      struct iwl_phy_context_cmd *cmd,
                                      struct cfg80211_chan_def *chandef,
                                      u8 chains_static, u8 chains_dynamic)
@@ -143,7 +146,7 @@ static void iwl_mvm_phy_ctxt_cmd_data(struct iwl_mvm *mvm,
        /* Set the channel info data */
        iwl_mvm_set_chan_info_chandef(mvm, &cmd->ci, chandef);
 
-       iwl_mvm_phy_ctxt_set_rxchain(mvm, &cmd->rxchain_info,
+       iwl_mvm_phy_ctxt_set_rxchain(mvm, ctxt, &cmd->rxchain_info,
                                     chains_static, chains_dynamic);
 }
 
@@ -170,7 +173,7 @@ static int iwl_mvm_phy_ctxt_apply(struct iwl_mvm *mvm,
                iwl_mvm_phy_ctxt_cmd_hdr(ctxt, &cmd, action);
 
                /* Set the command data */
-               iwl_mvm_phy_ctxt_cmd_data(mvm, &cmd, chandef,
+               iwl_mvm_phy_ctxt_cmd_data(mvm, ctxt, &cmd, chandef,
                                          chains_static,
                                          chains_dynamic);
 
@@ -186,7 +189,7 @@ static int iwl_mvm_phy_ctxt_apply(struct iwl_mvm *mvm,
                                         action);
 
                /* Set the command data */
-               iwl_mvm_phy_ctxt_cmd_data_v1(mvm, &cmd, chandef,
+               iwl_mvm_phy_ctxt_cmd_data_v1(mvm, ctxt, &cmd, chandef,
                                             chains_static,
                                             chains_dynamic);
                ret = iwl_mvm_send_cmd_pdu(mvm, PHY_CONTEXT_CMD,
index e1e45eca09b59c2ab4e778a768a700e1477c963f..0e8ad798ab570afac7c162e0c1d0cc8edff6b6b5 100644 (file)
@@ -681,23 +681,37 @@ void iwl_mvm_accu_radio_stats(struct iwl_mvm *mvm)
        mvm->accu_radio_stats.on_time_scan += mvm->radio_stats.on_time_scan;
 }
 
+struct iwl_mvm_diversity_iter_data {
+       struct iwl_mvm_phy_ctxt *ctxt;
+       bool result;
+};
+
 static void iwl_mvm_diversity_iter(void *_data, u8 *mac,
                                   struct ieee80211_vif *vif)
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
-       bool *result = _data;
+       struct iwl_mvm_diversity_iter_data *data = _data;
        int i;
 
+       if (mvmvif->phy_ctxt != data->ctxt)
+               return;
+
        for (i = 0; i < NUM_IWL_MVM_SMPS_REQ; i++) {
                if (mvmvif->smps_requests[i] == IEEE80211_SMPS_STATIC ||
-                   mvmvif->smps_requests[i] == IEEE80211_SMPS_DYNAMIC)
-                       *result = false;
+                   mvmvif->smps_requests[i] == IEEE80211_SMPS_DYNAMIC) {
+                       data->result = false;
+                       break;
+               }
        }
 }
 
-bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm)
+bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm,
+                                 struct iwl_mvm_phy_ctxt *ctxt)
 {
-       bool result = true;
+       struct iwl_mvm_diversity_iter_data data = {
+               .ctxt = ctxt,
+               .result = true,
+       };
 
        lockdep_assert_held(&mvm->mutex);
 
@@ -709,9 +723,9 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm)
 
        ieee80211_iterate_active_interfaces_atomic(
                        mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
-                       iwl_mvm_diversity_iter, &result);
+                       iwl_mvm_diversity_iter, &data);
 
-       return result;
+       return data.result;
 }
 
 void iwl_mvm_send_low_latency_cmd(struct iwl_mvm *mvm,