Commit 42b941cd authored by Johannes Berg's avatar Johannes Berg
Browse files

wifi: mac80211: add a flag to disallow puncturing



There may be cases where puncturing isn't possible, and
a connection needs to be downgraded. Add a hardware flag
to support this.

This is likely temporary: it seems we will need to move
puncturing to the chandef/channel context.

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Reviewed-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20231211085121.c1e89ea55e93.I37b8ca0ee64d5d7699e351785a9010afc106da3c@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent b61e6b41
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -2686,6 +2686,9 @@ struct ieee80211_txq {
 * @IEEE80211_HW_MLO_MCAST_MULTI_LINK_TX: Hardware/driver handles transmitting
 *	multicast frames on all links, mac80211 should not do that.
 *
 * @IEEE80211_HW_DISALLOW_PUNCTURING: HW requires disabling puncturing in EHT
 *	and connecting with a lower bandwidth instead
 *
 * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
 */
enum ieee80211_hw_flags {
@@ -2743,6 +2746,7 @@ enum ieee80211_hw_flags {
	IEEE80211_HW_SUPPORTS_CONC_MON_RX_DECAP,
	IEEE80211_HW_DETECTS_COLOR_COLLISION,
	IEEE80211_HW_MLO_MCAST_MULTI_LINK_TX,
	IEEE80211_HW_DISALLOW_PUNCTURING,

	/* keep last, obviously */
	NUM_IEEE80211_HW_FLAGS
+1 −0
Original line number Diff line number Diff line
@@ -497,6 +497,7 @@ static const char *hw_flag_names[] = {
	FLAG(SUPPORTS_CONC_MON_RX_DECAP),
	FLAG(DETECTS_COLOR_COLLISION),
	FLAG(MLO_MCAST_MULTI_LINK_TX),
	FLAG(DISALLOW_PUNCTURING),
#undef FLAG
};

+10 −2
Original line number Diff line number Diff line
@@ -135,6 +135,7 @@ ieee80211_handle_puncturing_bitmap(struct ieee80211_link_data *link,
				   u16 bitmap, u64 *changed)
{
	struct cfg80211_chan_def *chandef = &link->conf->chandef;
	struct ieee80211_local *local = link->sdata->local;
	u16 extracted;
	u64 _changed = 0;

@@ -147,7 +148,9 @@ ieee80211_handle_puncturing_bitmap(struct ieee80211_link_data *link,
							 bitmap);

		if (cfg80211_valid_disable_subchannel_bitmap(&bitmap,
							     chandef))
							     chandef) &&
		    !(bitmap && ieee80211_hw_check(&local->hw,
						   DISALLOW_PUNCTURING)))
			break;
		link->u.mgd.conn_flags |=
			ieee80211_chandef_downgrade(chandef);
@@ -5682,6 +5685,7 @@ static bool ieee80211_config_puncturing(struct ieee80211_link_data *link,
					const struct ieee80211_eht_operation *eht_oper,
					u64 *changed)
{
	struct ieee80211_local *local = link->sdata->local;
	u16 bitmap = 0, extracted;

	if ((eht_oper->params & IEEE80211_EHT_OPER_INFO_PRESENT) &&
@@ -5713,6 +5717,9 @@ static bool ieee80211_config_puncturing(struct ieee80211_link_data *link,
		return false;
	}

	if (bitmap && ieee80211_hw_check(&local->hw, DISALLOW_PUNCTURING))
		return false;

	ieee80211_handle_puncturing_bitmap(link, eht_oper, bitmap, changed);
	return true;
}
@@ -7584,7 +7591,8 @@ ieee80211_setup_assoc_link(struct ieee80211_sub_if_data *sdata,

			bitmap = get_unaligned_le16(disable_subchannel_bitmap);
			if (cfg80211_valid_disable_subchannel_bitmap(&bitmap,
								     &link->conf->chandef))
								     &link->conf->chandef) &&
			    !(bitmap && ieee80211_hw_check(&local->hw, DISALLOW_PUNCTURING)))
				ieee80211_handle_puncturing_bitmap(link,
								   eht_oper,
								   bitmap,