From 92d5175130d9ca20546fae76ce61f9a6ecda1460 Mon Sep 17 00:00:00 2001 From: nobelj Date: Thu, 25 Jan 2018 16:35:36 -0800 Subject: [PATCH] qcacmn: Add support for chan_nf noise floor Add function for extract_nfcal_power_ev_param and register wmi_pdev_nfcal_power_all_channels_event_id event to support noise floor in HK. Change-Id: I6eef823b507be94c65df026664244eec7fc07e24 CRs-Fixed: 2157972 --- wmi/inc/wmi_unified_api.h | 3 +- wmi/inc/wmi_unified_param.h | 41 +++++++---------- wmi/inc/wmi_unified_priv.h | 3 +- wmi/src/wmi_unified_api.c | 6 ++- wmi/src/wmi_unified_non_tlv.c | 17 +++++-- wmi/src/wmi_unified_tlv.c | 86 +++++++++++++++++++++++++++++++++-- 6 files changed, 120 insertions(+), 36 deletions(-) diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index ebcdd0d9dd30..7a6a9f4204d7 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1424,7 +1424,8 @@ uint8_t *wmi_extract_dbglog_data_len(void *wmi_hdl, QDF_STATUS wmi_send_ext_resource_config(void *wmi_hdl, wmi_host_ext_resource_config *ext_cfg); -QDF_STATUS wmi_unified_nf_dbr_dbm_info_get_cmd_send(void *wmi_hdl); +QDF_STATUS wmi_unified_nf_dbr_dbm_info_get_cmd_send(void *wmi_hdl, + uint8_t mac_id); QDF_STATUS wmi_unified_packet_power_info_get_cmd_send(void *wmi_hdl, struct packet_power_info_params *param); diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index bbc6d86193f2..a95c22017f7b 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -287,8 +287,8 @@ #define WMI_HOST_TPC_RATE_MAX 160 #define WMI_HOST_TPC_TX_NUM_CHAIN 4 -#define WMI_HOST_RXG_CAL_CHAN_MAX 4 -#define WMI_HOST_MAX_NUM_CHAINS 4 +#define WMI_HOST_RXG_CAL_CHAN_MAX 8 +#define WMI_HOST_MAX_NUM_CHAINS 8 #define WMI_MAX_NUM_OF_RATE_THRESH 4 #define WMI_HOST_PDEV_MAX_VDEVS 17 @@ -6317,31 +6317,24 @@ typedef struct { /** * struct wmi_host_pdev_nfcal_power_all_channels_event - NF cal event data - * @nfdBr: - * chan0: {NFCalPower_chain0, NFCalPower_chain1, - * NFCalPower_chain2, NFCalPower_chain3}, - * chan1: {NFCalPower_chain0, NFCalPower_chain1, - * NFCalPower_chain2, NFCalPower_chain3}, - * chan2: {NFCalPower_chain0, NFCalPower_chain1, - * NFCalPower_chain2, NFCalPower_chain3}, - * chan3: {NFCalPower_chain0, NFCalPower_chain1, - * NFCalPower_chain2, NFCalPower_chain3}, - * @nfdBr: - * chan0: {NFCalPower_chain0, NFCalPower_chain1, - * NFCalPower_chain2, NFCalPower_chain3}, - * chan1: {NFCalPower_chain0, NFCalPower_chain1, - * NFCalPower_chain2, NFCalPower_chain3}, - * chan2: {NFCalPower_chain0, NFCalPower_chain1, - * NFCalPower_chain2, NFCalPower_chain3}, - * chan3: {NFCalPower_chain0, NFCalPower_chain1, - * NFCalPower_chain2, NFCalPower_chain3}, - * @freqNum: frequency number + * @nfdbr: + * chan[0 ~ 7]: {NFCalPower_chain0, NFCalPower_chain1, + * NFCalPower_chain2, NFCalPower_chain3, + * NFCalPower_chain4, NFCalPower_chain5, + * NFCalPower_chain6, NFCalPower_chain7}, + * @nfdbm: + * chan[0 ~ 7]: {NFCalPower_chain0, NFCalPower_chain1, + * NFCalPower_chain2, NFCalPower_chain3, + * NFCalPower_chain4, NFCalPower_chain5, + * NFCalPower_chain6, NFCalPower_chain7}, + * @freqnum: + * chan[0 ~ 7]: frequency number * @pdev_id: pdev_id */ typedef struct { - int8_t nfdBr[WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS]; - int8_t nfdBm[WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS]; - uint32_t freqNum[WMI_HOST_RXG_CAL_CHAN_MAX]; + int8_t nfdbr[WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS]; + int8_t nfdbm[WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS]; + uint32_t freqnum[WMI_HOST_RXG_CAL_CHAN_MAX]; uint32_t pdev_id; } wmi_host_pdev_nfcal_power_all_channels_event; diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 30bf99ac96f4..c21a89de468a 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1053,7 +1053,8 @@ uint8_t* (*extract_dbglog_data_len)(wmi_unified_t wmi_handle, void *evt_buf, QDF_STATUS (*send_ext_resource_config)(wmi_unified_t wmi_handle, wmi_host_ext_resource_config *ext_cfg); -QDF_STATUS (*send_nf_dbr_dbm_info_get_cmd)(wmi_unified_t wmi_handle); +QDF_STATUS (*send_nf_dbr_dbm_info_get_cmd)(wmi_unified_t wmi_handle, + uint8_t mac_id); QDF_STATUS (*send_packet_power_info_get_cmd)(wmi_unified_t wmi_handle, struct packet_power_info_params *param); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index d6d1a6203515..1db693bcf475 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -4881,15 +4881,17 @@ QDF_STATUS wmi_send_ext_resource_config(void *wmi_hdl, /** * wmi_unified_nf_dbr_dbm_info_get_cmd_send() - WMI request nf info function * @param wmi_handle : handle to WMI. + * @mac_id: mac_id * * @return QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure */ -QDF_STATUS wmi_unified_nf_dbr_dbm_info_get_cmd_send(void *wmi_hdl) +QDF_STATUS wmi_unified_nf_dbr_dbm_info_get_cmd_send(void *wmi_hdl, + uint8_t mac_id) { wmi_unified_t wmi = (wmi_unified_t) wmi_hdl; if (wmi->ops->send_nf_dbr_dbm_info_get_cmd) - return wmi->ops->send_nf_dbr_dbm_info_get_cmd(wmi); + return wmi->ops->send_nf_dbr_dbm_info_get_cmd(wmi, mac_id); return QDF_STATUS_E_FAILURE; } diff --git a/wmi/src/wmi_unified_non_tlv.c b/wmi/src/wmi_unified_non_tlv.c index 6aaa8b3fccf6..a7baa9284403 100644 --- a/wmi/src/wmi_unified_non_tlv.c +++ b/wmi/src/wmi_unified_non_tlv.c @@ -4592,11 +4592,12 @@ send_periodic_chan_stats_config_cmd_non_tlv(wmi_unified_t wmi_handle, /** * send_nf_dbr_dbm_info_get_cmd_non_tlv() - send request to get nf to fw * @wmi_handle: wmi handle + * @mac_id: radio context * * Return: 0 for success or error code */ static QDF_STATUS -send_nf_dbr_dbm_info_get_cmd_non_tlv(wmi_unified_t wmi_handle) +send_nf_dbr_dbm_info_get_cmd_non_tlv(wmi_unified_t wmi_handle, uint8_t mac_id) { wmi_buf_t wmibuf; @@ -6597,9 +6598,17 @@ static QDF_STATUS extract_nfcal_power_ev_param_non_tlv(wmi_unified_t wmi_handle, wmi_pdev_nfcal_power_all_channels_event *event = (wmi_pdev_nfcal_power_all_channels_event *)evt_buf; - qdf_mem_copy(param->nfdBr, event->nfdBr, sizeof(param->nfdBr)); - qdf_mem_copy(param->nfdBm, event->nfdBm, sizeof(param->nfdBm)); - qdf_mem_copy(param->freqNum, event->freqNum, sizeof(param->freqNum)); + if ((sizeof(event->nfdBr) == sizeof(param->nfdbr)) && + (sizeof(event->nfdBm) == sizeof(param->nfdbm)) && + (sizeof(event->freqNum) == sizeof(param->freqnum))) { + qdf_mem_copy(param->nfdbr, event->nfdBr, sizeof(param->nfdbr)); + qdf_mem_copy(param->nfdbm, event->nfdBm, sizeof(param->nfdbm)); + qdf_mem_copy(param->freqnum, event->freqNum, + sizeof(param->freqnum)); + } else { + WMI_LOGE("%s: %d Failed copy out of bound memory!\n", __func__, __LINE__); + return QDF_STATUS_E_RESOURCES; + } param->pdev_id = WMI_NON_TLV_DEFAULT_PDEV_ID; diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 2dd802a1c63e..f4c704209714 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -12477,20 +12477,30 @@ send_periodic_chan_stats_config_cmd_tlv(wmi_unified_t wmi_handle, /** * send_nf_dbr_dbm_info_get_cmd_tlv() - send request to get nf to fw * @wmi_handle: wmi handle + * @mac_id: radio context * * Return: 0 for success or error code */ static QDF_STATUS -send_nf_dbr_dbm_info_get_cmd_tlv(wmi_unified_t wmi_handle) +send_nf_dbr_dbm_info_get_cmd_tlv(wmi_unified_t wmi_handle, uint8_t mac_id) { wmi_buf_t buf; QDF_STATUS ret; + wmi_pdev_get_nfcal_power_fixed_param *cmd; + int32_t len = sizeof(*cmd); - buf = wmi_buf_alloc(wmi_handle, 0); + buf = wmi_buf_alloc(wmi_handle, len); if (buf == NULL) return QDF_STATUS_E_NOMEM; - ret = wmi_unified_cmd_send(wmi_handle, buf, 0, + cmd = (wmi_pdev_get_nfcal_power_fixed_param *)wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_pdev_get_nfcal_power_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_pdev_get_nfcal_power_fixed_param)); + cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(mac_id); + + ret = wmi_unified_cmd_send(wmi_handle, buf, len, WMI_PDEV_GET_NFCAL_POWER_CMDID); if (ret != 0) { WMI_LOGE("Sending get nfcal power cmd failed\n"); @@ -20572,6 +20582,72 @@ static QDF_STATUS extract_pdev_tpc_ev_param_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +/** + * extract_nfcal_power_ev_param_tlv() - extract noise floor calibration + * power param from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param param: Pointer to hold nf cal power param + * + * Return: 0 for success or error code + */ +static QDF_STATUS +extract_nfcal_power_ev_param_tlv(wmi_unified_t wmi_handle, + void *evt_buf, + wmi_host_pdev_nfcal_power_all_channels_event *param) +{ + WMI_PDEV_NFCAL_POWER_ALL_CHANNELS_EVENTID_param_tlvs *param_buf; + wmi_pdev_nfcal_power_all_channels_event_fixed_param *event; + wmi_pdev_nfcal_power_all_channels_nfdBr *ch_nfdbr; + wmi_pdev_nfcal_power_all_channels_nfdBm *ch_nfdbm; + wmi_pdev_nfcal_power_all_channels_freqNum *ch_freqnum; + uint32_t i; + + param_buf = + (WMI_PDEV_NFCAL_POWER_ALL_CHANNELS_EVENTID_param_tlvs *)evt_buf; + event = param_buf->fixed_param; + ch_nfdbr = param_buf->nfdbr; + ch_nfdbm = param_buf->nfdbm; + ch_freqnum = param_buf->freqnum; + + WMI_LOGD("pdev_id[%x], num_nfdbr[%d], num_nfdbm[%d] num_freqnum[%d]\n", + event->pdev_id, param_buf->num_nfdbr, + param_buf->num_nfdbm, param_buf->num_freqnum); + + if (param_buf->num_nfdbr > + WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS) { + WMI_LOGE("invalid number of nfdBr"); + return QDF_STATUS_E_FAILURE; + } + + if (param_buf->num_nfdbm > + WMI_HOST_RXG_CAL_CHAN_MAX * WMI_HOST_MAX_NUM_CHAINS) { + WMI_LOGE("invalid number of nfdBm"); + return QDF_STATUS_E_FAILURE; + } + + if (param_buf->num_freqnum > WMI_HOST_RXG_CAL_CHAN_MAX) { + WMI_LOGE("invalid number of freqNum"); + return QDF_STATUS_E_FAILURE; + } + + for (i = 0; i < param_buf->num_nfdbr; i++) { + param->nfdbr[i] = (int8_t)ch_nfdbr->nfdBr; + param->nfdbm[i] = (int8_t)ch_nfdbm->nfdBm; + ch_nfdbr++; + ch_nfdbm++; + } + + for (i = 0; i < param_buf->num_freqnum; i++) { + param->freqnum[i] = ch_freqnum->freqNum; + ch_freqnum++; + } + + param->pdev_id = event->pdev_id; + + return QDF_STATUS_SUCCESS; +} + #ifdef BIG_ENDIAN_HOST /** @@ -22502,6 +22578,7 @@ struct wmi_ops tlv_ops = { .extract_pdev_tpc_ev_param = extract_pdev_tpc_ev_param_tlv, .extract_pdev_tpc_config_ev_param = extract_pdev_tpc_config_ev_param_tlv, + .extract_nfcal_power_ev_param = extract_nfcal_power_ev_param_tlv, .extract_wds_addr_event = extract_wds_addr_event_tlv, .extract_peer_sta_ps_statechange_ev = extract_peer_sta_ps_statechange_ev_tlv, @@ -22631,7 +22708,8 @@ static void populate_tlv_events_id(uint32_t *event_ids) WMI_OFFLOAD_PROB_RESP_TX_STATUS_EVENTID; event_ids[wmi_mgmt_tx_completion_event_id] = WMI_MGMT_TX_COMPLETION_EVENTID; - + event_ids[wmi_pdev_nfcal_power_all_channels_event_id] = + WMI_PDEV_NFCAL_POWER_ALL_CHANNELS_EVENTID; event_ids[wmi_tx_delba_complete_event_id] = WMI_TX_DELBA_COMPLETE_EVENTID; event_ids[wmi_tx_addba_complete_event_id] =