Przeglądaj źródła

qcacmn: Implement the commands that cover APF 3.0 requirements

Android Packet Filter 3.0 requires the framework to be able to
read and write into the APF work memory in the Firmware. It
also requires to be able to enable or disable the interpreter.
New WMI commands are defined for read/write/enable/disable
operations.

Complete the implementation of these new commands.

Change-Id: I852d61eb213d9ae530e8a71069144ef35816f5b8
CRs-Fixed: 2184971
Nachiket Kukade 7 lat temu
rodzic
commit
e06beaa8f4
3 zmienionych plików z 226 dodań i 15 usunięć
  1. 160 4
      wmi_unified_apf_tlv.c
  2. 52 9
      wmi_unified_api.c
  3. 14 2
      wmi_unified_tlv.c

+ 160 - 4
wmi_unified_apf_tlv.c

@@ -18,7 +18,7 @@
 
 #include "wmi_unified_apf_tlv.h"
 
-QDF_STATUS send_set_active_apf_mode_cmd_tlv(wmi_unified_t wmi_handle,
+QDF_STATUS wmi_send_set_active_apf_mode_cmd_tlv(wmi_unified_t wmi_handle,
 					    uint8_t vdev_id,
 					    enum wmi_host_active_apf_mode
 								     ucast_mode,
@@ -33,7 +33,7 @@ QDF_STATUS send_set_active_apf_mode_cmd_tlv(wmi_unified_t wmi_handle,
 	wmi_bpf_set_vdev_active_mode_cmd_fixed_param *cmd;
 	wmi_buf_t buf;
 
-	WMI_LOGD("Sending WMI_APF_SET_VDEV_ACTIVE_MODE_CMDID(%u, %d, %d)",
+	WMI_LOGD("Sending WMI_BPF_SET_VDEV_ACTIVE_MODE_CMDID(%u, %d, %d)",
 		 vdev_id, ucast_mode, mcast_bcast_mode);
 
 	/* allocate command buffer */
@@ -56,14 +56,170 @@ QDF_STATUS send_set_active_apf_mode_cmd_tlv(wmi_unified_t wmi_handle,
 	status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
 				      WMI_BPF_SET_VDEV_ACTIVE_MODE_CMDID);
 	if (QDF_IS_STATUS_ERROR(status)) {
-		WMI_LOGE("Failed to send WMI_APF_SET_VDEV_ACTIVE_MODE_CMDID:%d",
+		WMI_LOGE("Failed to send WMI_BPF_SET_VDEV_ACTIVE_MODE_CMDID:%d",
 			 status);
 		wmi_buf_free(buf);
 		return status;
 	}
 
-	WMI_LOGD("Sent WMI_APF_SET_VDEV_ACTIVE_MODE_CMDID successfully");
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS wmi_send_apf_enable_cmd_tlv(wmi_unified_t wmi_handle,
+				       uint32_t vdev_id,
+				       bool enable)
+{
+	wmi_bpf_set_vdev_enable_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+
+	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
+	if (!buf) {
+		WMI_LOGP("%s: wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	cmd = (wmi_bpf_set_vdev_enable_cmd_fixed_param *) wmi_buf_data(buf);
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		WMITLV_TAG_STRUC_wmi_bpf_set_vdev_enable_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN(
+			wmi_bpf_set_vdev_enable_cmd_fixed_param));
+	cmd->vdev_id = vdev_id;
+	cmd->is_enabled = enable;
+
+	if (wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
+				 WMI_BPF_SET_VDEV_ENABLE_CMDID)) {
+		WMI_LOGE("%s: Failed to enable/disable APF interpreter",
+			 __func__);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+wmi_send_apf_write_work_memory_cmd_tlv(wmi_unified_t wmi_handle,
+				       struct wmi_apf_write_memory_params
+							      *apf_write_params)
+{
+	wmi_bpf_set_vdev_work_memory_cmd_fixed_param *cmd;
+	uint32_t wmi_buf_len;
+	wmi_buf_t buf;
+	uint8_t *buf_ptr;
+	uint32_t aligned_len = 0;
+
+	wmi_buf_len = sizeof(*cmd);
+	if (apf_write_params->length) {
+		aligned_len = roundup(apf_write_params->length,
+				      sizeof(A_UINT32));
+
+		wmi_buf_len += WMI_TLV_HDR_SIZE + aligned_len;
+
+	}
+
+	buf = wmi_buf_alloc(wmi_handle, wmi_buf_len);
+	if (!buf) {
+		WMI_LOGP("%s: wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	buf_ptr = wmi_buf_data(buf);
+	cmd = (wmi_bpf_set_vdev_work_memory_cmd_fixed_param *)buf_ptr;
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		WMITLV_TAG_STRUC_wmi_bpf_set_vdev_work_memory_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN(
+			wmi_bpf_set_vdev_work_memory_cmd_fixed_param));
+	cmd->vdev_id = apf_write_params->vdev_id;
+	cmd->bpf_version = apf_write_params->apf_version;
+	cmd->program_len = apf_write_params->program_len;
+	cmd->addr_offset = apf_write_params->addr_offset;
+	cmd->length = apf_write_params->length;
+
+	if (apf_write_params->length) {
+		buf_ptr += sizeof(*cmd);
+		WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
+			       aligned_len);
+		buf_ptr += WMI_TLV_HDR_SIZE;
+		qdf_mem_copy(buf_ptr, apf_write_params->buf,
+			     apf_write_params->length);
+	}
+
+	if (wmi_unified_cmd_send(wmi_handle, buf, wmi_buf_len,
+				 WMI_BPF_SET_VDEV_WORK_MEMORY_CMDID)) {
+		WMI_LOGE("%s: Failed to write APF work memory", __func__);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
 
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS
+wmi_send_apf_read_work_memory_cmd_tlv(wmi_unified_t wmi_handle,
+				      struct wmi_apf_read_memory_params
+							       *apf_read_params)
+{
+	wmi_bpf_get_vdev_work_memory_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+
+	buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
+	if (!buf) {
+		WMI_LOGP("%s: wmi_buf_alloc failed", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	cmd = (wmi_bpf_get_vdev_work_memory_cmd_fixed_param *)
+							wmi_buf_data(buf);
+
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		WMITLV_TAG_STRUC_wmi_bpf_get_vdev_work_memory_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN(
+			wmi_bpf_get_vdev_work_memory_cmd_fixed_param));
+	cmd->vdev_id = apf_read_params->vdev_id;
+	cmd->addr_offset = apf_read_params->addr_offset;
+	cmd->length = apf_read_params->length;
+
+	if (wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
+				 WMI_BPF_GET_VDEV_WORK_MEMORY_CMDID)) {
+		WMI_LOGE("%s: Failed to get APF work memory", __func__);
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+wmi_extract_apf_read_memory_resp_event_tlv(wmi_unified_t wmi_handle,
+				void *evt_buf,
+				struct wmi_apf_read_memory_resp_event_params
+									  *resp)
+{
+	WMI_BPF_GET_VDEV_WORK_MEMORY_RESP_EVENTID_param_tlvs *param_buf;
+	wmi_bpf_get_vdev_work_memory_resp_evt_fixed_param *data_event;
+
+	param_buf = evt_buf;
+	if (!param_buf) {
+		WMI_LOGE("encrypt decrypt resp evt_buf is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	data_event = param_buf->fixed_param;
+
+	resp->vdev_id = data_event->vdev_id;
+	resp->offset = data_event->offset;
+	resp->more_data = data_event->fragment;
+
+	if (data_event->length > param_buf->num_data) {
+		WMI_LOGE("FW msg data_len %d more than TLV hdr %d",
+			 data_event->length,
+			 param_buf->num_data);
+		return QDF_STATUS_E_INVAL;
+	}
+	resp->length = data_event->length;
+
+	if (resp->length)
+		resp->data = (uint8_t *)param_buf->data;
+
+	return QDF_STATUS_SUCCESS;
+}

+ 52 - 9
wmi_unified_api.c

@@ -3157,23 +3157,66 @@ QDF_STATUS wmi_unified_roam_send_hlp_cmd(void *wmi_hdl,
 }
 #endif
 
+#ifdef FEATURE_WLAN_APF
 QDF_STATUS
-wmi_unified_set_active_apf_mode_cmd(void *wmi_hdl, uint8_t vdev_id,
+wmi_unified_set_active_apf_mode_cmd(wmi_unified_t wmi, uint8_t vdev_id,
 				    enum wmi_host_active_apf_mode ucast_mode,
 				    enum wmi_host_active_apf_mode
 							       mcast_bcast_mode)
 {
-	wmi_unified_t wmi = (wmi_unified_t)wmi_hdl;
+	if (wmi->ops->send_set_active_apf_mode_cmd)
+		return wmi->ops->send_set_active_apf_mode_cmd(wmi, vdev_id,
+							      ucast_mode,
+							      mcast_bcast_mode);
+	return QDF_STATUS_E_FAILURE;
+}
 
-	if (!wmi->ops->send_set_active_apf_mode_cmd) {
-		WMI_LOGD("send_set_active_apf_mode_cmd op is NULL");
-		return QDF_STATUS_E_FAILURE;
-	}
+QDF_STATUS
+wmi_unified_send_apf_enable_cmd(wmi_unified_t wmi,
+				uint32_t vdev_id, bool enable)
+{
+	if (wmi->ops->send_apf_enable_cmd)
+		return wmi->ops->send_apf_enable_cmd(wmi, vdev_id, enable);
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS
+wmi_unified_send_apf_write_work_memory_cmd(wmi_unified_t wmi,
+					   struct wmi_apf_write_memory_params
+								  *write_params)
+{
+	if (wmi->ops->send_apf_write_work_memory_cmd)
+		return wmi->ops->send_apf_write_work_memory_cmd(wmi,
+								write_params);
 
-	return wmi->ops->send_set_active_apf_mode_cmd(wmi, vdev_id,
-						      ucast_mode,
-						      mcast_bcast_mode);
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS
+wmi_unified_send_apf_read_work_memory_cmd(wmi_unified_t wmi,
+					  struct wmi_apf_read_memory_params
+								   *read_params)
+{
+	if (wmi->ops->send_apf_read_work_memory_cmd)
+		return wmi->ops->send_apf_read_work_memory_cmd(wmi,
+							       read_params);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS
+wmi_extract_apf_read_memory_resp_event(wmi_unified_t wmi, void *evt_buf,
+				struct wmi_apf_read_memory_resp_event_params
+								*read_mem_evt)
+{
+	if (wmi->ops->extract_apf_read_memory_resp_event)
+		return wmi->ops->extract_apf_read_memory_resp_event(wmi,
+								evt_buf,
+								read_mem_evt);
+
+	return QDF_STATUS_E_FAILURE;
 }
+#endif /* FEATURE_WLAN_APF */
 
 /**
  *  wmi_unified_pdev_get_tpc_config_cmd_send() - WMI get tpc config function

+ 14 - 2
wmi_unified_tlv.c

@@ -24,8 +24,9 @@
 #include <qdf_module.h>
 #include <wlan_defs.h>
 #include <htc_services.h>
+#ifdef FEATURE_WLAN_APF
 #include "wmi_unified_apf_tlv.h"
-
+#endif
 #ifdef CONVERGED_P2P_ENABLE
 #include "wlan_p2p_public_struct.h"
 #endif
@@ -21828,7 +21829,16 @@ struct wmi_ops tlv_ops =  {
 		 send_roam_scan_offload_chan_list_cmd_tlv,
 	.send_roam_scan_offload_rssi_change_cmd =
 		 send_roam_scan_offload_rssi_change_cmd_tlv,
-	.send_set_active_apf_mode_cmd = send_set_active_apf_mode_cmd_tlv,
+#ifdef FEATURE_WLAN_APF
+	.send_set_active_apf_mode_cmd = wmi_send_set_active_apf_mode_cmd_tlv,
+	.send_apf_enable_cmd = wmi_send_apf_enable_cmd_tlv,
+	.send_apf_write_work_memory_cmd =
+				wmi_send_apf_write_work_memory_cmd_tlv,
+	.send_apf_read_work_memory_cmd =
+				wmi_send_apf_read_work_memory_cmd_tlv,
+	.extract_apf_read_memory_resp_event =
+				wmi_extract_apf_read_memory_resp_event_tlv,
+#endif /* FEATURE_WLAN_APF */
 	.send_adapt_dwelltime_params_cmd =
 		send_adapt_dwelltime_params_cmd_tlv,
 	.send_dbs_scan_sel_params_cmd =
@@ -22354,6 +22364,8 @@ static void populate_tlv_events_id(uint32_t *event_ids)
 		WMI_PDEV_DIV_RSSI_ANTID_EVENTID;
 	event_ids[wmi_twt_enable_complete_event_id] =
 		WMI_TWT_ENABLE_COMPLETE_EVENTID;
+	event_ids[wmi_apf_get_vdev_work_memory_resp_event_id] =
+		WMI_BPF_GET_VDEV_WORK_MEMORY_RESP_EVENTID;
 }
 
 /**