From 3d32949b42ae461eb3c77e92333d61a58891a56a Mon Sep 17 00:00:00 2001 From: Edayilliam Jayadev Date: Fri, 6 Apr 2018 16:37:17 +0530 Subject: [PATCH] qcacmn: Extract meta data from dbr event Extract meta data from the dbr wmi event. CRs-Fixed: 2219818 Change-Id: Ib19588775060e75017e9777206132a0efeec6223 --- .../inc/target_if_direct_buf_rx_api.h | 6 +++++ .../src/target_if_direct_buf_rx_api.c | 1 + .../src/target_if_direct_buf_rx_main.c | 15 +++++++++++ wmi/inc/wmi_unified_api.h | 16 ++++++++++++ wmi/inc/wmi_unified_param.h | 10 ++++++++ wmi/inc/wmi_unified_priv.h | 5 ++++ wmi/src/wmi_unified_api.c | 15 +++++++++++ wmi/src/wmi_unified_tlv.c | 25 +++++++++++++++++++ 8 files changed, 93 insertions(+) diff --git a/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h b/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h index 897766e1ef..f13888a177 100644 --- a/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h +++ b/target_if/direct_buf_rx/inc/target_if_direct_buf_rx_api.h @@ -43,6 +43,8 @@ #define direct_buf_rx_exit() \ direct_buf_rx_logfl(QDF_TRACE_LEVEL_DEBUG, "exit") +#define DBR_MAX_CHAINS (8) + struct wlan_objmgr_psoc; struct wlan_lmac_if_tx_ops; @@ -50,10 +52,14 @@ struct wlan_lmac_if_tx_ops; * struct direct_buf_rx_data - direct buffer rx data * @dbr_len: Length of the buffer DMAed * @vaddr: Virtual address of the buffer that has DMAed data + * @meta_data_valid: Indicates that metadata is valid + * @meta_data: Meta data */ struct direct_buf_rx_data { size_t dbr_len; void *vaddr; + bool meta_data_valid; + struct direct_buf_rx_metadata meta_data; }; /** diff --git a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c index a966081ee1..75adb50227 100644 --- a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c +++ b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_api.c @@ -17,6 +17,7 @@ */ #include +#include #include #include #include diff --git a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c index 84a88659bf..fa6efc3ba9 100644 --- a/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c +++ b/target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c @@ -832,6 +832,13 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn, dbr_rsp.dbr_entries = qdf_mem_malloc(dbr_rsp.num_buf_release_entry * sizeof(struct direct_buf_rx_entry)); + if (dbr_rsp.num_meta_data_entry > dbr_rsp.num_buf_release_entry) { + direct_buf_rx_err("More than expected number of metadata"); + wlan_objmgr_pdev_release_ref(pdev, + WLAN_DIRECT_BUF_RX_ID); + return QDF_STATUS_E_FAILURE; + } + for (i = 0; i < dbr_rsp.num_buf_release_entry; i++) { if (wmi_extract_dbr_buf_release_entry( GET_WMI_HDL_FROM_PSOC(psoc), data_buf, i, @@ -851,6 +858,14 @@ static int target_if_direct_buf_rx_rsp_event_handler(ol_scn_t scn, WLAN_DIRECT_BUF_RX_ID); return QDF_STATUS_E_FAILURE; } + + dbr_data.meta_data_valid = false; + if (i < dbr_rsp.num_meta_data_entry) { + if (wmi_extract_dbr_buf_metadata( + GET_WMI_HDL_FROM_PSOC(psoc), data_buf, i, + &dbr_data.meta_data) == QDF_STATUS_SUCCESS) + dbr_data.meta_data_valid = true; + } ret = mod_param->dbr_rsp_handler(pdev, &dbr_data); status = target_if_dbr_replenish_ring(pdev, mod_param, dbr_data.vaddr, cookie); diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 3a1a485545..e4f5cb2b64 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1830,6 +1830,22 @@ QDF_STATUS wmi_extract_dbr_buf_release_entry( void *wmi_hdl, uint8_t *evt_buf, uint8_t idx, struct direct_buf_rx_entry *param); + +/** + * wmi_extract_dbr_buf_metadata: Extract direct buffer metadata + * + * @wmi_hdl: WMI handle + * @evt_buf: Event buffer + * @idx: Index of the module for which capability is received + * @param: Pointer to direct buffer metadata + * + * Return: QDF status of operation + */ +QDF_STATUS wmi_extract_dbr_buf_metadata( + void *wmi_hdl, + uint8_t *evt_buf, uint8_t idx, + struct direct_buf_rx_metadata *param); + QDF_STATUS wmi_extract_pdev_utf_event(void *wmi_hdl, uint8_t *evt_buf, struct wmi_host_pdev_utf_event *param); diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 9dfcbdd445..c725b405dd 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -8160,6 +8160,15 @@ struct wdsentry { #define WMI_HOST_DBR_DATA_ADDR_HI_HOST_DATA_SET(dword, val) \ WMI_HOST_F_RMW(dword, val, WMI_HOST_DBR_DATA_ADDR_HI_HOST_DATA) +/** + * struct direct_buf_rx_metadata: direct buffer metadata + * + * @noisefloor: noisefloor + */ +struct direct_buf_rx_metadata { + int32_t noisefloor[WMI_HOST_MAX_NUM_CHAINS]; +}; + /** * struct direct_buf_rx_entry: direct buffer rx release entry structure * @@ -8185,6 +8194,7 @@ struct direct_buf_rx_rsp { uint32_t pdev_id; uint32_t mod_id; uint32_t num_buf_release_entry; + uint32_t num_meta_data_entry; struct direct_buf_rx_entry *dbr_entries; }; diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 641da9a81b..fce32ad6c6 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1425,6 +1425,11 @@ QDF_STATUS (*extract_dbr_buf_release_entry)( uint8_t *evt_buf, uint8_t idx, struct direct_buf_rx_entry *param); +QDF_STATUS (*extract_dbr_buf_metadata)( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, uint8_t idx, + struct direct_buf_rx_metadata *param); + QDF_STATUS (*extract_pdev_utf_event)(wmi_unified_t wmi_hdl, uint8_t *evt_buf, struct wmi_host_pdev_utf_event *param); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 0f54a28975..a2fd441365 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -6907,6 +6907,21 @@ QDF_STATUS wmi_extract_dbr_buf_release_entry( return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_extract_dbr_buf_metadata( + void *wmi_hdl, + uint8_t *evt_buf, uint8_t idx, + struct direct_buf_rx_metadata *param) +{ + wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl; + + if (wmi_handle->ops->extract_dbr_buf_metadata) + return wmi_handle->ops->extract_dbr_buf_metadata( + wmi_handle, + evt_buf, idx, param); + + return QDF_STATUS_E_FAILURE; +} + /** * wmi_extract_pdev_utf_event() - * extract UTF data from pdev utf event diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 5ad4ccd1fc..505d7dd382 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -20070,6 +20070,7 @@ static QDF_STATUS extract_dbr_buf_release_fixed_tlv(wmi_unified_t wmi_handle, ev->pdev_id); param->mod_id = ev->mod_id; param->num_buf_release_entry = ev->num_buf_release_entry; + param->num_meta_data_entry = ev->num_meta_data_entry; WMI_LOGD("%s:pdev id %d mod id %d num buf release entry %d\n", __func__, param->pdev_id, param->mod_id, param->num_buf_release_entry); @@ -20101,6 +20102,29 @@ static QDF_STATUS extract_dbr_buf_release_entry_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +static QDF_STATUS extract_dbr_buf_metadata_tlv( + wmi_unified_t wmi_handle, uint8_t *event, + uint8_t idx, struct direct_buf_rx_metadata *param) +{ + WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf; + wmi_dma_buf_release_spectral_meta_data *entry; + + param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event; + if (!param_buf) + return QDF_STATUS_E_INVAL; + + entry = ¶m_buf->meta_data[idx]; + + if (!entry) { + WMI_LOGE("%s: Entry is NULL\n", __func__); + return QDF_STATUS_E_FAILURE; + } + + qdf_mem_copy(param->noisefloor, entry->noise_floor, + sizeof(entry->noise_floor)); + return QDF_STATUS_SUCCESS; +} + /** * extract_dcs_interference_type_tlv() - extract dcs interference type * from event @@ -22730,6 +22754,7 @@ struct wmi_ops tlv_ops = { extract_dbr_ring_cap_service_ready_ext_tlv, .extract_dbr_buf_release_fixed = extract_dbr_buf_release_fixed_tlv, .extract_dbr_buf_release_entry = extract_dbr_buf_release_entry_tlv, + .extract_dbr_buf_metadata = extract_dbr_buf_metadata_tlv, .extract_pdev_utf_event = extract_pdev_utf_event_tlv, .wmi_set_htc_tx_tag = wmi_set_htc_tx_tag_tlv, .extract_dcs_interference_type = extract_dcs_interference_type_tlv,