Search Linux Wireless

Re: [PATCH v2] wifi: mac80211: re-order assigning channel in activate links

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2024-10-01 at 14:20 +0530, Aditya Kumar Singh wrote:
> The current flow in _ieee80211_set_active_links() does not align with the
> operational requirements of drivers that groups multiple hardware
> under a single wiphy. These drivers (e.g ath12k) rely on channel
> assignment to determine the appropriate hardware for each link. Without
> this, the drivers cannot correctly establish the link interface.
> 
> Currently in _ieee80211_set_active_links(), after calling
> drv_change_vif_links() on the driver, the state of all connected stations
> is updated via drv_change_sta_links(). This is followed by handling keys
> in the links, and finally, assigning the channel to the links.
> Consequently, drv_change_sta_links() prompts drivers to create the station
> entry at their level and within their firmware. However, since channels
> have not yet been assigned to links at this stage, drivers have not
> created the necessary link interface for establishing link stations,
> leading to failures in activating the links.
> 
> Therefore, re-order the logic so that after drv_change_vif_links() and
> removing the old links, channels are assigned to newly added links.
> Following this, the flow proceeds to station handling.
> 

I tried this again but I fear it fundamentally cannot work with iwlwifi.

We have this comment:

        /* 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.
         */

which sort of indicates that we're working around it, but it also
correctly says that we cannot activate a link before we have the (link)
station.

In the flow as you changed it we'd activate the link in firmware before
the stations are added, but that isn't allowed. There's not really a
good place to hook into after the station is added, unless we somehow
want to activate the link from the station change, but that seems ...
odd to say the least? Though I guess it's already somewhat odd to init
rate control here as written now...

Maybe we can hook into the later link info change. This seems to
initially work, but still doing more tests:


diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
index 9753d2c1df3e..5d90fb53b762 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
@@ -343,33 +343,20 @@ __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.
+	/*
+	 * if link switching (link not active yet) we'll activate it in
+	 * firmware later on link-info change, which mac80211 guarantees
+	 * for link switch after the stations are set up
 	 */
-	if (mvmvif->ap_sta) {
-		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();
+	if (ieee80211_vif_link_active(vif, link_conf->link_id)) {
+		ret = iwl_mvm_link_changed(mvm, vif, link_conf,
+					   LINK_CONTEXT_MODIFY_ACTIVE |
+					   LINK_CONTEXT_MODIFY_RATES_INFO,
+					   true);
+		if (ret)
+			goto out;
 	}
 
-	/* then activate */
-	ret = iwl_mvm_link_changed(mvm, vif, link_conf,
-				   LINK_CONTEXT_MODIFY_ACTIVE |
-				   LINK_CONTEXT_MODIFY_RATES_INFO,
-				   true);
-	if (ret)
-		goto out;
-
 	if (vif->type == NL80211_IFTYPE_STATION)
 		iwl_mvm_send_ap_tx_power_constraint_cmd(mvm, vif,
 							link_conf,
@@ -786,6 +773,11 @@ iwl_mvm_mld_link_info_changed_station(struct iwl_mvm *mvm,
 	if (WARN_ON_ONCE(!mvmvif->link[link_conf->link_id]))
 		return;
 
+	/* not yet marked active in vif means during link switch */
+	if (!ieee80211_vif_link_active(vif, link_conf->link_id) &&
+	    vif->cfg.assoc && mvmvif->link[link_conf->link_id]->phy_ctxt)
+		link_changes |= LINK_CONTEXT_MODIFY_ACTIVE;
+
 	has_he = link_conf->he_support && !iwlwifi_mod_params.disable_11ax;
 	has_eht = link_conf->eht_support && !iwlwifi_mod_params.disable_11be;
 


johannes





[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux