diff options
| author | Rajesh Chauhan <rajeshc@qca.qualcomm.com> | 2013-10-09 23:14:37 -0700 |
|---|---|---|
| committer | Madan Mohan Koyyalamudi <mkoyyala@qca.qualcomm.com> | 2013-10-23 20:05:05 -0700 |
| commit | 0a4b764a824e78bd52ec8be1aacc831ef08fb5ec (patch) | |
| tree | 2edfbace85f9d29cc3816f06c7bd16059a620c47 | |
| parent | d395614d38d1145980a97c35fe96461fbca6e9bb (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.h | 15 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/wmi_unified.h | 7 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/inc/legacy/halMsgApi.h | 8 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 148 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 1 |
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; |
