qcacmn: Extract OEM response params

Add API to extract OEM response parameters from corresponding
WMI event.

Change-Id: I9a45bdac4a9091bf21ad8b9877e485baad4a75db
CRs-Fixed: 2467938
This commit is contained in:
Abhiram Jogadenu
2019-06-04 16:46:34 +05:30
committed by nshrivas
parent 5e9e4549d9
commit 94748b3c46
6 changed files with 133 additions and 11 deletions

View File

@@ -84,7 +84,7 @@ static QDF_STATUS target_if_wifi_pos_replenish_ring(
static QDF_STATUS target_if_wifi_pos_get_indirect_data(
struct wifi_pos_psoc_priv_obj *priv_obj,
wmi_oem_indirect_data *indirect,
struct wmi_host_oem_indirect_data *indirect,
struct oem_data_rsp *rsp, uint32_t *cookie)
{
void *paddr = NULL;
@@ -127,7 +127,7 @@ static QDF_STATUS target_if_wifi_pos_replenish_ring(
static QDF_STATUS target_if_wifi_pos_get_indirect_data(
struct wifi_pos_psoc_priv_obj *priv_obj,
wmi_oem_indirect_data *indirect,
struct wmi_host_oem_indirect_data *indirect,
struct oem_data_rsp *rsp, uint32_t *cookie)
{
return QDF_STATUS_SUCCESS;
@@ -151,13 +151,13 @@ static int target_if_wifi_pos_oem_rsp_ev_handler(ol_scn_t scn,
uint8_t ring_idx = 0;
QDF_STATUS status;
uint32_t cookie = 0;
wmi_oem_indirect_data *indirect;
struct wmi_host_oem_indirect_data *indirect;
struct oem_data_rsp oem_rsp = {0};
struct wifi_pos_psoc_priv_obj *priv_obj;
struct wlan_objmgr_psoc *psoc = wifi_pos_get_psoc();
struct wlan_lmac_if_wifi_pos_rx_ops *wifi_pos_rx_ops = NULL;
WMI_OEM_RESPONSE_EVENTID_param_tlvs *param_buf =
(WMI_OEM_RESPONSE_EVENTID_param_tlvs *)data_buf;
struct wmi_oem_response_param oem_resp_param = {0};
wmi_unified_t wmi_handle;
if (!psoc) {
target_if_err("psoc is null");
@@ -166,6 +166,13 @@ static int target_if_wifi_pos_oem_rsp_ev_handler(ol_scn_t scn,
wlan_objmgr_psoc_get_ref(psoc, WLAN_WIFI_POS_TGT_IF_ID);
wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
if (!wmi_handle) {
target_if_err("wmi_handle is null");
wlan_objmgr_psoc_release_ref(psoc, WLAN_WIFI_POS_TGT_IF_ID);
return QDF_STATUS_NOT_INITIALIZED;
}
priv_obj = wifi_pos_get_psoc_priv_obj(psoc);
if (!priv_obj) {
target_if_err("priv_obj is null");
@@ -180,15 +187,19 @@ static int target_if_wifi_pos_oem_rsp_ev_handler(ol_scn_t scn,
return QDF_STATUS_NOT_INITIALIZED;
}
oem_rsp.rsp_len_1 = param_buf->num_data;
oem_rsp.data_1 = param_buf->data;
ret = wmi_extract_oem_response_param(wmi_handle,
data_buf,
&oem_resp_param);
if (param_buf->num_data2) {
oem_rsp.rsp_len_2 = param_buf->num_data2;
oem_rsp.data_2 = param_buf->data2;
oem_rsp.rsp_len_1 = oem_resp_param.num_data1;
oem_rsp.data_1 = oem_resp_param.data_1;
if (oem_resp_param.num_data2) {
oem_rsp.rsp_len_2 = oem_resp_param.num_data2;
oem_rsp.data_2 = oem_resp_param.data_2;
}
indirect = (wmi_oem_indirect_data *)param_buf->indirect_data;
indirect = &oem_resp_param.indirect_data;
status = target_if_wifi_pos_get_indirect_data(priv_obj, indirect,
&oem_rsp, &cookie);
if (QDF_IS_STATUS_ERROR(status)) {

View File

@@ -2451,4 +2451,18 @@ wmi_extract_cfr_peer_tx_event_param(void *wmi_hdl, void *evt_buf,
wmi_cfr_peer_tx_event_param *peer_tx_event);
#endif /* WLAN_CFR_ENABLE */
#ifdef WIFI_POS_CONVERGED
/**
* wmi_extract_oem_response_param() - WMI function to extract OEM response param
* @wmi_hdl: WMI handle
* @resp_buf: Buffer holding response data
* @oem_resp_param: zero-filled structure pointer to hold oem response data
*
* Return: QDF_STATUS_SUCCESS if success, else returns proper error code.
*/
QDF_STATUS
wmi_extract_oem_response_param(wmi_unified_t wmi_hdl, void *resp_buf,
struct wmi_oem_response_param *oem_resp_param);
#endif /* WIFI_POS_CONVERGED */
#endif /* _WMI_UNIFIED_API_H_ */

View File

@@ -7854,6 +7854,34 @@ typedef struct {
uint32_t chain_rssi[WMI_HOST_MAX_CHAINS];
} wmi_cfr_peer_tx_event_param;
/**
* struct wmi_host_oem_indirect_data - Indirect OEM data
* @pdev_id: pdev id
* @addr: 36 bit address
* @len: length of data in bytes
*/
struct wmi_host_oem_indirect_data {
uint32_t pdev_id;
uint64_t addr;
uint32_t len;
};
/**
* struct wmi_oem_response_param - OEM response info
* @num_data1: First data response length
* @data_1: First data
* @num_data2: Second data response length
* @data_2: Second data
* @indirect_data: Indirect data
*/
struct wmi_oem_response_param {
uint32_t num_data1;
uint8_t *data_1;
uint32_t num_data2;
uint8_t *data_2;
struct wmi_host_oem_indirect_data indirect_data;
};
/**
* struct mws_coex_state - Modem Wireless Subsystem(MWS) coex info
* @vdev_id : vdev id

View File

@@ -1984,6 +1984,11 @@ QDF_STATUS (*send_mws_coex_status_req_cmd)(wmi_unified_t wmi_handle,
QDF_STATUS (*set_rx_pkt_type_routing_tag_cmd)(
wmi_unified_t wmi_hdl, struct wmi_rx_pkt_protocol_routing_info *param);
#endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */
#ifdef WIFI_POS_CONVERGED
QDF_STATUS (*extract_oem_response_param)
(wmi_unified_t wmi_hdl, void *resp_buf,
struct wmi_oem_response_param *oem_resp_param);
#endif /* WIFI_POS_CONVERGED */
};
/* Forward declartion for psoc*/

View File

@@ -4069,3 +4069,17 @@ QDF_STATUS wmi_unified_send_mws_coex_req_cmd(struct wmi_unified *wmi_handle,
return QDF_STATUS_E_FAILURE;
}
#ifdef WIFI_POS_CONVERGED
QDF_STATUS
wmi_extract_oem_response_param(wmi_unified_t wmi_hdl, void *resp_buf,
struct wmi_oem_response_param *oem_resp_param)
{
if (wmi_hdl->ops->extract_oem_response_param)
return wmi_hdl->ops->extract_oem_response_param(wmi_hdl,
resp_buf,
oem_resp_param);
return QDF_STATUS_E_FAILURE;
}
#endif /* WIFI_POS_CONVERGED */

View File

@@ -11642,6 +11642,53 @@ static QDF_STATUS send_mws_coex_status_req_cmd_tlv(wmi_unified_t wmi_handle,
}
#endif
#ifdef WIFI_POS_CONVERGED
/**
* extract_oem_response_param_tlv() - Extract oem response params
* @wmi_handle: wmi handle
* @resp_buf: response buffer
* @oem_resp_param: pointer to hold oem response params
*
* Return: QDF_STATUS_SUCCESS on success or proper error code.
*/
static QDF_STATUS
extract_oem_response_param_tlv(wmi_unified_t wmi_handle, void *resp_buf,
struct wmi_oem_response_param *oem_resp_param)
{
uint64_t temp_addr;
WMI_OEM_RESPONSE_EVENTID_param_tlvs *param_buf =
(WMI_OEM_RESPONSE_EVENTID_param_tlvs *)resp_buf;
if (!param_buf) {
WMI_LOGE("Invalid OEM response");
return QDF_STATUS_E_INVAL;
}
if (param_buf->num_data) {
oem_resp_param->num_data1 = param_buf->num_data;
oem_resp_param->data_1 = param_buf->data;
}
if (param_buf->num_data2) {
oem_resp_param->num_data2 = param_buf->num_data2;
oem_resp_param->data_2 = param_buf->data2;
}
if (param_buf->indirect_data) {
oem_resp_param->indirect_data.pdev_id =
param_buf->indirect_data->pdev_id;
temp_addr = (param_buf->indirect_data->addr_hi) & 0xf;
oem_resp_param->indirect_data.addr =
param_buf->indirect_data->addr_lo +
((uint64_t)temp_addr << 32);
oem_resp_param->indirect_data.len =
param_buf->indirect_data->len;
}
return QDF_STATUS_SUCCESS;
}
#endif /* WIFI_POS_CONVERGED */
struct wmi_ops tlv_ops = {
.send_vdev_create_cmd = send_vdev_create_cmd_tlv,
.send_vdev_delete_cmd = send_vdev_delete_cmd_tlv,
@@ -11913,6 +11960,9 @@ struct wmi_ops tlv_ops = {
send_peer_cfr_capture_cmd_tlv,
.extract_cfr_peer_tx_event_param = extract_cfr_peer_tx_event_param_tlv,
#endif /* WLAN_CFR_ENABLE */
#ifdef WIFI_POS_CONVERGED
.extract_oem_response_param = extract_oem_response_param_tlv,
#endif /* WIFI_POS_CONVERGED */
#ifdef WLAN_MWS_INFO_DEBUGFS
.send_mws_coex_status_req_cmd = send_mws_coex_status_req_cmd_tlv,
#endif