소스 검색

qcacmn: Support for SWFDA Event & FD Frame tx

Add new WMI EVENT, SW FILS Discovery Alert Event, to get
firmware trigger to transmit FILS Discovery Frames.
Add WMI command to send FD frame buffer to firwmare.
Add WMI command to set FD period interval in mili seconds.

Change-Id: I8cb6279ec4431b9236bd32c548228a0dc6598664
CRs-Fixed: 2118098
Subrat Mishra 7 년 전
부모
커밋
d7c7a5630e
3개의 변경된 파일259개의 추가작업 그리고 0개의 파일을 삭제
  1. 39 0
      wmi_unified_api.c
  2. 102 0
      wmi_unified_non_tlv.c
  3. 118 0
      wmi_unified_tlv.c

+ 39 - 0
wmi_unified_api.c

@@ -4158,6 +4158,45 @@ QDF_STATUS wmi_unified_vdev_set_fwtest_param_cmd_send(void *wmi_hdl,
 	return QDF_STATUS_E_FAILURE;
 }
 
+#ifdef WLAN_SUPPORT_FILS
+QDF_STATUS
+wmi_unified_fils_discovery_send_cmd(void *wmi_hdl, struct fd_params *param)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl;
+
+	if (wmi_handle->ops->send_fils_discovery_send_cmd)
+		return wmi_handle->ops->send_fils_discovery_send_cmd(wmi_handle,
+								     param);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS
+wmi_unified_fils_vdev_config_send_cmd(void *wmi_hdl,
+				      struct config_fils_params *param)
+{
+	wmi_unified_t wmi = (wmi_unified_t)wmi_hdl;
+
+	if (wmi->ops->send_vdev_fils_enable_cmd)
+		return wmi->ops->send_vdev_fils_enable_cmd(wmi, param);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS
+wmi_extract_swfda_vdev_id(void *wmi_hdl, void *evt_buf,
+			  uint32_t *vdev_id)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl;
+
+	if (wmi_handle->ops->extract_swfda_vdev_id)
+		return wmi_handle->ops->extract_swfda_vdev_id(wmi_handle,
+							      evt_buf, vdev_id);
+
+	return QDF_STATUS_E_FAILURE;
+}
+#endif /* WLAN_SUPPORT_FILS */
+
 /**
  *  wmi_unified_vdev_config_ratemask_cmd_send() - WMI config ratemask function
  *  @param wmi_handle      : handle to WMI.

+ 102 - 0
wmi_unified_non_tlv.c

@@ -2691,6 +2691,102 @@ static QDF_STATUS send_vdev_spectral_configure_cmd_non_tlv(wmi_unified_t wmi_han
 	return ret;
 }
 
+#ifdef WLAN_SUPPORT_FILS
+/**
+ *  send_fils_discovery_send_cmd_non_tlv() - WMI FILS Discovery send function
+ *  @wmi_handle:  handle to WMI
+ *  @param:  pointer to hold FD send cmd parameter
+ *
+ *  Return: QDF_STATUS_SUCCESS on success and QDF_STATUS error code on failure.
+ */
+static QDF_STATUS
+send_fils_discovery_send_cmd_non_tlv(wmi_unified_t wmi_handle,
+				     struct fd_params *param)
+{
+	wmi_fd_send_from_host_cmd_t  *cmd;
+	wmi_buf_t wmi_buf;
+	QDF_STATUS status;
+	int fd_len = qdf_nbuf_len(param->wbuf);
+	int len = sizeof(wmi_fd_send_from_host_cmd_t);
+
+	wmi_buf = wmi_buf_alloc(wmi_handle, roundup(len, sizeof(u_int32_t)));
+	if (!wmi_buf) {
+		WMI_LOGE("wmi_buf_alloc failed\n");
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	cmd = (wmi_fd_send_from_host_cmd_t *)wmi_buf_data(wmi_buf);
+	cmd->vdev_id = param->vdev_id;
+	cmd->data_len = fd_len;
+	cmd->frag_ptr = qdf_nbuf_get_frag_paddr(param->wbuf, 0);
+	cmd->frame_ctrl = param->frame_ctrl;
+	status = wmi_unified_cmd_send(wmi_handle, wmi_buf, len,
+				      WMI_PDEV_SEND_FD_CMDID);
+	if (status != QDF_STATUS_SUCCESS) {
+		wmi_buf_free(wmi_buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_vdev_fils_enable_cmd_non_tlv() - enable/Disable FD Frame command to fw
+ * @wmi_handle:  wmi handle
+ * @param:  pointer to hold FILS discovery enable param
+ *
+ * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS error code on failure
+ */
+static QDF_STATUS
+send_vdev_fils_enable_cmd_non_tlv(wmi_unified_t wmi_handle,
+				  struct config_fils_params *param)
+{
+	wmi_enable_fils_cmd *cmd;
+	wmi_buf_t buf;
+	QDF_STATUS status;
+	int len = sizeof(wmi_enable_fils_cmd);
+
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf) {
+		WMI_LOGE("wmi_buf_alloc failed\n");
+		return QDF_STATUS_E_FAILURE;
+	}
+	cmd = (wmi_enable_fils_cmd *)wmi_buf_data(buf);
+	cmd->vdev_id = param->vdev_id;
+	cmd->fd_period = param->fd_period;
+	WMI_LOGI("Setting FD period to %d vdev id : %d\n",
+		 param->fd_period, param->vdev_id);
+
+	status = wmi_unified_cmd_send(wmi_handle, buf, len,
+				      WMI_ENABLE_FILS_CMDID);
+	if (status != QDF_STATUS_SUCCESS) {
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * extract_swfda_vdev_id_non_tlv() - extract swfda vdev id from event
+ * @wmi_handle:  wmi handle
+ * @evt_buf:  pointer to event buffer
+ * @vdev_id:  pointer to hold vdev id
+ *
+ * Return: QDF_STATUS_SUCCESS
+ */
+static QDF_STATUS
+extract_swfda_vdev_id_non_tlv(wmi_unified_t wmi_handle,
+			      void *evt_buf, uint32_t *vdev_id)
+{
+	wmi_host_swfda_event *swfda_event = (wmi_host_swfda_event *)evt_buf;
+
+	*vdev_id = swfda_event->vdev_id;
+
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* WLAN_SUPPORT_FILS */
+
 /**
  * send_vdev_spectral_enable_cmd_non_tlv() - send VDEV spectral configure
  * command to fw
@@ -8449,6 +8545,11 @@ struct wmi_ops non_tlv_ops =  {
 		send_dfs_phyerr_offload_dis_cmd_non_tlv,
 	.send_wds_entry_list_cmd = send_wds_entry_list_cmd_non_tlv,
 	.extract_wds_entry = extract_wds_entry_non_tlv,
+#ifdef WLAN_SUPPORT_FILS
+	.send_vdev_fils_enable_cmd = send_vdev_fils_enable_cmd_non_tlv,
+	.send_fils_discovery_send_cmd = send_fils_discovery_send_cmd_non_tlv,
+	.extract_swfda_vdev_id = extract_swfda_vdev_id_non_tlv,
+#endif /* WLAN_SUPPORT_FILS */
 };
 
 /**
@@ -8740,6 +8841,7 @@ static void populate_non_tlv_events_id(uint32_t *event_ids)
 					WMI_ATF_PEER_STATS_EVENTID;
 	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;
 }
 
 /**

+ 118 - 0
wmi_unified_tlv.c

@@ -1788,6 +1788,118 @@ static QDF_STATUS send_packet_log_disable_cmd_tlv(wmi_unified_t wmi_handle,
 }
 #endif
 
+#ifdef WLAN_SUPPORT_FILS
+/**
+ * extract_swfda_vdev_id_tlv() - extract swfda vdev id from event
+ * @wmi_handle: wmi handle
+ * @evt_buf: pointer to event buffer
+ * @vdev_id: pointer to hold vdev id
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_INVAL on failure
+ */
+static QDF_STATUS
+extract_swfda_vdev_id_tlv(wmi_unified_t wmi_handle,
+			  void *evt_buf, uint32_t *vdev_id)
+{
+	WMI_HOST_SWFDA_EVENTID_param_tlvs *param_buf;
+	wmi_host_swfda_event_fixed_param *swfda_event;
+
+	param_buf = (WMI_HOST_SWFDA_EVENTID_param_tlvs *)evt_buf;
+	if (!param_buf) {
+		WMI_LOGE("Invalid swfda event buffer");
+		return QDF_STATUS_E_INVAL;
+	}
+	swfda_event = param_buf->fixed_param;
+	*vdev_id = swfda_event->vdev_id;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_vdev_fils_enable_cmd_tlv() - enable/Disable FD Frame command to fw
+ * @wmi_handle: wmi handle
+ * @param: pointer to hold FILS discovery enable param
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE on failure
+ */
+static QDF_STATUS
+send_vdev_fils_enable_cmd_tlv(wmi_unified_t wmi_handle,
+			      struct config_fils_params *param)
+{
+	wmi_enable_fils_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	QDF_STATUS status;
+	uint32_t len = sizeof(wmi_enable_fils_cmd_fixed_param);
+
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf) {
+		WMI_LOGE("%s : wmi_buf_alloc failed\n", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+	cmd = (wmi_enable_fils_cmd_fixed_param *)wmi_buf_data(buf);
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_enable_fils_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN(
+		       wmi_enable_fils_cmd_fixed_param));
+	cmd->vdev_id = param->vdev_id;
+	cmd->fd_period = param->fd_period;
+	WMI_LOGI("Setting FD period to %d vdev id : %d\n",
+		 param->fd_period, param->vdev_id);
+
+	status = wmi_unified_cmd_send(wmi_handle, buf, len,
+				      WMI_ENABLE_FILS_CMDID);
+	if (status != QDF_STATUS_SUCCESS) {
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_fils_discovery_send_cmd_tlv() - WMI FILS Discovery send function
+ * @wmi_handle: wmi handle
+ * @param: pointer to hold FD send cmd parameter
+ *
+ * Return : QDF_STATUS_SUCCESS on success and QDF_STATUS_E_NOMEM on failure.
+ */
+static QDF_STATUS
+send_fils_discovery_send_cmd_tlv(wmi_unified_t wmi_handle,
+				 struct fd_params *param)
+{
+	QDF_STATUS ret;
+	wmi_fd_send_from_host_cmd_fixed_param *cmd;
+	wmi_buf_t wmi_buf;
+	qdf_dma_addr_t dma_addr;
+
+	wmi_buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
+	if (!wmi_buf) {
+		WMI_LOGE("%s : wmi_buf_alloc failed\n", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+	cmd = (wmi_fd_send_from_host_cmd_fixed_param *)wmi_buf_data(wmi_buf);
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_fd_send_from_host_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN(
+		       wmi_fd_send_from_host_cmd_fixed_param));
+	cmd->vdev_id = param->vdev_id;
+	cmd->data_len = qdf_nbuf_len(param->wbuf);
+	dma_addr = qdf_nbuf_get_frag_paddr(param->wbuf, 0);
+	qdf_dmaaddr_to_32s(dma_addr, &cmd->frag_ptr_lo, &cmd->frag_ptr_hi);
+	cmd->frame_ctrl = param->frame_ctrl;
+
+	ret = wmi_unified_cmd_send(wmi_handle, wmi_buf, sizeof(*cmd),
+				   WMI_PDEV_SEND_FD_CMDID);
+	if (ret != QDF_STATUS_SUCCESS) {
+		WMI_LOGE("%s: Failed to send fils discovery frame: %d",
+			 __func__, ret);
+		wmi_buf_free(wmi_buf);
+	}
+
+	return ret;
+}
+#endif /* WLAN_SUPPORT_FILS */
+
 static QDF_STATUS send_beacon_send_cmd_tlv(wmi_unified_t wmi_handle,
 				struct beacon_params *param)
 {
@@ -21505,6 +21617,11 @@ struct wmi_ops tlv_ops =  {
 	.send_btm_config = send_btm_config_cmd_tlv,
 	.send_obss_detection_cfg_cmd = send_obss_detection_cfg_cmd_tlv,
 	.extract_obss_detection_info = extract_obss_detection_info_tlv,
+#ifdef WLAN_SUPPORT_FILS
+	.send_vdev_fils_enable_cmd = send_vdev_fils_enable_cmd_tlv,
+	.extract_swfda_vdev_id = extract_swfda_vdev_id_tlv,
+	.send_fils_discovery_send_cmd = send_fils_discovery_send_cmd_tlv,
+#endif /* WLAN_SUPPORT_FILS */
 };
 
 /**
@@ -21785,6 +21902,7 @@ static void populate_tlv_events_id(uint32_t *event_ids)
 					WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID;
 	event_ids[wmi_sap_obss_detection_report_event_id] =
 		WMI_SAP_OBSS_DETECTION_REPORT_EVENTID;
+	event_ids[wmi_host_swfda_event_id] = WMI_HOST_SWFDA_EVENTID;
 }
 
 #ifndef CONFIG_MCL