diff --git a/wmi_unified_api.c b/wmi_unified_api.c index 4de0ee01c6..f4c10e344d 100644 --- a/wmi_unified_api.c +++ b/wmi_unified_api.c @@ -7507,3 +7507,30 @@ QDF_STATUS wmi_extract_cca_stats(wmi_unified_t wmi_handle, void *evt_buf, return QDF_STATUS_E_FAILURE; } #endif /* QCA_SUPPORT_CP_STATS */ + +#if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) +QDF_STATUS +wmi_unified_dfs_send_avg_params_cmd(void *wmi_hdl, + struct dfs_radar_found_params *params) +{ + wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl; + + if (wmi_handle->ops->send_dfs_average_radar_params_cmd) + return wmi_handle->ops->send_dfs_average_radar_params_cmd( + wmi_handle, params); + + return QDF_STATUS_E_FAILURE; +} + +QDF_STATUS wmi_extract_dfs_status_from_fw(void *wmi_hdl, void *evt_buf, + uint32_t *dfs_status_check) +{ + wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl; + + if (wmi_handle->ops->extract_dfs_status_from_fw) + return wmi_handle->ops->extract_dfs_status_from_fw(wmi_handle, + evt_buf, dfs_status_check); + + return QDF_STATUS_E_FAILURE; +} +#endif diff --git a/wmi_unified_non_tlv.c b/wmi_unified_non_tlv.c index a87de11fe2..6629205e91 100644 --- a/wmi_unified_non_tlv.c +++ b/wmi_unified_non_tlv.c @@ -8413,6 +8413,83 @@ QDF_STATUS send_wds_entry_list_cmd_non_tlv(wmi_unified_t wmi_handle) return QDF_STATUS_SUCCESS; } +#if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) +/** + * send_dfs_average_radar_params_cmd_non_tlv() - send average radar params to + * fw. + * @wmi_handle: wmi handle + * @params: pointer to dfs_radar_found_params. + * + * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error + */ +static QDF_STATUS send_dfs_average_radar_params_cmd_non_tlv( + wmi_unified_t wmi_handle, + struct dfs_radar_found_params *params) +{ + wmi_host_dfs_radar_found_cmd *cmd; + wmi_buf_t buf; + + int len = sizeof(wmi_host_dfs_radar_found_cmd); + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGD("%s:wmi_buf_alloc failed\n", __func__); + return QDF_STATUS_E_FAILURE; + } + + cmd = (wmi_host_dfs_radar_found_cmd *)wmi_buf_data(buf); + + /* Fill the WMI structure (PRI, duration, SIDX) from + * the radar_found_param structure and then send + * out. + */ + cmd->pri_min_value = params->pri_min; + cmd->pri_max_value = params->pri_max; + cmd->duration_min_value = params->duration_min; + cmd->duration_max_value = params->duration_max; + cmd->sidx_min_value = params->sidx_min; + cmd->sidx_max_value = params->sidx_max; + + if (wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_HOST_DFS_RADAR_FOUND_CMDID)) { + WMI_LOGD("%s:Failed to send WMI command\n", __func__); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + +/** + * extract_dfs_status_from_fw_non_tlv() - extract the result of host dfs check + * from fw + * @wmi_handle: wmi handle + * @evt_buf: pointer to event buffer + * @fw_dfs_status_code: pointer to the status received from fw. + * + * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error + */ +static QDF_STATUS +extract_dfs_status_from_fw_non_tlv(wmi_unified_t wmi_handle, + void *evt_buf, + uint32_t *fw_dfs_status_code) +{ + wmi_host_dfs_status_check_event *ev = + (wmi_host_dfs_status_check_event *)evt_buf; + + if ((ev->status == WMI_HOST_DFS_CHECK_PASSED) || + (ev->status == WMI_HOST_DFS_CHECK_FAILED) || + (ev->status == WMI_HOST_DFS_CHECK_HW_RADAR)) { + *fw_dfs_status_code = ev->status; + return QDF_STATUS_SUCCESS; + } + + WMI_LOGD("%s..Invalid status code : %d received\n", __func__, + ev->status); + + return QDF_STATUS_E_FAILURE; +} +#endif /** * wmi_non_tlv_pdev_id_conversion_enable() - Enable pdev_id conversion @@ -8659,6 +8736,11 @@ struct wmi_ops non_tlv_ops = { .extract_swfda_vdev_id = extract_swfda_vdev_id_non_tlv, #endif /* WLAN_SUPPORT_FILS */ .wmi_pdev_id_conversion_enable = wmi_non_tlv_pdev_id_conversion_enable, +#if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) + .send_dfs_average_radar_params_cmd = + send_dfs_average_radar_params_cmd_non_tlv, + .extract_dfs_status_from_fw = extract_dfs_status_from_fw_non_tlv, +#endif }; /** @@ -8852,6 +8934,8 @@ static void populate_non_tlv_service(uint32_t *wmi_service) wmi_service[wmi_service_widebw_scan] = WMI_SERVICE_UNAVAILABLE; wmi_service[wmi_service_support_dma] = WMI_SERVICE_UNAVAILABLE; + wmi_service[wmi_service_host_dfs_check_support] = + WMI_SERVICE_HOST_DFS_CHECK_SUPPORT; } /** @@ -8951,6 +9035,10 @@ static void populate_non_tlv_events_id(uint32_t *event_ids) event_ids[wmi_pdev_wds_entry_list_event_id] = WMI_PDEV_WDS_ENTRY_LIST_EVENTID; event_ids[wmi_host_swfda_event_id] = WMI_HOST_SWFDA_EVENTID; +#if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) + event_ids[wmi_host_dfs_status_check_event_id] = + WMI_HOST_DFS_STATUS_CHECK_EVENTID; +#endif } /**