diff --git a/wmi_unified_api.c b/wmi_unified_api.c index 5db4912542..d24a715f72 100644 --- a/wmi_unified_api.c +++ b/wmi_unified_api.c @@ -6514,14 +6514,17 @@ QDF_STATUS wmi_extract_hw_mode_cap_service_ready_ext( * extract MAC phy cap from service ready event * @wmi_handle: wmi handle * @param evt_buf: pointer to event buffer - * @param param: Pointer to hold evt buf - * @param hw_mode_idx: hw mode idx should be less than num_mode + * @param hw_mode_id: hw mode id of hw_mode_caps + * @param phy_id: phy_id within hw_mode_cap + * @param param: pointer to mac phy caps structure to hold the values from event * * Return: QDF_STATUS_SUCCESS for success or error code */ QDF_STATUS wmi_extract_mac_phy_cap_service_ready_ext( void *wmi_hdl, - uint8_t *evt_buf, uint8_t hw_mode_idx, + uint8_t *evt_buf, + uint8_t hw_mode_id, + uint8_t phy_id, struct wmi_host_mac_phy_caps *param) { wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; @@ -6529,7 +6532,7 @@ QDF_STATUS wmi_extract_mac_phy_cap_service_ready_ext( if (wmi_handle->ops->extract_mac_phy_cap_service_ready_ext) return wmi_handle->ops->extract_mac_phy_cap_service_ready_ext( wmi_handle, - evt_buf, hw_mode_idx, param); + evt_buf, hw_mode_id, phy_id, param); return QDF_STATUS_E_FAILURE; } diff --git a/wmi_unified_tlv.c b/wmi_unified_tlv.c index 2ba3543a99..49b7fad68b 100644 --- a/wmi_unified_tlv.c +++ b/wmi_unified_tlv.c @@ -12861,6 +12861,9 @@ static QDF_STATUS extract_hw_mode_cap_service_ready_ext_tlv( param->hw_mode_id = param_buf->hw_mode_caps[hw_mode_idx].hw_mode_id; param->phy_id_map = param_buf->hw_mode_caps[hw_mode_idx].phy_id_map; + param->hw_mode_config_type = + param_buf->hw_mode_caps[hw_mode_idx].hw_mode_config_type; + return QDF_STATUS_SUCCESS; } @@ -12871,37 +12874,61 @@ static QDF_STATUS extract_hw_mode_cap_service_ready_ext_tlv( * @param evt_buf: pointer to event buffer * @param param: Pointer to hold evt buf * @param hw_mode_idx: hw mode idx should be less than num_mode + * @param phy_id: phy id within hw_mode * * Return: QDF_STATUS_SUCCESS for success or error code */ static QDF_STATUS extract_mac_phy_cap_service_ready_ext_tlv( wmi_unified_t wmi_handle, - uint8_t *event, uint8_t hw_mode_idx, + uint8_t *event, uint8_t hw_mode_id, uint8_t phy_id, struct wmi_host_mac_phy_caps *param) { WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *param_buf; - WMI_SOC_MAC_PHY_HW_MODE_CAPS *hw_caps; WMI_MAC_PHY_CAPABILITIES *mac_phy_caps; + WMI_SOC_MAC_PHY_HW_MODE_CAPS *hw_caps; + uint32_t phy_map; + uint8_t hw_idx, phy_idx = 0; param_buf = (WMI_SERVICE_READY_EXT_EVENTID_param_tlvs *) event; if (!param_buf) return -EINVAL; hw_caps = param_buf->soc_hw_mode_caps; - if (hw_mode_idx >= hw_caps->num_hw_modes) + for (hw_idx = 0; hw_idx < hw_caps->num_hw_modes; hw_idx++) { + if (hw_mode_id == param_buf->hw_mode_caps[hw_idx].hw_mode_id) + break; + + phy_map = param_buf->hw_mode_caps[hw_idx].phy_id_map; + while (phy_map) { + phy_map >>= 1; + phy_idx++; + } + } + + if (hw_idx == hw_caps->num_hw_modes) return -EINVAL; - mac_phy_caps = ¶m_buf->mac_phy_caps[hw_mode_idx]; + phy_idx += phy_id; + if (phy_idx >= param_buf->num_mac_phy_caps) + return -EINVAL; + + mac_phy_caps = ¶m_buf->mac_phy_caps[phy_idx]; param->hw_mode_id = mac_phy_caps->hw_mode_id; param->pdev_id = mac_phy_caps->pdev_id; param->phy_id = mac_phy_caps->phy_id; - param->supports_11b = mac_phy_caps->supports_11b; - param->supports_11g = mac_phy_caps->supports_11g; - param->supports_11a = mac_phy_caps->supports_11a; - param->supports_11n = mac_phy_caps->supports_11n; - param->supports_11ac = mac_phy_caps->supports_11ac; - param->supports_11ax = mac_phy_caps->supports_11ax; + param->supports_11b = + WMI_SUPPORT_11B_GET(mac_phy_caps->supported_flags); + param->supports_11g = + WMI_SUPPORT_11G_GET(mac_phy_caps->supported_flags); + param->supports_11a = + WMI_SUPPORT_11A_GET(mac_phy_caps->supported_flags); + param->supports_11n = + WMI_SUPPORT_11N_GET(mac_phy_caps->supported_flags); + param->supports_11ac = + WMI_SUPPORT_11AC_GET(mac_phy_caps->supported_flags); + param->supports_11ax = + WMI_SUPPORT_11AX_GET(mac_phy_caps->supported_flags); param->supported_bands = mac_phy_caps->supported_bands; param->ampdu_density = mac_phy_caps->ampdu_density;