diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 2731e1891a..218cb934bb 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -315,6 +315,75 @@ typedef struct { uint32_t reg_info_2; } wmi_host_channel; +/** + * enum WMI_HOST_REGDMN_MODE: + * @WMI_HOST_REGDMN_MODE_11A: 11a channels + * @WMI_HOST_REGDMN_MODE_TURBO: 11a turbo-only channels + * @WMI_HOST_REGDMN_MODE_11B: 11b channels + * @WMI_HOST_REGDMN_MODE_PUREG: 11g channels (OFDM only) + * @WMI_HOST_REGDMN_MODE_11G: historical + * @WMI_HOST_REGDMN_MODE_108G: 11g+Turbo channels + * @WMI_HOST_REGDMN_MODE_108A: 11a+Turbo channels + * @WMI_HOST_REGDMN_MODE_XR: XR channels + * @WMI_HOST_REGDMN_MODE_11A_HALF_RATE: 11a half rate channels + * @WMI_HOST_REGDMN_MODE_11A_QUARTER_RATE: 11a quarter rate channels + * @WMI_HOST_REGDMN_MODE_11NG_HT20: 11ng HT20 channels + * @WMI_HOST_REGDMN_MODE_11NA_HT20: 11na HT20 channels + * @WMI_HOST_REGDMN_MODE_11NG_HT40PLUS: 11ng HT40+ channels + * @WMI_HOST_REGDMN_MODE_11NG_HT40MINUS: 11ng HT40- channels + * @WMI_HOST_REGDMN_MODE_11NA_HT40PLUS: 11na HT40+ channels + * @WMI_HOST_REGDMN_MODE_11NA_HT40MINUS: 11na HT40- channels + * @WMI_HOST_REGDMN_MODE_11AC_VHT20: 5GHz, VHT20 + * @WMI_HOST_REGDMN_MODE_11AC_VHT40PLUS: 5GHz, VHT40+ channels + * @WMI_HOST_REGDMN_MODE_11AC_VHT40MINUS: 5GHz, VHT40- channels + * @WMI_HOST_REGDMN_MODE_11AC_VHT80: 5GHz, VHT80 channels + * @WMI_HOST_REGDMN_MODE_11AC_VHT160: 5GHz, VHT160 channels + * @WMI_HOST_REGDMN_MODE_11AC_VHT80_80: 5GHz, VHT80+80 channels + * @WMI_HOST_REGDMN_MODE_11AXG_HE20: 11ax 2.4GHz, HE20 channels + * @WMI_HOST_REGDMN_MODE_11AXA_HE20: 11ax 5GHz, HE20 channels + * @WMI_HOST_REGDMN_MODE_11AXG_HE40PLUS: 11ax 2.4GHz, HE40+ channels + * @WMI_HOST_REGDMN_MODE_11AXG_HE40MINUS: 11ax 2.4GHz, HE40- channels + * @WMI_HOST_REGDMN_MODE_11AXA_HE40PLUS: 11ax 5GHz, HE40+ channels + * @WMI_HOST_REGDMN_MODE_11AXA_HE40MINUS: 11ax 5GHz, HE40- channels + * @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 + */ +typedef enum { + WMI_HOST_REGDMN_MODE_11A = 0x00000001, + WMI_HOST_REGDMN_MODE_TURBO = 0x00000002, + WMI_HOST_REGDMN_MODE_11B = 0x00000004, + WMI_HOST_REGDMN_MODE_PUREG = 0x00000008, + WMI_HOST_REGDMN_MODE_11G = 0x00000008, + WMI_HOST_REGDMN_MODE_108G = 0x00000020, + WMI_HOST_REGDMN_MODE_108A = 0x00000040, + WMI_HOST_REGDMN_MODE_XR = 0x00000100, + WMI_HOST_REGDMN_MODE_11A_HALF_RATE = 0x00000200, + WMI_HOST_REGDMN_MODE_11A_QUARTER_RATE = 0x00000400, + WMI_HOST_REGDMN_MODE_11NG_HT20 = 0x00000800, + WMI_HOST_REGDMN_MODE_11NA_HT20 = 0x00001000, + WMI_HOST_REGDMN_MODE_11NG_HT40PLUS = 0x00002000, + WMI_HOST_REGDMN_MODE_11NG_HT40MINUS = 0x00004000, + WMI_HOST_REGDMN_MODE_11NA_HT40PLUS = 0x00008000, + WMI_HOST_REGDMN_MODE_11NA_HT40MINUS = 0x00010000, + WMI_HOST_REGDMN_MODE_11AC_VHT20 = 0x00020000, + WMI_HOST_REGDMN_MODE_11AC_VHT40PLUS = 0x00040000, + WMI_HOST_REGDMN_MODE_11AC_VHT40MINUS = 0x00080000, + WMI_HOST_REGDMN_MODE_11AC_VHT80 = 0x00100000, + WMI_HOST_REGDMN_MODE_11AC_VHT160 = 0x00200000, + WMI_HOST_REGDMN_MODE_11AC_VHT80_80 = 0x00400000, + WMI_HOST_REGDMN_MODE_11AXG_HE20 = 0x00800000, + WMI_HOST_REGDMN_MODE_11AXA_HE20 = 0x01000000, + WMI_HOST_REGDMN_MODE_11AXG_HE40PLUS = 0x02000000, + WMI_HOST_REGDMN_MODE_11AXG_HE40MINUS = 0x04000000, + WMI_HOST_REGDMN_MODE_11AXA_HE40PLUS = 0x08000000, + WMI_HOST_REGDMN_MODE_11AXA_HE40MINUS = 0x10000000, + 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 +} WMI_HOST_REGDMN_MODE; + /** * enum wmi_dwelltime_adaptive_mode: dwelltime_mode * @WMI_DWELL_MODE_DEFAULT: Use firmware default mode diff --git a/wmi/src/wmi_unified_non_tlv.c b/wmi/src/wmi_unified_non_tlv.c index ef6649acdf..e36c851c89 100644 --- a/wmi/src/wmi_unified_non_tlv.c +++ b/wmi/src/wmi_unified_non_tlv.c @@ -5545,12 +5545,89 @@ static QDF_STATUS extract_hal_reg_cap_non_tlv(wmi_unified_t wmi_handle, TARGET_HAL_REG_CAPABILITIES *cap) { wmi_service_ready_event *ev; + u_int32_t wireless_modes_orig = 0; ev = (wmi_service_ready_event *) evt_buf; qdf_mem_copy(cap, &ev->hal_reg_capabilities, sizeof(TARGET_HAL_REG_CAPABILITIES)); + /* Convert REGDMN_MODE values sent by target to host internal + * WMI_HOST_REGDMN_MODE values. + * + * REGULATORY TODO : + * REGDMN_MODE_11AC_VHT*_2G values are not used by the + * host currently. Add this in the future if required. + */ + wireless_modes_orig = ev->hal_reg_capabilities.wireless_modes; + cap->wireless_modes = 0; + + if (wireless_modes_orig & REGDMN_MODE_11A) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11A; + + if (wireless_modes_orig & REGDMN_MODE_TURBO) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_TURBO; + + if (wireless_modes_orig & REGDMN_MODE_11B) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11B; + + if (wireless_modes_orig & REGDMN_MODE_PUREG) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_PUREG; + + if (wireless_modes_orig & REGDMN_MODE_11G) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11G; + + if (wireless_modes_orig & REGDMN_MODE_108G) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_108G; + + if (wireless_modes_orig & REGDMN_MODE_108A) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_108A; + + if (wireless_modes_orig & REGDMN_MODE_XR) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_XR; + + if (wireless_modes_orig & REGDMN_MODE_11A_HALF_RATE) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11A_HALF_RATE; + + if (wireless_modes_orig & REGDMN_MODE_11A_QUARTER_RATE) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11A_QUARTER_RATE; + + if (wireless_modes_orig & REGDMN_MODE_11NG_HT20) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NG_HT20; + + if (wireless_modes_orig & REGDMN_MODE_11NA_HT20) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NA_HT20; + + if (wireless_modes_orig & REGDMN_MODE_11NG_HT40PLUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NG_HT40PLUS; + + if (wireless_modes_orig & REGDMN_MODE_11NG_HT40MINUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NG_HT40MINUS; + + if (wireless_modes_orig & REGDMN_MODE_11NA_HT40PLUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NA_HT40PLUS; + + if (wireless_modes_orig & REGDMN_MODE_11NA_HT40MINUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NA_HT40MINUS; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT20) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT20; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT40PLUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT40PLUS; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT40MINUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT40MINUS; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT80) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT80; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT160) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT160; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT80_80) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT80_80; + return QDF_STATUS_SUCCESS; } diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 0e0c42fff6..cd5e366eb7 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -11825,6 +11825,7 @@ static QDF_STATUS extract_hal_reg_cap_tlv(wmi_unified_t wmi_handle, void *evt_buf, TARGET_HAL_REG_CAPABILITIES *cap) { WMI_SERVICE_READY_EVENTID_param_tlvs *param_buf; + u_int32_t wireless_modes_orig = 0; param_buf = (WMI_SERVICE_READY_EVENTID_param_tlvs *) evt_buf; @@ -11832,6 +11833,86 @@ static QDF_STATUS extract_hal_reg_cap_tlv(wmi_unified_t wmi_handle, sizeof(uint32_t)), sizeof(TARGET_HAL_REG_CAPABILITIES)); + /* Convert REGDMN_MODE values sent by target to host internal + * WMI_HOST_REGDMN_MODE values. + * + * REGULATORY TODO : REGDMN_MODE_11AC_VHT*_2G values are not used by the + * host currently. Add this in the future if required. + * + * 11AX TODO (Phase II) : 11ax related values are not currently + * advertised separately by FW. As part of phase II regulatory bring-up, + * finalize the advertisement mechanism. + */ + + wireless_modes_orig = param_buf->hal_reg_capabilities->wireless_modes; + cap->wireless_modes = 0; + + if (wireless_modes_orig & REGDMN_MODE_11A) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11A; + + if (wireless_modes_orig & REGDMN_MODE_TURBO) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_TURBO; + + if (wireless_modes_orig & REGDMN_MODE_11B) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11B; + + if (wireless_modes_orig & REGDMN_MODE_PUREG) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_PUREG; + + if (wireless_modes_orig & REGDMN_MODE_11G) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11G; + + if (wireless_modes_orig & REGDMN_MODE_108G) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_108G; + + if (wireless_modes_orig & REGDMN_MODE_108A) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_108A; + + if (wireless_modes_orig & REGDMN_MODE_XR) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_XR; + + if (wireless_modes_orig & REGDMN_MODE_11A_HALF_RATE) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11A_HALF_RATE; + + if (wireless_modes_orig & REGDMN_MODE_11A_QUARTER_RATE) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11A_QUARTER_RATE; + + if (wireless_modes_orig & REGDMN_MODE_11NG_HT20) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NG_HT20; + + if (wireless_modes_orig & REGDMN_MODE_11NA_HT20) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NA_HT20; + + if (wireless_modes_orig & REGDMN_MODE_11NG_HT40PLUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NG_HT40PLUS; + + if (wireless_modes_orig & REGDMN_MODE_11NG_HT40MINUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NG_HT40MINUS; + + if (wireless_modes_orig & REGDMN_MODE_11NA_HT40PLUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NA_HT40PLUS; + + if (wireless_modes_orig & REGDMN_MODE_11NA_HT40MINUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11NA_HT40MINUS; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT20) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT20; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT40PLUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT40PLUS; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT40MINUS) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT40MINUS; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT80) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT80; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT160) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT160; + + if (wireless_modes_orig & REGDMN_MODE_11AC_VHT80_80) + cap->wireless_modes |= WMI_HOST_REGDMN_MODE_11AC_VHT80_80; + return QDF_STATUS_SUCCESS; }