summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajesh Chauhan <rajeshc@qca.qualcomm.com>2013-10-09 23:14:37 -0700
committerMadan Mohan Koyyalamudi <mkoyyala@qca.qualcomm.com>2013-10-23 20:05:05 -0700
commit0a4b764a824e78bd52ec8be1aacc831ef08fb5ec (patch)
tree2edfbace85f9d29cc3816f06c7bd16059a620c47
parentd395614d38d1145980a97c35fe96461fbca6e9bb (diff)
cld: Add support for OEM Data Request and Response
Add support for OEM Data Request and Response CRs-fixed: 547980 Change-Id: I9751b4a7760c9e4dc8942a4da361e30d768513a2
-rw-r--r--CORE/SERVICES/COMMON/wmi_tlv_defs.h15
-rw-r--r--CORE/SERVICES/COMMON/wmi_unified.h7
-rw-r--r--CORE/SERVICES/WMA/inc/legacy/halMsgApi.h8
-rw-r--r--CORE/SERVICES/WMA/wma.c148
-rw-r--r--CORE/SERVICES/WMA/wma.h1
5 files changed, 168 insertions, 11 deletions
diff --git a/CORE/SERVICES/COMMON/wmi_tlv_defs.h b/CORE/SERVICES/COMMON/wmi_tlv_defs.h
index 4ddeb1092d7f..460c70996d77 100644
--- a/CORE/SERVICES/COMMON/wmi_tlv_defs.h
+++ b/CORE/SERVICES/COMMON/wmi_tlv_defs.h
@@ -864,17 +864,12 @@ WMITLV_CREATE_PARAM_STRUC(WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID);
/* RTT measurement request Cmd */
#define WMITLV_TABLE_WMI_RTT_MEASREQ_CMDID(id,op,buf,len) \
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_rtt_measreq_head, wmi_rtt_measreq_head, fixed_param, WMITLV_SIZE_FIX) \
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_channel, wmi_channel, channel, WMITLV_SIZE_FIX) \
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_rtt_measreq_body, body, WMITLV_SIZE_VAR)
-
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR)
WMITLV_CREATE_PARAM_STRUC(WMI_RTT_MEASREQ_CMDID);
/* RTT TSF Cmd */
#define WMITLV_TABLE_WMI_RTT_TSF_CMDID(id,op,buf,len) \
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_rtt_tsf_cmd_fixed_param, wmi_rtt_tsf_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) \
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_channel, wmi_channel, channel, WMITLV_SIZE_FIX)
-
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR)
WMITLV_CREATE_PARAM_STRUC(WMI_RTT_TSF_CMDID);
/* Spectral scan configure Cmd */
@@ -1382,9 +1377,8 @@ WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_EVENTID);
WMITLV_CREATE_PARAM_STRUC(WMI_WOW_WAKEUP_HOST_EVENTID);
/* RTT error report Event */
-#define WMITLV_TABLE_WMI_RTT_ERROR_REPORT_EVENTID(id,op,buf,len) \
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_rtt_event_header, wmi_rtt_event_hdr, rtt_hdr, WMITLV_SIZE_FIX) \
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_rtt_error_report_event_fixed_param, wmi_rtt_error_report_event_fixed_param, fixed_param, WMITLV_SIZE_FIX)
+#define WMITLV_TABLE_WMI_RTT_ERROR_REPORT_EVENTID(id,op,buf,len) \
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR)
WMITLV_CREATE_PARAM_STRUC(WMI_RTT_ERROR_REPORT_EVENTID);
/* Echo Event */
@@ -1448,7 +1442,6 @@ WMITLV_CREATE_PARAM_STRUC(WMI_DEBUG_PRINT_EVENTID);
/* RTT measurement report Event */
#define WMITLV_TABLE_WMI_RTT_MEASUREMENT_REPORT_EVENTID(id,op,buf,len) \
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_rtt_event_header, wmi_rtt_event_hdr, rtt_hdr, WMITLV_SIZE_FIX) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR)
WMITLV_CREATE_PARAM_STRUC(WMI_RTT_MEASUREMENT_REPORT_EVENTID);
diff --git a/CORE/SERVICES/COMMON/wmi_unified.h b/CORE/SERVICES/COMMON/wmi_unified.h
index dd6b87e9cc55..041f358c374c 100644
--- a/CORE/SERVICES/COMMON/wmi_unified.h
+++ b/CORE/SERVICES/COMMON/wmi_unified.h
@@ -674,6 +674,13 @@ typedef enum {
WMI_TDLS_PEER_EVENTID = WMI_EVT_GRP_START_ID(WMI_GRP_TDLS),
} WMI_EVT_ID;
+#define WMI_OEM_DATA_REQ_CMDID WMI_RTT_MEASREQ_CMDID
+#define WMI_OEM_DATA_RSP_EVENTID WMI_RTT_MEASUREMENT_REPORT_EVENTID
+#define WMI_OEM_DATA_ERROR_REPORT_EVENTID WMI_RTT_ERROR_REPORT_EVENTID
+#define WMI_OEM_DATA_RSP_EVENTID_param_tlvs \
+ WMI_RTT_MEASUREMENT_REPORT_EVENTID_param_tlvs
+#define WMI_OEM_DATA_ERROR_REPORT_EVENTID_param_tlvs \
+ WMI_RTT_ERROR_REPORT_EVENTID_param_tlvs
#define WMI_CHAN_LIST_TAG 0x1
#define WMI_SSID_LIST_TAG 0x2
diff --git a/CORE/SERVICES/WMA/inc/legacy/halMsgApi.h b/CORE/SERVICES/WMA/inc/legacy/halMsgApi.h
index da5c5126017e..f8ec797c281b 100644
--- a/CORE/SERVICES/WMA/inc/legacy/halMsgApi.h
+++ b/CORE/SERVICES/WMA/inc/legacy/halMsgApi.h
@@ -680,11 +680,19 @@ typedef struct {
#ifdef FEATURE_OEM_DATA_SUPPORT
#ifndef OEM_DATA_REQ_SIZE
+#ifdef QCA_WIFI_2_0
+#define OEM_DATA_REQ_SIZE 276
+#else
#define OEM_DATA_REQ_SIZE 134
#endif
+#endif
#ifndef OEM_DATA_RSP_SIZE
+#ifdef QCA_WIFI_2_0
+#define OEM_DATA_RSP_SIZE 1720
+#else
#define OEM_DATA_RSP_SIZE 1968
#endif
+#endif
typedef struct
{
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index a6bc51d5d1a1..a0d55818dd44 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -1164,6 +1164,86 @@ static int wma_gtk_offload_status_event(void *handle, u_int8_t *event,
}
#endif
+#ifdef FEATURE_OEM_DATA_SUPPORT
+static int wma_oem_data_rsp_event_callback(void *handle, u_int8_t *datap,
+ u_int32_t len)
+{
+ tp_wma_handle wma = (tp_wma_handle) handle;
+ WMI_OEM_DATA_RSP_EVENTID_param_tlvs *param_buf;
+ u_int8_t *data;
+ u_int32_t datalen;
+ tStartOemDataRsp *pStartOemDataRsp;
+
+ param_buf = (WMI_OEM_DATA_RSP_EVENTID_param_tlvs *)datap;
+ if (!param_buf) {
+ WMA_LOGE("%s: Received NULL buf ptr from FW", __func__);
+ return -ENOMEM;
+ }
+
+ data = param_buf->data;
+ datalen = param_buf->num_data;
+
+ if (!data) {
+ WMA_LOGE("%s: Received NULL data from FW", __func__);
+ return -EINVAL;
+ }
+
+ if (datalen > OEM_DATA_RSP_SIZE) {
+ WMA_LOGE("%s: Received data len (%d) exceeds max value (%d)",
+ __func__, datalen, OEM_DATA_RSP_SIZE);
+ return -EINVAL;
+ }
+
+ pStartOemDataRsp = vos_mem_malloc(sizeof(tStartOemDataRsp));
+
+ vos_mem_zero(pStartOemDataRsp, sizeof(tStartOemDataRsp));
+ vos_mem_copy(&pStartOemDataRsp->oemDataRsp[0], data, datalen);
+
+ wma_send_msg(wma, WDA_START_OEM_DATA_RSP, (void *)pStartOemDataRsp, 0);
+ vos_mem_free(data);
+ return 0;
+}
+
+static int wma_oem_data_error_report_event_callback(void *handle,
+ u_int8_t *datap, u_int32_t len)
+{
+ tp_wma_handle wma = (tp_wma_handle) handle;
+ WMI_OEM_DATA_ERROR_REPORT_EVENTID_param_tlvs *param_buf;
+ u_int8_t *data;
+ u_int32_t datalen;
+ tStartOemDataRsp *pStartOemDataRsp;
+
+ param_buf = (WMI_OEM_DATA_ERROR_REPORT_EVENTID_param_tlvs *)datap;
+ if (!param_buf) {
+ WMA_LOGE("%s: Received NULL buf ptr from FW", __func__);
+ return -ENOMEM;
+ }
+
+ data = param_buf->data;
+ datalen = param_buf->num_data;
+
+ if (!data) {
+ WMA_LOGE("%s: Received NULL data from FW", __func__);
+ return -EINVAL;
+ }
+
+ if (datalen > OEM_DATA_RSP_SIZE) {
+ WMA_LOGE("%s: Received data len (%d) exceeds max value (%d)",
+ __func__, datalen, OEM_DATA_RSP_SIZE);
+ return -EINVAL;
+ }
+
+ pStartOemDataRsp = vos_mem_malloc(sizeof(tStartOemDataRsp));
+
+ vos_mem_zero(pStartOemDataRsp, sizeof(tStartOemDataRsp));
+ vos_mem_copy(&pStartOemDataRsp->oemDataRsp[0], data, datalen);
+
+ wma_send_msg(wma, WDA_START_OEM_DATA_RSP, (void *)data, 0);
+ vos_mem_free(data);
+ return 0;
+}
+#endif /* FEATURE_OEM_DATA_SUPPORT */
+
/*
* Allocate and init wmi adaptation layer.
*/
@@ -1302,6 +1382,17 @@ VOS_STATUS WDA_open(v_VOID_t *vos_context, v_VOID_t *os_ctx,
wmi_unified_register_event_handler(wma_handle->wmi_handle,
WMI_PEER_STA_KICKOUT_EVENTID,
wma_peer_sta_kickout_event_handler);
+
+#ifdef FEATURE_OEM_DATA_SUPPORT
+ wmi_unified_register_event_handler(wma_handle->wmi_handle,
+ WMI_OEM_DATA_RSP_EVENTID,
+ wma_oem_data_rsp_event_callback);
+
+ wmi_unified_register_event_handler(wma_handle->wmi_handle,
+ WMI_OEM_DATA_ERROR_REPORT_EVENTID,
+ wma_oem_data_error_report_event_callback);
+#endif
+
/* Firmware debug log */
vos_status = dbglog_init(wma_handle->wmi_handle);
if (vos_status != VOS_STATUS_SUCCESS) {
@@ -6308,6 +6399,53 @@ static void wma_process_update_opmode(tp_wma_handle wma_handle,
update_vht_opmode->smesessionId);
}
+#ifdef FEATURE_OEM_DATA_SUPPORT
+static void wma_start_oem_data_req(tp_wma_handle wma_handle,
+ tStartOemDataReq *startOemDataReq)
+{
+ wmi_buf_t buf;
+ u_int8_t *cmd;
+ int ret = 0;
+
+ WMA_LOGD("%s: Send OEM Data Request to target", __func__);
+
+ if (!startOemDataReq)
+ return;
+
+ if (!wma_handle || !wma_handle->wmi_handle) {
+ WMA_LOGE("%s: WMA is closed, can not send Oem data request cmd", __func__);
+ return;
+ }
+
+ buf = wmi_buf_alloc(wma_handle->wmi_handle,
+ (OEM_DATA_REQ_SIZE + WMI_TLV_HDR_SIZE));
+ if (!buf) {
+ WMA_LOGE("%s:wmi_buf_alloc failed", __func__);
+ return;
+ }
+
+ cmd = (u_int8_t *)wmi_buf_data(buf);
+
+ WMITLV_SET_HDR(cmd, WMITLV_TAG_ARRAY_BYTE,
+ OEM_DATA_REQ_SIZE);
+ cmd += WMI_TLV_HDR_SIZE;
+ vos_mem_copy(cmd, &startOemDataReq->oemDataReq[0], OEM_DATA_REQ_SIZE);
+
+ ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf,
+ (OEM_DATA_REQ_SIZE +
+ WMI_TLV_HDR_SIZE),
+ WMI_OEM_DATA_REQ_CMDID);
+
+ if (ret != 0) {
+ WMA_LOGE("%s:wmi cmd send failed", __func__);
+ adf_nbuf_free(buf);
+ return;
+ }
+
+ return;
+}
+#endif /* FEATURE_OEM_DATA_SUPPORT */
+
static void wma_add_ts_req(tp_wma_handle wma, tAddTsParams *msg)
{
msg->status = eHAL_STATUS_SUCCESS;
@@ -6721,6 +6859,13 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg)
(tpSirGtkOffloadGetInfoRspParams)msg->bodyptr);
break;
#endif /* WLAN_FEATURE_GTK_OFFLOAD */
+
+#ifdef FEATURE_OEM_DATA_SUPPORT
+ case WDA_START_OEM_DATA_REQ:
+ wma_start_oem_data_req(wma_handle,
+ (tStartOemDataReq *)msg->bodyptr);
+#endif /* FEATURE_OEM_DATA_SUPPORT */
+
default:
WMA_LOGD("unknow msg type %x", msg->type);
/* Do Nothing? MSG Body should be freed at here */
@@ -7559,6 +7704,7 @@ static void wma_update_hdd_cfg(tp_wma_handle wma_handle)
#endif /* #ifdef WLAN_FEATURE_11AC */
#ifndef QCA_WIFI_ISOC
+ hdd_tgt_cfg.target_fw_version = wma_handle->target_fw_version;
wma_handle->tgt_cfg_update_cb(hdd_ctx, &hdd_tgt_cfg);
#endif
}
@@ -7724,6 +7870,8 @@ v_VOID_t wma_rx_service_ready_event(WMA_HANDLE handle, void *cmd_param_info)
#endif
wma_handle->num_rf_chains = ev->num_rf_chains;
+ wma_handle->target_fw_version = ev->fw_build_vers;
+
/* TODO: Recheck below line to dump service ready event */
/* dbg_print_wmi_service_11ac(ev); */
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index 39bf1bdb735d..41e38b8e12a8 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -326,6 +326,7 @@ typedef struct {
wmi_abi_version target_abi_vers; /* The target firmware version */
/* The final negotiated ABI version to be used for communicating */
wmi_abi_version final_abi_vers;
+ v_U32_t target_fw_version; /* Target f/w build version */
bool wmi_ready;
u_int32_t wlan_init_status;
adf_os_device_t adf_dev;