From c4880c3a0bbc2c90c287417eb0ab22eb92070628 Mon Sep 17 00:00:00 2001 From: Gurumoorthi Gnanasambandhan Date: Wed, 18 Dec 2019 15:37:27 +0530 Subject: [PATCH] qcacmn: WMI tlv support to profile commands WMI_WLAN_PROFILE commands support for tlv path. Add WMI profile enable and trigger commands in tlv path Change-Id: I10f867b181b559b82c097d6a61236f2145549238 --- wmi/inc/wmi_unified_api.h | 12 +++ wmi/inc/wmi_unified_priv.h | 3 + wmi/src/wmi_unified_api.c | 11 +++ wmi/src/wmi_unified_tlv.c | 183 +++++++++++++++++++++++++++++++++++++ 4 files changed, 209 insertions(+) diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index b24f46e38f..330506c5dd 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1816,6 +1816,18 @@ QDF_STATUS wmi_unified_wlan_profile_trigger_cmd_send(wmi_unified_t wmi_handle, struct wlan_profile_params *param); +/** + * wmi_unified_wlan_profile_hist_intvl_cmd_send() - WMI wlan profile history + * cmd function + * @wmi_handle: handle to WMI. + * @param: pointer to hold wlan profile param + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS +wmi_unified_wlan_profile_hist_intvl_cmd_send(wmi_unified_t wmi_handle, + struct wlan_profile_params *param); + /** * wmi_unified_set_chan_cmd_send() - WMI set channel cmd function * @wmi_handle: handle to WMI. diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 189c693baf..664c04611d 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1099,6 +1099,9 @@ QDF_STATUS QDF_STATUS (*send_wlan_profile_trigger_cmd)(wmi_unified_t wmi_handle, struct wlan_profile_params *param); +QDF_STATUS (*send_wlan_profile_hist_intvl_cmd)(wmi_unified_t wmi_handle, + struct wlan_profile_params *param); + QDF_STATUS (*send_pdev_set_chan_cmd)(wmi_unified_t wmi_handle, struct channel_param *param); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 2360bc9709..94fca521d6 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -1146,6 +1146,17 @@ wmi_unified_wlan_profile_trigger_cmd_send(wmi_unified_t wmi_handle, return QDF_STATUS_E_FAILURE; } +QDF_STATUS +wmi_unified_wlan_profile_hist_intvl_cmd_send(wmi_unified_t wmi_handle, + struct wlan_profile_params *param) +{ + if (wmi_handle->ops->send_wlan_profile_hist_intvl_cmd) + return wmi_handle->ops->send_wlan_profile_hist_intvl_cmd( + wmi_handle, param); + + return QDF_STATUS_E_FAILURE; +} + QDF_STATUS wmi_unified_set_chan_cmd_send(wmi_unified_t wmi_handle, struct channel_param *param) diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 8fd1d0b083..88b402b861 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -7660,6 +7660,142 @@ send_pdev_fips_cmd_tlv(wmi_unified_t wmi_handle, return retval; } +/** + * send_wlan_profile_enable_cmd_tlv() - send wlan profile enable command + * to fw + * @wmi_handle: wmi handle + * @param: pointer to wlan profile param + * + * Return: 0 for success or error code + */ +static QDF_STATUS +send_wlan_profile_enable_cmd_tlv(wmi_unified_t wmi_handle, + struct wlan_profile_params *param) +{ + wmi_buf_t buf; + uint16_t len; + QDF_STATUS ret; + wmi_wlan_profile_enable_profile_id_cmd_fixed_param *profile_enable_cmd; + + len = sizeof(wmi_wlan_profile_enable_profile_id_cmd_fixed_param); + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("Failed to send WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID"); + return QDF_STATUS_E_NOMEM; + } + + profile_enable_cmd = + (wmi_wlan_profile_enable_profile_id_cmd_fixed_param *) + wmi_buf_data(buf); + WMITLV_SET_HDR(&profile_enable_cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_wlan_profile_enable_profile_id_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_wlan_profile_enable_profile_id_cmd_fixed_param)); + + profile_enable_cmd->profile_id = param->profile_id; + profile_enable_cmd->enable = param->enable; + wmi_mtrace(WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, + NO_SESSION, 0); + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID); + if (ret) { + WMI_LOGE("Failed to send PROFILE_ENABLE_PROFILE_ID_CMDID"); + wmi_buf_free(buf); + } + return ret; +} + +/** + * send_wlan_profile_trigger_cmd_tlv() - send wlan profile trigger command + * to fw + * @wmi_handle: wmi handle + * @param: pointer to wlan profile param + * + * Return: 0 for success or error code + */ +static QDF_STATUS +send_wlan_profile_trigger_cmd_tlv(wmi_unified_t wmi_handle, + struct wlan_profile_params *param) +{ + wmi_buf_t buf; + uint16_t len; + QDF_STATUS ret; + wmi_wlan_profile_trigger_cmd_fixed_param *prof_trig_cmd; + + len = sizeof(wmi_wlan_profile_trigger_cmd_fixed_param); + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("Failed to send WMI_WLAN_PROFILE_TRIGGER_CMDID"); + return QDF_STATUS_E_NOMEM; + } + + prof_trig_cmd = + (wmi_wlan_profile_trigger_cmd_fixed_param *) + wmi_buf_data(buf); + + WMITLV_SET_HDR(&prof_trig_cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_wlan_profile_trigger_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_wlan_profile_trigger_cmd_fixed_param)); + + prof_trig_cmd->enable = param->enable; + wmi_mtrace(WMI_WLAN_PROFILE_TRIGGER_CMDID, NO_SESSION, 0); + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_WLAN_PROFILE_TRIGGER_CMDID); + if (ret) { + WMI_LOGE("Failed to send WMI_WLAN_PROFILE_TRIGGER_CMDID"); + wmi_buf_free(buf); + } + return ret; +} + +/** + * send_wlan_profile_hist_intvl_cmd_tlv() - send wlan profile interval command + * to fw + * @wmi_handle: wmi handle + * @param: pointer to wlan profile param + * + * Return: 0 for success or error code + */ +static QDF_STATUS +send_wlan_profile_hist_intvl_cmd_tlv(wmi_unified_t wmi_handle, + struct wlan_profile_params *param) +{ + wmi_buf_t buf; + int32_t len = 0; + QDF_STATUS ret; + wmi_wlan_profile_set_hist_intvl_cmd_fixed_param *hist_intvl_cmd; + + len = sizeof(wmi_wlan_profile_set_hist_intvl_cmd_fixed_param); + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("Failed to send WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID"); + return QDF_STATUS_E_NOMEM; + } + + hist_intvl_cmd = + (wmi_wlan_profile_set_hist_intvl_cmd_fixed_param *) + wmi_buf_data(buf); + + WMITLV_SET_HDR(&hist_intvl_cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_wlan_profile_set_hist_intvl_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_wlan_profile_set_hist_intvl_cmd_fixed_param)); + + hist_intvl_cmd->profile_id = param->profile_id; + hist_intvl_cmd->value = param->enable; + wmi_mtrace(WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID, + NO_SESSION, 0); + + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID); + if (ret) { + WMI_LOGE("Failed to send PROFILE_SET_HIST_INTVL_CMDID"); + wmi_buf_free(buf); + } + return ret; +} + /** * send_fw_test_cmd_tlv() - send fw test command to fw. * @wmi_handle: wmi handle @@ -9975,6 +10111,26 @@ static QDF_STATUS extract_mib_stats_tlv(wmi_unified_t wmi_handle, static QDF_STATUS extract_profile_ctx_tlv(wmi_unified_t wmi_handle, void *evt_buf, wmi_host_wlan_profile_ctx_t *profile_ctx) { + WMI_WLAN_PROFILE_DATA_EVENTID_param_tlvs *param_buf; + + wmi_wlan_profile_ctx_t *ev; + + param_buf = (WMI_WLAN_PROFILE_DATA_EVENTID_param_tlvs *)evt_buf; + if (!param_buf) { + WMI_LOGE("%s: Invalid profile data event buf", __func__); + return QDF_STATUS_E_INVAL; + } + + ev = param_buf->profile_ctx; + + profile_ctx->tot = ev->tot; + profile_ctx->tx_msdu_cnt = ev->tx_msdu_cnt; + profile_ctx->tx_mpdu_cnt = ev->tx_mpdu_cnt; + profile_ctx->tx_ppdu_cnt = ev->tx_ppdu_cnt; + profile_ctx->rx_msdu_cnt = ev->rx_msdu_cnt; + profile_ctx->rx_mpdu_cnt = ev->rx_mpdu_cnt; + profile_ctx->bin_count = ev->bin_count; + return QDF_STATUS_SUCCESS; } @@ -9989,6 +10145,29 @@ static QDF_STATUS extract_profile_ctx_tlv(wmi_unified_t wmi_handle, static QDF_STATUS extract_profile_data_tlv(wmi_unified_t wmi_handle, void *evt_buf, uint8_t idx, wmi_host_wlan_profile_t *profile_data) { + WMI_WLAN_PROFILE_DATA_EVENTID_param_tlvs *param_buf; + wmi_wlan_profile_t *ev; + uint8_t *buf_ptr; + + param_buf = (WMI_WLAN_PROFILE_DATA_EVENTID_param_tlvs *)evt_buf; + if (!param_buf) { + WMI_LOGE("%s: Invalid profile data event buf", __func__); + return QDF_STATUS_E_INVAL; + } + + buf_ptr = (uint8_t *)param_buf->profile_ctx; + buf_ptr = buf_ptr + sizeof(wmi_wlan_profile_ctx_t) + WMI_TLV_HDR_SIZE; + + buf_ptr = buf_ptr + (sizeof(wmi_wlan_profile_t) * idx); + ev = (wmi_wlan_profile_t *)buf_ptr; + + profile_data->id = ev->id; + profile_data->cnt = ev->cnt; + profile_data->tot = ev->tot; + profile_data->min = ev->min; + profile_data->max = ev->max; + profile_data->hist_intvl = ev->hist_intvl; + qdf_mem_copy(profile_data->hist, ev->hist, sizeof(profile_data->hist)); return QDF_STATUS_SUCCESS; } @@ -13400,9 +13579,13 @@ struct wmi_ops tlv_ops = { .send_pdev_fips_cmd = send_pdev_fips_cmd_tlv, .extract_get_pn_data = extract_get_pn_data_tlv, .send_pdev_get_pn_cmd = send_pdev_get_pn_cmd_tlv, + .send_wlan_profile_enable_cmd = send_wlan_profile_enable_cmd_tlv, #ifdef WLAN_FEATURE_DISA .send_encrypt_decrypt_send_cmd = send_encrypt_decrypt_send_cmd_tlv, #endif + .send_wlan_profile_trigger_cmd = send_wlan_profile_trigger_cmd_tlv, + .send_wlan_profile_hist_intvl_cmd = + send_wlan_profile_hist_intvl_cmd_tlv, .is_management_record = is_management_record_tlv, .is_diag_event = is_diag_event_tlv, #ifdef WLAN_FEATURE_ACTION_OUI