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
This commit is contained in:
Subrat Dash
2021-08-07 15:46:22 +05:30
committed by Madan Koyyalamudi
parent ffb8752cf3
commit 8525330652
7 changed files with 364 additions and 2 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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_*/

View File

@@ -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_ */

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;
}