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
This commit is contained in:
Subrat Mishra
2017-09-27 14:41:20 +05:30
committed by snandini
parent 622a2fae1c
commit bf12587bd1
16 changed files with 533 additions and 1 deletions

View File

@@ -1888,6 +1888,7 @@ QDF_STATUS wmi_extract_ndp_end_ind(wmi_unified_t wmi_handle, uint8_t *data,
struct nan_datapath_end_indication_event **ind);
#endif
/**
* wmi_unified_send_btm_config() - Send BTM config to fw
* @wmi_hdl: wmi handle
@@ -1929,4 +1930,37 @@ QDF_STATUS wmi_unified_extract_obss_detection_info(void *wmi_hdl,
struct wmi_obss_detect_info
*info);
#ifdef WLAN_SUPPORT_FILS
/**
* wmi_unified_fils_vdev_config_send_cmd() - send FILS config cmd to fw
* @wmi_hdl: wmi handle
* @param: fils config params
*
* Return: QDF_STATUS_SUCCESS for success or error code
*/
QDF_STATUS
wmi_unified_fils_vdev_config_send_cmd(void *wmi_hdl,
struct config_fils_params *param);
/**
* wmi_extract_swfda_vdev_id() - api to extract vdev id
* @wmi_hdl: wmi handle
* @evt_buf: pointer to event buffer
* @vdev_id: pointer to vdev id
*
* Return: QDF_STATUS_SUCCESS for success or error code
*/
QDF_STATUS wmi_extract_swfda_vdev_id(void *wmi_hdl, void *evt_buf,
uint32_t *vdev_id);
/**
* wmi_unified_fils_discovery_send_cmd() - send FILS discovery cmd to fw
* @wmi_hdl: wmi handle
* @param: fils discovery params
*
* Return: QDF_STATUS_SUCCESS for success or error code
*/
QDF_STATUS wmi_unified_fils_discovery_send_cmd(void *wmi_hdl,
struct fd_params *param);
#endif /* WLAN_SUPPORT_FILS */
#endif /* _WMI_UNIFIED_API_H_ */

View File

@@ -1028,6 +1028,18 @@ struct beacon_params {
bool is_high_latency;
};
/**
* struct fd_params - FD cmd parameter
* @vdev_id: vdev id
* @wbuf: FD buffer
* @frame_ctrl: frame control field
*/
struct fd_params {
uint8_t vdev_id;
qdf_nbuf_t wbuf;
uint16_t frame_ctrl;
};
/**
* struct bcn_prb_template_params - beacon probe template parameter
* @vdev_id: vdev id
@@ -3926,6 +3938,16 @@ struct config_ratemask_params {
uint32_t higher32;
};
/**
* struct config_fils_params - FILS config params
* @vdev_id: vdev id
* @fd_period: 0 - Disabled, non-zero - Period in ms (mili seconds)
*/
struct config_fils_params {
uint8_t vdev_id;
uint32_t fd_period;
};
/**
* struct peer_add_wds_entry_params - WDS peer entry add params
* @dest_addr: Pointer to destination macaddr
@@ -5641,6 +5663,7 @@ typedef enum {
wmi_report_stats_event_id,
wmi_dma_buf_release_event_id,
wmi_sap_obss_detection_report_event_id,
wmi_host_swfda_event_id,
wmi_events_max,
} wmi_conv_event_id;

View File

@@ -1490,7 +1490,6 @@ QDF_STATUS (*extract_ndp_end_rsp)(wmi_unified_t wmi_handle,
uint8_t *data, struct nan_datapath_end_rsp_event **rsp);
QDF_STATUS (*extract_ndp_end_ind)(wmi_unified_t wmi_handle,
uint8_t *data, struct nan_datapath_end_indication_event **ind);
#endif
QDF_STATUS (*send_btm_config)(wmi_unified_t wmi_handle,
struct wmi_btm_config *params);
@@ -1498,6 +1497,15 @@ QDF_STATUS (*send_obss_detection_cfg_cmd)(wmi_unified_t wmi_handle,
struct wmi_obss_detection_cfg_param *obss_cfg_param);
QDF_STATUS (*extract_obss_detection_info)(uint8_t *evt_buf,
struct wmi_obss_detect_info *info);
#ifdef WLAN_SUPPORT_FILS
QDF_STATUS (*send_vdev_fils_enable_cmd)(wmi_unified_t wmi_handle,
struct config_fils_params *param);
QDF_STATUS (*extract_swfda_vdev_id)(wmi_unified_t wmi_handle, void *evt_buf,
uint32_t *vdev_id);
QDF_STATUS (*send_fils_discovery_send_cmd)(wmi_unified_t wmi_handle,
struct fd_params *param);
#endif /* WLAN_SUPPORT_FILS */
};
/* Forward declartion for psoc*/

View File

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

View File

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

View File

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