The branch main has been updated by bz:

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

commit adff403fe7a870c5b7a2d7e003d445c3b409bc0c
Author:     Bjoern A. Zeeb <[email protected]>
AuthorDate: 2023-05-16 22:07:53 +0000
Commit:     Bjoern A. Zeeb <[email protected]>
CommitDate: 2023-08-21 00:39:57 +0000

    LinuxKPI: 802.11: update compat code for updated drivers
    
    Adjust and add structs, fields, functions to make more modern versions
    of LinuxKPI based wireless drivers (based on wireless-testing (
    wt-2023-06-09, wt-2023-07-24, and later)) compile.
    
    Some of these changes can only be applied once all drivers get
    updated to not break the old versions currently in the tree.
    Mark those changes with __FOR_LATER_DRV_UPDATE for now and flip the
    switch at a later point.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      20 days
---
 .../linuxkpi/common/include/linux/ieee80211.h      |  60 ++++-
 sys/compat/linuxkpi/common/include/linux/nl80211.h |  38 ++-
 sys/compat/linuxkpi/common/include/net/cfg80211.h  | 161 +++++++++++-
 sys/compat/linuxkpi/common/include/net/mac80211.h  | 280 +++++++++++++++++++--
 sys/compat/linuxkpi/common/src/linux_80211.c       |  15 +-
 sys/compat/linuxkpi/dummy/include/net/gso.h        |   0
 6 files changed, 509 insertions(+), 45 deletions(-)

diff --git a/sys/compat/linuxkpi/common/include/linux/ieee80211.h 
b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
index 4e37ee612921..4648a12ec889 100644
--- a/sys/compat/linuxkpi/common/include/linux/ieee80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/ieee80211.h
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2020-2021 The FreeBSD Foundation
+ * Copyright (c) 2020-2023 The FreeBSD Foundation
  *
  * This software was developed by Björn Zeeb under sponsorship from
  * the FreeBSD Foundation.
@@ -60,9 +60,10 @@ struct ieee80211_mmie_16 {
 
 #define        IEEE80211_INVAL_HW_QUEUE                ((uint8_t)-1)
 
-#define        IEEE80211_MAX_AMPDU_BUF_HT              0x40
 #define        IEEE80211_MAX_AMPDU_BUF                 256     /* for HE? */
+#define        IEEE80211_MAX_AMPDU_BUF_HT              64
 #define        IEEE80211_MAX_AMPDU_BUF_HE              256
+#define        IEEE80211_MAX_AMPDU_BUF_EHT             1024
 
 #define        IEEE80211_MAX_FRAME_LEN                 2352
 #define        IEEE80211_MAX_DATA_LEN                  (2300 + 
IEEE80211_CRC_LEN)
@@ -140,8 +141,8 @@ enum ieee80211_min_mpdu_start_spacing {
        IEEE80211_HT_MPDU_DENSITY_NONE          = 0,
 #if 0
        IEEE80211_HT_MPDU_DENSITY_XXX           = 1,    /* 1/4 us */
-       IEEE80211_HT_MPDU_DENSITY_YYY           = 2,    /* 1/2 us */
 #endif
+       IEEE80211_HT_MPDU_DENSITY_0_5           = 2,    /* 1/2 us */
        IEEE80211_HT_MPDU_DENSITY_1             = 3,    /* 1 us */
        IEEE80211_HT_MPDU_DENSITY_2             = 4,    /* 2 us */
        IEEE80211_HT_MPDU_DENSITY_4             = 5,    /* 4us */
@@ -159,6 +160,7 @@ enum ieee80211_min_mpdu_start_spacing {
 #define        IEEE80211_FCTL_FROMDS                   
(IEEE80211_FC1_DIR_FROMDS << 8)
 #define        IEEE80211_FCTL_TODS                     (IEEE80211_FC1_DIR_TODS 
<< 8)
 #define        IEEE80211_FCTL_MOREFRAGS                
(IEEE80211_FC1_MORE_FRAG << 8)
+#define        IEEE80211_FCTL_PM                       (IEEE80211_FC1_PWR_MGT 
<< 8)
 
 #define        IEEE80211_FTYPE_MGMT                    IEEE80211_FC0_TYPE_MGT
 #define        IEEE80211_FTYPE_CTL                     IEEE80211_FC0_TYPE_CTL
@@ -170,8 +172,12 @@ enum ieee80211_min_mpdu_start_spacing {
 #define        IEEE80211_STYPE_DISASSOC                
IEEE80211_FC0_SUBTYPE_DISASSOC
 #define        IEEE80211_STYPE_AUTH                    
IEEE80211_FC0_SUBTYPE_AUTH
 #define        IEEE80211_STYPE_DEAUTH                  
IEEE80211_FC0_SUBTYPE_DEAUTH
+#define        IEEE80211_STYPE_CTS                     
IEEE80211_FC0_SUBTYPE_CTS
+#define        IEEE80211_STYPE_RTS                     
IEEE80211_FC0_SUBTYPE_RTS
 #define        IEEE80211_STYPE_ACTION                  
IEEE80211_FC0_SUBTYPE_ACTION
 #define        IEEE80211_STYPE_QOS_DATA                
IEEE80211_FC0_SUBTYPE_QOS_DATA
+#define        IEEE80211_STYPE_QOS_NULLFUNC            
IEEE80211_FC0_SUBTYPE_QOS_NULL
+#define        IEEE80211_STYPE_QOS_CFACK               0xd0    /* XXX-BZ 
reserved? */
 
 #define        IEEE80211_NUM_ACS                       4       /* 
net8021::WME_NUM_AC */
 
@@ -211,15 +217,19 @@ enum ieee80211_tdls_action_code {
        /* 11-255 reserved */
 };
 
-/* 9.4.2.27, Table 9-135. Extended Capabilities field. */
+/* 802.11-2020 9.4.2.26, Table 9-153. Extended Capabilities field. */
 /* This is split up into octets CAPA1 = octet 1, ... */
 #define        WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING                    BIT(2  
% 8)
 #define        WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT                      BIT(22 
% 8)
+#define        WLAN_EXT_CAPA3_TIMING_MEASUREMENT_SUPPORT               BIT(23 
% 8)
 #define        WLAN_EXT_CAPA8_OPMODE_NOTIF                             BIT(62 
% 8)
+#define        WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB                    BIT(63 
% 8)
+#define        WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB                    BIT(64 
% 8)
+#define        WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT                   BIT(77 
% 8)
+#define        WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT                   BIT(78 
% 8)
+#define        WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT     BIT(79 
% 8)
 
-#define        WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT                   BIT(5)  
        /* XXX */
-#define        WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT     BIT(7)  
        /* XXX */
-#define        WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT                   BIT(6)  
        /* XXX */
+#define        WLAN_EXT_CAPA11_EMA_SUPPORT                             0x00    
/* XXX TODO FIXME */
 
 
 /* iwlwifi/mvm/utils:: for (ac = IEEE80211_AC_VO; ac <= IEEE80211_AC_VI; ac++) 
*/
@@ -262,6 +272,8 @@ enum ieee80211_ac_numbers {
 #define        IEEE80211_HT_MCS_RX_HIGHEST_MASK        0x3ff
 #define        IEEE80211_HT_MCS_MASK_LEN               10
 
+#define        IEEE80211_MLD_MAX_NUM_LINKS             15
+
 struct ieee80211_mcs_info {
        uint8_t         rx_mask[IEEE80211_HT_MCS_MASK_LEN];
        uint16_t        rx_highest;
@@ -384,12 +396,20 @@ enum ieee80211_tx_info_flags {
        IEEE80211_TX_CTL_HW_80211_ENCAP         = BIT(16),
        IEEE80211_TX_CTL_USE_MINRATE            = BIT(17),
        IEEE80211_TX_CTL_RATE_CTRL_PROBE        = BIT(18),
+       IEEE80211_TX_CTL_LDPC                   = BIT(19),
+       IEEE80211_TX_CTL_STBC                   = BIT(20),
+};
+
+enum ieee80211_tx_status_flags {
+       IEEE80211_TX_STATUS_ACK_SIGNAL_VALID    = BIT(0),
 };
 
 enum ieee80211_tx_control_flags {
        /* XXX TODO .. right shift numbers */
        IEEE80211_TX_CTRL_PORT_CTRL_PROTO       = BIT(0),
        IEEE80211_TX_CTRL_PS_RESPONSE           = BIT(1),
+       IEEE80211_TX_CTRL_RATE_INJECT           = BIT(2),
+       IEEE80211_TX_CTRL_MLO_LINK              = 0xF0000000,   /* This is 
IEEE80211_LINK_UNSPECIFIED on the high bits. */
 };
 
 enum ieee80211_tx_rate_flags {
@@ -404,6 +424,8 @@ enum ieee80211_tx_rate_flags {
        IEEE80211_TX_RC_USE_SHORT_PREAMBLE      = BIT(7),
 };
 
+#define        IEEE80211_RNR_TBTT_PARAMS_PSD_RESERVED  -128
+
 #define        IEEE80211_HT_CTL_LEN    4
 
 struct ieee80211_hdr {         /* net80211::ieee80211_frame_addr4 */
@@ -511,11 +533,28 @@ struct ieee80211_mgmt {
                                        /* Optional follows... */
                                        uint8_t variable[0];
                                } addba_req;
+                               /* XXX */
+                               struct {
+                                       uint8_t dialog_token;
+                               } wnm_timing_msr;
                        } u;
                } action;
        } u;
 };
 
+struct ieee80211_cts {         /* net80211::ieee80211_frame_cts */
+        __le16         frame_control;
+        __le16         duration;
+       uint8_t         ra[ETH_ALEN];
+} __packed;
+
+struct ieee80211_rts {         /* net80211::ieee80211_frame_rts */
+        __le16         frame_control;
+        __le16         duration;
+       uint8_t         ra[ETH_ALEN];
+       uint8_t         ta[ETH_ALEN];
+} __packed;
+
 #define        MHZ_TO_KHZ(_f)          ((_f) * 1000)
 #define        DBI_TO_MBI(_g)          ((_g) * 100)
 #define        MBI_TO_DBI(_x)          ((_x) / 100)
@@ -546,6 +585,7 @@ enum ieee80211_eid {
        WLAN_EID_HT_CAPABILITY                  = 45,   /* 
IEEE80211_ELEMID_HTCAP */
        WLAN_EID_RSN                            = 48,   /* IEEE80211_ELEMID_RSN 
*/
        WLAN_EID_EXT_SUPP_RATES                 = 50,
+       WLAN_EID_EXT_NON_INHERITANCE            = 56,
        WLAN_EID_EXT_CHANSWITCH_ANN             = 60,
        WLAN_EID_MULTIPLE_BSSID                 = 71,   /* 
IEEE80211_ELEMID_MULTIBSSID */
        WLAN_EID_MULTI_BSSID_IDX                = 85,
@@ -650,6 +690,12 @@ struct ieee80211_bssid_index {
        int     bssid_index;
 };
 
+enum ieee80211_reg_ap_power {
+       IEEE80211_REG_LPI_AP,
+       IEEE80211_REG_SP_AP,
+       IEEE80211_REG_VLP_AP,
+};
+
 /* net80211: IEEE80211_IS_CTL() */
 static __inline bool
 ieee80211_is_ctl(__le16 fc)
diff --git a/sys/compat/linuxkpi/common/include/linux/nl80211.h 
b/sys/compat/linuxkpi/common/include/linux/nl80211.h
index 93b40361202d..5b43ff675e19 100644
--- a/sys/compat/linuxkpi/common/include/linux/nl80211.h
+++ b/sys/compat/linuxkpi/common/include/linux/nl80211.h
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2020-2021 The FreeBSD Foundation
+ * Copyright (c) 2020-2023 The FreeBSD Foundation
  *
  * This software was developed by Björn Zeeb under sponsorship from
  * the FreeBSD Foundation.
@@ -78,6 +78,8 @@ enum nl80211_reg_rule_flags {
        NL80211_RRF_NO_160MHZ                           = BIT(8),
        NL80211_RRF_NO_HE                               = BIT(9),
        NL80211_RRF_NO_OFDM                             = BIT(10),
+       NL80211_RRF_NO_320MHZ                           = BIT(11),
+       NL80211_RRF_NO_EHT                              = BIT(12),
 };
 #define        NL80211_RRF_NO_HT40     
(NL80211_RRF_NO_HT40MINUS|NL80211_RRF_NO_HT40PLUS)
 
@@ -143,6 +145,7 @@ enum nl80211_chan_width {
        NL80211_CHAN_WIDTH_160,
        NL80211_CHAN_WIDTH_5,
        NL80211_CHAN_WIDTH_10,
+       NL80211_CHAN_WIDTH_320,
 };
 
 enum nl80211_iftype {
@@ -159,6 +162,7 @@ enum nl80211_iftype {
        NL80211_IFTYPE_MESH_POINT,
        NL80211_IFTYPE_WDS,
        NL80211_IFTYPE_OCB,
+       NL80211_IFTYPE_NAN,
 
        /* Keep this last. */
        NUM_NL80211_IFTYPES
@@ -223,6 +227,9 @@ enum nl80211_ext_feature {
        NL80211_EXT_FEATURE_FILS_DISCOVERY,
        NL80211_EXT_FEATURE_RADAR_BACKGROUND,
        NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
+       NL80211_EXT_FEATURE_BEACON_PROTECTION,
+       NL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT,
+       NL80211_EXT_FEATURE_PUNCT,
 
        /* Keep this last. */
        NUM_NL80211_EXT_FEATURES
@@ -247,10 +254,13 @@ enum nl80211_sta_info {
        NL80211_STA_INFO_TX_PACKETS,
        NL80211_STA_INFO_TX_BYTES,
        NL80211_STA_INFO_TX_BYTES64,
+       NL80211_STA_INFO_RX_BYTES64,
        NL80211_STA_INFO_TX_FAILED,
        NL80211_STA_INFO_TX_RETRIES,
        NL80211_STA_INFO_RX_DURATION,
        NL80211_STA_INFO_TX_DURATION,
+       NL80211_STA_INFO_ACK_SIGNAL,
+       NL80211_STA_INFO_ACK_SIGNAL_AVG,
 };
 
 enum nl80211_ftm_stats {
@@ -326,6 +336,31 @@ enum nl80211_he_ltf {
        NL80211_RATE_INFO_HE_4XLTF,
 };
 
+enum nl80211_eht_gi {
+       NL80211_RATE_INFO_EHT_GI_0_8,
+       NL80211_RATE_INFO_EHT_GI_1_6,
+       NL80211_RATE_INFO_EHT_GI_3_2,
+};
+
+enum nl80211_eht_ru_alloc {
+       NL80211_RATE_INFO_EHT_RU_ALLOC_26,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_52,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_52P26,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_106,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_106P26,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_242,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_484,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_484P242,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_996,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_996P484,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_996P484P242,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_2x996,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_2x996P484,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_3x996,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_3x996P484,
+       NL80211_RATE_INFO_EHT_RU_ALLOC_4x996,
+};
+
 enum nl80211_dfs_regions {
        NL80211_DFS_UNSET,
        NL80211_DFS_FCC,
@@ -352,6 +387,7 @@ enum nl80211_tid_cfg_attr {
        NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL,
        NL80211_TID_CONFIG_ATTR_RETRY_LONG,
        NL80211_TID_CONFIG_ATTR_AMPDU_CTRL,
+       NL80211_TID_CONFIG_ATTR_AMSDU_CTRL,
 };
 
 enum nl80211_tid_config {
diff --git a/sys/compat/linuxkpi/common/include/net/cfg80211.h 
b/sys/compat/linuxkpi/common/include/net/cfg80211.h
index 43d4cd662c97..56ca9a231d2d 100644
--- a/sys/compat/linuxkpi/common/include/net/cfg80211.h
+++ b/sys/compat/linuxkpi/common/include/net/cfg80211.h
@@ -70,10 +70,11 @@ enum rfkill_hard_block_reasons {
 #define        IEEE80211_MAX_CHAINS    4               /* net80211: 
IEEE80211_MAX_CHAINS copied */
 
 enum cfg80211_rate_info_flags {
-       RATE_INFO_FLAGS_SHORT_GI        = BIT(0),
-       RATE_INFO_FLAGS_MCS             = BIT(1),
-       RATE_INFO_FLAGS_VHT_MCS         = BIT(2),
-       RATE_INFO_FLAGS_HE_MCS          = BIT(3),
+       RATE_INFO_FLAGS_MCS             = BIT(0),
+       RATE_INFO_FLAGS_VHT_MCS         = BIT(1),
+       RATE_INFO_FLAGS_SHORT_GI        = BIT(2),
+       RATE_INFO_FLAGS_HE_MCS          = BIT(4),
+       RATE_INFO_FLAGS_EHT_MCS         = BIT(7),
        /* Max 8 bits as used in struct rate_info. */
 };
 
@@ -149,6 +150,8 @@ enum rate_info_bw {
        RATE_INFO_BW_80,
        RATE_INFO_BW_160,
        RATE_INFO_BW_HE_RU,
+       RATE_INFO_BW_320,
+       RATE_INFO_BW_EHT_RU,
 };
 
 struct rate_info {
@@ -160,6 +163,7 @@ struct rate_info {
        uint8_t                                 he_dcm;
        uint8_t                                 he_gi;
        uint8_t                                 he_ru_alloc;
+       uint8_t                                 eht_gi;
 };
 
 struct ieee80211_rate {
@@ -224,6 +228,7 @@ struct ieee80211_sta_ht_cap {
 #define        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK       \
        (7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT)       /* 
IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK */
 
+#define        IEEE80211_VHT_CAP_EXT_NSS_BW_MASK       0xc0000000
 
 struct ieee80211_sta_vht_cap {
                /* TODO FIXME */
@@ -362,7 +367,7 @@ struct cfg80211_ssid {
 struct cfg80211_scan_6ghz_params {
        /* XXX TODO */
        uint8_t                         *bssid;
-       int     channel_idx, psc_no_listen, short_ssid, short_ssid_valid, 
unsolicited_probe;
+       int     channel_idx, psc_no_listen, short_ssid, short_ssid_valid, 
unsolicited_probe, psd_20;
 };
 
 struct cfg80211_match_set {
@@ -529,6 +534,7 @@ struct station_info {
        int     generation, inactive_time, rx_bytes, rx_dropped_misc, 
rx_packets, signal, tx_bytes, tx_packets;
        int     filled, rx_beacon, rx_beacon_signal_avg, signal_avg;
        int     rx_duration, tx_duration, tx_failed, tx_retries;
+       int     ack_signal, avg_ack_signal;
 
        int                                     chains;
        uint8_t                                 
chain_signal[IEEE80211_MAX_CHAINS];
@@ -656,6 +662,7 @@ struct linuxkpi_ieee80211_regdomain {
 #define        IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G        
0x10
 #define        IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G        
0x20
 #define        IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK                    
0x40
+#define        IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL                
0xff
 
 #define        IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A            0x1
 #define        IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD    0x2
@@ -753,12 +760,95 @@ struct linuxkpi_ieee80211_regdomain {
 
 #define        IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED               0x1
 #define        IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET                 0x2
+#define        IEEE80211_HE_OPERATION_ER_SU_DISABLE                    0x4
 
 #define        IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED                0x01
 #define        IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED          0x02
 #define        IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT                 0x04
 #define        IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT                0x08
 
+#define        IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS                 0x01
+#define        IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_11454               0x02
+#define        IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK                0x03
+#define        IEEE80211_EHT_MAC_CAP0_OM_CONTROL                       0x04
+#define        IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1          0x05
+#define        IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2          0x06
+#define        IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_7991                0x07
+
+#define        IEEE80211_EHT_MAC_CAP1_MAX_AMPDU_LEN_MASK               0x01
+
+#define        IEEE80211_EHT_MCS_NSS_RX                                0x01
+#define        IEEE80211_EHT_MCS_NSS_TX                                0x02
+
+#define        IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ              0x01
+#define        IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ                   0x02
+#define        IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK         0x03
+#define        IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI              0x04
+#define        IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO            0x05
+#define        IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE                    0x06
+#define        IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER                    0x07
+
+#define        IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK        0x01
+#define        IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK        0x02
+#define        IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK         0x03
+
+#define        IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK          0x01
+#define        IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK         0x02
+#define        IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK         0x03
+
+#define        IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK             0x01
+#define        IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK             0x02
+#define        IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK                0x03
+#define        IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK                0x04
+#define        IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK                    0x05
+#define        IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK          0x06
+#define        IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK                  0x07
+#define        IEEE80211_EHT_PHY_CAP3_SOUNDING_DIM_320MHZ_MASK         0x08
+
+#define        IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI      0x01
+#define        IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO               0x02
+#define        IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP            0x03
+#define        IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK                      0x04
+
+#define        IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_0US       0x01
+#define        IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US      0x02
+#define        IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_20US      0x03
+#define        IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_8US       0x04
+#define        IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK      0x05
+#define        IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK            0x06
+#define        IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT            0x07
+#define        IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP         0x08
+#define        IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP         0x09
+#define        IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK        0x0a
+#define        IEEE80211_EHT_PHY_CAP5_SUPP_EXTRA_EHT_LTF               0x0b
+
+#define        IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP                0x01
+#define        IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK                  0x02
+#define        IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK        0x03
+
+#define        IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ              0x01
+#define        IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ             0x02
+#define        IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ             0x03
+#define        IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ       0x04
+#define        IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ      0x05
+#define        IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ      0x06
+
+#define        IEEE80211_EHT_PHY_CAP8_RX_1024QAM_WIDER_BW_DL_OFDMA     0x01
+#define        IEEE80211_EHT_PHY_CAP8_RX_4096QAM_WIDER_BW_DL_OFDMA     0x02
+
+#define        IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE                0x01
+#define        IEEE80211_EHT_PPE_THRES_NSS_MASK                        0x02
+#define        IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK           0x03
+#define        IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE                  0x04
+
+#define        IEEE80211_EML_CAP_EMLSR_SUPP                            0x01
+#define        IEEE80211_EML_CAP_TRANSITION_TIMEOUT                    0x02
+#define        IEEE80211_EML_CAP_TRANSITION_TIMEOUT_128TU              0x04
+#define        IEEE80211_EML_CAP_EMLSR_PADDING_DELAY                   0x08
+#define        IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_32US              0x10
+#define        IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY                0x20
+#define        IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_64US           0x40
+
 #define        VENDOR_CMD_RAW_DATA     (void *)(uintptr_t)(-ENOENT)
 
 struct ieee80211_he_cap_elem {
@@ -804,11 +894,51 @@ struct ieee80211_sta_he_6ghz_capa {
        int     capa;
 };
 
+struct ieee80211_eht_mcs_nss_supp_20mhz_only {
+       uint8_t                                 rx_tx_mcs7_max_nss;
+       uint8_t                                 rx_tx_mcs9_max_nss;
+       uint8_t                                 rx_tx_mcs11_max_nss;
+       uint8_t                                 rx_tx_mcs13_max_nss;
+};
+
+struct ieee80211_eht_mcs_nss_supp_bw {
+       uint8_t                                 rx_tx_mcs9_max_nss;
+       uint8_t                                 rx_tx_mcs11_max_nss;
+       uint8_t                                 rx_tx_mcs13_max_nss;
+};
+
+struct ieee80211_eht_cap_elem_fixed {
+       uint8_t                                 mac_cap_info[2];
+       uint8_t                                 phy_cap_info[9];
+};
+
+struct ieee80211_eht_mcs_nss_supp {
+       /* TODO FIXME */
+       /* Can only have either or... */
+       union {
+               struct ieee80211_eht_mcs_nss_supp_20mhz_only            
only_20mhz;
+               struct {
+                       struct ieee80211_eht_mcs_nss_supp_bw            _80;
+                       struct ieee80211_eht_mcs_nss_supp_bw            _160;
+                       struct ieee80211_eht_mcs_nss_supp_bw            _320;
+               } bw;
+       };
+};
+
+#define        IEEE80211_STA_EHT_PPE_THRES_MAX         32
+struct ieee80211_sta_eht_cap {
+       bool                                    has_eht;
+       struct ieee80211_eht_cap_elem_fixed     eht_cap_elem;
+       struct ieee80211_eht_mcs_nss_supp       eht_mcs_nss_supp;
+       uint8_t                                 
eht_ppe_thres[IEEE80211_STA_EHT_PPE_THRES_MAX];
+};
+
 struct ieee80211_sband_iftype_data {
        /* TODO FIXME */
        enum nl80211_iftype                     types_mask;
        struct ieee80211_sta_he_cap             he_cap;
        struct ieee80211_sta_he_6ghz_capa       he_6ghz_capa;
+       struct ieee80211_sta_eht_cap            eht_cap;
        struct {
                const uint8_t                   *data;
                size_t                          len;
@@ -900,7 +1030,7 @@ struct cfg80211_gtk_rekey_data {
 
 struct cfg80211_tid_cfg {
        /* XXX TODO */
-       int     mask, noack, retry_long, rtscts, tids;
+       int     mask, noack, retry_long, rtscts, tids, amsdu, ampdu;
        enum nl80211_tx_rate_setting            txrate_type;
        struct cfg80211_bitrate_mask            txrate_mask;
 };
@@ -938,6 +1068,11 @@ struct regulatory_request {
        int     user_reg_hint_type;
 };
 
+struct cfg80211_set_hw_timestamp {
+       const uint8_t                           *macaddr;
+       bool                                    enable;
+};
+
 enum wiphy_vendor_cmd_need_flags {
        WIPHY_VENDOR_CMD_NEED_NETDEV            = 0x01,
        WIPHY_VENDOR_CMD_NEED_RUNNING           = 0x02,
@@ -960,6 +1095,7 @@ struct wiphy_iftype_ext_capab {
        const uint8_t                           *extended_capabilities;
        const uint8_t                           *extended_capabilities_mask;
        uint8_t                                 extended_capabilities_len;
+       uint16_t                                eml_capabilities;
 
 };
 
@@ -996,6 +1132,7 @@ enum wiphy_flags {
        WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD        = BIT(13),
        WIPHY_FLAG_4ADDR_AP                     = BIT(14),
        WIPHY_FLAG_4ADDR_STATION                = BIT(15),
+       WIPHY_FLAG_SUPPORTS_MLO                 = BIT(16),
 };
 
 struct wiphy {
@@ -1037,6 +1174,8 @@ struct wiphy {
        int     max_data_retry_count;
        int     tx_queue_len, rfkill;
        int     mbssid_max_interfaces;
+       int     hw_timestamp_max_peers;
+       int     ema_max_profile_periodicity;
 
        unsigned long                           
ext_features[BITS_TO_LONGS(NUM_NL80211_EXT_FEATURES)];
        struct dentry                           *debugfsdir;
@@ -1816,7 +1955,7 @@ cfg80211_background_radar_event(struct wiphy *wiphy,
 }
 
 static __inline const u8 *
-cfg80211_find_ext_ie(uint8_t eid, uint8_t *p, size_t len)
+cfg80211_find_ext_ie(uint8_t eid, const uint8_t *p, size_t len)
 {
        TODO();
        return (NULL);
@@ -1829,6 +1968,14 @@ cfg80211_chandef_valid(const struct cfg80211_chan_def 
*chandef)
        return (false);
 }
 
+static __inline const struct ieee80211_sta_eht_cap *
+ieee80211_get_eht_iftype_cap(const struct ieee80211_supported_band *band,
+    enum nl80211_iftype iftype)
+{
+       TODO();
+       return (NULL);
+}
+
 #define        wiphy_info(wiphy, fmt, ...)                                     
\
        printf("%s:%d XXX TODO " fmt, __func__, __LINE__, __VA_ARGS__)
 
diff --git a/sys/compat/linuxkpi/common/include/net/mac80211.h 
b/sys/compat/linuxkpi/common/include/net/mac80211.h
index 5597300e18c9..cacf9d652fd0 100644
--- a/sys/compat/linuxkpi/common/include/net/mac80211.h
+++ b/sys/compat/linuxkpi/common/include/net/mac80211.h
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2020-2022 The FreeBSD Foundation
+ * Copyright (c) 2020-2023 The FreeBSD Foundation
  * Copyright (c) 2020-2022 Bjoern A. Zeeb
  *
  * This software was developed by Björn Zeeb under sponsorship from
@@ -50,6 +50,8 @@
 #define        WLAN_OUI_TYPE_WFA_P2P                   (9)
 #define        WLAN_OUI_WFA                            (0x506F9A)
 
+#define        IEEE80211_LINK_UNSPECIFIED              0x0f
+
 /* hw->conf.flags */
 enum ieee80211_hw_conf_flags {
        IEEE80211_CONF_IDLE                     = BIT(0),
@@ -114,6 +116,7 @@ enum ieee80211_bss_changed {
        BSS_CHANGED_HE_OBSS_PD          = BIT(27),
        BSS_CHANGED_TWT                 = BIT(28),
        BSS_CHANGED_UNSOL_BCAST_PROBE_RESP = BIT(30),
+       BSS_CHANGED_EHT_PUNCTURING      = BIT(31),
 };
 
 /* 802.11 Figure 9-256 Suite selector format. [OUI(3), SUITE TYPE(1)] */
@@ -224,6 +227,15 @@ struct ieee80211_chanctx_conf {
 
 struct ieee80211_rate_status {
        struct rate_info                        rate_idx;
+       uint8_t                                 try_count;
+};
+
+struct ieee80211_ema_beacons {
+       uint8_t                                 cnt;
+       struct {
+               struct sk_buff                  *skb;
+               struct ieee80211_mutable_offsets offs;
+       } bcn[0];
 };
 
 #define        WLAN_MEMBERSHIP_LEN                     (8)
@@ -231,7 +243,11 @@ struct ieee80211_rate_status {
 
 struct ieee80211_bss_conf {
        /* TODO FIXME */
+       struct ieee80211_vif                    *vif;
        const uint8_t                           *bssid;
+       uint8_t                                 addr[ETH_ALEN];
+       uint8_t                                 link_id;
+       uint8_t                                 _pad0;
        uint8_t                                 transmitter_bssid[ETH_ALEN];
        struct ieee80211_ftm_responder_params   *ftmr_params;
        struct ieee80211_p2p_noa_attr           p2p_noa_attr;
@@ -248,11 +264,28 @@ struct ieee80211_bss_conf {
        } he_oper;
        struct cfg80211_he_bss_color            he_bss_color;
        struct ieee80211_he_obss_pd             he_obss_pd;
+
+       bool                                    ht_ldpc;
+       bool                                    vht_ldpc;
+       bool                                    he_ldpc;
+       bool                                    vht_mu_beamformee;
+       bool                                    vht_mu_beamformer;
+       bool                                    vht_su_beamformee;
+       bool                                    vht_su_beamformer;
+       bool                                    he_mu_beamformer;
+       bool                                    he_su_beamformee;
+       bool                                    he_su_beamformer;
+       bool                                    he_full_ul_mumimo;
+       bool                                    eht_su_beamformee;
+       bool                                    eht_su_beamformer;
+       bool                                    eht_mu_beamformer;
+
        size_t                                  ssid_len;
        uint8_t                                 ssid[IEEE80211_NWID_LEN];
        uint16_t                                aid;
        uint16_t                                ht_operation_mode;
        int                                     arp_addr_cnt;
+       uint16_t                                eht_puncturing;
 
        uint8_t                                 dtim_period;
        uint8_t                                 sync_dtim_count;
@@ -265,16 +298,20 @@ struct ieee80211_bss_conf {
        bool                                    use_short_preamble;
        bool                                    use_short_slot;
        bool                                    he_support;
+       bool                                    eht_support;
        bool                                    csa_active;
+       bool                                    mu_mimo_owner;
        uint32_t                                sync_device_ts;
        uint64_t                                sync_tsf;
        uint16_t                                beacon_int;
        int16_t                                 txpower;
        uint32_t                                basic_rates;
        int                                     mcast_rate[NUM_NL80211_BANDS];
+       enum ieee80211_reg_ap_power             power_type;
        struct cfg80211_bitrate_mask            beacon_tx_rate;
        struct mac80211_fils_discovery          fils_discovery;
        struct ieee80211_chanctx_conf           *chanctx_conf;
+       struct ieee80211_vif                    *mbssid_tx_vif;
 
        int             ack_enabled, bssid_index, bssid_indicator, 
cqm_rssi_hyst, cqm_rssi_thold, ema_ap, frame_time_rts_th, ftm_responder;
        int             htc_trig_based_pkt_ext;
@@ -410,6 +447,7 @@ enum ieee80211_hw_flags {
        IEEE80211_HW_SUPPORTS_RX_DECAP_OFFLOAD,
        IEEE80211_HW_SUPPORTS_TX_ENCAP_OFFLOAD,
        IEEE80211_HW_SUPPORTS_RC_TABLE,
+       IEEE80211_HW_DETECTS_COLOR_COLLISION,
 
        /* Keep last. */
        NUM_IEEE80211_HW_FLAGS
@@ -477,6 +515,7 @@ struct ieee80211_key_conf {
        uint16_t                        flags;
        uint8_t                         keylen;
        uint8_t                         key[0];
+       int8_t                          link_id;        /* signed! */
 };
 
 struct ieee80211_key_seq {
@@ -529,31 +568,47 @@ enum ieee80211_rx_status_flags {
        RX_FLAG_ONLY_MONITOR            = BIT(25),
        RX_FLAG_SKIP_MONITOR            = BIT(26),
        RX_FLAG_8023                    = BIT(27),
+       RX_FLAG_RADIOTAP_TLV_AT_END     = BIT(28),
 };
 
 enum mac80211_rx_encoding {
        RX_ENC_LEGACY           = 0,
        RX_ENC_HT,
        RX_ENC_VHT,
-       RX_ENC_HE
+       RX_ENC_HE,
+       RX_ENC_EHT,
 };
 
 struct ieee80211_rx_status {
        /* TODO FIXME, this is too large. Over-reduce types to u8 where 
possible. */
-       uint64_t                        boottime_ns;
+       union {
+               uint64_t                        boottime_ns;
+               int64_t                         ack_tx_hwtstamp;
+       };
        uint64_t                        mactime;
        uint32_t                        device_timestamp;
        enum ieee80211_rx_status_flags  flag;
        uint16_t                        freq;
-       uint8_t                         encoding:2, bw:3, he_ru:3;      /* enum 
mac80211_rx_encoding, rate_info_bw */   /* See mt76.h */
+       uint8_t                         encoding:3, bw:4;       /* enum 
mac80211_rx_encoding, rate_info_bw */   /* See mt76.h */
        uint8_t                         ampdu_reference;
        uint8_t                         band;
        uint8_t                         chains;
        int8_t                          chain_signal[IEEE80211_MAX_CHAINS];
        int8_t                          signal;
        uint8_t                         enc_flags;
-       uint8_t                         he_dcm;
-       uint8_t                         he_gi;
+       union {
+               struct {
+                       uint8_t         he_ru:3;        /* nl80211::enum 
nl80211_he_ru_alloc */
+                       uint8_t         he_gi:2;        /* nl80211::enum 
nl80211_he_gi */
+                       uint8_t         he_dcm:1;
+               };
+               struct {
+                       uint8_t         ru:4;           /* nl80211::enum 
nl80211_eht_ru_alloc */
+                       uint8_t         gi:2;           /* nl80211::enum 
nl80211_eht_gi */
+               } eht;
+       };
+       bool                            link_valid;
+       uint8_t                         link_id;        /* very incosistent 
sizes? */
        uint8_t                         zero_length_psdu_type;
        uint8_t                         nss;
        uint8_t                         rate_idx;
@@ -562,6 +617,7 @@ struct ieee80211_rx_status {
 struct ieee80211_tx_status {
        struct ieee80211_sta            *sta;
        struct ieee80211_tx_info        *info;
+       int64_t                         ack_hwtstamp;
 
        u8                              n_rates;
        struct ieee80211_rate_status    *rates;
@@ -608,17 +664,22 @@ struct ieee80211_sta_txpwr {
        short                           power;
 };
 
+#define        IEEE80211_NUM_TIDS                      16      /* 
net80211::WME_NUM_TID */
 struct ieee80211_sta_agg {
-       /* XXX TODO */
-       int max_amsdu_len;
+       uint16_t                                max_amsdu_len;
+       uint16_t                                max_rc_amsdu_len;
+       uint16_t                                
max_tid_amsdu_len[IEEE80211_NUM_TIDS];
 };
 
 struct ieee80211_link_sta {
+       uint8_t                                 addr[ETH_ALEN];
+       uint8_t                                 link_id;
        uint32_t                                supp_rates[NUM_NL80211_BANDS];
        struct ieee80211_sta_ht_cap             ht_cap;
        struct ieee80211_sta_vht_cap            vht_cap;
        struct ieee80211_sta_he_cap             he_cap;
        struct ieee80211_sta_he_6ghz_capa       he_6ghz_capa;
+       struct ieee80211_sta_eht_cap            eht_cap;
        uint8_t                                 rx_nss;
        enum ieee80211_sta_rx_bw                bandwidth;
        enum ieee80211_smps_mode                smps_mode;
@@ -626,21 +687,27 @@ struct ieee80211_link_sta {
        struct ieee80211_sta_txpwr              txpwr;
 };
 
-#define        IEEE80211_NUM_TIDS                      16      /* 
net80211::WME_NUM_TID */
 struct ieee80211_sta {
        /* TODO FIXME */
-       int             max_amsdu_len, max_amsdu_subframes, max_rc_amsdu_len;
+       int             max_amsdu_subframes;
        int             mfp, smps_mode, tdls, tdls_initiator;
        struct ieee80211_txq                    *txq[IEEE80211_NUM_TIDS + 1];   
/* iwlwifi: 8 and adds +1 to tid_data, net80211::IEEE80211_TID_SIZE */
        struct ieee80211_sta_rates              *rates; /* some rcu thing? */
-       uint32_t                                
max_tid_amsdu_len[IEEE80211_NUM_TIDS];
        uint8_t                                 addr[ETH_ALEN];
        uint16_t                                aid;
        bool                                    wme;
        uint8_t                                 max_sp;
        uint8_t                                 uapsd_queues;
+       uint16_t                                valid_links;
 
        struct ieee80211_link_sta               deflink;
+       struct ieee80211_link_sta               
*link[IEEE80211_MLD_MAX_NUM_LINKS];     /* rcu? */
+
+#ifndef __FOR_LATER_DRV_UPDATE
+       uint16_t                                max_rc_amsdu_len;
+       uint16_t                                max_amsdu_len;
+       uint16_t                                
max_tid_amsdu_len[IEEE80211_NUM_TIDS];
+#endif
 
        /* Must stay last. */
        uint8_t                                 drv_priv[0] 
__aligned(CACHE_LINE_SIZE);
@@ -681,16 +748,24 @@ enum ieee80211_vif_driver_flags {
        IEEE80211_VIF_BEACON_FILTER             = BIT(0),
        IEEE80211_VIF_SUPPORTS_CQM_RSSI         = BIT(1),
        IEEE80211_VIF_SUPPORTS_UAPSD            = BIT(2),
+       IEEE80211_VIF_DISABLE_SMPS_OVERRIDE     = BIT(3),
 };
 
 #define        IEEE80211_BSS_ARP_ADDR_LIST_LEN         4
 
 struct ieee80211_vif_cfg {
        uint16_t                                aid;
+       uint16_t                                eml_cap;
+       uint16_t                                eml_med_sync_delay;
        bool                                    assoc;
        bool                                    ps;
+       bool                                    idle;
+       bool                                    ibss_joined;
        int                                     arp_addr_cnt;
+       size_t                                  ssid_len;
        uint32_t                                
arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN];         /* big endian */
+       uint8_t                                 ssid[IEEE80211_NWID_LEN];
+       uint8_t                                 ap_addr[ETH_ALEN];
 };
 
 struct ieee80211_vif {
@@ -707,7 +782,11 @@ struct ieee80211_vif {
        struct ieee80211_chanctx_conf   *chanctx_conf;
        struct ieee80211_txq            *txq;
        struct ieee80211_bss_conf       bss_conf;
+       struct ieee80211_bss_conf       
*link_conf[IEEE80211_MLD_MAX_NUM_LINKS];        /* rcu? */
        uint8_t                         hw_queue[IEEE80211_NUM_ACS];
+       uint16_t                        active_links;
+       uint16_t                        valid_links;
+       struct ieee80211_vif            *mbssid_tx_vif;
 
 /* #ifdef CONFIG_MAC80211_DEBUGFS */   /* Do not change structure depending on 
compile-time option. */
        struct dentry                   *debugfs_dir;
@@ -720,6 +799,7 @@ struct ieee80211_vif {
 struct ieee80211_vif_chanctx_switch {
        struct ieee80211_chanctx_conf   *old_ctx, *new_ctx;
        struct ieee80211_vif            *vif;
+       struct ieee80211_bss_conf       *link_conf;
 };
 
 struct ieee80211_prep_tx_info {
@@ -750,7 +830,7 @@ struct ieee80211_tx_info {
                        uint8_t                         ampdu_len;
                        uint8_t                         antenna;
                        uint16_t                        tx_time;
-                       bool                            is_valid_ack_signal;
+                       uint8_t                         flags;
                        void                            *status_driver_data[16 
/ sizeof(void *)];               /* XXX TODO */
                } status;
 #define        IEEE80211_TX_INFO_DRIVER_DATA_SIZE      40
@@ -792,11 +872,10 @@ enum ieee80211_iface_iter {
        IEEE80211_IFACE_ITER_NORMAL     = BIT(0),
        IEEE80211_IFACE_ITER_RESUME_ALL = BIT(1),
        IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER = BIT(2),      /* seems to be 
an iter flag */
+       IEEE80211_IFACE_ITER_ACTIVE     = BIT(3),
 
        /* Internal flags only. */
-       /* ieee80211_iterate_active_interfaces*(). */
        IEEE80211_IFACE_ITER__ATOMIC    = BIT(6),
-       IEEE80211_IFACE_ITER__ACTIVE    = BIT(7),
        IEEE80211_IFACE_ITER__MTX       = BIT(8),
 };
 
@@ -864,6 +943,7 @@ struct ieee80211_ops {
        void (*mgd_protect_tdls_discover)(struct ieee80211_hw *, struct 
ieee80211_vif *);
 
        void (*flush)(struct ieee80211_hw *, struct ieee80211_vif *, u32, bool);
+       void (*flush_sta)(struct ieee80211_hw *, struct ieee80211_vif *, struct 
ieee80211_sta *);
 
        int  (*set_frag_threshold)(struct ieee80211_hw *, u32);
 
@@ -933,6 +1013,7 @@ struct ieee80211_ops {
        int  (*set_key)(struct ieee80211_hw *, enum set_key_cmd, struct 
ieee80211_vif *, struct ieee80211_sta *, struct ieee80211_key_conf *);
        void (*set_default_unicast_key)(struct ieee80211_hw *, struct 
ieee80211_vif *, int);
        void (*update_tkip_key)(struct ieee80211_hw *, struct ieee80211_vif *, 
struct ieee80211_key_conf *, struct ieee80211_sta *, u32, u16 *);
+       void (*set_rekey_data)(struct ieee80211_hw *, struct ieee80211_vif *, 
struct cfg80211_gtk_rekey_data *);
 
        int  (*start_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, 
struct cfg80211_pmsr_request *);
        void (*abort_pmsr)(struct ieee80211_hw *, struct ieee80211_vif *, 
struct cfg80211_pmsr_request *);
@@ -961,6 +1042,14 @@ struct ieee80211_ops {
        void (*add_twt_setup)(struct ieee80211_hw *, struct ieee80211_sta *, 
struct ieee80211_twt_setup *);
        void (*twt_teardown_request)(struct ieee80211_hw *, struct 
ieee80211_sta *, u8);
 
+       int (*set_hw_timestamp)(struct ieee80211_hw *, struct ieee80211_vif *, 
struct cfg80211_set_hw_timestamp *);
+
+        void (*link_info_changed)(struct ieee80211_hw *, struct ieee80211_vif 
*, struct ieee80211_bss_conf *, u64);
+        void (*vif_cfg_changed)(struct ieee80211_hw *, struct ieee80211_vif *, 
u64);
+
+       int (*change_vif_links)(struct ieee80211_hw *, struct ieee80211_vif *, 
u16, u16, struct ieee80211_bss_conf *[IEEE80211_MLD_MAX_NUM_LINKS]);
+       int (*change_sta_links)(struct ieee80211_hw *, struct ieee80211_vif *, 
struct ieee80211_sta *, u16, u16);
+
 /* #ifdef CONFIG_MAC80211_DEBUGFS */   /* Do not change depending on 
compile-time option. */
        void (*sta_add_debugfs)(struct ieee80211_hw *, struct ieee80211_vif *, 
struct ieee80211_sta *, struct dentry *);
 /* #endif */
@@ -1017,7 +1106,7 @@ void linuxkpi_ieee80211_queue_work(struct ieee80211_hw *, 
struct work_struct *);
 struct sk_buff *linuxkpi_ieee80211_pspoll_get(struct ieee80211_hw *,
     struct ieee80211_vif *);
 struct sk_buff *linuxkpi_ieee80211_nullfunc_get(struct ieee80211_hw *,
-    struct ieee80211_vif *, bool);
+    struct ieee80211_vif *, int, bool);
 void linuxkpi_ieee80211_txq_get_depth(struct ieee80211_txq *, unsigned long *,
     unsigned long *);
 struct wireless_dev *linuxkpi_ieee80211_vif_to_wdev(struct ieee80211_vif *);
@@ -1140,6 +1229,37 @@ ieee80211_restart_hw(struct ieee80211_hw *hw)
        linuxkpi_ieee80211_restart_hw(hw);
 }
 
+static inline void
+ieee80211_hw_restart_disconnect(struct ieee80211_vif *vif)
+{
+       TODO();
+}
+
+/* -------------------------------------------------------------------------- 
*/
+
+#define        link_conf_dereference_check(_vif, _linkid)                      
\
+    rcu_dereference_check((_vif)->link_conf[_linkid], true)
+
+#define        link_conf_dereference_protected(_vif, _linkid)                  
\
+    rcu_dereference_protected((_vif)->link_conf[_linkid], true)
+
+#define        link_sta_dereference_check(_sta, _linkid)                       
\
+    rcu_dereference_check((_sta)->link[_linkid], true)
+
+#define        link_sta_dereference_protected(_sta, _linkid)                   
\
+    rcu_dereference_protected((_sta)->link[_linkid], true)
+
+#define        for_each_vif_active_link(_vif, _link, _linkid)                  
\
+    for (_linkid = 0; _linkid < nitems((_vif)->link_conf); _linkid++)  \
+       if ( ((_vif)->active_links == 0 /* no MLO */ ||                 \
+           ((_vif)->active_links & BIT(_linkid)) != 0) &&              \
+           (_link = rcu_dereference((_vif)->link_conf[_linkid])) )
+
+#define        for_each_sta_active_link(_vif, _sta, _linksta, _linkid)         
\
+    for (_linkid = 0; _linkid < nitems((_vif)->link_conf); _linkid++)  \
+       if ( ((_vif)->active_links == 0 /* no MLO */ ||                 \
+           ((_vif)->active_links & BIT(_linkid)) != 0) &&              \
+           (_linksta = link_sta_dereference_protected((_sta), (_linkid))) )
 
 /* -------------------------------------------------------------------------- 
*/
 
@@ -1301,8 +1421,18 @@ ieee80211_is_back_req(__le16 fc)
 }
 
 static __inline bool
+#ifdef __FOR_LATER_DRV_UPDATE
+ieee80211_is_bufferable_mmpdu(struct sk_buff *skb)
+{
+       struct ieee80211_mgmt *mgmt;
+       __le16 fc;
+
+       mgmt = (struct ieee80211_mgmt *)skb->data;
+       fc = mgmt->frame_control;
+#else
 ieee80211_is_bufferable_mmpdu(__le16 fc)
 {
*** 298 LINES SKIPPED ***

Reply via email to