diff --git a/os_if/linux/qca_vendor.h b/os_if/linux/qca_vendor.h index 45af353122..f8709cd24b 100644 --- a/os_if/linux/qca_vendor.h +++ b/os_if/linux/qca_vendor.h @@ -841,6 +841,7 @@ enum qca_nl80211_vendor_subcmds_index { QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX, QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX, #endif /* FEATURE_WLAN_EXTSCAN */ + QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_CONFIGURATION_INDEX, QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX, #ifdef WLAN_FEATURE_MEMDUMP QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP_INDEX, diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h index 96e1a02fbc..3e3b60763e 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h @@ -200,6 +200,7 @@ typedef void (*wlan_objmgr_peer_status_handler)( * @WLAN_POLICY_MGR_ID: Policy Manager operations * @WLAN_SPECTRAL_ID: Spectral operations * @WLAN_SPLITMAC_ID SplitMac + * @WLAN_DEBUG_ID Debug operations * @WLAN_REF_ID_MAX: Max id used to generate ref count tracking array */ /* New value added to the enum must also be reflected in function @@ -235,6 +236,7 @@ typedef enum { WLAN_SA_API_ID = 26, WLAN_SPECTRAL_ID = 27, WLAN_SPLITMAC_ID = 28, + WLAN_DEBUG_ID = 29, WLAN_REF_ID_MAX, } wlan_objmgr_ref_dbgid; @@ -277,6 +279,7 @@ static inline char *string_from_dbgid(wlan_objmgr_ref_dbgid id) "WLAN_SA_API_ID", "WLAN_SPECTRAL_ID", "WLAN_SPLITMAC_ID", + "WLAN_DEBUG_ID", "WLAN_REF_ID_MAX" }; return (char *)strings[id]; diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 984730b12c..b1bd75a550 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1448,6 +1448,9 @@ QDF_STATUS wmi_extract_pdev_stats(void *wmi_hdl, void *evt_buf, uint32_t index, wmi_host_pdev_stats *pdev_stats); +QDF_STATUS wmi_extract_unit_test(void *wmi_hdl, void *evt_buf, + wmi_unit_test_event *unit_test, uint32_t maxspace); + QDF_STATUS wmi_extract_pdev_ext_stats(void *wmi_hdl, void *evt_buf, uint32_t index, wmi_host_pdev_ext_stats *pdev_ext_stats); diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 8e5957b597..7b023b193e 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -3576,12 +3576,16 @@ struct ssid_hotlist_request_params { * @vdev_id: vdev id * @module_id: module id * @num_args: number of arguments + * @diag_token: dialog token, which identifies the transaction. + * this number is generated by wifitool and may be used to + * identify the transaction in the event path * @args: arguments */ struct wmi_unit_test_cmd { uint32_t vdev_id; uint32_t module_id; uint32_t num_args; + uint32_t diag_token; uint32_t args[WMI_MAX_NUM_ARGS]; }; @@ -5136,6 +5140,32 @@ typedef struct { uint32_t mib_int_count; } wmi_host_pdev_stats; + +/** + * struct wmi_unit_test_event - Structure corresponding to WMI Unit test event + * @vdev_id: VDEV ID + * @module_id: MODULE ID + * @diag_token: Diag Token (the number that was generated in the unit-test cmd) + * @flag: flag has 2 bits 0x1 indicates status, and 0x2 indicates done-bit + * @payload_len: payload_len (blindly copied from payload_len field in WMI) + * @buffer_len: actual number of data bytes in the variable data size TLV + * buffer_len is likely to be the nearest multiple of 4 (from + * payload_len). both buffer_len and payload_len need to be + * passed to wifitool so that the driver can be agnostic + * regarding these differences. + * @buffer: data buffer + */ +typedef struct { + uint32_t vdev_id; + uint32_t module_id; + uint32_t diag_token; + uint32_t flag; + uint32_t payload_len; + uint32_t buffer_len; + uint8_t buffer[1]; +} wmi_unit_test_event; + + /** * struct wmi_host_snr_info - WMI host Signal to noise ration info * @bcn_snr: beacon SNR @@ -5407,6 +5437,7 @@ typedef enum { wmi_update_whal_mib_stats_event_id, wmi_update_vdev_rate_stats_event_id, wmi_diag_event_id, + wmi_unit_test_event_id, wmi_ocb_set_sched_event_id, wmi_dbg_mesg_flush_complete_event_id, wmi_rssi_breach_event_id, diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index d05e53d45d..52d739cff0 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1223,6 +1223,9 @@ QDF_STATUS (*extract_all_stats_count)(wmi_unified_t wmi_handle, void *evt_buf, QDF_STATUS (*extract_pdev_stats)(wmi_unified_t wmi_handle, void *evt_buf, uint32_t index, wmi_host_pdev_stats *pdev_stats); +QDF_STATUS (*extract_unit_test)(wmi_unified_t wmi_handle, void *evt_buf, + wmi_unit_test_event *unit_test, uint32_t maxspace); + QDF_STATUS (*extract_pdev_ext_stats)(wmi_unified_t wmi_handle, void *evt_buf, uint32_t index, wmi_host_pdev_ext_stats *pdev_ext_stats); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 03ac0214e8..c9f86cb9b0 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -6007,6 +6007,27 @@ QDF_STATUS wmi_extract_pdev_stats(void *wmi_hdl, void *evt_buf, return QDF_STATUS_E_FAILURE; } +/** + * extract_unit_test() - extract unit test from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param unit_test: Pointer to hold unit-test header + * @param maxspace: The amount of space in evt_buf + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_extract_unit_test(void *wmi_hdl, void *evt_buf, + wmi_unit_test_event *unit_test, uint32_t maxspace) +{ + wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + + if (wmi_handle->ops->extract_unit_test) + return wmi_handle->ops->extract_unit_test(wmi_handle, + evt_buf, unit_test, maxspace); + + return QDF_STATUS_E_FAILURE; +} + /** * wmi_extract_pdev_ext_stats() - extract extended pdev stats from event * @wmi_handle: wmi handle diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index f64fe4a54d..cc74bf8104 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -15180,10 +15180,14 @@ static QDF_STATUS send_unit_test_cmd_tlv(wmi_unified_t wmi_handle, cmd->vdev_id = wmi_utest->vdev_id; cmd->module_id = wmi_utest->module_id; cmd->num_args = wmi_utest->num_args; + cmd->diag_token = wmi_utest->diag_token; buf_ptr += sizeof(wmi_unit_test_cmd_fixed_param); WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32, (wmi_utest->num_args * sizeof(uint32_t))); unit_test_cmd_args = (A_UINT32 *) (buf_ptr + WMI_TLV_HDR_SIZE); + WMI_LOGI("%s: VDEV ID: %d\n", __func__, cmd->vdev_id); + WMI_LOGI("%s: MODULE ID: %d\n", __func__, cmd->module_id); + WMI_LOGI("%s: TOKEN: %d\n", __func__, cmd->diag_token); WMI_LOGI("%s: %d num of args = ", __func__, wmi_utest->num_args); for (i = 0; (i < wmi_utest->num_args && i < WMI_MAX_NUM_ARGS); i++) { unit_test_cmd_args[i] = wmi_utest->args[i]; @@ -17878,6 +17882,48 @@ static QDF_STATUS extract_pdev_stats_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +/** + * extract_unit_test_tlv() - extract unit test data + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param unit_test: pointer to hold unit test data + * @param maxspace: Amount of space in evt_buf + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +static QDF_STATUS extract_unit_test_tlv(wmi_unified_t wmi_handle, + void *evt_buf, wmi_unit_test_event *unit_test, uint32_t maxspace) +{ + WMI_UNIT_TEST_EVENTID_param_tlvs *param_buf; + wmi_unit_test_event_fixed_param *ev_param; + uint32_t num_bufp; + uint32_t copy_size; + uint8_t *bufp; + + param_buf = (WMI_UNIT_TEST_EVENTID_param_tlvs *) evt_buf; + ev_param = param_buf->fixed_param; + bufp = param_buf->bufp; + num_bufp = param_buf->num_bufp; + unit_test->vdev_id = ev_param->vdev_id; + unit_test->module_id = ev_param->module_id; + unit_test->diag_token = ev_param->diag_token; + unit_test->flag = ev_param->flag; + unit_test->payload_len = ev_param->payload_len; + WMI_LOGI("%s:vdev_id:%d mod_id:%d diag_token:%d flag:%d\n", __func__, + ev_param->vdev_id, + ev_param->module_id, + ev_param->diag_token, + ev_param->flag); + WMI_LOGD("%s: Unit-test data given below %d", __func__, num_bufp); + qdf_trace_hex_dump(QDF_MODULE_ID_WMI, QDF_TRACE_LEVEL_DEBUG, + bufp, num_bufp); + copy_size = (num_bufp < maxspace) ? num_bufp : maxspace; + qdf_mem_copy(unit_test->buffer, bufp, copy_size); + unit_test->buffer_len = copy_size; + + return QDF_STATUS_SUCCESS; +} + /** * extract_pdev_ext_stats_tlv() - extract extended pdev stats from event * @wmi_handle: wmi handle @@ -20261,6 +20307,7 @@ struct wmi_ops tlv_ops = { .extract_peer_sta_kickout_ev = extract_peer_sta_kickout_ev_tlv, .extract_all_stats_count = extract_all_stats_counts_tlv, .extract_pdev_stats = extract_pdev_stats_tlv, + .extract_unit_test = extract_unit_test_tlv, .extract_pdev_ext_stats = extract_pdev_ext_stats_tlv, .extract_vdev_stats = extract_vdev_stats_tlv, .extract_peer_stats = extract_peer_stats_tlv, @@ -20479,6 +20526,7 @@ static void populate_tlv_events_id(uint32_t *event_ids) WMI_UPDATE_VDEV_RATE_STATS_EVENTID; event_ids[wmi_diag_event_id] = WMI_DIAG_EVENTID; + event_ids[wmi_unit_test_event_id] = WMI_UNIT_TEST_EVENTID; /** Set OCB Sched Response, deprecated */ event_ids[wmi_ocb_set_sched_event_id] = WMI_OCB_SET_SCHED_EVENTID;