wifi: iwlwifi: mvm: rework active links counting
authorGregory Greenman <gregory.greenman@intel.com>
Wed, 29 Mar 2023 07:05:34 +0000 (10:05 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 30 Mar 2023 10:08:43 +0000 (12:08 +0200)
Remove fw_active_links_num counter since we now have a bitmap of
active links in vif. Also, update link activation status only when
LINK_CONTEXT_MODIFY_ACTIVE bit set in changes parameter.

Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230329100040.1ecfb27b6b84.I3a5e0bc32b3728e4caae8a231bc3f04ea1d89cad@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/link.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

index 0cd4067..eb828de 100644 (file)
@@ -104,11 +104,6 @@ int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                         link_info->fw_link_id == IWL_MVM_FW_LINK_ID_INVALID))
                return -EINVAL;
 
-       /* cannot activate third link */
-       if (!link_info->active && active &&
-           mvmvif->fw_active_links_num >= IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM)
-               return -EINVAL;
-
        if (changes & LINK_CONTEXT_MODIFY_ACTIVE) {
                /* When activating a link, phy context should be valid;
                 * when deactivating a link, it also should be valid since
@@ -119,6 +114,22 @@ 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++;
+
+                       /* FIXME: IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM should be
+                        * defined per HW
+                        */
+                       if (count >= IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM)
+                               return -EINVAL;
+               }
+
                /* Catch early if driver tries to activate or deactivate a link
                 * twice.
                 */
@@ -230,18 +241,8 @@ send_cmd:
        cmd.flags_mask = cpu_to_le32(flags_mask);
 
        ret = iwl_mvm_link_cmd_send(mvm, &cmd, FW_CTXT_ACTION_MODIFY);
-       if (!ret) {
-               /* the FW is updated, so now it's possible to update the
-                * activation status. If activating a link, it was already
-                * checked above that we didn't reach the FW limit.
-                */
-               if (link_info->active && !active)
-                       mvmvif->fw_active_links_num--;
-               else if (!link_info->active && active)
-                       mvmvif->fw_active_links_num++;
-
+       if (!ret && (changes & LINK_CONTEXT_MODIFY_ACTIVE))
                link_info->active = active;
-       }
 
        return ret;
 }
index 7fb0022..ff03c8d 100644 (file)
@@ -1027,7 +1027,6 @@ static void iwl_mvm_cleanup_iterator(void *data, u8 *mac,
 
        memset(&mvmvif->bf_data, 0, sizeof(mvmvif->bf_data));
 
-       mvmvif->fw_active_links_num = 0;
        for_each_mvm_vif_valid_link(mvmvif, link_id) {
                mvmvif->link[link_id]->ap_sta_id = IWL_MVM_INVALID_STA;
                mvmvif->link[link_id]->fw_link_id = IWL_MVM_FW_LINK_ID_INVALID;
index 23d7972..022f7bd 100644 (file)
@@ -355,7 +355,6 @@ struct iwl_mvm_vif_link_info {
  * @csa_failed: CSA failed to schedule time event, report an error later
  * @csa_bcn_pending: indicates that we are waiting for a beacon on a new channel
  * @features: hw features active for this vif
- * @fw_active_links_num: the number of activated links
  */
 struct iwl_mvm_vif {
        struct iwl_mvm *mvm;
@@ -439,8 +438,6 @@ struct iwl_mvm_vif {
                struct ieee80211_key_conf __rcu *keys[2];
        } bcn_prot;
 
-       u32 fw_active_links_num;
-
        struct iwl_mvm_vif_link_info deflink;
        struct iwl_mvm_vif_link_info *link[IEEE80211_MLD_MAX_NUM_LINKS];
 };