diff --git a/target_if/init_deinit/inc/service_ready_param.h b/target_if/init_deinit/inc/service_ready_param.h index 2277ef9e5a..54d262d0a6 100644 --- a/target_if/init_deinit/inc/service_ready_param.h +++ b/target_if/init_deinit/inc/service_ready_param.h @@ -119,7 +119,7 @@ struct wlan_psoc_host_ppe_threshold { * @high_5ghz_chan: higher 5 GHz channels */ struct wlan_psoc_host_hal_reg_cap_ext { - uint32_t wireless_modes; + uint64_t wireless_modes; uint32_t low_2ghz_chan; uint32_t high_2ghz_chan; uint32_t low_5ghz_chan; @@ -263,7 +263,7 @@ struct wlan_psoc_host_mac_phy_caps_ext2 { uint32_t hw_mode_id; uint32_t pdev_id; uint32_t phy_id; - uint32_t wireless_modes_ext; + uint64_t wireless_modes_ext; #ifdef WLAN_FEATURE_11BE uint32_t eht_cap_info_2G[PSOC_HOST_MAX_MAC_SIZE]; uint32_t eht_supp_mcs_2G; diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h index 9c5f968ce2..58886217ed 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h @@ -401,7 +401,7 @@ struct wlan_psoc_host_hal_reg_capabilities_ext { uint32_t eeprom_reg_domain_ext; uint32_t regcap1; uint32_t regcap2; - uint32_t wireless_modes; + uint64_t wireless_modes; uint32_t low_2ghz_chan; uint32_t high_2ghz_chan; uint32_t low_5ghz_chan; @@ -416,7 +416,7 @@ struct wlan_psoc_host_hal_reg_capabilities_ext { */ struct wlan_psoc_host_hal_reg_capabilities_ext2 { uint32_t phy_id; - uint32_t wireless_modes_ext; + uint64_t wireless_modes_ext; }; /** diff --git a/umac/regulatory/core/src/reg_priv_objs.h b/umac/regulatory/core/src/reg_priv_objs.h index 79d3f521a7..1360e4db4e 100644 --- a/umac/regulatory/core/src/reg_priv_objs.h +++ b/umac/regulatory/core/src/reg_priv_objs.h @@ -228,7 +228,7 @@ struct wlan_regulatory_pdev_priv_obj { uint32_t band_capability; bool indoor_chan_enabled; bool en_chan_144; - uint32_t wireless_modes; + uint64_t wireless_modes; struct ch_avoid_ind_type freq_avoid_list; bool force_ssc_disable_indoor_channel; bool sap_state; diff --git a/umac/regulatory/core/src/reg_services_common.c b/umac/regulatory/core/src/reg_services_common.c index c39c377f29..d3824fa10c 100644 --- a/umac/regulatory/core/src/reg_services_common.c +++ b/umac/regulatory/core/src/reg_services_common.c @@ -2258,7 +2258,7 @@ QDF_STATUS reg_set_hal_reg_cap( } QDF_STATUS reg_update_hal_reg_cap(struct wlan_objmgr_psoc *psoc, - uint32_t wireless_modes, uint8_t phy_id) + uint64_t wireless_modes, uint8_t phy_id) { struct wlan_regulatory_psoc_priv_obj *psoc_priv_obj; @@ -4094,6 +4094,30 @@ reg_get_unii_5g_bitmap(struct wlan_objmgr_pdev *pdev, uint8_t *bitmap) } #endif +#ifdef WLAN_FEATURE_11BE +bool reg_is_phymode_unallowed(enum reg_phymode phy_in, uint32_t phymode_bitmap) +{ + if (!phymode_bitmap) + return false; + + if (phy_in == REG_PHYMODE_11BE) + return phymode_bitmap & REGULATORY_PHYMODE_NO11BE; + else if (phy_in == REG_PHYMODE_11AX) + return phymode_bitmap & REGULATORY_PHYMODE_NO11AX; + else if (phy_in == REG_PHYMODE_11AC) + return phymode_bitmap & REGULATORY_PHYMODE_NO11AC; + else if (phy_in == REG_PHYMODE_11N) + return phymode_bitmap & REGULATORY_CHAN_NO11N; + else if (phy_in == REG_PHYMODE_11G) + return phymode_bitmap & REGULATORY_PHYMODE_NO11G; + else if (phy_in == REG_PHYMODE_11A) + return phymode_bitmap & REGULATORY_PHYMODE_NO11A; + else if (phy_in == REG_PHYMODE_11B) + return phymode_bitmap & REGULATORY_PHYMODE_NO11B; + else + return true; +} +#else bool reg_is_phymode_unallowed(enum reg_phymode phy_in, uint32_t phymode_bitmap) { if (!phymode_bitmap) @@ -4113,8 +4137,8 @@ bool reg_is_phymode_unallowed(enum reg_phymode phy_in, uint32_t phymode_bitmap) return phymode_bitmap & REGULATORY_PHYMODE_NO11B; else return true; - } +#endif #ifdef CHECK_REG_PHYMODE enum reg_phymode reg_get_max_phymode(struct wlan_objmgr_pdev *pdev, diff --git a/umac/regulatory/core/src/reg_services_common.h b/umac/regulatory/core/src/reg_services_common.h index 58294db67d..2a6c0fccaf 100644 --- a/umac/regulatory/core/src/reg_services_common.h +++ b/umac/regulatory/core/src/reg_services_common.h @@ -456,7 +456,7 @@ QDF_STATUS reg_set_hal_reg_cap( * Return: QDF_STATUS */ QDF_STATUS reg_update_hal_reg_cap(struct wlan_objmgr_psoc *psoc, - uint32_t wireless_modes, uint8_t phy_id); + uint64_t wireless_modes, uint8_t phy_id); /** * reg_chan_in_range() - Check if the given channel is in pdev's channel range diff --git a/umac/regulatory/dispatcher/inc/reg_services_public_struct.h b/umac/regulatory/dispatcher/inc/reg_services_public_struct.h index 3e87cf3a80..cb1a6ea8d6 100644 --- a/umac/regulatory/dispatcher/inc/reg_services_public_struct.h +++ b/umac/regulatory/dispatcher/inc/reg_services_public_struct.h @@ -70,6 +70,9 @@ #define REGULATORY_CHAN_NO11N BIT(3) #define REGULATORY_PHYMODE_NO11AC BIT(4) #define REGULATORY_PHYMODE_NO11AX BIT(5) +#ifdef WLAN_FEATURE_11BE +#define REGULATORY_PHYMODE_NO11BE BIT(6) +#endif #define BW_5_MHZ 5 #define BW_10_MHZ 10 @@ -1304,6 +1307,7 @@ struct reg_ctl_params { * @REG_PHYMODE_11N: 802.11n phymode * @REG_PHYMODE_11AC: 802.11ac phymode * @REG_PHYMODE_11AX: 802.11ax phymode + * @REG_PHYMODE_11BE: 802.11be phymode * @REG_PHYMODE_MAX: placeholder for future phymodes */ enum reg_phymode { @@ -1314,6 +1318,9 @@ enum reg_phymode { REG_PHYMODE_11N, REG_PHYMODE_11AC, REG_PHYMODE_11AX, +#ifdef WLAN_FEATURE_11BE + REG_PHYMODE_11BE, +#endif REG_PHYMODE_MAX, }; diff --git a/umac/regulatory/dispatcher/inc/wlan_reg_services_api.h b/umac/regulatory/dispatcher/inc/wlan_reg_services_api.h index 033a72d2b4..c5aedd3fa9 100644 --- a/umac/regulatory/dispatcher/inc/wlan_reg_services_api.h +++ b/umac/regulatory/dispatcher/inc/wlan_reg_services_api.h @@ -921,7 +921,7 @@ bool wlan_reg_11d_enabled_on_host(struct wlan_objmgr_psoc *psoc); * Return: QDF STATUS */ QDF_STATUS wlan_reg_get_chip_mode(struct wlan_objmgr_pdev *pdev, - uint32_t *chip_mode); + uint64_t *chip_mode); /** * wlan_reg_is_11d_scan_inprogress() - checks 11d scan status diff --git a/umac/regulatory/dispatcher/inc/wlan_reg_ucfg_api.h b/umac/regulatory/dispatcher/inc/wlan_reg_ucfg_api.h index eafd72b5ce..b496089ca8 100644 --- a/umac/regulatory/dispatcher/inc/wlan_reg_ucfg_api.h +++ b/umac/regulatory/dispatcher/inc/wlan_reg_ucfg_api.h @@ -400,7 +400,7 @@ QDF_STATUS ucfg_reg_set_hal_reg_cap(struct wlan_objmgr_psoc *psoc, * Return: QDF_STATUS */ QDF_STATUS ucfg_reg_update_hal_reg_cap(struct wlan_objmgr_psoc *psoc, - uint32_t wireless_modes, uint8_t phy_id); + uint64_t wireless_modes, uint8_t phy_id); /** * ucfg_set_ignore_fw_reg_offload_ind() - API to set ignore regdb offload ind diff --git a/umac/regulatory/dispatcher/src/wlan_reg_services_api.c b/umac/regulatory/dispatcher/src/wlan_reg_services_api.c index 0307b0e15d..ce6915c533 100644 --- a/umac/regulatory/dispatcher/src/wlan_reg_services_api.c +++ b/umac/regulatory/dispatcher/src/wlan_reg_services_api.c @@ -609,7 +609,7 @@ bool wlan_reg_get_fcc_constraint(struct wlan_objmgr_pdev *pdev, uint32_t freq) } QDF_STATUS wlan_reg_get_chip_mode(struct wlan_objmgr_pdev *pdev, - uint32_t *chip_mode) + uint64_t *chip_mode) { struct wlan_regulatory_pdev_priv_obj *pdev_priv_obj; diff --git a/umac/regulatory/dispatcher/src/wlan_reg_ucfg_api.c b/umac/regulatory/dispatcher/src/wlan_reg_ucfg_api.c index b544dc0bd2..f92682007f 100644 --- a/umac/regulatory/dispatcher/src/wlan_reg_ucfg_api.c +++ b/umac/regulatory/dispatcher/src/wlan_reg_ucfg_api.c @@ -286,7 +286,7 @@ QDF_STATUS ucfg_reg_set_hal_reg_cap(struct wlan_objmgr_psoc *psoc, qdf_export_symbol(ucfg_reg_set_hal_reg_cap); QDF_STATUS ucfg_reg_update_hal_reg_cap(struct wlan_objmgr_psoc *psoc, - uint32_t wireless_modes, uint8_t phy_id) + uint64_t wireless_modes, uint8_t phy_id) { return reg_update_hal_reg_cap(psoc, wireless_modes, phy_id); } diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 6482734a17..47a8c87ffe 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -551,6 +551,15 @@ typedef struct { * @WMI_HOST_REGDMN_MODE_11AXA_HE80: 11ax 5GHz, HE80 channels * @WMI_HOST_REGDMN_MODE_11AXA_HE160: 11ax 5GHz, HE160 channels * @WMI_HOST_REGDMN_MODE_11AXA_HE80_80: 11ax 5GHz, HE80+80 channels + * @WMI_HOST_REGDMN_MODE_11BEG_EHT20: 11be 2GHz, EHT20 channels + * @WMI_HOST_REGDMN_MODE_11BEA_EHT20: 11be 5GHz, EHT20 channels + * @WMI_HOST_REGDMN_MODE_11BEG_EHT40PLUS: 11be 2GHz, EHT40+ channels + * @WMI_HOST_REGDMN_MODE_11BEG_EHT40MINUS: 11be 2GHz, EHT40- channels + * @WMI_HOST_REGDMN_MODE_11BEA_EHT40PLUS: 11be 5GHz, EHT40+ channels + * @WMI_HOST_REGDMN_MODE_11BEA_EHT40MINUS: 11be 5GHz, EHT40- channels + * @WMI_HOST_REGDMN_MODE_11BEA_EHT80: 11be 5GHz, EHT80 channels + * @WMI_HOST_REGDMN_MODE_11BEA_EHT160: 11be 5GHz, EHT160 channels + * @WMI_HOST_REGDMN_MODE_11BEA_EHT320: 11be 5GHz, EHT320 channels */ typedef enum { WMI_HOST_REGDMN_MODE_11A = 0x00000001, @@ -585,7 +594,18 @@ typedef enum { WMI_HOST_REGDMN_MODE_11AXA_HE80 = 0x20000000, WMI_HOST_REGDMN_MODE_11AXA_HE160 = 0x40000000, WMI_HOST_REGDMN_MODE_11AXA_HE80_80 = 0x80000000, - WMI_HOST_REGDMN_MODE_ALL = 0xffffffff +#ifdef WLAN_FEATURE_11BE + WMI_HOST_REGDMN_MODE_11BEG_EHT20 = 0x0000000100000000, + WMI_HOST_REGDMN_MODE_11BEA_EHT20 = 0x0000000200000000, + WMI_HOST_REGDMN_MODE_11BEG_EHT40PLUS = 0x0000000400000000, + WMI_HOST_REGDMN_MODE_11BEG_EHT40MINUS = 0x0000000800000000, + WMI_HOST_REGDMN_MODE_11BEA_EHT40PLUS = 0x0000001000000000, + WMI_HOST_REGDMN_MODE_11BEA_EHT40MINUS = 0x0000002000000000, + WMI_HOST_REGDMN_MODE_11BEA_EHT80 = 0x0000004000000000, + WMI_HOST_REGDMN_MODE_11BEA_EHT160 = 0x0000008000000000, + WMI_HOST_REGDMN_MODE_11BEA_EHT320 = 0x0000010000000000, +#endif + WMI_HOST_REGDMN_MODE_ALL = 0xffffffffffffffff } WMI_HOST_REGDMN_MODE; /** diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 6d0d00cc32..aaa25ba1bb 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -9921,6 +9921,30 @@ static inline uint32_t convert_wireless_modes_tlv(uint32_t target_wireless_mode) return wireless_modes; } +/** + * convert_11be_phybitmap_to_reg_flags() - Convert 11BE phybitmap to + * to regulatory flags. + * @target_phybitmap: target phybitmap. + * @phybitmap: host internal REGULATORY_PHYMODE set based on target + * phybitmap. + * + * Return: None + */ + +#ifdef WLAN_FEATURE_11BE +static void convert_11be_phybitmap_to_reg_flags(uint32_t target_phybitmap, + uint32_t *phybitmap) +{ + if (target_phybitmap & WMI_REGULATORY_PHYMODE_NO11BE) + *phybitmap |= REGULATORY_PHYMODE_NO11BE; +} +#else +static void convert_11be_phybitmap_to_reg_flags(uint32_t target_phybitmap, + uint32_t *phybitmap) +{ +} +#endif + /* convert_phybitmap_tlv() - Convert WMI_REGULATORY_PHYBITMAP values sent by * target to host internal REGULATORY_PHYMODE values. * @@ -9952,13 +9976,61 @@ static uint32_t convert_phybitmap_tlv(uint32_t target_phybitmap) if (target_phybitmap & WMI_REGULATORY_PHYMODE_NO11AX) phybitmap |= REGULATORY_PHYMODE_NO11AX; + convert_11be_phybitmap_to_reg_flags(target_phybitmap, &phybitmap); + return phybitmap; } -static inline uint32_t convert_wireless_modes_ext_tlv( +/** + * convert_11be_flags_to_modes_ext() - Convert 11BE wireless mode flag + * advertised by the target to wireless mode ext flags. + * @target_wireless_modes_ext: Target wireless mode + * @wireless_modes_ext: Variable to hold all the target wireless mode caps. + * + * Return: None + */ +#ifdef WLAN_FEATURE_11BE +static void convert_11be_flags_to_modes_ext(uint32_t target_wireless_modes_ext, + uint64_t *wireless_modes_ext) +{ + if (target_wireless_modes_ext & REGDMN_MODE_U32_11BEG_EHT20) + *wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11BEG_EHT20; + + if (target_wireless_modes_ext & REGDMN_MODE_U32_11BEG_EHT40PLUS) + *wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11BEG_EHT40PLUS; + + if (target_wireless_modes_ext & REGDMN_MODE_U32_11BEG_EHT40MINUS) + *wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11BEG_EHT40MINUS; + + if (target_wireless_modes_ext & REGDMN_MODE_U32_11BEA_EHT20) + *wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11BEA_EHT20; + + if (target_wireless_modes_ext & REGDMN_MODE_U32_11BEA_EHT40PLUS) + *wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11BEA_EHT40PLUS; + + if (target_wireless_modes_ext & REGDMN_MODE_U32_11BEA_EHT40MINUS) + *wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11BEA_EHT40MINUS; + + if (target_wireless_modes_ext & REGDMN_MODE_U32_11BEA_EHT80) + *wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11BEA_EHT80; + + if (target_wireless_modes_ext & REGDMN_MODE_U32_11BEA_EHT160) + *wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11BEA_EHT160; + + if (target_wireless_modes_ext & REGDMN_MODE_U32_11BEA_EHT320) + *wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11BEA_EHT320; +} +#else +static void convert_11be_flags_to_modes_ext(uint32_t target_wireless_modes_ext, + uint64_t *wireless_modes_ext) +{ +} +#endif + +static inline uint64_t convert_wireless_modes_ext_tlv( uint32_t target_wireless_modes_ext) { - uint32_t wireless_modes_ext = 0; + uint64_t wireless_modes_ext = 0; wmi_debug("Target wireless mode: 0x%x", target_wireless_modes_ext); @@ -9989,6 +10061,9 @@ static inline uint32_t convert_wireless_modes_ext_tlv( if (target_wireless_modes_ext & REGDMN_MODE_U32_11AXA_HE80_80) wireless_modes_ext |= WMI_HOST_REGDMN_MODE_11AXA_HE80_80; + convert_11be_flags_to_modes_ext(target_wireless_modes_ext, + &wireless_modes_ext); + return wireless_modes_ext; }