diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 6a3e2e4ecc..a3b63971bb 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -2260,4 +2260,31 @@ QDF_STATUS wmi_extract_cca_stats(wmi_unified_t wmi_handle, void *evt_buf, struct wmi_host_congestion_stats *stats); #endif /* QCA_SUPPORT_CP_STATS */ +#if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) +/** + * wmi_unified_dfs_send_avg_params_cmd() - send average radar parameters cmd. + * @wmi_hdl: wmi handle + * @params: radar found params + * + * This function passes the average radar parameters to fw + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS +wmi_unified_dfs_send_avg_params_cmd(void *wmi_hdl, + struct dfs_radar_found_params *params); + +/** + * wmi_extract_dfs_status_from_fw() - extract host dfs status from fw. + * @wmi_hdl: wmi handle + * @evt_buf: pointer to event buffer + * @dfs_status_check: pointer to the host dfs status + * + * This function extracts the result of host dfs from fw + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_extract_dfs_status_from_fw(void *wmi_hdl, void *evt_buf, + uint32_t *dfs_status_check); +#endif #endif /* _WMI_UNIFIED_API_H_ */ diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 64dc05dd52..8e4db637af 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -432,6 +432,7 @@ typedef enum { typedef enum { WMI_HOST_VDEV_START_OK = 0, WMI_HOST_VDEV_START_CHAN_INVALID, + WMI_HOST_VDEV_START_CHAN_BLOCKED, } WMI_HOST_VDEV_START_STATUS; /* @@ -5519,6 +5520,9 @@ typedef enum { wmi_host_swfda_event_id, wmi_sar_get_limits_event_id, wmi_pdev_div_rssi_antid_event_id, +#if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) + wmi_host_dfs_status_check_event_id, +#endif wmi_events_max, } wmi_conv_event_id; @@ -5944,6 +5948,7 @@ typedef enum { wmi_service_ap_obss_detection_offload, wmi_service_bss_color_offload, wmi_service_gmac_offload_support, + wmi_service_host_dfs_check_support, wmi_services_max, } wmi_conv_service_ids; diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index dfe0097d55..581b766ccd 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1616,6 +1616,16 @@ QDF_STATUS (*extract_twt_resume_dialog_comp_event)(wmi_unified_t wmi_handle, QDF_STATUS (*extract_cca_stats)(wmi_unified_t wmi_handle, void *evt_buf, struct wmi_host_congestion_stats *stats); #endif /* QCA_SUPPORT_CP_STATS */ + +#if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) +QDF_STATUS (*send_dfs_average_radar_params_cmd)( + wmi_unified_t wmi_handle, + struct dfs_radar_found_params *params); + +QDF_STATUS (*extract_dfs_status_from_fw)(wmi_unified_t wmi_handle, + void *evt_buf, + uint32_t *dfs_status_check); +#endif }; /* Forward declartion for psoc*/ diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 4de0ee01c6..f4c10e344d 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/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/src/wmi_unified_non_tlv.c b/wmi/src/wmi_unified_non_tlv.c index a87de11fe2..6629205e91 100644 --- a/wmi/src/wmi_unified_non_tlv.c +++ b/wmi/src/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 } /**