wifi: iwlwifi: mvm: configure TLC on link activation
authorJohannes Berg <johannes.berg@intel.com>
Mon, 17 Apr 2023 08:41:31 +0000 (11:41 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 18 Apr 2023 12:47:55 +0000 (14:47 +0200)
If the AP station already exists on link activation (which
means we're during link switch), configure the TLC in FW so
we can immediately transmit once the link is activated.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230417113648.1a93de9b7c1f.I42022f24bbe3572f5a082da8c99794ae14281875@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c

index 99ef12c530eae5f49ffb6af7ba95cb523848010e..fbc2d5ed100690a583f750e0db0a91603aa7881c 100644 (file)
@@ -256,6 +256,30 @@ __iwl_mvm_mld_assign_vif_chanctx(struct iwl_mvm *mvm,
        if (ret)
                goto out;
 
+       /* Initialize rate control for the AP station, since we might be
+        * doing a link switch here - we cannot initialize it before since
+        * this needs the phy context assigned (and in FW?), and we cannot
+        * do it later because it needs to be initialized as soon as we're
+        * able to TX on the link, i.e. when active.
+        *
+        * Firmware restart isn't quite correct yet for MLO, but we don't
+        * need to do it in that case anyway since it will happen from the
+        * normal station state callback.
+        */
+       if (mvmvif->ap_sta &&
+           !test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
+               struct ieee80211_link_sta *link_sta;
+
+               rcu_read_lock();
+               link_sta = rcu_dereference(mvmvif->ap_sta->link[link_id]);
+
+               if (!WARN_ON_ONCE(!link_sta))
+                       iwl_mvm_rs_rate_init(mvm, vif, mvmvif->ap_sta,
+                                            link_conf, link_sta,
+                                            phy_ctxt->channel->band);
+               rcu_read_unlock();
+       }
+
        /* then activate */
        ret = iwl_mvm_link_changed(mvm, vif, link_conf,
                                   LINK_CONTEXT_MODIFY_ACTIVE |