From a45ed094315bd885e496bcf43720e59063ff36da Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Tue, 20 Dec 2022 22:38:35 +0800 Subject: [PATCH] mac80211: backport some new API from v6.1 --- .../subsys/997-backport-API-from-v6.1.patch | 315 ++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 package/kernel/mac80211/patches/subsys/997-backport-API-from-v6.1.patch diff --git a/package/kernel/mac80211/patches/subsys/997-backport-API-from-v6.1.patch b/package/kernel/mac80211/patches/subsys/997-backport-API-from-v6.1.patch new file mode 100644 index 000000000..0cd6c24bb --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/997-backport-API-from-v6.1.patch @@ -0,0 +1,315 @@ +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -702,6 +702,8 @@ + u32 unsol_bcast_probe_resp_interval; + bool s1g; + struct cfg80211_bitrate_mask beacon_tx_rate; ++ ++ bool csa_active; + }; + + /** +@@ -1672,6 +1674,46 @@ + }; + + /** ++ * struct ieee80211_vif_cfg - interface configuration ++ * @assoc: association status ++ * @ibss_joined: indicates whether this station is part of an IBSS or not ++ * @ibss_creator: indicates if a new IBSS network is being created ++ * @ps: power-save mode (STA only). This flag is NOT affected by ++ * offchannel/dynamic_ps operations. ++ * @aid: association ID number, valid only when @assoc is true ++ * @arp_addr_list: List of IPv4 addresses for hardware ARP filtering. The ++ * may filter ARP queries targeted for other addresses than listed here. ++ * The driver must allow ARP queries targeted for all address listed here ++ * to pass through. An empty list implies no ARP queries need to pass. ++ * @arp_addr_cnt: Number of addresses currently on the list. Note that this ++ * may be larger than %IEEE80211_BSS_ARP_ADDR_LIST_LEN (the arp_addr_list ++ * array size), it's up to the driver what to do in that case. ++ * @ssid: The SSID of the current vif. Valid in AP and IBSS mode. ++ * @ssid_len: Length of SSID given in @ssid. ++ * @s1g: BSS is S1G BSS (affects Association Request format). ++ * @idle: This interface is idle. There's also a global idle flag in the ++ * hardware config which may be more appropriate depending on what ++ * your driver/device needs to do. ++ * @ap_addr: AP MLD address, or BSSID for non-MLO connections ++ * (station mode only) ++ */ ++struct ieee80211_vif_cfg { ++ /* association related data */ ++ bool assoc, ibss_joined; ++ bool ibss_creator; ++ bool ps; ++ u16 aid; ++ ++ __be32 arp_addr_list[IEEE80211_BSS_ARP_ADDR_LIST_LEN]; ++ int arp_addr_cnt; ++ u8 ssid[IEEE80211_MAX_SSID_LEN]; ++ size_t ssid_len; ++ bool s1g; ++ bool idle; ++ u8 ap_addr[ETH_ALEN] __aligned(2); ++}; ++ ++/** + * struct ieee80211_vif - per-interface data + * + * Data in this structure is continually present for driver +@@ -1725,6 +1767,7 @@ + */ + struct ieee80211_vif { + enum nl80211_iftype type; ++ struct ieee80211_vif_cfg cfg; + struct ieee80211_bss_conf bss_conf; + u8 addr[ETH_ALEN] __aligned(2); + bool p2p; +@@ -2045,6 +2088,80 @@ + }; + + /** ++ * struct ieee80211_sta_aggregates - info that is aggregated from active links ++ * ++ * Used for any per-link data that needs to be aggregated and updated in the ++ * main &struct ieee80211_sta when updated or the active links change. ++ * ++ * @max_amsdu_len: indicates the maximal length of an A-MSDU in bytes. ++ * This field is always valid for packets with a VHT preamble. ++ * For packets with a HT preamble, additional limits apply: ++ * ++ * * If the skb is transmitted as part of a BA agreement, the ++ * A-MSDU maximal size is min(max_amsdu_len, 4065) bytes. ++ * * If the skb is not part of a BA agreement, the A-MSDU maximal ++ * size is min(max_amsdu_len, 7935) bytes. ++ * ++ * Both additional HT limits must be enforced by the low level ++ * driver. This is defined by the spec (IEEE 802.11-2012 section ++ * 8.3.2.2 NOTE 2). ++ * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control. ++ * @max_tid_amsdu_len: Maximum A-MSDU size in bytes for this TID ++ */ ++struct ieee80211_sta_aggregates { ++ u16 max_amsdu_len; ++ ++ u16 max_rc_amsdu_len; ++ u16 max_tid_amsdu_len[IEEE80211_NUM_TIDS]; ++}; ++ ++/** ++ * struct ieee80211_link_sta - station Link specific info ++ * All link specific info for a STA link for a non MLD STA(single) ++ * or a MLD STA(multiple entries) are stored here. ++ * ++ * @sta: reference to owning STA ++ * @addr: MAC address of the Link STA. For non-MLO STA this is same as the addr ++ * in ieee80211_sta. For MLO Link STA this addr can be same or different ++ * from addr in ieee80211_sta (representing MLD STA addr) ++ * @link_id: the link ID for this link STA (0 for deflink) ++ * @smps_mode: current SMPS mode (off, static or dynamic) ++ * @supp_rates: Bitmap of supported rates ++ * @ht_cap: HT capabilities of this STA; restricted to our own capabilities ++ * @vht_cap: VHT capabilities of this STA; restricted to our own capabilities ++ * @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 ++ * @bandwidth: current bandwidth the station can receive with ++ * @rx_nss: in HT/VHT, the maximum number of spatial streams the ++ * station can receive at the moment, changed by operating mode ++ * notifications and capabilities. The value is only valid after ++ * the station moves to associated state. ++ * @txpwr: the station tx power configuration ++ * ++ */ ++struct ieee80211_link_sta { ++ struct ieee80211_sta *sta; ++ ++ u8 addr[ETH_ALEN]; ++ u8 link_id; ++ enum ieee80211_smps_mode smps_mode; ++ ++ u32 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_he_6ghz_capa he_6ghz_capa; ++ struct ieee80211_sta_eht_cap eht_cap; ++ ++ struct ieee80211_sta_aggregates agg; ++ ++ u8 rx_nss; ++ enum ieee80211_sta_rx_bandwidth bandwidth; ++ struct ieee80211_sta_txpwr txpwr; ++}; ++ ++/** + * struct ieee80211_sta - station table entry + * + * A station table entry represents a station we are possibly +@@ -2136,6 +2253,10 @@ + struct ieee80211_sta_txpwr txpwr; + + struct ieee80211_txq *txq[IEEE80211_NUM_TIDS + 1]; ++ ++ u16 valid_links; ++ struct ieee80211_link_sta deflink; ++ struct ieee80211_link_sta __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS]; + + /* must be last */ + u8 drv_priv[] __aligned(sizeof(void *)); +--- a/include/linux/ieee80211.h ++++ b/include/linux/ieee80211.h +@@ -1912,6 +1912,73 @@ + } __packed; + + /** ++ * struct ieee80211_eht_mcs_nss_supp_20mhz_only - EHT 20MHz only station max ++ * supported NSS for per MCS. ++ * ++ * For each field below, bits 0 - 3 indicate the maximal number of spatial ++ * streams for Rx, and bits 4 - 7 indicate the maximal number of spatial streams ++ * for Tx. ++ * ++ * @rx_tx_mcs7_max_nss: indicates the maximum number of spatial streams ++ * supported for reception and the maximum number of spatial streams ++ * supported for transmission for MCS 0 - 7. ++ * @rx_tx_mcs9_max_nss: indicates the maximum number of spatial streams ++ * supported for reception and the maximum number of spatial streams ++ * supported for transmission for MCS 8 - 9. ++ * @rx_tx_mcs11_max_nss: indicates the maximum number of spatial streams ++ * supported for reception and the maximum number of spatial streams ++ * supported for transmission for MCS 10 - 11. ++ * @rx_tx_mcs13_max_nss: indicates the maximum number of spatial streams ++ * supported for reception and the maximum number of spatial streams ++ * supported for transmission for MCS 12 - 13. ++ */ ++struct ieee80211_eht_mcs_nss_supp_20mhz_only { ++ u8 rx_tx_mcs7_max_nss; ++ u8 rx_tx_mcs9_max_nss; ++ u8 rx_tx_mcs11_max_nss; ++ u8 rx_tx_mcs13_max_nss; ++}; ++ ++/** ++ * struct ieee80211_eht_mcs_nss_supp_bw - EHT max supported NSS per MCS (except ++ * 20MHz only stations). ++ * ++ * For each field below, bits 0 - 3 indicate the maximal number of spatial ++ * streams for Rx, and bits 4 - 7 indicate the maximal number of spatial streams ++ * for Tx. ++ * ++ * @rx_tx_mcs9_max_nss: indicates the maximum number of spatial streams ++ * supported for reception and the maximum number of spatial streams ++ * supported for transmission for MCS 0 - 9. ++ * @rx_tx_mcs11_max_nss: indicates the maximum number of spatial streams ++ * supported for reception and the maximum number of spatial streams ++ * supported for transmission for MCS 10 - 11. ++ * @rx_tx_mcs13_max_nss: indicates the maximum number of spatial streams ++ * supported for reception and the maximum number of spatial streams ++ * supported for transmission for MCS 12 - 13. ++ */ ++struct ieee80211_eht_mcs_nss_supp_bw { ++ u8 rx_tx_mcs9_max_nss; ++ u8 rx_tx_mcs11_max_nss; ++ u8 rx_tx_mcs13_max_nss; ++}; ++ ++/** ++ * struct ieee80211_eht_cap_elem_fixed - EHT capabilities fixed data ++ * ++ * This structure is the "EHT Capabilities element" fixed fields as ++ * described in P802.11be_D2.0 section 9.4.2.313. ++ * ++ * @mac_cap_info: MAC capabilities, see IEEE80211_EHT_MAC_CAP* ++ * @phy_cap_info: PHY capabilities, see IEEE80211_EHT_PHY_CAP* ++ */ ++struct ieee80211_eht_cap_elem_fixed { ++ u8 mac_cap_info[2]; ++ u8 phy_cap_info[9]; ++} __packed; ++ ++ ++/** + * struct ieee80211_mu_edca_param_set - MU EDCA Parameter Set element + * + * This structure is the "MU EDCA Parameter Set element" fields as +@@ -2225,6 +2292,12 @@ + #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_16US 0x80 + #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_RESERVED 0xc0 + #define IEEE80211_HE_PHY_CAP9_NOMIMAL_PKT_PADDING_MASK 0xc0 ++#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_0US 0x0 ++#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_8US 0x1 ++#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US 0x2 ++#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED 0x3 ++#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS 6 ++#define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK 0xc0 + + #define IEEE80211_HE_PHY_CAP10_HE_MU_M1RU_MAX_LTF 0x01 + +@@ -3978,5 +4051,8 @@ + IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_16, + IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_UNSPECIFIED, + }; ++ ++/* multi-link device */ ++#define IEEE80211_MLD_MAX_NUM_LINKS 15 + + #endif /* LINUX_IEEE80211_H */ +--- a/include/net/cfg80211.h ++++ b/include/net/cfg80211.h +@@ -348,6 +348,31 @@ + #define IEEE80211_HE_PPE_THRES_MAX_LEN 25 + + /** ++ * struct ieee80211_eht_mcs_nss_supp - EHT max supported NSS per MCS ++ * ++ * See P802.11be_D1.3 Table 9-401k - "Subfields of the Supported EHT-MCS ++ * and NSS Set field" ++ * ++ * @only_20mhz: MCS/NSS support for 20 MHz-only STA. ++ * @bw: MCS/NSS support for 80, 160 and 320 MHz ++ * @bw._80: MCS/NSS support for BW <= 80 MHz ++ * @bw._160: MCS/NSS support for BW = 160 MHz ++ * @bw._320: MCS/NSS support for BW = 320 MHz ++ */ ++struct ieee80211_eht_mcs_nss_supp { ++ 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; ++ } __packed bw; ++ } __packed; ++} __packed; ++ ++#define IEEE80211_EHT_PPE_THRES_MAX_LEN 32 ++ ++/** + * struct ieee80211_sta_he_cap - STA's HE capabilities + * + * This structure describes most essential parameters needed +@@ -363,6 +388,24 @@ + struct ieee80211_he_cap_elem he_cap_elem; + struct ieee80211_he_mcs_nss_supp he_mcs_nss_supp; + u8 ppe_thres[IEEE80211_HE_PPE_THRES_MAX_LEN]; ++}; ++ ++/** ++ * struct ieee80211_sta_eht_cap - STA's EHT capabilities ++ * ++ * This structure describes most essential parameters needed ++ * to describe 802.11be EHT capabilities for a STA. ++ * ++ * @has_eht: true iff EHT data is valid. ++ * @eht_cap_elem: Fixed portion of the eht capabilities element. ++ * @eht_mcs_nss_supp: The supported NSS/MCS combinations. ++ * @eht_ppe_thres: Holds the PPE Thresholds data. ++ */ ++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; ++ u8 eht_ppe_thres[IEEE80211_EHT_PPE_THRES_MAX_LEN]; + }; + + /**