wifi: iwlwifi: fix max number of fw active links
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Thu, 15 Jun 2023 06:47:16 +0000 (09:47 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 19 Jun 2023 10:05:27 +0000 (12:05 +0200)
The max active links that are supported by the FW is hard coded.
This is wrong since this value is HW-dependent. Fix this by
determining according to the actual HW.

Also remove a redundant check that the number of active links
doesn't exceeds the maximum.

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230615094410.e78ad74c6715.I68b26911c0a312d72eaf25344b448d03b1c61f4e@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/link.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

index 563396d..69ebd84 100644 (file)
@@ -118,24 +118,6 @@ int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                if (!link_info->phy_ctxt)
                        return 0;
 
-               /* check there aren't too many active links */
-               if (!link_info->active && active) {
-                       int i, count = 0;
-
-                       /* link with phy_ctxt is active in FW */
-                       for_each_mvm_vif_valid_link(mvmvif, i)
-                               if (mvmvif->link[i]->phy_ctxt)
-                                       count++;
-
-                       if (vif->type == NL80211_IFTYPE_AP) {
-                               if (count > mvm->fw->ucode_capa.num_beacons)
-                                       return -EOPNOTSUPP;
-                       /* this should be per HW or such */
-                       } else if (count >= IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM) {
-                               return -EOPNOTSUPP;
-                       }
-               }
-
                /* Catch early if driver tries to activate or deactivate a link
                 * twice.
                 */
index 8cd0335..37b5b7f 100644 (file)
@@ -900,9 +900,7 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw,
        u16 added = new_links & ~old_links;
        int err, i;
 
-       if (hweight16(new_links) > 2) {
-               return -EOPNOTSUPP;
-       } else if (hweight16(new_links) > 1) {
+       if (hweight16(new_links) > 1) {
                unsigned int n_active = 0;
 
                for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
@@ -917,7 +915,7 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw,
                if (vif->type == NL80211_IFTYPE_AP) {
                        if (n_active > mvm->fw->ucode_capa.num_beacons)
                                return -EOPNOTSUPP;
-               } else if (n_active > 1) {
+               } else if (n_active > iwl_mvm_max_active_links(mvm)) {
                        return -EOPNOTSUPP;
                }
        }
index de7aa47..35cf001 100644 (file)
@@ -1544,6 +1544,28 @@ static inline bool iwl_mvm_is_ctdp_supported(struct iwl_mvm *mvm)
                           IWL_UCODE_TLV_CAPA_CTDP_SUPPORT);
 }
 
+static inline bool iwl_mvm_is_esr_supported(struct iwl_trans *trans)
+{
+       if ((CSR_HW_RFID_TYPE(trans->hw_rf_id) == IWL_CFG_RF_TYPE_FM) &&
+           !CSR_HW_RFID_IS_CDB(trans->hw_rf_id))
+               /* Step A doesn't support eSR */
+               return CSR_HW_RFID_STEP(trans->hw_rf_id);
+
+       return false;
+}
+
+static inline int iwl_mvm_max_active_links(struct iwl_mvm *mvm)
+{
+       struct iwl_trans *trans = mvm->fwrt.trans;
+
+       if (iwl_mvm_is_esr_supported(trans) ||
+           (CSR_HW_RFID_TYPE(trans->hw_rf_id) == IWL_CFG_RF_TYPE_FM &&
+            CSR_HW_RFID_IS_CDB(trans->hw_rf_id)))
+               return IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM;
+
+       return 1;
+}
+
 extern const u8 iwl_mvm_ac_to_tx_fifo[];
 extern const u8 iwl_mvm_ac_to_gen2_tx_fifo[];