Browse Source

qcacmn: Add WMI support for Agile DFS feature

Add WMI commands and event to support Agile DFS feature:
	1)WMI send adfs channel config command
	2)WMI send adfs o-cac abort command
	3)WMI extract function to handle O-CAC complete event from target

Change-Id: Ib11d042bf06c786ab553aa28091145b620fbd551
CRs-Fixed: 2385536
Shaakir Mohamed 6 years ago
parent
commit
9ff68da6e5

+ 24 - 0
wmi/inc/wmi_unified_api.h

@@ -1366,6 +1366,30 @@ QDF_STATUS wmi_unified_dfs_phyerr_offload_en_cmd(void *wmi_hdl,
 QDF_STATUS wmi_unified_dfs_phyerr_offload_dis_cmd(void *wmi_hdl,
 		uint32_t pdev_id);
 
+#ifdef QCA_SUPPORT_AGILE_DFS
+/**
+ * wmi_unified_send_vdev_adfs_ch_cfg_cmd() - send adfs channel config command
+ * @wmi_handle: wmi handle
+ * @vdev_adfs_ch_cfg_params: adfs channel config params
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wmi_unified_send_vdev_adfs_ch_cfg_cmd(void *wmi_hdl,
+				      struct vdev_adfs_ch_cfg_params *param);
+
+/**
+ * wmi_unified_send_vdev_adfs_ocac_abort_cmd() - send adfs o-cac abort command
+ * @wmi_handle: wmi handle
+ * @vdev_adfs_abort_params: adfs channel o-cac abort params
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wmi_unified_send_vdev_adfs_ocac_abort_cmd(void *wmi_hdl,
+					  struct vdev_adfs_abort_params *param);
+#endif
+
 QDF_STATUS wmi_unified_set_country_cmd_send(void *wmi_hdl,
 				struct set_country *param);
 

+ 13 - 0
wmi/inc/wmi_unified_dfs_api.h

@@ -40,6 +40,19 @@ QDF_STATUS wmi_extract_dfs_cac_complete_event(void *wmi_hdl,
 		uint32_t *vdev_id,
 		uint32_t len);
 
+/**
+ * wmi_extract_dfs_ocac_complete_event() - function to handle off channel
+ *						CAC complete event
+ * @handle: wmi handle
+ * @event_buf: event buffer
+ * @vdev_adfs_complete_status: off channel cac  complete params
+ *
+ * Return: 0 for success or error code
+ */
+QDF_STATUS
+wmi_extract_dfs_ocac_complete_event(void *wmi_hdl, uint8_t *evt_buf,
+				    struct vdev_adfs_complete_status *param);
+
 /**
  * wmi_extract_dfs_radar_detection_event() - function to handle radar event
  * @handle: wma handle

+ 33 - 0
wmi/inc/wmi_unified_param.h

@@ -1404,6 +1404,36 @@ struct multiple_vdev_restart_params {
 	uint32_t vdev_ids[WMI_HOST_PDEV_MAX_VDEVS];
 };
 #endif
+
+#ifdef QCA_SUPPORT_AGILE_DFS
+/**
+ * struct vdev_adfs_ch_cfg_params - Agile dfs channel set request params
+ * @vdev_id: Vdev indentifier
+ * @ocac_mode: Off Channel CAC mode
+ * @min_duration_ms: Minimum Off channel CAC duration
+ * @max_duration_ms: Maximum Off channel CAC duration
+ * @chan_freq: channel number of precac channel
+ * @chan_width: Precac Channel width
+ * @center_freq: Center frequency of precac channel
+ */
+struct vdev_adfs_ch_cfg_params {
+	uint32_t vdev_id;
+	uint32_t ocac_mode;  /* WMI_ADFS_OCAC_MODE */
+	uint32_t min_duration_ms;
+	uint32_t max_duration_ms;
+	uint32_t chan_freq;
+	uint32_t chan_width;
+	uint32_t center_freq; /* in MHz */
+};
+
+/**
+ * struct vdev_adfs_ch_cfg_params - Agile dfs ocac abort command to stop precac.
+ * @vdev_id: Vdev indentifier
+ */
+struct vdev_adfs_abort_params {
+	uint32_t vdev_id;
+};
+#endif
 /**
  * struct fw_hang_params - fw hang command parameters
  * @type: 0:unused 1: ASSERT, 2:not respond detect command, 3:simulate ep-full
@@ -4746,6 +4776,7 @@ typedef enum {
 	wmi_twt_enable_complete_event_id,
 	wmi_apf_get_vdev_work_memory_resp_event_id,
 	wmi_roam_scan_stats_event_id,
+	wmi_vdev_ocac_complete_event_id,
 
 #ifdef OL_ATH_SMART_LOGGING
 	wmi_debug_fatal_condition_eventid,
@@ -5307,6 +5338,7 @@ struct wmi_host_fw_abi_ver {
  * @gtk_offload_max_vdev: Max vdevs for GTK offload
  * @num_msdu_desc: Number of msdu desc
  * @max_frag_entries: Max frag entries
+ * @agile_capability: Target Agile Capability
  *      End common
  * @max_peer_ext_stats: Max peer EXT stats
  * @smart_ant_cap: Smart antenna capabilities
@@ -5381,6 +5413,7 @@ typedef struct {
 	uint32_t num_msdu_desc; /* Number of msdu desc */
 	uint32_t max_frag_entries;
 	uint32_t scheduler_params;
+	uint32_t agile_capability;
 	/* End common */
 
 	/* Added for Beeliner */

+ 12 - 0
wmi/inc/wmi_unified_priv.h

@@ -1590,7 +1590,14 @@ QDF_STATUS (*send_power_dbg_cmd)(wmi_unified_t wmi_handle,
 
 QDF_STATUS (*send_multiple_vdev_restart_req_cmd)(wmi_unified_t wmi_handle,
 				struct multiple_vdev_restart_params *param);
+#ifdef QCA_SUPPORT_AGILE_DFS
+QDF_STATUS
+(*send_adfs_ocac_abort_cmd)(wmi_unified_t wmi_handle,
+			    struct vdev_adfs_abort_params *param);
 
+QDF_STATUS (*send_adfs_ch_cfg_cmd)(wmi_unified_t wmi_handle,
+				   struct vdev_adfs_ch_cfg_params *param);
+#endif
 QDF_STATUS (*send_fw_test_cmd)(wmi_unified_t wmi_handle,
 			       struct set_fwtest_params *wmi_fwtest);
 
@@ -1715,6 +1722,11 @@ QDF_STATUS (*extract_dfs_cac_complete_event)(wmi_unified_t wmi_handle,
 		uint8_t *evt_buf,
 		uint32_t *vdev_id,
 		uint32_t len);
+QDF_STATUS
+(*extract_dfs_ocac_complete_event)(wmi_unified_t wmi_handle,
+				   uint8_t *evt_buf,
+				   struct vdev_adfs_complete_status *oca_stats);
+
 QDF_STATUS (*extract_dfs_radar_detection_event)(wmi_unified_t wmi_handle,
 		uint8_t *evt_buf,
 		struct radar_found_info *radar_found,

+ 28 - 0
wmi/src/wmi_unified_api.c

@@ -4167,6 +4167,34 @@ wmi_unified_dfs_phyerr_offload_en_cmd(void *wmi_hdl,
 	return QDF_STATUS_E_FAILURE;
 }
 
+#ifdef QCA_SUPPORT_AGILE_DFS
+QDF_STATUS
+wmi_unified_send_vdev_adfs_ch_cfg_cmd(void *wmi_hdl,
+				      struct vdev_adfs_ch_cfg_params *param)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl;
+
+	if (wmi_handle->ops->send_adfs_ch_cfg_cmd)
+		return wmi_handle->ops->send_adfs_ch_cfg_cmd(
+				wmi_handle,
+				param);
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS
+wmi_unified_send_vdev_adfs_ocac_abort_cmd(void *wmi_hdl,
+					  struct vdev_adfs_abort_params *param)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl;
+
+	if (wmi_handle->ops->send_adfs_ocac_abort_cmd)
+		return wmi_handle->ops->send_adfs_ocac_abort_cmd(
+				wmi_handle,
+				param);
+	return QDF_STATUS_E_FAILURE;
+}
+#endif
+
 QDF_STATUS
 wmi_unified_dfs_phyerr_offload_dis_cmd(void *wmi_hdl,
 				       uint32_t pdev_id)

+ 16 - 0
wmi/src/wmi_unified_dfs_api.c

@@ -45,6 +45,22 @@ QDF_STATUS wmi_extract_dfs_cac_complete_event(void *wmi_hdl,
 }
 qdf_export_symbol(wmi_extract_dfs_cac_complete_event);
 
+QDF_STATUS
+wmi_extract_dfs_ocac_complete_event(void *wmi_hdl,
+				    uint8_t *evt_buf,
+				    struct vdev_adfs_complete_status *param)
+{
+	struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl;
+
+	if (wmi_handle && wmi_handle->ops->extract_dfs_ocac_complete_event)
+		return wmi_handle->ops->extract_dfs_ocac_complete_event(
+				wmi_handle, evt_buf, param);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+qdf_export_symbol(wmi_extract_dfs_ocac_complete_event);
+
 QDF_STATUS wmi_extract_dfs_radar_detection_event(void *wmi_hdl,
 		uint8_t *evt_buf,
 		struct radar_found_info *radar_found,

+ 147 - 2
wmi/src/wmi_unified_tlv.c

@@ -7132,6 +7132,102 @@ static QDF_STATUS send_dfs_phyerr_offload_dis_cmd_tlv(wmi_unified_t wmi_handle,
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef QCA_SUPPORT_AGILE_DFS
+static
+QDF_STATUS send_adfs_ch_cfg_cmd_tlv(wmi_unified_t wmi_handle,
+				    struct vdev_adfs_ch_cfg_params *param)
+{
+	/* wmi_unified_cmd_send set request of agile ADFS channel*/
+	wmi_vdev_adfs_ch_cfg_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	QDF_STATUS ret;
+	uint16_t len;
+
+	len = sizeof(*cmd);
+	buf = wmi_buf_alloc(wmi_handle, len);
+
+	if (!buf) {
+		WMI_LOGE("%s : wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	cmd = (wmi_vdev_adfs_ch_cfg_cmd_fixed_param *)
+		wmi_buf_data(buf);
+
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_vdev_adfs_ch_cfg_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+		       (wmi_vdev_adfs_ch_cfg_cmd_fixed_param));
+
+	cmd->vdev_id = param->vdev_id;
+	cmd->ocac_mode = param->ocac_mode;
+	cmd->center_freq = param->center_freq;
+	cmd->chan_freq = param->chan_freq;
+	cmd->chan_width = param->chan_width;
+	cmd->min_duration_ms = param->min_duration_ms;
+	cmd->max_duration_ms = param->max_duration_ms;
+	WMI_LOGD("%s:cmd->vdev_id: %d ,cmd->ocac_mode: %d cmd->center_freq: %d",
+		 __func__, cmd->vdev_id, cmd->ocac_mode,
+		 cmd->center_freq);
+
+	wmi_mtrace(WMI_VDEV_ADFS_CH_CFG_CMDID, NO_SESSION, 0);
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+				   WMI_VDEV_ADFS_CH_CFG_CMDID);
+
+	if (QDF_IS_STATUS_ERROR(ret)) {
+		WMI_LOGE("%s: Failed to send cmd to fw, ret=%d",
+			 __func__, ret);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+static
+QDF_STATUS send_adfs_ocac_abort_cmd_tlv(wmi_unified_t wmi_handle,
+					struct vdev_adfs_abort_params *param)
+{
+	/*wmi_unified_cmd_send with ocac abort on ADFS channel*/
+	wmi_vdev_adfs_ocac_abort_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	QDF_STATUS ret;
+	uint16_t len;
+
+	len = sizeof(*cmd);
+	buf = wmi_buf_alloc(wmi_handle, len);
+
+	if (!buf) {
+		WMI_LOGE("%s : wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	cmd = (wmi_vdev_adfs_ocac_abort_cmd_fixed_param *)
+		wmi_buf_data(buf);
+
+	WMITLV_SET_HDR
+		(&cmd->tlv_header,
+		 WMITLV_TAG_STRUC_wmi_vdev_adfs_ocac_abort_cmd_fixed_param,
+		 WMITLV_GET_STRUCT_TLVLEN
+		 (wmi_vdev_adfs_ocac_abort_cmd_fixed_param));
+
+	cmd->vdev_id = param->vdev_id;
+
+	wmi_mtrace(WMI_VDEV_ADFS_OCAC_ABORT_CMDID, NO_SESSION, 0);
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+				   WMI_VDEV_ADFS_OCAC_ABORT_CMDID);
+
+	if (QDF_IS_STATUS_ERROR(ret)) {
+		WMI_LOGE("%s: Failed to send cmd to fw, ret=%d",
+			 __func__, ret);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 /**
  * init_cmd_send_tlv() - send initialization cmd to fw
  * @wmi_handle: wmi handle
@@ -7976,9 +8072,11 @@ static QDF_STATUS extract_ready_event_params_tlv(wmi_unified_t wmi_handle,
 	ev_param->num_extra_mac_addr = ev->num_extra_mac_addr;
 	ev_param->num_total_peer = ev->num_total_peers;
 	ev_param->num_extra_peer = ev->num_extra_peers;
-	/* Agile_cap in ready event is not supported in TLV target */
-	ev_param->agile_capability = false;
+	/* Agile_capability in ready event is supported in TLV target,
+	 * as per aDFS FR
+	 */
 	ev_param->max_ast_index = ev->max_ast_index;
+	ev_param->agile_capability = 1;
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -9769,6 +9867,46 @@ static QDF_STATUS extract_dfs_cac_complete_event_tlv(wmi_unified_t wmi_handle,
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * extract_dfs_ocac_complete_event_tlv() - extract cac complete event
+ * @wmi_handle: wma handle
+ * @evt_buf: event buffer
+ * @vdev_id: vdev id
+ * @len: length of buffer
+ *
+ * Return: 0 for success or error code
+ */
+static QDF_STATUS
+extract_dfs_ocac_complete_event_tlv(wmi_unified_t wmi_handle,
+				    uint8_t *evt_buf,
+				    struct vdev_adfs_complete_status *param)
+{
+	WMI_VDEV_ADFS_OCAC_COMPLETE_EVENTID_param_tlvs *param_tlvs;
+	wmi_vdev_adfs_ocac_complete_event_fixed_param  *ocac_complete_status;
+
+	param_tlvs = (WMI_VDEV_ADFS_OCAC_COMPLETE_EVENTID_param_tlvs *)evt_buf;
+	if (!param_tlvs) {
+		WMI_LOGE("invalid ocac complete event buf");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!param_tlvs->fixed_param) {
+		WMI_LOGE("invalid param_tlvs->fixed_param");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	ocac_complete_status = param_tlvs->fixed_param;
+	param->vdev_id = ocac_complete_status->vdev_id;
+	param->chan_freq = ocac_complete_status->chan_freq;
+	param->center_freq = ocac_complete_status->center_freq;
+	param->ocac_status = ocac_complete_status->status;
+	param->chan_width = ocac_complete_status->chan_width;
+	WMI_LOGD("processed ocac complete event vdev %d agile chan %d",
+		 param->vdev_id, param->center_freq);
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * extract_dfs_radar_detection_event_tlv() - extract radar found event
  * @wmi_handle: wma handle
@@ -11187,6 +11325,10 @@ struct wmi_ops tlv_ops =  {
 	.send_action_oui_cmd = send_action_oui_cmd_tlv,
 #endif
 	.send_dfs_phyerr_offload_en_cmd = send_dfs_phyerr_offload_en_cmd_tlv,
+#ifdef QCA_SUPPORT_AGILE_DFS
+	.send_adfs_ch_cfg_cmd = send_adfs_ch_cfg_cmd_tlv,
+	.send_adfs_ocac_abort_cmd = send_adfs_ocac_abort_cmd_tlv,
+#endif
 	.send_dfs_phyerr_offload_dis_cmd = send_dfs_phyerr_offload_dis_cmd_tlv,
 	.extract_reg_chan_list_update_event =
 		extract_reg_chan_list_update_event_tlv,
@@ -11198,6 +11340,7 @@ struct wmi_ops tlv_ops =  {
 	.extract_rcpi_response_event = extract_rcpi_response_event_tlv,
 #ifdef DFS_COMPONENT_ENABLE
 	.extract_dfs_cac_complete_event = extract_dfs_cac_complete_event_tlv,
+	.extract_dfs_ocac_complete_event = extract_dfs_ocac_complete_event_tlv,
 	.extract_dfs_radar_detection_event =
 		extract_dfs_radar_detection_event_tlv,
 	.extract_wlan_radar_event_info = extract_wlan_radar_event_info_tlv,
@@ -11467,6 +11610,8 @@ static void populate_tlv_events_id(uint32_t *event_ids)
 	event_ids[wmi_pdev_fips_event_id] = WMI_PDEV_FIPS_EVENTID;
 	event_ids[wmi_pdev_csa_switch_count_status_event_id] =
 				WMI_PDEV_CSA_SWITCH_COUNT_STATUS_EVENTID;
+	event_ids[wmi_vdev_ocac_complete_event_id] =
+				WMI_VDEV_ADFS_OCAC_COMPLETE_EVENTID;
 	event_ids[wmi_reg_chan_list_cc_event_id] = WMI_REG_CHAN_LIST_CC_EVENTID;
 	event_ids[wmi_inst_rssi_stats_event_id] = WMI_INST_RSSI_STATS_EVENTID;
 	event_ids[wmi_pdev_tpc_config_event_id] = WMI_PDEV_TPC_CONFIG_EVENTID;