forked from mirrors/linux
		
	wifi: mac80211: track changes in AP's TPE
If the TPE (transmit power envelope) is changed, detect and report that to the driver. Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com> Link: https://msgid.link/20240506214536.103dda923f45.I990877e409ab8eade9ed7c172272e0cae57256cf@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
		
							parent
							
								
									39dc8b8ea3
								
							
						
					
					
						commit
						5a009b42e0
					
				
					 2 changed files with 16 additions and 2 deletions
				
			
		|  | @ -362,6 +362,7 @@ struct ieee80211_vif_chanctx_switch { | ||||||
|  *	status changed. |  *	status changed. | ||||||
|  * @BSS_CHANGED_MLD_VALID_LINKS: MLD valid links status changed. |  * @BSS_CHANGED_MLD_VALID_LINKS: MLD valid links status changed. | ||||||
|  * @BSS_CHANGED_MLD_TTLM: negotiated TID to link mapping was changed |  * @BSS_CHANGED_MLD_TTLM: negotiated TID to link mapping was changed | ||||||
|  |  * @BSS_CHANGED_TPE: transmit power envelope changed | ||||||
|  */ |  */ | ||||||
| enum ieee80211_bss_change { | enum ieee80211_bss_change { | ||||||
| 	BSS_CHANGED_ASSOC		= 1<<0, | 	BSS_CHANGED_ASSOC		= 1<<0, | ||||||
|  | @ -398,6 +399,7 @@ enum ieee80211_bss_change { | ||||||
| 	BSS_CHANGED_UNSOL_BCAST_PROBE_RESP = 1<<31, | 	BSS_CHANGED_UNSOL_BCAST_PROBE_RESP = 1<<31, | ||||||
| 	BSS_CHANGED_MLD_VALID_LINKS	= BIT_ULL(33), | 	BSS_CHANGED_MLD_VALID_LINKS	= BIT_ULL(33), | ||||||
| 	BSS_CHANGED_MLD_TTLM		= BIT_ULL(34), | 	BSS_CHANGED_MLD_TTLM		= BIT_ULL(34), | ||||||
|  | 	BSS_CHANGED_TPE			= BIT_ULL(35), | ||||||
| 
 | 
 | ||||||
| 	/* when adding here, make sure to change ieee80211_reconfig */ | 	/* when adding here, make sure to change ieee80211_reconfig */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -973,6 +973,7 @@ static int ieee80211_config_bw(struct ieee80211_link_data *link, | ||||||
| 	struct ieee80211_channel *channel = link->conf->chanreq.oper.chan; | 	struct ieee80211_channel *channel = link->conf->chanreq.oper.chan; | ||||||
| 	struct ieee80211_sub_if_data *sdata = link->sdata; | 	struct ieee80211_sub_if_data *sdata = link->sdata; | ||||||
| 	struct ieee80211_chan_req chanreq = {}; | 	struct ieee80211_chan_req chanreq = {}; | ||||||
|  | 	struct cfg80211_chan_def ap_chandef; | ||||||
| 	enum ieee80211_conn_mode ap_mode; | 	enum ieee80211_conn_mode ap_mode; | ||||||
| 	u32 vht_cap_info = 0; | 	u32 vht_cap_info = 0; | ||||||
| 	u16 ht_opmode; | 	u16 ht_opmode; | ||||||
|  | @ -988,7 +989,7 @@ static int ieee80211_config_bw(struct ieee80211_link_data *link, | ||||||
| 
 | 
 | ||||||
| 	ap_mode = ieee80211_determine_ap_chan(sdata, channel, vht_cap_info, | 	ap_mode = ieee80211_determine_ap_chan(sdata, channel, vht_cap_info, | ||||||
| 					      elems, true, &link->u.mgd.conn, | 					      elems, true, &link->u.mgd.conn, | ||||||
| 					      &chanreq.ap); | 					      &ap_chandef); | ||||||
| 
 | 
 | ||||||
| 	if (ap_mode != link->u.mgd.conn.mode) { | 	if (ap_mode != link->u.mgd.conn.mode) { | ||||||
| 		link_info(link, | 		link_info(link, | ||||||
|  | @ -998,7 +999,8 @@ static int ieee80211_config_bw(struct ieee80211_link_data *link, | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	chanreq.oper = chanreq.ap; | 	chanreq.ap = ap_chandef; | ||||||
|  | 	chanreq.oper = ap_chandef; | ||||||
| 	if (link->u.mgd.conn.mode < IEEE80211_CONN_MODE_EHT || | 	if (link->u.mgd.conn.mode < IEEE80211_CONN_MODE_EHT || | ||||||
| 	    sdata->vif.driver_flags & IEEE80211_VIF_IGNORE_OFDMA_WIDER_BW) | 	    sdata->vif.driver_flags & IEEE80211_VIF_IGNORE_OFDMA_WIDER_BW) | ||||||
| 		chanreq.ap.chan = NULL; | 		chanreq.ap.chan = NULL; | ||||||
|  | @ -1026,6 +1028,16 @@ static int ieee80211_config_bw(struct ieee80211_link_data *link, | ||||||
| 			ieee80211_min_bw_limit_from_chandef(&chanreq.oper)) | 			ieee80211_min_bw_limit_from_chandef(&chanreq.oper)) | ||||||
| 		ieee80211_chandef_downgrade(&chanreq.oper, NULL); | 		ieee80211_chandef_downgrade(&chanreq.oper, NULL); | ||||||
| 
 | 
 | ||||||
|  | 	if (ap_chandef.chan->band == NL80211_BAND_6GHZ && | ||||||
|  | 	    link->u.mgd.conn.mode >= IEEE80211_CONN_MODE_HE) { | ||||||
|  | 		ieee80211_rearrange_tpe(&elems->tpe, &ap_chandef, | ||||||
|  | 					&chanreq.oper); | ||||||
|  | 		if (memcmp(&link->conf->tpe, &elems->tpe, sizeof(elems->tpe))) { | ||||||
|  | 			link->conf->tpe = elems->tpe; | ||||||
|  | 			*changed |= BSS_CHANGED_TPE; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if (ieee80211_chanreq_identical(&chanreq, &link->conf->chanreq)) | 	if (ieee80211_chanreq_identical(&chanreq, &link->conf->chanreq)) | ||||||
| 		return 0; | 		return 0; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Johannes Berg
						Johannes Berg