git: 9b13e6ce5b09 - main - LinuxKPI: 802.11: add more defines, structures, ...

From: Bjoern A. Zeeb <bz_at_FreeBSD.org>
Date: Wed, 19 Aug 2026 15:43:29 UTC
The branch main has been updated by bz:

URL: https://cgit.FreeBSD.org/src/commit/?id=9b13e6ce5b099af0958a824fa37c70538a8b6d2a

commit 9b13e6ce5b099af0958a824fa37c70538a8b6d2a
Author:     Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2026-08-12 14:11:36 +0000
Commit:     Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2026-08-19 15:37:42 +0000

    LinuxKPI: 802.11: add more defines, structures, ...
    
    Add more defines, structures, sort struct field types, add inline
    functions (partially implemented) all needed for the upcoming
    espwl(4) wireless driver.
    
    MFC after:      3 days
---
 .../linuxkpi/common/include/linux/ieee80211.h      | 27 +++++++++--
 sys/compat/linuxkpi/common/include/linux/nl80211.h |  6 +++
 sys/compat/linuxkpi/common/include/net/cfg80211.h  | 54 ++++++++++++++++++----
 sys/compat/linuxkpi/common/include/net/mac80211.h  | 12 ++++-
 4 files changed, 84 insertions(+), 15 deletions(-)

diff --git a/sys/compat/linuxkpi/common/include/linux/ieee80211.h b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
index 3edcf96292f7..3d5c938835fe 100644
--- a/sys/compat/linuxkpi/common/include/linux/ieee80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
@@ -1,5 +1,6 @@
 /*-
  * Copyright (c) 2020-2026 The FreeBSD Foundation
+ * Copyright (c) 2026 Bjoern A. Zeeb
  *
  * This software was developed by Björn Zeeb under sponsorship from
  * the FreeBSD Foundation.
@@ -159,6 +160,13 @@ enum ieee80211_vht_max_ampdu_len_exp {
 	IEEE80211_VHT_MAX_AMPDU_1024K		= 7,
 };
 
+/* 802.11-2020, 9.6.22 VHT Action frame details. */
+enum ieee80211_vht_actioncode {
+	/* VHT Compressed Beamforming		= 0, */
+	WLAN_VHT_ACTION_GROUPID_MGMT		= 1,
+	/* Operating Mode Notification		= 2, */
+};
+
 #define	IEEE80211_WEP_IV_LEN			3	/* net80211: IEEE80211_WEP_IVLEN */
 #define	IEEE80211_WEP_ICV_LEN			4
 
@@ -539,6 +547,7 @@ enum ieee80211_sa_query {
 enum ieee80211_category {
 	WLAN_CATEGORY_BACK		= 3,
 	WLAN_CATEGORY_SA_QUERY		= 8,	/* net80211::IEEE80211_ACTION_CAT_SA_QUERY */
+	WLAN_CATEGORY_VHT		= 21,
 };
 
 /* 80211-2020 9.3.3.2 Format of Management frames */
@@ -563,6 +572,14 @@ struct ieee80211_mgmt {
 			uint16_t	listen_interval;
 			uint8_t		variable[0];
 		} __packed assoc_req;
+		/* 9.3.3.6 Association Response frame format */
+		/* 9.3.3.8 Reassociation Response frame format */
+		struct {
+			uint16_t	capab_info;
+			uint16_t	status_code;
+			uint16_t	aid;
+			uint8_t		variable[0];
+		} __packed assoc_resp, reassoc_resp;
 		/* 9.3.3.10 Probe Request frame format */
 		struct {
 			uint8_t		variable[0];
@@ -732,15 +749,15 @@ struct ieee80211_trigger {
 /* Table 9-29c-Trigger Type subfield encoding */
 enum {
 	IEEE80211_TRIGGER_TYPE_BASIC		= 0x0,
+	IEEE80211_TRIGGER_TYPE_BFRP		= 0x1,
 	IEEE80211_TRIGGER_TYPE_MU_BAR		= 0x2,
+	IEEE80211_TRIGGER_TYPE_MU_RTS		= 0x3,
+	IEEE80211_TRIGGER_TYPE_BSRP		= 0x4,
+	IEEE80211_TRIGGER_TYPE_BQRP		= 0x6,
+	IEEE80211_TRIGGER_TYPE_NFRP		= 0x7,
 #if 0
 	/* Not seen yet. */
-	BFRP					= 0x1,
-	MU-RTS					= 0x3,
-	BSRP					= 0x4,
 	GCR MU-BAR				= 0x5,
-	BQRP					= 0x6,
-	NFRP					= 0x7,
 	/* 0x8..0xf reserved */
 #endif
 	IEEE80211_TRIGGER_TYPE_MASK		= 0xf
diff --git a/sys/compat/linuxkpi/common/include/linux/nl80211.h b/sys/compat/linuxkpi/common/include/linux/nl80211.h
index 845ffec4bcba..635ded732d7e 100644
--- a/sys/compat/linuxkpi/common/include/linux/nl80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/nl80211.h
@@ -1,5 +1,6 @@
 /*-
  * Copyright (c) 2020-2024 The FreeBSD Foundation
+ * Copyright (c) 2026 Bjoern A. Zeeb
  *
  * This software was developed by Björn Zeeb under sponsorship from
  * the FreeBSD Foundation.
@@ -444,6 +445,11 @@ enum nl80211_rxmgmt_flags {
 	NL80211_RXMGMT_FLAG_EXTERNAL_AUTH	= BIT(1),
 };
 
+enum nl80211_radar_event {
+	NL80211_RADAR_CAC_FINISHED,
+	NL80211_RADAR_CAC_STARTED,
+};
+
 #define	NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY	16
 #define	NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY	24
 
diff --git a/sys/compat/linuxkpi/common/include/net/cfg80211.h b/sys/compat/linuxkpi/common/include/net/cfg80211.h
index dedf687d6530..1538f70b58d0 100644
--- a/sys/compat/linuxkpi/common/include/net/cfg80211.h
+++ b/sys/compat/linuxkpi/common/include/net/cfg80211.h
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2020-2026 The FreeBSD Foundation
- * Copyright (c) 2021-2022 Bjoern A. Zeeb
+ * Copyright (c) 2021-2026 Bjoern A. Zeeb
  *
  * This software was developed by Björn Zeeb under sponsorship from
  * the FreeBSD Foundation.
@@ -64,6 +64,9 @@ extern int linuxkpi_debug_80211;
     printf("%s:%d: XXX LKPI80211 IMPROVE " fmt "\n", __func__, __LINE__, ##__VA_ARGS__)
 #endif
 
+#define	wiphy_dbg(_wiphy, _fmt, ...)						\
+    dev_dbg(&(_wiphy)->dev, _fmt, ##__VA_ARGS__)
+
 enum rfkill_hard_block_reasons {
 	RFKILL_HARD_BLOCK_NOT_OWNER		= BIT(0),
 };
@@ -1023,12 +1026,14 @@ struct ieee80211_iface_limit {
 };
 
 struct ieee80211_iface_combination {
-	/* TODO FIXME */
 	const struct ieee80211_iface_limit	*limits;
-	int					n_limits;
-	int		max_interfaces, num_different_channels;
-	int		beacon_int_infra_match, beacon_int_min_gcd;
-	int		radar_detect_widths;
+	uint32_t				num_different_channels;
+	uint32_t				beacon_int_min_gcd;
+	uint16_t				max_interfaces;
+	uint8_t					n_limits;
+	uint8_t					radar_detect_widths;
+	uint8_t					radar_detect_regions;
+	bool					beacon_int_infra_match;
 };
 
 struct iface_combination_params {
@@ -1204,6 +1209,8 @@ struct wiphy {
 	uint8_t					nan_supported_bands;
 	struct wiphy_nan_capa			nan_capa;
 
+	struct list_head			wdev_list;
+
 	int	features, hw_version;
 	int	interface_modes, max_match_sets, max_remain_on_channel_duration, max_scan_ssids, max_sched_scan_ie_len, max_sched_scan_plan_interval, max_sched_scan_plan_iterations, max_sched_scan_plans, max_sched_scan_reqs, max_sched_scan_ssids;
 	int	num_iftype_ext_capab;
@@ -1230,11 +1237,13 @@ struct wiphy {
 
 struct wireless_dev {
 		/* XXX TODO, like ic? */
+	struct wiphy				*wiphy;
 	enum nl80211_iftype			iftype;
-	uint32_t				radio_mask;
-	uint8_t					address[ETH_ALEN];
+
 	struct net_device			*netdev;
-	struct wiphy				*wiphy;
+	struct list_head			list;
+	uint8_t					address[ETH_ALEN];
+	uint32_t				radio_mask;
 };
 
 struct cfg80211_ops {
@@ -1554,6 +1563,26 @@ cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef)
 	return (false);
 }
 
+static inline enum nl80211_channel_type
+cfg80211_get_chandef_type(const struct cfg80211_chan_def *chandef)
+{
+
+	switch (chandef->width) {
+	case NL80211_CHAN_WIDTH_20_NOHT:
+		return (NL80211_CHAN_NO_HT);
+	case NL80211_CHAN_WIDTH_20:
+		return (NL80211_CHAN_HT20);
+	case NL80211_CHAN_WIDTH_40:
+		if (chandef->center_freq1 < chandef->chan->center_freq)
+			return (NL80211_CHAN_HT40MINUS);
+		return (NL80211_CHAN_HT40PLUS);
+	default:
+		WARN_ONCE(1, "%s: invalid chandef width %d\n",
+		    __func__, chandef->width);
+		return (NL80211_CHAN_NO_HT);
+	}
+}
+
 static inline int
 cfg80211_chandef_get_width(const struct cfg80211_chan_def *chandef)
 {
@@ -1574,6 +1603,13 @@ cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy, const struct cfg80211_chan_de
 	return (0);
 }
 
+static inline void
+cfg80211_cac_event(struct net_device *netdev, const struct cfg80211_chan_def *chandef,
+    enum nl80211_radar_event re, gfp_t gfp, unsigned int link_id)
+{
+	TODO();
+}
+
 static __inline bool
 cfg80211_chandef_identical(const struct cfg80211_chan_def *chandef_1,
     const struct cfg80211_chan_def *chandef_2)
diff --git a/sys/compat/linuxkpi/common/include/net/mac80211.h b/sys/compat/linuxkpi/common/include/net/mac80211.h
index 5555e14b06f9..83521c2fabaf 100644
--- a/sys/compat/linuxkpi/common/include/net/mac80211.h
+++ b/sys/compat/linuxkpi/common/include/net/mac80211.h
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 2020-2026 The FreeBSD Foundation
- * Copyright (c) 2020-2025 Bjoern A. Zeeb
+ * Copyright (c) 2020-2026 Bjoern A. Zeeb
  *
  * This software was developed by Björn Zeeb under sponsorship from
  * the FreeBSD Foundation.
@@ -471,6 +471,7 @@ enum ieee80211_hw_flags {
 	IEEE80211_HW_TX_STATUS_NO_AMPDU_LEN,
 	IEEE80211_HW_HANDLES_QUIET_CSA,
 	IEEE80211_HW_NO_VIRTUAL_MONITOR,
+	IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING,
 
 	/* Keep last. */
 	NUM_IEEE80211_HW_FLAGS
@@ -647,6 +648,7 @@ struct ieee80211_rx_status {
 	uint8_t				band;
 	uint8_t				chains;
 	int8_t				chain_signal[IEEE80211_MAX_CHAINS];
+	uint8_t				antenna;
 	int8_t				signal;
 	uint8_t				enc_flags;
 	union {
@@ -1056,6 +1058,7 @@ struct ieee80211_ops {
         uint64_t (*get_tsf)(struct ieee80211_hw *, struct ieee80211_vif *);
         void (*set_tsf)(struct ieee80211_hw *, struct ieee80211_vif *, uint64_t);
 	void (*offset_tsf)(struct ieee80211_hw *, struct ieee80211_vif *, s64);
+	void (*reset_tsf)(struct ieee80211_hw *, struct ieee80211_vif *);
 
 	int  (*set_bitrate_mask)(struct ieee80211_hw *, struct ieee80211_vif *, const struct cfg80211_bitrate_mask *);
 	void (*set_coverage_class)(struct ieee80211_hw *, int, s16);
@@ -2106,6 +2109,13 @@ ieee80211_sta_set_buffered(struct ieee80211_sta *sta, uint8_t tid, bool t)
 	TODO();
 }
 
+static inline struct sk_buff *
+ieee80211_get_buffered_bc(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+{
+	TODO("IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING (espwl)");
+	return (NULL);
+}
+
 static __inline void
 ieee80211_sched_scan_results(struct ieee80211_hw *hw)
 {