Commit 2a8a6b7c authored by Lachlan Hodges's avatar Lachlan Hodges Committed by Johannes Berg
Browse files

wifi: mac80211: handle station association response with S1G



Add support for updating the stations S1G capabilities when
an S1G association occurs.

Signed-off-by: default avatarLachlan Hodges <lachlan.hodges@morsemicro.com>
Link: https://patch.msgid.link/20250617080610.756048-3-lachlan.hodges@morsemicro.com


[remove unused S1G_CAP3_MAX_MPDU_LEN_3895/_7791]
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 5ea25567
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2428,6 +2428,7 @@ struct ieee80211_sta_aggregates {
 * @he_cap: HE capabilities of this STA
 * @he_6ghz_capa: on 6 GHz, holds the HE 6 GHz band capabilities
 * @eht_cap: EHT capabilities of this STA
 * @s1g_cap: S1G capabilities of this STA
 * @agg: per-link data for multi-link aggregation
 * @bandwidth: current bandwidth the station can receive with
 * @rx_nss: in HT/VHT, the maximum number of spatial streams the
@@ -2450,6 +2451,7 @@ struct ieee80211_link_sta {
	struct ieee80211_sta_he_cap he_cap;
	struct ieee80211_he_6ghz_capa he_6ghz_capa;
	struct ieee80211_sta_eht_cap eht_cap;
	struct ieee80211_sta_s1g_cap s1g_cap;

	struct ieee80211_sta_aggregates agg;

+3 −0
Original line number Diff line number Diff line
@@ -2270,6 +2270,9 @@ void ieee80211_s1g_rx_twt_action(struct ieee80211_sub_if_data *sdata,
				 struct sk_buff *skb);
void ieee80211_s1g_status_twt_action(struct ieee80211_sub_if_data *sdata,
				     struct sk_buff *skb);
void ieee80211_s1g_cap_to_sta_s1g_cap(struct ieee80211_sub_if_data *sdata,
				      const struct ieee80211_s1g_cap *s1g_cap_ie,
				      struct link_sta_info *link_sta);

/* Spectrum management */
void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata,
+6 −0
Original line number Diff line number Diff line
@@ -5399,6 +5399,12 @@ static bool ieee80211_assoc_config_link(struct ieee80211_link_data *link,
		bss_conf->epcs_support = false;
	}

	if (elems->s1g_oper &&
	    link->u.mgd.conn.mode == IEEE80211_CONN_MODE_S1G &&
	    elems->s1g_capab)
		ieee80211_s1g_cap_to_sta_s1g_cap(sdata, elems->s1g_capab,
						 link_sta);

	bss_conf->twt_broadcast =
		ieee80211_twt_bcast_support(sdata, bss_conf, sband, link_sta);

+26 −0
Original line number Diff line number Diff line
@@ -194,3 +194,29 @@ void ieee80211_s1g_status_twt_action(struct ieee80211_sub_if_data *sdata,
		break;
	}
}

void ieee80211_s1g_cap_to_sta_s1g_cap(struct ieee80211_sub_if_data *sdata,
				      const struct ieee80211_s1g_cap *s1g_cap_ie,
				      struct link_sta_info *link_sta)
{
	struct ieee80211_sta_s1g_cap *s1g_cap = &link_sta->pub->s1g_cap;

	memset(s1g_cap, 0, sizeof(*s1g_cap));

	memcpy(s1g_cap->cap, s1g_cap_ie->capab_info, sizeof(s1g_cap->cap));
	memcpy(s1g_cap->nss_mcs, s1g_cap_ie->supp_mcs_nss,
	       sizeof(s1g_cap->nss_mcs));

	s1g_cap->s1g = true;

	/* Maximum MPDU length is 1 bit for S1G */
	if (s1g_cap->cap[3] & S1G_CAP3_MAX_MPDU_LEN) {
		link_sta->pub->agg.max_amsdu_len =
			IEEE80211_MAX_MPDU_LEN_VHT_7991;
	} else {
		link_sta->pub->agg.max_amsdu_len =
			IEEE80211_MAX_MPDU_LEN_VHT_3895;
	}

	ieee80211_sta_recalc_aggregates(&link_sta->sta->sta);
}