mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	wifi: mac80211: fix idle calculation with multi-link
The vif's idle state doesn't automatically go to true when any link removes the channel context, it's only idle when _all_ links no longer have a channel context. Fix that. Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com> Link: https://msgid.link/20240418105220.90df97557702.I05d2228ce85c203b9f2d6da8538cc16dce46752a@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
		
							parent
							
								
									6a94cf996f
								
							
						
					
					
						commit
						89884459a0
					
				
					 1 changed files with 22 additions and 5 deletions
				
			
		| 
						 | 
					@ -797,6 +797,7 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link,
 | 
				
			||||||
	struct ieee80211_local *local = sdata->local;
 | 
						struct ieee80211_local *local = sdata->local;
 | 
				
			||||||
	struct ieee80211_chanctx_conf *conf;
 | 
						struct ieee80211_chanctx_conf *conf;
 | 
				
			||||||
	struct ieee80211_chanctx *curr_ctx = NULL;
 | 
						struct ieee80211_chanctx *curr_ctx = NULL;
 | 
				
			||||||
 | 
						bool new_idle;
 | 
				
			||||||
	int ret = 0;
 | 
						int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_NAN))
 | 
						if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_NAN))
 | 
				
			||||||
| 
						 | 
					@ -829,8 +830,6 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link,
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	rcu_assign_pointer(link->conf->chanctx_conf, conf);
 | 
						rcu_assign_pointer(link->conf->chanctx_conf, conf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sdata->vif.cfg.idle = !conf;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (curr_ctx && ieee80211_chanctx_num_assigned(local, curr_ctx) > 0) {
 | 
						if (curr_ctx && ieee80211_chanctx_num_assigned(local, curr_ctx) > 0) {
 | 
				
			||||||
		ieee80211_recalc_chanctx_chantype(local, curr_ctx);
 | 
							ieee80211_recalc_chanctx_chantype(local, curr_ctx);
 | 
				
			||||||
		ieee80211_recalc_smps_chanctx(local, curr_ctx);
 | 
							ieee80211_recalc_smps_chanctx(local, curr_ctx);
 | 
				
			||||||
| 
						 | 
					@ -843,9 +842,27 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link,
 | 
				
			||||||
		ieee80211_recalc_chanctx_min_def(local, new_ctx, NULL);
 | 
							ieee80211_recalc_chanctx_min_def(local, new_ctx, NULL);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (conf) {
 | 
				
			||||||
 | 
							new_idle = false;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							struct ieee80211_link_data *tmp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							new_idle = true;
 | 
				
			||||||
 | 
							for_each_sdata_link(local, tmp) {
 | 
				
			||||||
 | 
								if (rcu_access_pointer(tmp->conf->chanctx_conf)) {
 | 
				
			||||||
 | 
									new_idle = false;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (new_idle != sdata->vif.cfg.idle) {
 | 
				
			||||||
 | 
							sdata->vif.cfg.idle = new_idle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
 | 
							if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
 | 
				
			||||||
		    sdata->vif.type != NL80211_IFTYPE_MONITOR)
 | 
							    sdata->vif.type != NL80211_IFTYPE_MONITOR)
 | 
				
			||||||
			ieee80211_vif_cfg_change_notify(sdata, BSS_CHANGED_IDLE);
 | 
								ieee80211_vif_cfg_change_notify(sdata, BSS_CHANGED_IDLE);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ieee80211_check_fast_xmit_iface(sdata);
 | 
						ieee80211_check_fast_xmit_iface(sdata);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue