qcacmn: Add interface to get / set eLNA bypass

Add interface to get / set eLNA bypass from / to firmware via WMI.

Change-Id: I2ed78aece6703c18999fdfbfdfa159a2abd477a6
CRs-Fixed: 2498526
This commit is contained in:
Min Liu
2019-07-03 17:57:58 +08:00
committed by nshrivas
parent 24dab77dbe
commit 2c14fae3d5
8 changed files with 329 additions and 0 deletions

View File

@@ -254,6 +254,8 @@ typedef void (*wlan_objmgr_peer_status_handler)(
* @WLAN_MLME_OBJMGR_ID: MLME object manager operations VAP, Node * @WLAN_MLME_OBJMGR_ID: MLME object manager operations VAP, Node
* @WLAN_OFFCHAN_TX_ID: Offchannel Tx operations * @WLAN_OFFCHAN_TX_ID: Offchannel Tx operations
* @WLAN_MISC_ID: power manager, PAPI, rate set, etc. * @WLAN_MISC_ID: power manager, PAPI, rate set, etc.
* @WLAN_FWOL_NB_ID: fw offload northbound operations
* @WLAN_FWOL_SB_ID: fw offload southbound operations
* @WLAN_REF_ID_MAX: Max id used to generate ref count tracking array * @WLAN_REF_ID_MAX: Max id used to generate ref count tracking array
*/ */
/* New value added to the enum must also be reflected in function /* New value added to the enum must also be reflected in function
@@ -330,6 +332,8 @@ typedef enum {
WLAN_MLME_OBJMGR_ID = 67, WLAN_MLME_OBJMGR_ID = 67,
WLAN_OFFCHAN_TX_ID = 68, WLAN_OFFCHAN_TX_ID = 68,
WLAN_MISC_ID = 69, WLAN_MISC_ID = 69,
WLAN_FWOL_NB_ID = 70,
WLAN_FWOL_SB_ID = 71,
WLAN_REF_ID_MAX, WLAN_REF_ID_MAX,
} wlan_objmgr_ref_dbgid; } wlan_objmgr_ref_dbgid;
@@ -413,6 +417,8 @@ static inline char *string_from_dbgid(wlan_objmgr_ref_dbgid id)
"WLAN_MLME_OBJMGR_ID", "WLAN_MLME_OBJMGR_ID",
"WLAN_OFFCHAN_TX_ID", "WLAN_OFFCHAN_TX_ID",
"WLAN_MISC_ID", "WLAN_MISC_ID",
"WLAN_FWOL_NB_ID",
"WLAN_FWOL_SB_ID",
"WLAN_REF_ID_MAX"}; "WLAN_REF_ID_MAX"};
return (char *)strings[id]; return (char *)strings[id];

View File

@@ -96,6 +96,10 @@
#include "wmi_unified_sta_api.h" #include "wmi_unified_sta_api.h"
#endif #endif
#ifdef WLAN_FW_OFFLOAD
#include "wmi_unified_fwol_api.h"
#endif
typedef qdf_nbuf_t wmi_buf_t; typedef qdf_nbuf_t wmi_buf_t;
#define wmi_buf_data(_buf) qdf_nbuf_data(_buf) #define wmi_buf_data(_buf) qdf_nbuf_data(_buf)

View File

@@ -0,0 +1,68 @@
/*
* Copyright (c) 2019 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 fw offload component.
*/
#ifndef _WMI_UNIFIED_FWOL_API_H_
#define _WMI_UNIFIED_FWOL_API_H_
#include "wlan_fwol_public_structs.h"
#ifdef WLAN_FEATURE_ELNA
/**
* wmi_unified_send_set_elna_bypass_cmd() - Send WMI set eLNA bypass cmd
* @wmi_handle: wmi handle
* @req: set eLNA bypass request
*
* Send WMI set eLNA bypass command to firmware.
*
* Return: QDF_STATUS
*/
QDF_STATUS
wmi_unified_send_set_elna_bypass_cmd(struct wmi_unified *wmi_handle,
struct set_elna_bypass_request *req);
/**
* wmi_unified_send_get_elna_bypass_cmd() - Send WMI get eLNA bypass cmd
* @wmi_handle: wmi handle
* @req: get eLNA bypass request
*
* Send WMI get eLNA bypass command to firmware.
*
* Return: QDF_STATUS
*/
QDF_STATUS
wmi_unified_send_get_elna_bypass_cmd(struct wmi_unified *wmi_handle,
struct get_elna_bypass_request *req);
/**
* wmi_extract_get_elna_bypass_resp() - Extract WMI get eLNA bypass response
* @wmi_handle: wmi handle
* @resp_buf: response buffer
* @resp: get eLNA bypass response
*
* Extract WMI get eLNA bypass response from firmware.
*
* Return: QDF_STATUS
*/
QDF_STATUS
wmi_extract_get_elna_bypass_resp(struct wmi_unified *wmi_handle, void *resp_buf,
struct get_elna_bypass_response *resp);
#endif /* WLAN_FEATURE_ELNA */
#endif /* _WMI_UNIFIED_FWOL_API_H_ */

View File

@@ -4521,6 +4521,7 @@ typedef enum {
wmi_chan_rf_characterization_info_event_id, wmi_chan_rf_characterization_info_event_id,
wmi_roam_auth_offload_event_id, wmi_roam_auth_offload_event_id,
wmi_service_ready_ext2_event_id, wmi_service_ready_ext2_event_id,
wmi_get_elna_bypass_event_id,
wmi_events_max, wmi_events_max,
} wmi_conv_event_id; } wmi_conv_event_id;

View File

@@ -29,6 +29,10 @@
#include "qdf_atomic.h" #include "qdf_atomic.h"
#include <wbuff.h> #include <wbuff.h>
#ifdef WLAN_FW_OFFLOAD
#include "wlan_fwol_public_structs.h"
#endif
#ifdef DFS_COMPONENT_ENABLE #ifdef DFS_COMPONENT_ENABLE
#include <wlan_dfs_public_struct.h> #include <wlan_dfs_public_struct.h>
#endif #endif
@@ -2021,6 +2025,16 @@ QDF_STATUS (*extract_hw_mode_resp_event)(wmi_unified_t wmi_handle,
QDF_STATUS (*send_set_roam_trigger_cmd)(wmi_unified_t wmi_handle, QDF_STATUS (*send_set_roam_trigger_cmd)(wmi_unified_t wmi_handle,
uint32_t vdev_id, uint32_t vdev_id,
uint32_t trigger_bitmap); uint32_t trigger_bitmap);
#ifdef WLAN_FEATURE_ELNA
QDF_STATUS (*send_set_elna_bypass_cmd)(wmi_unified_t wmi_handle,
struct set_elna_bypass_request *req);
QDF_STATUS (*send_get_elna_bypass_cmd)(wmi_unified_t wmi_handle,
struct get_elna_bypass_request *req);
QDF_STATUS (*extract_get_elna_bypass_resp)(wmi_unified_t wmi_handle,
void *resp_buf,
struct get_elna_bypass_response *resp);
#endif /* WLAN_FEATURE_ELNA */
}; };
/* Forward declartion for psoc*/ /* Forward declartion for psoc*/
@@ -2404,6 +2418,20 @@ static inline void wmi_bcn_attach_tlv(wmi_unified_t wmi_handle)
} }
#endif #endif
/**
* wmi_fwol_attach_tlv() - attach fw offload tlv handlers
* @wmi_handle: wmi handle
*
* Return: void
*/
#ifdef WLAN_FW_OFFLOAD
void wmi_fwol_attach_tlv(wmi_unified_t wmi_handle);
#else
static inline void wmi_fwol_attach_tlv(wmi_unified_t wmi_handle)
{
}
#endif
/** /**
* wmi_align() - provides word aligned parameter * wmi_align() - provides word aligned parameter
* @param: parameter to be aligned * @param: parameter to be aligned

View File

@@ -0,0 +1,60 @@
/*
* Copyright (c) 2019 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 fw offload component.
*/
#include "wmi_unified_priv.h"
#include "wlan_fwol_public_structs.h"
#include "wmi_unified_fwol_api.h"
#ifdef WLAN_FEATURE_ELNA
QDF_STATUS
wmi_unified_send_set_elna_bypass_cmd(struct wmi_unified *wmi_handle,
struct set_elna_bypass_request *req)
{
if (wmi_handle->ops->send_set_elna_bypass_cmd)
return wmi_handle->ops->send_set_elna_bypass_cmd(wmi_handle,
req);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_unified_send_get_elna_bypass_cmd(struct wmi_unified *wmi_handle,
struct get_elna_bypass_request *req)
{
if (wmi_handle->ops->send_get_elna_bypass_cmd)
return wmi_handle->ops->send_get_elna_bypass_cmd(wmi_handle,
req);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_extract_get_elna_bypass_resp(struct wmi_unified *wmi_handle, void *resp_buf,
struct get_elna_bypass_response *resp)
{
if (wmi_handle->ops->extract_get_elna_bypass_resp)
return wmi_handle->ops->extract_get_elna_bypass_resp(wmi_handle,
resp_buf,
resp);
return QDF_STATUS_E_FAILURE;
}
#endif /* WLAN_FEATURE_ELNA */

View File

@@ -0,0 +1,160 @@
/*
* Copyright (c) 2019 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 "wlan_fwol_public_structs.h"
#include "wmi_unified_fwol_api.h"
#ifdef WLAN_FEATURE_ELNA
/**
* send_set_elna_bypass_cmd_tlv() - send set elna bypass cmd to fw
* @wmi_handle: wmi handle
* @req: set eLNA bypass request
*
* Send WMI_SET_ELNA_BYPASS_CMDID to fw.
*
* Return: QDF_STATUS
*/
static QDF_STATUS
send_set_elna_bypass_cmd_tlv(wmi_unified_t wmi_handle,
struct set_elna_bypass_request *req)
{
wmi_buf_t buf;
wmi_set_elna_bypass_cmd_fixed_param *cmd;
uint16_t len = sizeof(*cmd);
QDF_STATUS ret;
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf) {
WMI_LOGE("%s: Failed to allocate wmi buffer", __func__);
return QDF_STATUS_E_NOMEM;
}
cmd = (wmi_set_elna_bypass_cmd_fixed_param *)wmi_buf_data(buf);
WMITLV_SET_HDR(&cmd->tlv_header,
WMITLV_TAG_STRUC_wmi_set_elna_bypass_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_set_elna_bypass_cmd_fixed_param));
cmd->vdev_id = req->vdev_id;
cmd->en_dis = req->en_dis;
wmi_mtrace(WMI_SET_ELNA_BYPASS_CMDID, req->vdev_id, req->en_dis);
ret = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_SET_ELNA_BYPASS_CMDID);
if (QDF_IS_STATUS_ERROR(ret)) {
WMI_LOGE("Failed to send set param command ret = %d", ret);
wmi_buf_free(buf);
}
return ret;
}
/**
* send_get_elna_bypass_cmd_tlv() - send get elna bypass cmd to fw
* @wmi_handle: wmi handle
* @req: get eLNA bypass request
*
* Send WMI_GET_ELNA_BYPASS_CMDID to fw.
*
* Return: QDF_STATUS
*/
static QDF_STATUS
send_get_elna_bypass_cmd_tlv(wmi_unified_t wmi_handle,
struct get_elna_bypass_request *req)
{
wmi_buf_t buf;
wmi_get_elna_bypass_cmd_fixed_param *cmd;
uint16_t len = sizeof(*cmd);
QDF_STATUS ret;
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf) {
WMI_LOGE("%s: Failed to allocate wmi buffer", __func__);
return QDF_STATUS_E_NOMEM;
}
cmd = (wmi_get_elna_bypass_cmd_fixed_param *)wmi_buf_data(buf);
WMITLV_SET_HDR(&cmd->tlv_header,
WMITLV_TAG_STRUC_wmi_get_elna_bypass_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_get_elna_bypass_cmd_fixed_param));
cmd->vdev_id = req->vdev_id;
wmi_mtrace(WMI_GET_ELNA_BYPASS_CMDID, req->vdev_id, 0);
ret = wmi_unified_cmd_send(wmi_handle, buf, len,
WMI_GET_ELNA_BYPASS_CMDID);
if (QDF_IS_STATUS_ERROR(ret)) {
WMI_LOGE("Failed to send set param command ret = %d", ret);
wmi_buf_free(buf);
}
return ret;
}
/**
* extract_get_elna_bypass_resp_tlv() - Extract WMI get eLNA bypass response
* @wmi_handle: wmi handle
* @resp_buf: response buffer
* @resp: get eLNA bypass response
*
* Extract WMI get eLNA bypass response from firmware.
*
* Return: QDF_STATUS
*/
static QDF_STATUS
extract_get_elna_bypass_resp_tlv(struct wmi_unified *wmi_handle, void *resp_buf,
struct get_elna_bypass_response *resp)
{
WMI_GET_ELNA_BYPASS_EVENTID_param_tlvs *param_buf;
wmi_get_elna_bypass_event_fixed_param *evt;
param_buf = resp_buf;
evt = param_buf->fixed_param;
if (!evt) {
WMI_LOGE("Invalid get elna bypass event");
return QDF_STATUS_E_INVAL;
}
WMI_LOGD("Get elna bypass %d from vdev %d", evt->en_dis, evt->vdev_id);
resp->vdev_id = evt->vdev_id;
resp->en_dis = evt->en_dis;
return QDF_STATUS_SUCCESS;
}
#endif /* WLAN_FEATURE_ELNA */
#ifdef WLAN_FEATURE_ELNA
static void wmi_fwol_attach_elna_tlv(struct wmi_ops *ops)
{
ops->send_set_elna_bypass_cmd = send_set_elna_bypass_cmd_tlv;
ops->send_get_elna_bypass_cmd = send_get_elna_bypass_cmd_tlv;
ops->extract_get_elna_bypass_resp = extract_get_elna_bypass_resp_tlv;
}
#else
static void wmi_fwol_attach_elna_tlv(struct wmi_ops *ops)
{
}
#endif /* WLAN_FEATURE_ELNA */
void wmi_fwol_attach_tlv(wmi_unified_t wmi_handle)
{
struct wmi_ops *ops = wmi_handle->ops;
wmi_fwol_attach_elna_tlv(ops);
}

View File

@@ -12560,6 +12560,7 @@ static void populate_tlv_events_id(uint32_t *event_ids)
WMI_CHAN_RF_CHARACTERIZATION_INFO_EVENTID; WMI_CHAN_RF_CHARACTERIZATION_INFO_EVENTID;
event_ids[wmi_roam_auth_offload_event_id] = event_ids[wmi_roam_auth_offload_event_id] =
WMI_ROAM_PREAUTH_START_EVENTID; WMI_ROAM_PREAUTH_START_EVENTID;
event_ids[wmi_get_elna_bypass_event_id] = WMI_GET_ELNA_BYPASS_EVENTID;
} }
/** /**
@@ -12885,6 +12886,7 @@ void wmi_tlv_attach(wmi_unified_t wmi_handle)
wmi_pmo_attach_tlv(wmi_handle); wmi_pmo_attach_tlv(wmi_handle);
wmi_sta_attach_tlv(wmi_handle); wmi_sta_attach_tlv(wmi_handle);
wmi_11ax_bss_color_attach_tlv(wmi_handle); wmi_11ax_bss_color_attach_tlv(wmi_handle);
wmi_fwol_attach_tlv(wmi_handle);
} }
qdf_export_symbol(wmi_tlv_attach); qdf_export_symbol(wmi_tlv_attach);