浏览代码

qcacmn: Add WMI support to send the wds AST commands to fw

Add host WMI APIs to send WMI_PEER_ADD_WDS_ENTRY_CMDID,
WMI_PEER_REMOVE_WDS_ENTRY_CMDID, and WMI_PEER_UPDATE_WDS_ENTRY_CMDID
to the Fw.

Change-Id: I32afdac7c366b647ee3196bcb76531295e640b8b
CRs-Fixed: 2997227
Subrat Dash 3 年之前
父节点
当前提交
8525330652

+ 3 - 1
wmi/inc/wmi_unified_api.h

@@ -53,7 +53,9 @@
 #include "wmi_unified_twt_param.h"
 #include "wmi_unified_twt_api.h"
 #endif
-
+#ifdef WDS_CONV_TARGET_IF_OPS_ENABLE
+#include "wmi_unified_wds_api.h"
+#endif
 #ifdef FEATURE_WLAN_EXTSCAN
 #include "wmi_unified_extscan_api.h"
 #endif

+ 8 - 1
wmi/inc/wmi_unified_priv.h

@@ -61,6 +61,10 @@
 #include "wmi_unified_atf_param.h"
 #endif
 
+#ifdef WDS_CONV_TARGET_IF_OPS_ENABLE
+#include "wmi_unified_wds_param.h"
+#endif
+
 #ifdef WLAN_FEATURE_INTEROP_ISSUES_AP
 #include <wlan_interop_issues_ap_public_structs.h>
 #endif
@@ -1273,7 +1277,7 @@ QDF_STATUS (*send_set_vap_dscp_tid_map_cmd)(wmi_unified_t wmi_handle,
 QDF_STATUS (*send_proxy_ast_reserve_cmd)(wmi_unified_t wmi_handle,
 		struct proxy_ast_reserve_params *param);
 
-#ifdef WMI_AP_SUPPORT
+#if defined(WMI_AP_SUPPORT) || defined(WDS_CONV_TARGET_IF_OPS_ENABLE)
 QDF_STATUS (*send_peer_add_wds_entry_cmd)(wmi_unified_t wmi_handle,
 		struct peer_add_wds_entry_params *param);
 
@@ -1282,6 +1286,9 @@ QDF_STATUS (*send_peer_del_wds_entry_cmd)(wmi_unified_t wmi_handle,
 
 QDF_STATUS (*send_peer_update_wds_entry_cmd)(wmi_unified_t wmi_handle,
 		struct peer_update_wds_entry_params *param);
+#endif
+
+#ifdef WMI_AP_SUPPORT
 
 QDF_STATUS (*send_set_ctl_table_cmd)(wmi_unified_t wmi_handle,
 		struct ctl_table_params *param);

+ 83 - 0
wmi/inc/wmi_unified_wds_api.h

@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2021 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This file contains the API declaration for the WDS WMI APIs.
+ */
+
+#ifndef _WMI_UNIFIED_WDS_API_H_
+#define _WMI_UNIFIED_WDS_API_H_
+
+#ifdef WDS_CONV_TARGET_IF_OPS_ENABLE
+#include <wmi_unified_api.h>
+#include <wmi_unified_wds_param.h>
+
+/**
+ *  wmi_unified_peer_add_wds_entry_cmd() - WMI add wds entry cmd function
+ *  @wmi_hdl: handle to WMI
+ *  @param: pointer to hold wds entry param
+ *
+ *  Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS
+wmi_unified_peer_add_wds_entry_cmd(wmi_unified_t wmi_handle,
+				   struct peer_add_wds_entry_params *param);
+
+/**
+ *  wmi_unified_peer_del_wds_entry_cmd() - WMI del wds entry cmd function
+ *  @wmi_hdl: handle to WMI
+ *  @param: pointer to hold wds entry param
+ *
+ *  Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS
+wmi_unified_peer_del_wds_entry_cmd(wmi_unified_t wmi_handle,
+				   struct peer_del_wds_entry_params *param);
+
+/**
+ *  wmi_unified_update_wds_entry_cmd() - WMI update wds entry
+ *  cmd function
+ *  @wmi_hdl: handle to WMI
+ *  @param: pointer to hold wds entry param
+ *
+ *  Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS
+wmi_unified_update_wds_entry_cmd(wmi_unified_t wmi_handle,
+				 struct peer_update_wds_entry_params *param);
+
+/**
+ * wmi_wds_attach_tlv() - attach wds tlv handlers
+ * @wmi_handle: wmi handle
+ *
+ * Return: void
+ */
+void wmi_wds_attach_tlv(wmi_unified_t wmi_handle);
+#else
+/**
+ * wmi_wds_attach_tlv() - attach wds tlv handlers
+ * @wmi_handle: wmi handle
+ *
+ * Return: void
+ */
+static inline void
+wmi_wds_attach_tlv(struct wmi_unified *wmi_handle)
+{
+}
+#endif /*WDS_CONV_TARGET_IF_OPS*/
+#endif /*_WMI_UNIFIED_WDS_API_H_*/

+ 63 - 0
wmi/inc/wmi_unified_wds_param.h

@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2021 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This file contains the parameter definitions for the WDS WMI APIs.
+ */
+
+#ifndef _WMI_UNIFIED_WDS_PARAM_H_
+#define _WMI_UNIFIED_WDS_PARAM_H_
+
+/**
+ * struct peer_add_wds_entry_params - WDS peer entry add params
+ * @dest_addr: destination macaddr
+ * @peer_addr: peer mac addr
+ * @flags: WMI_HOST_WDS_FLAG_STATIC
+ * @vdev_id: Vdev id
+ */
+struct  peer_add_wds_entry_params {
+	uint8_t dest_addr[QDF_MAC_ADDR_SIZE];
+	uint8_t peer_addr[QDF_MAC_ADDR_SIZE];
+	uint32_t flags;
+	uint32_t vdev_id;
+};
+
+/**
+ * struct peer_del_wds_entry_params - WDS peer entry del params
+ * @dest_addr: destination macaddr
+ * @vdev_id: Vdev id
+ */
+struct peer_del_wds_entry_params {
+	uint8_t dest_addr[QDF_MAC_ADDR_SIZE];
+	uint32_t vdev_id;
+};
+
+/**
+ * struct peer_update_wds_entry_params - WDS peer entry update params
+ * @dest_addr: destination macaddr
+ * @peer_addr: peer mac addr
+ * @flags: WMI_HOST_WDS_FLAG_STATIC
+ * @vdev_id: Vdev id
+ */
+struct peer_update_wds_entry_params {
+	uint8_t dest_addr[QDF_MAC_ADDR_SIZE];
+	uint8_t peer_addr[QDF_MAC_ADDR_SIZE];
+	uint32_t flags;
+	uint32_t vdev_id;
+};
+#endif /* _WMI_UNIFIED_WDS_PARAM_H_ */

+ 2 - 0
wmi/src/wmi_unified_tlv.c

@@ -40,6 +40,7 @@
 #endif
 
 #include "wmi_unified_twt_api.h"
+#include "wmi_unified_wds_api.h"
 
 #ifdef WLAN_POLICY_MGR_ENABLE
 #include "wlan_policy_mgr_public_struct.h"
@@ -17223,6 +17224,7 @@ void wmi_tlv_attach(wmi_unified_t wmi_handle)
 #endif
 	populate_tlv_events_id(wmi_handle->wmi_events);
 	populate_tlv_service(wmi_handle->services);
+	wmi_wds_attach_tlv(wmi_handle);
 	wmi_twt_attach_tlv(wmi_handle);
 	wmi_extscan_attach_tlv(wmi_handle);
 	wmi_smart_ant_attach_tlv(wmi_handle);

+ 53 - 0
wmi/src/wmi_unified_wds_api.c

@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2021 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+/**
+ * DOC: Implement API's specific to WDS component.
+ */
+
+#include <wmi_unified_priv.h>
+#include <wmi_unified_wds_api.h>
+
+QDF_STATUS
+wmi_unified_peer_add_wds_entry_cmd(wmi_unified_t wmi_hdl,
+				   struct peer_add_wds_entry_params *param)
+{
+	if (wmi_hdl->ops->send_peer_add_wds_entry_cmd)
+		return wmi_hdl->ops->send_peer_add_wds_entry_cmd(wmi_hdl,
+								 param);
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS
+wmi_unified_peer_del_wds_entry_cmd(wmi_unified_t wmi_hdl,
+				   struct peer_del_wds_entry_params *param)
+{
+	if (wmi_hdl->ops->send_peer_del_wds_entry_cmd)
+		return wmi_hdl->ops->send_peer_del_wds_entry_cmd(wmi_hdl,
+								 param);
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS
+wmi_unified_update_wds_entry_cmd(wmi_unified_t wmi_hdl,
+				 struct peer_update_wds_entry_params *param)
+{
+	if (wmi_hdl->ops->send_peer_update_wds_entry_cmd)
+		return wmi_hdl->ops->send_peer_update_wds_entry_cmd(wmi_hdl,
+								    param);
+	return QDF_STATUS_E_FAILURE;
+}

+ 152 - 0
wmi/src/wmi_unified_wds_tlv.c

@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2021 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <osdep.h>
+#include <wmi.h>
+#include <wmi_unified_priv.h>
+#include <wmi_unified_wds_api.h>
+
+/**
+ * send_peer_add_wds_entry_cmd_tlv() - send peer add command to fw
+ * @wmi_handle: wmi handle
+ * @param: pointer holding peer details
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+static QDF_STATUS
+send_peer_add_wds_entry_cmd_tlv(wmi_unified_t wmi_handle,
+				struct peer_add_wds_entry_params *param)
+{
+	wmi_peer_add_wds_entry_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	int len = sizeof(*cmd);
+	QDF_STATUS ret;
+
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf)
+		return QDF_STATUS_E_NOMEM;
+
+	cmd = (wmi_peer_add_wds_entry_cmd_fixed_param *)wmi_buf_data(buf);
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_peer_add_wds_entry_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+		       (wmi_peer_add_wds_entry_cmd_fixed_param));
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(param->dest_addr, &cmd->wds_macaddr);
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(param->peer_addr, &cmd->peer_macaddr);
+
+	cmd->flags = (param->flags & WMI_HOST_WDS_FLAG_STATIC) ?
+					WMI_WDS_FLAG_STATIC : 0;
+	cmd->vdev_id = param->vdev_id;
+
+	wmi_mtrace(WMI_PEER_ADD_WDS_ENTRY_CMDID, cmd->vdev_id, 0);
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+				   WMI_PEER_ADD_WDS_ENTRY_CMDID);
+	if (QDF_IS_STATUS_ERROR(ret))
+		wmi_buf_free(buf);
+
+	return ret;
+}
+
+/**
+ * send_peer_del_wds_entry_cmd_tlv() - send peer delete command to fw
+ * @wmi_handle: wmi handle
+ * @param: pointer holding peer details
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+static QDF_STATUS
+send_peer_del_wds_entry_cmd_tlv(wmi_unified_t wmi_handle,
+				struct peer_del_wds_entry_params *param)
+{
+	wmi_peer_remove_wds_entry_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	int len = sizeof(*cmd);
+	QDF_STATUS ret;
+
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf)
+		return QDF_STATUS_E_NOMEM;
+
+	cmd = (wmi_peer_remove_wds_entry_cmd_fixed_param *)wmi_buf_data(buf);
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_peer_remove_wds_entry_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+		       (wmi_peer_remove_wds_entry_cmd_fixed_param));
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(param->dest_addr, &cmd->wds_macaddr);
+
+	cmd->vdev_id = param->vdev_id;
+
+	wmi_mtrace(WMI_PEER_REMOVE_WDS_ENTRY_CMDID, cmd->vdev_id, 0);
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+				   WMI_PEER_REMOVE_WDS_ENTRY_CMDID);
+	if (QDF_IS_STATUS_ERROR(ret))
+		wmi_buf_free(buf);
+
+	return ret;
+}
+
+/**
+ * send_peer_update_wds_entry_cmd_tlv() - send peer update command to fw
+ * @wmi_handle: wmi handle
+ * @param: pointer holding peer details
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+static QDF_STATUS
+send_peer_update_wds_entry_cmd_tlv(wmi_unified_t wmi_handle,
+				   struct peer_update_wds_entry_params *param)
+{
+	wmi_peer_update_wds_entry_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	int len = sizeof(*cmd);
+	QDF_STATUS ret;
+
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf)
+		return QDF_STATUS_E_NOMEM;
+
+	cmd = (wmi_peer_update_wds_entry_cmd_fixed_param *)wmi_buf_data(buf);
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_peer_update_wds_entry_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+		       (wmi_peer_update_wds_entry_cmd_fixed_param));
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(param->dest_addr, &cmd->wds_macaddr);
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(param->peer_addr, &cmd->peer_macaddr);
+
+	cmd->flags = (param->flags & WMI_HOST_WDS_FLAG_STATIC) ?
+						WMI_WDS_FLAG_STATIC : 0;
+	cmd->vdev_id = param->vdev_id;
+
+	wmi_mtrace(WMI_PEER_UPDATE_WDS_ENTRY_CMDID, cmd->vdev_id, 0);
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+				   WMI_PEER_UPDATE_WDS_ENTRY_CMDID);
+	if (QDF_IS_STATUS_ERROR(ret))
+		wmi_buf_free(buf);
+
+	return ret;
+}
+
+void wmi_wds_attach_tlv(wmi_unified_t wmi_handle)
+{
+	struct wmi_ops *ops = wmi_handle->ops;
+
+	ops->send_peer_add_wds_entry_cmd = send_peer_add_wds_entry_cmd_tlv;
+	ops->send_peer_del_wds_entry_cmd = send_peer_del_wds_entry_cmd_tlv;
+	ops->send_peer_update_wds_entry_cmd =
+		send_peer_update_wds_entry_cmd_tlv;
+}