diff --git a/target_if/core/inc/target_if.h b/target_if/core/inc/target_if.h index 685e9c324b..0b1a87eb41 100644 --- a/target_if/core/inc/target_if.h +++ b/target_if/core/inc/target_if.h @@ -187,6 +187,7 @@ struct target_version_info { * @mem_chunks: allocated memory blocks for FW * @scan_radio_caps: scan radio capabilities * @device_mode: Global Device mode + * @sbs_lower_band_end_freq: sbs lower band end frequency */ struct tgt_info { struct host_fw_ver version; @@ -220,6 +221,7 @@ struct tgt_info { bool is_pdevid_to_phyid_map; struct wlan_psoc_host_scan_radio_caps *scan_radio_caps; uint32_t device_mode; + uint32_t sbs_lower_band_end_freq; }; /** @@ -2665,6 +2667,25 @@ static inline enum QDF_GLOBAL_MODE target_psoc_get_device_mode void target_if_set_reg_cc_ext_supp(struct target_psoc_info *tgt_hdl, struct wlan_objmgr_psoc *psoc); +/** + * target_psoc_set_sbs_lower_band_end() - Set lower band end sbs frequency + * + * @psoc_info: Pointer to struct target_psoc_info. + * @val: sbs lower band end cap value + * + * Return: None + * + */ +static inline +void target_psoc_set_sbs_lower_band_end(struct target_psoc_info *psoc_info, + uint32_t val) +{ + if (!psoc_info) + return; + + psoc_info->info.sbs_lower_band_end_freq = val; +} + /** * target_psoc_set_twt_ack_cap() - Set twt ack capability * diff --git a/target_if/init_deinit/inc/service_ready_util.h b/target_if/init_deinit/inc/service_ready_util.h index 7aa16254ff..0596f5bd12 100644 --- a/target_if/init_deinit/inc/service_ready_util.h +++ b/target_if/init_deinit/inc/service_ready_util.h @@ -329,6 +329,23 @@ int init_deinit_populate_twt_cap_ext2(struct wlan_objmgr_psoc *psoc, } #endif +/** + * init_deinit_populate_dbs_or_sbs_cap_ext2() - populate dbs or sbs capability + * from service ready ext2 event + * + * @psoc: PSOC object + * @handle: WMI handle pointer + * @event: event buffer received from FW + * @info: tgt_info object + * + * API to populate dbs or sbs capability from service ready ext2 event. + * Return: zero on successful dbs or sbs capability or failure + */ +int init_deinit_populate_dbs_or_sbs_cap_ext2(struct wlan_objmgr_psoc *psoc, + wmi_unified_t handle, + uint8_t *event, + struct tgt_info *info); + /** * init_deinit_validate_160_80p80_fw_caps() - validate 160 80p80 fw caps * @psoc: PSOC object diff --git a/target_if/init_deinit/src/init_event_handler.c b/target_if/init_deinit/src/init_event_handler.c index e936434d0b..8bf712fc65 100644 --- a/target_if/init_deinit/src/init_event_handler.c +++ b/target_if/init_deinit/src/init_event_handler.c @@ -353,6 +353,11 @@ static int init_deinit_service_ext2_ready_event_handler(ol_scn_t scn_handle, if (err_code) target_if_debug("failed to populate twt cap ext2"); + err_code = init_deinit_populate_dbs_or_sbs_cap_ext2(psoc, wmi_handle, + event, info); + if (err_code) + target_if_debug("failed to populate dbs_or_sbs cap ext2"); + target_if_regulatory_set_ext_tpc(psoc); target_if_reg_set_lower_6g_edge_ch_info(psoc); diff --git a/target_if/init_deinit/src/service_ready_util.c b/target_if/init_deinit/src/service_ready_util.c index f58bb105b9..65a2aaf8a4 100644 --- a/target_if/init_deinit/src/service_ready_util.c +++ b/target_if/init_deinit/src/service_ready_util.c @@ -560,6 +560,29 @@ exit: } #endif +int init_deinit_populate_dbs_or_sbs_cap_ext2(struct wlan_objmgr_psoc *psoc, + wmi_unified_t handle, + uint8_t *event, + struct tgt_info *info) +{ + uint32_t sbs_lower_band_end_freq; + struct target_psoc_info *psoc_info; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + status = wmi_extract_dbs_or_sbs_cap_service_ready_ext2(handle, event, + &sbs_lower_band_end_freq); + if (QDF_IS_STATUS_ERROR(status)) { + target_if_err("Extraction of twt capability failed"); + goto exit; + } + psoc_info = wlan_psoc_get_tgt_if_handle(psoc); + target_psoc_set_sbs_lower_band_end(psoc_info, sbs_lower_band_end_freq); + +exit: + return qdf_status_to_os_return(status); +} + + QDF_STATUS init_deinit_dbr_ring_cap_free( struct target_psoc_info *tgt_psoc_info) { diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 16d93e6b4a..12a735d9d2 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -3405,6 +3405,23 @@ QDF_STATUS wmi_extract_service_ready_ext2( struct wmi_unified *wmi_handle, uint8_t *evt_buf, struct wlan_psoc_host_service_ext2_param *param); +/* + * wmi_extract_dbs_or_sbs_cap_service_ready_ext2() - extract dbs_or_sbs cap from + * service ready ext 2 + * + * @wmi_handle: wmi handle + * @evt_buf: pointer to event buffer + * @sbs_lower_band_end_freq: If sbs_lower_band_end_freq is set to non-zero, + * it indicates async SBS mode is supported, and + * lower-band/higher band to MAC mapping is + * switch-able. unit: mhz. examples 5180, 5320 + * + * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error + */ +QDF_STATUS wmi_extract_dbs_or_sbs_cap_service_ready_ext2( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, uint32_t *sbs_lower_band_end_freq); + /** * wmi_extract_hw_mode_cap_service_ready_ext() - * extract HW mode cap from service ready event diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 4029c0ae9e..005e05f743 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -2041,6 +2041,10 @@ QDF_STATUS (*extract_service_ready_ext2)( uint8_t *evt_buf, struct wlan_psoc_host_service_ext2_param *param); +QDF_STATUS (*extract_dbs_or_sbs_service_ready_ext2)( + wmi_unified_t wmi_handle, uint8_t *event, + uint32_t *sbs_lower_band_end_freq); + QDF_STATUS (*extract_hw_mode_cap_service_ready_ext)( wmi_unified_t wmi_handle, uint8_t *evt_buf, uint8_t hw_mode_idx, diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 7806d21677..435785f64b 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -2461,6 +2461,18 @@ QDF_STATUS wmi_extract_service_ready_ext2( return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_extract_dbs_or_sbs_cap_service_ready_ext2( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, uint32_t *sbs_lower_band_end_freq) +{ + if (wmi_handle->ops->extract_dbs_or_sbs_service_ready_ext2) + return wmi_handle->ops->extract_dbs_or_sbs_service_ready_ext2( + wmi_handle, + evt_buf, sbs_lower_band_end_freq); + + return QDF_STATUS_E_FAILURE; +} + QDF_STATUS wmi_extract_sar_cap_service_ready_ext( wmi_unified_t wmi_handle, uint8_t *evt_buf, diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 3e376d98f4..f35e3f0635 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -11726,6 +11726,39 @@ extract_service_ready_ext2_tlv(wmi_unified_t wmi_handle, uint8_t *event, return QDF_STATUS_SUCCESS; } +/* + * extract_dbs_or_sbs_cap_service_ready_ext2_tlv() - extract dbs_or_sbs cap from + * service ready ext 2 + * + * @wmi_handle: wmi handle + * @event: pointer to event buffer + * @sbs_lower_band_end_freq: If sbs_lower_band_end_freq is set to non-zero, + * it indicates async SBS mode is supported, and + * lower-band/higher band to MAC mapping is + * switch-able. unit: mhz. examples 5180, 5320 + * + * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error + */ +static QDF_STATUS extract_dbs_or_sbs_cap_service_ready_ext2_tlv( + wmi_unified_t wmi_handle, uint8_t *event, + uint32_t *sbs_lower_band_end_freq) +{ + WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *param_buf; + wmi_dbs_or_sbs_cap_ext *dbs_or_sbs_caps; + + param_buf = (WMI_SERVICE_READY_EXT2_EVENTID_param_tlvs *)event; + if (!param_buf) + return QDF_STATUS_E_INVAL; + + dbs_or_sbs_caps = param_buf->dbs_or_sbs_cap_ext; + if (!dbs_or_sbs_caps) + return QDF_STATUS_E_INVAL; + + *sbs_lower_band_end_freq = dbs_or_sbs_caps->sbs_lower_band_end_freq; + + return QDF_STATUS_SUCCESS; +} + /** * extract_sar_cap_service_ready_ext_tlv() - * extract SAR cap from service ready event @@ -16476,6 +16509,8 @@ struct wmi_ops tlv_ops = { .send_power_dbg_cmd = send_power_dbg_cmd_tlv, .extract_service_ready_ext = extract_service_ready_ext_tlv, .extract_service_ready_ext2 = extract_service_ready_ext2_tlv, + .extract_dbs_or_sbs_service_ready_ext2 = + extract_dbs_or_sbs_cap_service_ready_ext2_tlv, .extract_hw_mode_cap_service_ready_ext = extract_hw_mode_cap_service_ready_ext_tlv, .extract_mac_phy_cap_service_ready_ext =