git: 0567484734ad - main - LinuxKPI: 802.11: additions for Linux v6.17 based wireless drivers

From: Bjoern A. Zeeb <bz_at_FreeBSD.org>
Date: Tue, 21 Oct 2025 07:53:18 UTC
The branch main has been updated by bz:

URL: https://cgit.FreeBSD.org/src/commit/?id=0567484734ad9732978e189ebed042f6320e2471

commit 0567484734ad9732978e189ebed042f6320e2471
Author:     Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2025-10-11 09:21:55 +0000
Commit:     Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2025-10-21 07:52:21 +0000

    LinuxKPI: 802.11: additions for Linux v6.17 based wireless drivers
    
    This includes some type cleanups as well as some shuffling of structs
    and functions to sort dependencies out.  Few new functions and defines
    as well as new struct members.  Minor fixes to style and debug logging.
    
    This is the majority of changes.  None of these should conflict with
    current in-tree drivers.  The final bit of changes will come along with
    the driver updates adding an extra argument to function pointers.
    
    MFC after:      3 days
---
 .../linuxkpi/common/include/linux/ieee80211.h      |   2 +
 sys/compat/linuxkpi/common/include/linux/nl80211.h |  10 +
 sys/compat/linuxkpi/common/include/net/cfg80211.h  | 320 ++++++++++++++-------
 sys/compat/linuxkpi/common/include/net/mac80211.h  |  37 +--
 sys/compat/linuxkpi/common/src/linux_80211.c       |  12 +-
 .../linuxkpi/common/src/linux_80211_macops.c       |   2 +-
 6 files changed, 247 insertions(+), 136 deletions(-)

diff --git a/sys/compat/linuxkpi/common/include/linux/ieee80211.h b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
index 17041bb03ce8..ea8c0fc8ef5e 100644
--- a/sys/compat/linuxkpi/common/include/linux/ieee80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
@@ -312,6 +312,7 @@ enum ieee80211_ac_numbers {
 #define	IEEE80211_MLD_CAP_OP_MAX_SIMUL_LINKS	0xf
 #define	IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP		0x0060
 #define	IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP_SAME	1
+#define	IEEE80211_MLD_CAP_OP_LINK_RECONF_SUPPORT		0x2000
 
 struct ieee80211_mcs_info {
 	uint8_t		rx_mask[IEEE80211_HT_MCS_MASK_LEN];
@@ -365,6 +366,7 @@ enum ieee80211_chanctx_change_flags {
 	IEEE80211_CHANCTX_CHANGE_CHANNEL	= BIT(4),
 	IEEE80211_CHANCTX_CHANGE_PUNCTURING	= BIT(5),
 	IEEE80211_CHANCTX_CHANGE_MIN_DEF	= BIT(6),
+	IEEE80211_CHANCTX_CHANGE_AP		= BIT(7),
 };
 
 enum ieee80211_frame_release_type {
diff --git a/sys/compat/linuxkpi/common/include/linux/nl80211.h b/sys/compat/linuxkpi/common/include/linux/nl80211.h
index f3979d3a2abc..845ffec4bcba 100644
--- a/sys/compat/linuxkpi/common/include/linux/nl80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/nl80211.h
@@ -50,6 +50,7 @@ enum nl80211_feature_flags {
 	NL80211_FEATURE_WFA_TPC_IE_IN_PROBES		= BIT(15),
 	NL80211_FEATURE_AP_SCAN				= BIT(16),
 	NL80211_FEATURE_ACTIVE_MONITOR			= BIT(17),
+	NL80211_FEATURE_SAE				= BIT(18),
 };
 
 enum nl80211_pmsr_ftm_failure_flags {
@@ -85,6 +86,7 @@ enum nl80211_reg_rule_flags {
 	NL80211_RRF_NO_6GHZ_AFC_CLIENT			= BIT(15),
 	NL80211_RRF_PSD					= BIT(16),
 	NL80211_RRF_ALLOW_6GHZ_VLP_AP			= BIT(17),
+	NL80211_RRF_ALLOW_20MHZ_ACTIVITY		= BIT(18),
 };
 #define	NL80211_RRF_NO_HT40	(NL80211_RRF_NO_HT40MINUS|NL80211_RRF_NO_HT40PLUS)
 
@@ -434,6 +436,14 @@ enum nl80211_hidden_ssid {
 	NL80211_HIDDEN_SSID_NOT_IN_USE,
 };
 
+enum nl80211_external_auth_action {
+	NL80211_EXTERNAL_AUTH_START,
+};
+
+enum nl80211_rxmgmt_flags {
+	NL80211_RXMGMT_FLAG_EXTERNAL_AUTH	= BIT(1),
+};
+
 #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 239b4a5ae7b8..f769cfdd4075 100644
--- a/sys/compat/linuxkpi/common/include/net/cfg80211.h
+++ b/sys/compat/linuxkpi/common/include/net/cfg80211.h
@@ -56,7 +56,7 @@ extern int linuxkpi_debug_80211;
 #define	D80211_IMPROVE		0x2
 #endif
 #define	TODO(fmt, ...)		if (linuxkpi_debug_80211 & D80211_TODO)	\
-    printf("%s:%d: XXX LKPI80211 TODO " fmt "\n",  __func__, __LINE__, ##__VA_ARGS__)
+    printf("%s:%d: XXX LKPI80211 TODO " fmt "\n", __func__, __LINE__, ##__VA_ARGS__)
 #define	IMPROVE(fmt, ...)	if (linuxkpi_debug_80211 & D80211_IMPROVE)	\
     printf("%s:%d: XXX LKPI80211 IMPROVE " fmt "\n", __func__, __LINE__, ##__VA_ARGS__)
 
@@ -260,6 +260,19 @@ enum ieee80211_vht_opmode {
 	IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT	= 4,
 };
 
+struct cfg80211_bss_ies {
+	uint8_t				*data;
+	size_t				len;
+};
+
+struct cfg80211_bss {
+		/* XXX TODO */
+	struct cfg80211_bss_ies		*ies;
+	struct cfg80211_bss_ies		*beacon_ies;
+	uint64_t			ts_boottime;
+	int32_t				signal;
+};
+
 struct cfg80211_connect_resp_params {
 		/* XXX TODO */
 	uint8_t				*bssid;
@@ -267,7 +280,13 @@ struct cfg80211_connect_resp_params {
 	const uint8_t			*resp_ie;
 	uint32_t			req_ie_len;
 	uint32_t			resp_ie_len;
-	int	status;
+	int				status;
+	struct {
+		const uint8_t			*addr;
+		const uint8_t			*bssid;
+		struct cfg80211_bss		*bss;
+		uint16_t			status;
+	} links[IEEE80211_MLD_MAX_NUM_LINKS];
 };
 
 struct cfg80211_inform_bss {
@@ -284,19 +303,12 @@ struct cfg80211_roam_info {
 	uint32_t			req_ie_len;
 	uint32_t			resp_ie_len;
 	struct linuxkpi_ieee80211_channel	*channel;
-};
-
-struct cfg80211_bss_ies {
-	uint8_t				*data;
-	size_t				len;
-};
-
-struct cfg80211_bss {
-		/* XXX TODO */
-	struct cfg80211_bss_ies		*ies;
-	struct cfg80211_bss_ies		*beacon_ies;
-
-	int32_t				signal;
+	struct {
+		const uint8_t			*addr;
+		const uint8_t			*bssid;
+		struct cfg80211_bss		*bss;
+		struct linuxkpi_ieee80211_channel *channel;
+	} links[IEEE80211_MLD_MAX_NUM_LINKS];
 };
 
 struct cfg80211_chan_def {
@@ -404,6 +416,7 @@ struct cfg80211_scan_request {
 	bool					no_cck;
 	bool					scan_6ghz;
 	bool					duration_mandatory;
+	bool					first_part;
 	int8_t					tsf_report_link_id;
 	uint16_t				duration;
 	uint32_t				flags;
@@ -463,6 +476,24 @@ struct cfg80211_beacon_data {
 	uint32_t				assocresp_ies_len;
 };
 
+struct cfg80211_ap_update {
+	/* XXX TODO */
+	struct cfg80211_beacon_data		beacon;
+};
+
+struct cfg80211_crypto_settings {
+	/* XXX TODO */
+	enum nl80211_wpa_versions		wpa_versions;
+	uint32_t				cipher_group;	/* WLAN_CIPHER_SUITE_* */
+	uint32_t				*akm_suites;
+	uint32_t				*ciphers_pairwise;
+	const uint8_t				*sae_pwd;
+	const uint8_t				*psk;
+	int					n_akm_suites;
+	int					n_ciphers_pairwise;
+	int					sae_pwd_len;
+};
+
 struct cfg80211_ap_settings {
 	/* XXX TODO */
 	int     auth_type, beacon_interval, dtim_period, hidden_ssid, inactivity_timeout;
@@ -470,6 +501,7 @@ struct cfg80211_ap_settings {
 	size_t					ssid_len;
 	struct cfg80211_beacon_data		beacon;
 	struct cfg80211_chan_def		chandef;
+	struct cfg80211_crypto_settings		crypto;
 };
 
 struct cfg80211_bss_selection {
@@ -484,23 +516,12 @@ struct cfg80211_bss_selection {
 	} param;
 };
 
-struct cfg80211_crypto {		/* XXX made up name */
-	/* XXX TODO */
-	enum nl80211_wpa_versions		wpa_versions;
-	uint32_t				cipher_group;	/* WLAN_CIPHER_SUITE_* */
-	uint32_t				*akm_suites;
-	uint32_t				*ciphers_pairwise;
-	const uint8_t				*sae_pwd;
-	const uint8_t				*psk;
-	int					n_akm_suites;
-	int					n_ciphers_pairwise;
-	int					sae_pwd_len;
-};
-
 struct cfg80211_connect_params {
 	/* XXX TODO */
 	struct linuxkpi_ieee80211_channel	*channel;
+	struct linuxkpi_ieee80211_channel	*channel_hint;
 	uint8_t					*bssid;
+	uint8_t					*bssid_hint;
 	const uint8_t				*ie;
 	const uint8_t				*ssid;
 	uint32_t				ie_len;
@@ -509,7 +530,7 @@ struct cfg80211_connect_params {
 	uint32_t				key_len;
 	int     auth_type, key_idx, privacy, want_1x;
 	struct cfg80211_bss_selection		bss_select;
-	struct cfg80211_crypto			crypto;
+	struct cfg80211_crypto_settings		crypto;
 };
 
 enum bss_param_flags {		/* Used as bitflags. XXX FIXME values? */
@@ -538,6 +559,14 @@ struct cfg80211_mgmt_tx_params {
 	int	wait;
 };
 
+struct cfg80211_external_auth_params {
+	uint8_t					bssid[ETH_ALEN];
+        uint16_t				status;
+        enum nl80211_external_auth_action	action;
+        unsigned int				key_mgmt_suite;
+        struct cfg80211_ssid			ssid;
+};
+
 struct cfg80211_pmk_conf {
 	/* XXX TODO */
 	const uint8_t			*pmk;
@@ -548,6 +577,8 @@ struct cfg80211_pmksa {
 	/* XXX TODO */
 	const uint8_t			*bssid;
 	const uint8_t			*pmkid;
+	const uint8_t			*ssid;
+	size_t				ssid_len;
 };
 
 struct station_del_parameters {
@@ -961,6 +992,27 @@ struct cfg80211_set_hw_timestamp {
 	bool					enable;
 };
 
+struct survey_info {		/* net80211::struct ieee80211_channel_survey */
+	/* TODO FIXME */
+	uint32_t			filled;
+#define	SURVEY_INFO_TIME		0x0001
+#define	SURVEY_INFO_TIME_RX		0x0002
+#define	SURVEY_INFO_TIME_SCAN		0x0004
+#define	SURVEY_INFO_TIME_TX		0x0008
+#define	SURVEY_INFO_TIME_BSS_RX		0x0010
+#define	SURVEY_INFO_TIME_BUSY		0x0020
+#define	SURVEY_INFO_IN_USE		0x0040
+#define	SURVEY_INFO_NOISE_DBM		0x0080
+	uint32_t			noise;
+	uint64_t			time;
+	uint64_t			time_bss_rx;
+	uint64_t			time_busy;
+	uint64_t			time_rx;
+	uint64_t			time_scan;
+	uint64_t			time_tx;
+	struct linuxkpi_ieee80211_channel *channel;
+};
+
 enum wiphy_vendor_cmd_need_flags {
 	WIPHY_VENDOR_CMD_NEED_NETDEV		= 0x01,
 	WIPHY_VENDOR_CMD_NEED_RUNNING		= 0x02,
@@ -1118,49 +1170,53 @@ struct wireless_dev {
 struct cfg80211_ops {
 	/* XXX TODO */
 	struct wireless_dev *(*add_virtual_intf)(struct wiphy *, const char *, unsigned char, enum nl80211_iftype, struct vif_params *);
-	int (*del_virtual_intf)(struct wiphy *,  struct wireless_dev *);
-	s32 (*change_virtual_intf)(struct wiphy *,  struct net_device *, enum nl80211_iftype, struct vif_params *);
-	s32 (*scan)(struct wiphy *,  struct cfg80211_scan_request *);
-	s32 (*set_wiphy_params)(struct wiphy *,  u32);
-	s32 (*join_ibss)(struct wiphy *,  struct net_device *, struct cfg80211_ibss_params *);
-	s32 (*leave_ibss)(struct wiphy *,  struct net_device *);
-	s32 (*get_station)(struct wiphy *, struct net_device *, const u8 *, struct station_info *);
-	int (*dump_station)(struct wiphy *,  struct net_device *, int,  u8 *,  struct station_info *);
-	s32 (*set_tx_power)(struct wiphy *,  struct wireless_dev *, enum nl80211_tx_power_setting,  s32);
-	s32 (*get_tx_power)(struct wiphy *,  struct wireless_dev *, s32 *);
-	s32 (*add_key)(struct wiphy *,  struct net_device *, u8,  bool,  const u8 *, struct key_params *);
-	s32 (*del_key)(struct wiphy *,  struct net_device *, u8,  bool,  const u8 *);
-	s32 (*get_key)(struct wiphy *,  struct net_device *,  u8, bool,  const u8 *,  void *, void(*)(void *, struct key_params *));
-	s32 (*set_default_key)(struct wiphy *,  struct net_device *, u8,  bool,  bool);
-	s32 (*set_default_mgmt_key)(struct wiphy *, struct net_device *,  u8);
-	s32 (*set_power_mgmt)(struct wiphy *,  struct net_device *, bool,  s32);
-	s32 (*connect)(struct wiphy *,  struct net_device *, struct cfg80211_connect_params *);
-	s32 (*disconnect)(struct wiphy *,  struct net_device *, u16);
-	s32 (*suspend)(struct wiphy *, struct cfg80211_wowlan *);
-	s32 (*resume)(struct wiphy *);
-	s32 (*set_pmksa)(struct wiphy *, struct net_device *, struct cfg80211_pmksa *);
-	s32 (*del_pmksa)(struct wiphy *, struct net_device *, struct cfg80211_pmksa *);
-	s32 (*flush_pmksa)(struct wiphy *,  struct net_device *);
-	s32 (*start_ap)(struct wiphy *,  struct net_device *, struct cfg80211_ap_settings *);
-	int (*stop_ap)(struct wiphy *,  struct net_device *);
-	s32 (*change_beacon)(struct wiphy *,  struct net_device *, struct cfg80211_beacon_data *);
-	int (*del_station)(struct wiphy *,  struct net_device *, struct station_del_parameters *);
-	int (*change_station)(struct wiphy *,  struct net_device *, const u8 *,  struct station_parameters *);
+	int (*del_virtual_intf)(struct wiphy *, struct wireless_dev *);
+	int (*change_virtual_intf)(struct wiphy *, struct net_device *, enum nl80211_iftype, struct vif_params *);
+	int (*scan)(struct wiphy *, struct cfg80211_scan_request *);
+	int (*set_wiphy_params)(struct wiphy *, int, uint32_t);
+	int (*join_ibss)(struct wiphy *, struct net_device *, struct cfg80211_ibss_params *);
+	int (*leave_ibss)(struct wiphy *, struct net_device *);
+	int (*get_station)(struct wiphy *, struct net_device *, const uint8_t *, struct station_info *);
+	int (*dump_station)(struct wiphy *, struct net_device *, int, uint8_t *, struct station_info *);
+	int (*set_tx_power)(struct wiphy *, struct wireless_dev *, int, enum nl80211_tx_power_setting, int);
+	int (*get_tx_power)(struct wiphy *, struct wireless_dev *, int, unsigned int, int *);
+	int (*add_key)(struct wiphy *, struct net_device *, int, uint8_t, bool, const uint8_t *, struct key_params *);
+	int (*del_key)(struct wiphy *, struct net_device *, int, uint8_t, bool, const uint8_t *);
+	int (*get_key)(struct wiphy *, struct net_device *, int, uint8_t, bool, const uint8_t *, void *, void(*)(void *, struct key_params *));
+	int (*set_default_key)(struct wiphy *, struct net_device *, int, uint8_t, bool, bool);
+	int (*set_default_mgmt_key)(struct wiphy *, struct net_device *, int, uint8_t);
+	int (*set_power_mgmt)(struct wiphy *, struct net_device *, bool, int);
+	int (*connect)(struct wiphy *, struct net_device *, struct cfg80211_connect_params *);
+	int (*disconnect)(struct wiphy *, struct net_device *, uint16_t);
+	int (*suspend)(struct wiphy *, struct cfg80211_wowlan *);
+	int (*resume)(struct wiphy *);
+	int (*set_pmksa)(struct wiphy *, struct net_device *, struct cfg80211_pmksa *);
+	int (*del_pmksa)(struct wiphy *, struct net_device *, struct cfg80211_pmksa *);
+	int (*flush_pmksa)(struct wiphy *, struct net_device *);
+	int (*start_ap)(struct wiphy *, struct net_device *, struct cfg80211_ap_settings *);
+	int (*stop_ap)(struct wiphy *, struct net_device *, unsigned int);
+	int (*change_beacon)(struct wiphy *, struct net_device *, struct cfg80211_ap_update *);
+	int (*del_station)(struct wiphy *, struct net_device *, struct station_del_parameters *);
+	int (*change_station)(struct wiphy *, struct net_device *, const uint8_t *, struct station_parameters *);
 	int (*sched_scan_start)(struct wiphy *, struct net_device *, struct cfg80211_sched_scan_request *);
-	int (*sched_scan_stop)(struct wiphy *, struct net_device *,  u64);
+	int (*sched_scan_stop)(struct wiphy *, struct net_device *, uint64_t);
 	void (*update_mgmt_frame_registrations)(struct wiphy *, struct wireless_dev *, struct mgmt_frame_regs *);
-	int (*mgmt_tx)(struct wiphy *,  struct wireless_dev *, struct cfg80211_mgmt_tx_params *,  u64 *);
-	int (*cancel_remain_on_channel)(struct wiphy *, struct wireless_dev *, u64);
-	int (*get_channel)(struct wiphy *, struct wireless_dev *, struct cfg80211_chan_def *);
-	int (*crit_proto_start)(struct wiphy *, struct wireless_dev *, enum nl80211_crit_proto_id, u16);
+	int (*mgmt_tx)(struct wiphy *, struct wireless_dev *, struct cfg80211_mgmt_tx_params *, uint64_t *);
+	int (*cancel_remain_on_channel)(struct wiphy *, struct wireless_dev *, uint64_t);
+	int (*get_channel)(struct wiphy *, struct wireless_dev *, unsigned int, struct cfg80211_chan_def *);
+	int (*crit_proto_start)(struct wiphy *, struct wireless_dev *, enum nl80211_crit_proto_id, uint16_t);
 	void (*crit_proto_stop)(struct wiphy *, struct wireless_dev *);
-	int (*tdls_oper)(struct wiphy *, struct net_device *,  const u8 *, enum nl80211_tdls_operation);
-	int (*update_connect_params)(struct wiphy *, struct net_device *, struct cfg80211_connect_params *, u32);
-	int (*set_pmk)(struct wiphy *,  struct net_device *, const struct cfg80211_pmk_conf *);
-	int (*del_pmk)(struct wiphy *,  struct net_device *, const u8 *);
-	int (*remain_on_channel)(struct wiphy *,  struct wireless_dev *, struct linuxkpi_ieee80211_channel *, unsigned int,  u64 *);
-	int (*start_p2p_device)(struct wiphy *,  struct wireless_dev *);
-	void (*stop_p2p_device)(struct wiphy *,  struct wireless_dev *);
+	int (*tdls_oper)(struct wiphy *, struct net_device *, const uint8_t *, enum nl80211_tdls_operation);
+	int (*update_connect_params)(struct wiphy *, struct net_device *, struct cfg80211_connect_params *, uint32_t);
+	int (*set_pmk)(struct wiphy *, struct net_device *, const struct cfg80211_pmk_conf *);
+	int (*del_pmk)(struct wiphy *, struct net_device *, const uint8_t *);
+	int (*remain_on_channel)(struct wiphy *, struct wireless_dev *, struct linuxkpi_ieee80211_channel *, unsigned int, uint64_t *);
+	int (*start_p2p_device)(struct wiphy *, struct wireless_dev *);
+	void (*stop_p2p_device)(struct wiphy *, struct wireless_dev *);
+	int (*dump_survey)(struct wiphy *, struct net_device *, int, struct survey_info *);
+	int (*external_auth)(struct wiphy *, struct net_device *, struct cfg80211_external_auth_params *);
+        int (*set_cqm_rssi_range_config)(struct wiphy *, struct net_device *, int, int);
+
 };
 
 
@@ -1179,6 +1235,8 @@ void linuxkpi_wiphy_delayed_work_queue(struct wiphy *,
     struct wiphy_delayed_work *, unsigned long);
 void linuxkpi_wiphy_delayed_work_cancel(struct wiphy *,
     struct wiphy_delayed_work *);
+void linuxkpi_wiphy_delayed_work_flush(struct wiphy *,
+    struct wiphy_delayed_work *);
 
 int linuxkpi_regulatory_set_wiphy_regd_sync(struct wiphy *wiphy,
     struct linuxkpi_ieee80211_regdomain *regd);
@@ -1247,6 +1305,21 @@ wiphy_rfkill_set_hw_state_reason(struct wiphy *wiphy, bool blocked,
 
 /* -------------------------------------------------------------------------- */
 
+static inline int
+cfg80211_register_netdevice(struct net_device *ndev)
+{
+	TODO();
+	return (-ENXIO);
+}
+
+static inline void
+cfg80211_unregister_netdevice(struct net_device *ndev)
+{
+	TODO();
+}
+
+/* -------------------------------------------------------------------------- */
+
 static inline struct cfg80211_bss *
 cfg80211_get_bss(struct wiphy *wiphy, struct linuxkpi_ieee80211_channel *chan,
     const uint8_t *bssid, const uint8_t *ssid, size_t ssid_len,
@@ -1309,15 +1382,15 @@ reg_query_regdb_wmm(uint8_t *alpha2, uint32_t center_freq,
 	return (-ENODATA);
 }
 
-static __inline const u8 *
-cfg80211_find_ie_match(uint32_t f, const u8 *ies, size_t ies_len,
-    const u8 *match, int x, int y)
+static __inline const uint8_t *
+cfg80211_find_ie_match(uint32_t f, const uint8_t *ies, size_t ies_len,
+    const uint8_t *match, int x, int y)
 {
 	TODO();
 	return (NULL);
 }
 
-static __inline const u8 *
+static __inline const uint8_t *
 cfg80211_find_ie(uint8_t eid, const uint8_t *ie, uint32_t ielen)
 {
 	TODO();
@@ -1339,6 +1412,36 @@ cfg80211_pmsr_report(struct wireless_dev *wdev,
 	TODO();
 }
 
+static inline int
+nl80211_chan_width_to_mhz(enum nl80211_chan_width width)
+{
+	switch (width) {
+	case NL80211_CHAN_WIDTH_5:
+		return (5);
+		break;
+	case NL80211_CHAN_WIDTH_10:
+		return (10);
+		break;
+	case NL80211_CHAN_WIDTH_20_NOHT:
+	case NL80211_CHAN_WIDTH_20:
+		return (20);
+		break;
+	case NL80211_CHAN_WIDTH_40:
+		return (40);
+		break;
+	case NL80211_CHAN_WIDTH_80:
+	case NL80211_CHAN_WIDTH_80P80:
+		return (80);
+		break;
+	case NL80211_CHAN_WIDTH_160:
+		return (160);
+		break;
+	case NL80211_CHAN_WIDTH_320:
+		return (320);
+		break;
+	}
+}
+
 static inline void
 cfg80211_chandef_create(struct cfg80211_chan_def *chandef,
     struct linuxkpi_ieee80211_channel *chan, enum nl80211_channel_type chan_type)
@@ -1377,6 +1480,12 @@ cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef)
 	return (false);
 }
 
+static inline int
+cfg80211_chandef_get_width(const struct cfg80211_chan_def *chandef)
+{
+	return (nl80211_chan_width_to_mhz(chandef->width));
+}
+
 static __inline bool
 cfg80211_chandef_dfs_usable(struct wiphy *wiphy, const struct cfg80211_chan_def *chandef)
 {
@@ -1688,8 +1797,8 @@ cfg80211_disconnected(struct net_device *ndev, uint16_t reason,
 }
 
 static __inline int
-cfg80211_get_p2p_attr(const u8 *ie, u32 ie_len,
-    enum ieee80211_p2p_attr_ids attr, u8 *p, size_t p_len)
+cfg80211_get_p2p_attr(const uint8_t *ie, uint32_t ie_len,
+    enum ieee80211_p2p_attr_ids attr, uint8_t *p, size_t p_len)
 {
 	TODO();
 	return (-1);
@@ -1725,13 +1834,13 @@ cfg80211_inform_bss_data(struct wiphy *wiphy,
 
 static __inline void
 cfg80211_mgmt_tx_status(struct wireless_dev *wdev, uint64_t cookie,
-    const u8 *buf, size_t len, bool ack, gfp_t gfp)
+    const uint8_t *buf, size_t len, bool ack, gfp_t gfp)
 {
 	TODO();
 }
 
 static __inline void
-cfg80211_michael_mic_failure(struct net_device *ndev, const uint8_t *addr,
+cfg80211_michael_mic_failure(struct net_device *ndev, const uint8_t addr[ETH_ALEN],
     enum nl80211_key_type key_type, int _x, void *p, gfp_t gfp)
 {
 	TODO();
@@ -1751,8 +1860,8 @@ cfg80211_del_sta(struct net_device *ndev, const uint8_t *addr, gfp_t gfp)
 }
 
 static __inline void
-cfg80211_port_authorized(struct net_device *ndev, const uint8_t *bssid,
-    gfp_t gfp)
+cfg80211_port_authorized(struct net_device *ndev, const uint8_t *addr,
+    const uint8_t *bitmap, uint8_t len, gfp_t gfp)
 {
 	TODO();
 }
@@ -1935,7 +2044,7 @@ cfg80211_background_radar_event(struct wiphy *wiphy,
 	TODO();
 }
 
-static __inline const u8 *
+static __inline const uint8_t *
 cfg80211_find_ext_ie(uint8_t eid, const uint8_t *p, size_t len)
 {
 	TODO();
@@ -2033,6 +2142,14 @@ cfg80211_get_iftype_ext_capa(struct wiphy *wiphy, enum nl80211_iftype iftype)
 	return (NULL);
 }
 
+static inline int
+cfg80211_external_auth_request(struct net_device *ndev,
+    struct cfg80211_external_auth_params *params, gfp_t gfp)
+{
+	TODO();
+	return (-ENXIO);
+}
+
 static inline uint16_t
 ieee80211_get_he_6ghz_capa(const struct ieee80211_supported_band *sband,
     enum nl80211_iftype iftype)
@@ -2041,36 +2158,6 @@ ieee80211_get_he_6ghz_capa(const struct ieee80211_supported_band *sband,
 	return (0);
 }
 
-static inline int
-nl80211_chan_width_to_mhz(enum nl80211_chan_width width)
-{
-	switch (width) {
-	case NL80211_CHAN_WIDTH_5:
-		return (5);
-		break;
-	case NL80211_CHAN_WIDTH_10:
-		return (10);
-		break;
-	case NL80211_CHAN_WIDTH_20_NOHT:
-	case NL80211_CHAN_WIDTH_20:
-		return (20);
-		break;
-	case NL80211_CHAN_WIDTH_40:
-		return (40);
-		break;
-	case NL80211_CHAN_WIDTH_80:
-	case NL80211_CHAN_WIDTH_80P80:
-		return (80);
-		break;
-	case NL80211_CHAN_WIDTH_160:
-		return (160);
-		break;
-	case NL80211_CHAN_WIDTH_320:
-		return (320);
-		break;
-	}
-}
-
 static __inline ssize_t
 wiphy_locked_debugfs_read(struct wiphy *wiphy, struct file *file,
     char *buf, size_t bufsize, const char __user *userbuf, size_t count,
@@ -2093,6 +2180,13 @@ wiphy_locked_debugfs_write(struct wiphy *wiphy, struct file *file,
 	return (-ENXIO);
 }
 
+static inline void
+cfg80211_cqm_rssi_notify(struct net_device *dev,
+    enum nl80211_cqm_rssi_threshold_event rssi_te, int32_t rssi, gfp_t gfp)
+{
+	TODO();
+}
+
 /* -------------------------------------------------------------------------- */
 
 static inline void
@@ -2140,6 +2234,12 @@ wiphy_delayed_work_cancel(struct wiphy *wiphy, struct wiphy_delayed_work *wdwk)
 	linuxkpi_wiphy_delayed_work_cancel(wiphy, wdwk);
 }
 
+static inline void
+wiphy_delayed_work_flush(struct wiphy *wiphy, struct wiphy_delayed_work *wdwk)
+{
+	linuxkpi_wiphy_delayed_work_flush(wiphy, wdwk);
+}
+
 /* -------------------------------------------------------------------------- */
 
 #define	wiphy_err(_wiphy, _fmt, ...)					\
diff --git a/sys/compat/linuxkpi/common/include/net/mac80211.h b/sys/compat/linuxkpi/common/include/net/mac80211.h
index 8de03410c6b6..523836b52a40 100644
--- a/sys/compat/linuxkpi/common/include/net/mac80211.h
+++ b/sys/compat/linuxkpi/common/include/net/mac80211.h
@@ -166,7 +166,7 @@ enum ieee80211_bss_changed {
 #define	WLAN_AKM_SUITE_PSK_SHA256	WLAN_AKM_SUITE(6)
 /* TDLS					7 */
 #define	WLAN_AKM_SUITE_SAE		WLAN_AKM_SUITE(8)
-/* FToSAE				9 */
+#define	WLAN_AKM_SUITE_FT_OVER_SAE	WLAN_AKM_SUITE(9)
 /* AP peer key				10 */
 /* 802.1x suite B			11 */
 /* 802.1x suite B 384			12 */
@@ -857,7 +857,8 @@ struct ieee80211_vif_chanctx_switch {
 };
 
 struct ieee80211_prep_tx_info {
-	u16				duration;
+	uint16_t			duration;
+	uint16_t			subtype;
 	bool				success;
 	bool				was_assoc;
 	int				link_id;
@@ -904,27 +905,6 @@ struct linuxkpi_ieee80211_tim_ie {
 };
 #define	ieee80211_tim_ie	linuxkpi_ieee80211_tim_ie
 
-struct survey_info {		/* net80211::struct ieee80211_channel_survey */
-	/* TODO FIXME */
-	uint32_t			filled;
-#define	SURVEY_INFO_TIME		0x0001
-#define	SURVEY_INFO_TIME_RX		0x0002
-#define	SURVEY_INFO_TIME_SCAN		0x0004
-#define	SURVEY_INFO_TIME_TX		0x0008
-#define	SURVEY_INFO_TIME_BSS_RX		0x0010
-#define	SURVEY_INFO_TIME_BUSY		0x0020
-#define	SURVEY_INFO_IN_USE		0x0040
-#define	SURVEY_INFO_NOISE_DBM		0x0080
-	uint32_t			noise;
-	uint64_t			time;
-	uint64_t			time_bss_rx;
-	uint64_t			time_busy;
-	uint64_t			time_rx;
-	uint64_t			time_scan;
-	uint64_t			time_tx;
-	struct ieee80211_channel	*channel;
-};
-
 enum ieee80211_iface_iter {
 	IEEE80211_IFACE_ITER_NORMAL	= BIT(0),
 	IEEE80211_IFACE_ITER_RESUME_ALL	= BIT(1),
@@ -1552,6 +1532,15 @@ ieee80211_iter_chan_contexts_atomic(struct ieee80211_hw *hw,
 	linuxkpi_ieee80211_iterate_chan_contexts(hw, iterfunc, arg);
 }
 
+static __inline void
+ieee80211_iter_chan_contexts_mtx(struct ieee80211_hw *hw,
+    void (*iterfunc)(struct ieee80211_hw *, struct ieee80211_chanctx_conf *, void *),
+    void *arg)
+{
+	IMPROVE("XXX LKPI80211 TODO MTX\n");
+	linuxkpi_ieee80211_iterate_chan_contexts(hw, iterfunc, arg);
+}
+
 static __inline void
 ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
    void (*iterfunc)(void *, struct ieee80211_sta *), void *arg)
@@ -2063,7 +2052,7 @@ ieee80211_tx_dequeue_ni(struct ieee80211_hw *hw, struct ieee80211_txq *txq)
 
 static __inline void
 ieee80211_update_mu_groups(struct ieee80211_vif *vif,
-    u_int _i, uint8_t *ms, uint8_t *up)
+    u_int link_id, const uint8_t *ms, const uint8_t *up)
 {
 	TODO();
 }
diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c
index bc4b334de28e..0dc3b2631804 100644
--- a/sys/compat/linuxkpi/common/src/linux_80211.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211.c
@@ -7833,7 +7833,7 @@ lkpi_wiphy_delayed_work_timer(struct timer_list *tl)
 	struct wiphy_delayed_work *wdwk;
 
 	wdwk = timer_container_of(wdwk, tl, timer);
-        wiphy_work_queue(wdwk->wiphy, &wdwk->work);
+	wiphy_work_queue(wdwk->wiphy, &wdwk->work);
 }
 
 void
@@ -7858,6 +7858,16 @@ linuxkpi_wiphy_delayed_work_cancel(struct wiphy *wiphy,
 	wiphy_work_cancel(wiphy, &wdwk->work);
 }
 
+void
+linuxkpi_wiphy_delayed_work_flush(struct wiphy *wiphy,
+    struct wiphy_delayed_work *wdwk)
+{
+	lockdep_assert_held(&wiphy->mtx);
+
+	del_timer_sync(&wdwk->timer);
+	wiphy_work_flush(wiphy, &wdwk->work);
+}
+
 /* -------------------------------------------------------------------------- */
 
 struct wiphy *
diff --git a/sys/compat/linuxkpi/common/src/linux_80211_macops.c b/sys/compat/linuxkpi/common/src/linux_80211_macops.c
index 1046b753574f..04f9f6d7e7fc 100644
--- a/sys/compat/linuxkpi/common/src/linux_80211_macops.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211_macops.c
@@ -42,7 +42,7 @@
     if (linuxkpi_debug_80211 & D80211_TRACE_MO)				\
 	printf("LKPI_80211_TRACE_MO %s:%d: %d %d %lu: " fmt "\n",	\
 	    __func__, __LINE__, curcpu, curthread->td_tid,		\
-	    jiffies, __VA_ARGS__)
+	    jiffies, ##__VA_ARGS__)
 #else
 #define	LKPI_80211_TRACE_MO(...)	do { } while(0)
 #endif