Procházet zdrojové kódy

qcacmn: Add WMI changes for host DFS confirmation check

Send average radar parameters to FW.
Extract host dfs spoof check status from FW.

Change-Id: I70c4e5aad0fe1eda55da37abd20cc6d70728edba
CRs-Fixed: 2211883
Shashikala Prabhu před 6 roky
rodič
revize
9951d56842

+ 27 - 0
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_ */

+ 5 - 0
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;

+ 10 - 0
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*/

+ 27 - 0
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

+ 88 - 0
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
 }
 
 /**