diff --git a/wmi_unified_api.c b/wmi_unified_api.c index 6e265f7504..59d0f8a68a 100644 --- a/wmi_unified_api.c +++ b/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. diff --git a/wmi_unified_non_tlv.c b/wmi_unified_non_tlv.c index 57f40578e8..720b3e057f 100644 --- a/wmi_unified_non_tlv.c +++ b/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; } /** diff --git a/wmi_unified_tlv.c b/wmi_unified_tlv.c index b9686117c3..0a883a41a5 100644 --- a/wmi_unified_tlv.c +++ b/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