qcacmn: Extract meta data from dbr event

Extract meta data from the dbr wmi event.

CRs-Fixed: 2219818
Change-Id: Ib19588775060e75017e9777206132a0efeec6223
This commit is contained in:
Edayilliam Jayadev
2018-04-06 16:37:17 +05:30
committed by nshrivas
parent 3b0f9169c5
commit 3d32949b42
8 changed files with 93 additions and 0 deletions

View File

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

View File

@@ -17,6 +17,7 @@
*/
#include <qdf_status.h>
#include <wmi_unified_api.h>
#include <target_if_direct_buf_rx_api.h>
#include <wlan_objmgr_cmn.h>
#include <wlan_objmgr_global_obj.h>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 = &param_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,