diff options
author | Subhani Shaik <subhanis@codeaurora.org> | 2016-05-31 16:02:09 -0700 |
---|---|---|
committer | Ecco Park <eccopark@google.com> | 2016-06-28 00:07:07 +0000 |
commit | d61feef589f6f3bd8840a61129d6da2e5c020577 (patch) | |
tree | a07918d97ecfe6c8e0d1b622965ba33ab6ec8994 | |
parent | 6443b7f3e1bc7e31fc83965be8ba76859e3c1997 (diff) | |
download | wlan-d61feef589f6f3bd8840a61129d6da2e5c020577.tar.gz |
WiFi-HAL: Support timestamp sync in firmware diag message
As part of timestamp synchronization firmware events, logs and F3
message formats have changed which would result in change in
processing of the same. This commit will address the change in
Wifi-Hal catering to the new format, at the same time maintaining
backward compatibility.
At least FW 4.3-00089 is required for working.
BUG: 29762703
-rw-r--r-- | qcwcn/wifi_hal/wifilogger_diag.cpp | 98 | ||||
-rw-r--r-- | qcwcn/wifi_hal/wifilogger_diag.h | 37 |
2 files changed, 107 insertions, 28 deletions
diff --git a/qcwcn/wifi_hal/wifilogger_diag.cpp b/qcwcn/wifi_hal/wifilogger_diag.cpp index 1017357..e07b780 100644 --- a/qcwcn/wifi_hal/wifilogger_diag.cpp +++ b/qcwcn/wifi_hal/wifilogger_diag.cpp @@ -834,29 +834,46 @@ static wifi_error process_beacon_received_event(hal_info *info, static wifi_error process_fw_diag_msg(hal_info *info, u8* buf, u16 length) { - u16 count = 0, id, payloadlen; + u16 count = 0, id; + u16 payloadlen = 0; + u16 hdr_size = 0; wifi_error status; + fw_diag_msg_fixed_hdr_t *diag_msg_fixed_hdr; fw_diag_msg_hdr_t *diag_msg_hdr; + fw_diag_msg_hdr_v2_t *diag_msg_hdr_v2; + u8 *payload = NULL; buf += 4; length -= 4; - while (length > (count + sizeof(fw_diag_msg_hdr_t))) { - diag_msg_hdr = (fw_diag_msg_hdr_t *)(buf + count); - - id = diag_msg_hdr->diag_id; - payloadlen = diag_msg_hdr->u.payload_len; - - switch (diag_msg_hdr->diag_event_type) { + while (length > (count + sizeof(fw_diag_msg_fixed_hdr_t))) { + diag_msg_fixed_hdr = (fw_diag_msg_fixed_hdr_t *)(buf + count); + switch (diag_msg_fixed_hdr->diag_event_type) { case WLAN_DIAG_TYPE_EVENT: + case WLAN_DIAG_TYPE_EVENT_V2: { + if (WLAN_DIAG_TYPE_EVENT == + diag_msg_fixed_hdr->diag_event_type) { + diag_msg_hdr = (fw_diag_msg_hdr_t *)diag_msg_fixed_hdr; + id = diag_msg_hdr->diag_id; + payloadlen = diag_msg_hdr->u.payload_len; + hdr_size = sizeof(fw_diag_msg_hdr_t); + payload = diag_msg_hdr->payload; + } else { + diag_msg_hdr_v2 = + (fw_diag_msg_hdr_v2_t *)diag_msg_fixed_hdr; + id = diag_msg_hdr_v2->diag_id; + payloadlen = diag_msg_hdr_v2->u.payload_len; + hdr_size = sizeof(fw_diag_msg_hdr_v2_t); + payload = diag_msg_hdr_v2->payload; + } switch (id) { case EVENT_WLAN_BT_COEX_BT_SCO_START: case EVENT_WLAN_BT_COEX_BT_SCO_STOP: case EVENT_WLAN_BT_COEX_BT_HID_START: case EVENT_WLAN_BT_COEX_BT_HID_STOP: status = process_bt_coex_event(info, id, - diag_msg_hdr->payload, + payload, payloadlen); if (status != WIFI_SUCCESS) { ALOGE("Failed to process bt_coex event"); @@ -866,7 +883,7 @@ static wifi_error process_fw_diag_msg(hal_info *info, u8* buf, u16 length) case EVENT_WLAN_BT_COEX_BT_SCAN_START: case EVENT_WLAN_BT_COEX_BT_SCAN_STOP: status = process_bt_coex_scan_event(info, id, - diag_msg_hdr->payload, + payload, payloadlen); if (status != WIFI_SUCCESS) { ALOGE("Failed to process bt_coex_scan event"); @@ -880,7 +897,7 @@ static wifi_error process_fw_diag_msg(hal_info *info, u8* buf, u16 length) case EVENT_WLAN_EXTSCAN_FEATURE_STOP: case EVENT_WLAN_EXTSCAN_RESULTS_AVAILABLE: status = process_extscan_event(info, id, - diag_msg_hdr->payload, + payload, payloadlen); if (status != WIFI_SUCCESS) { ALOGE("Failed to process extscan event"); @@ -892,7 +909,7 @@ static wifi_error process_fw_diag_msg(hal_info *info, u8* buf, u16 length) case EVENT_WLAN_ROAM_CANDIDATE_FOUND: case EVENT_WLAN_ROAM_SCAN_CONFIG: status = process_roam_event(info, id, - diag_msg_hdr->payload, + payload, payloadlen); if (status != WIFI_SUCCESS) { ALOGE("Failed to process roam event"); @@ -901,7 +918,7 @@ static wifi_error process_fw_diag_msg(hal_info *info, u8* buf, u16 length) break; case EVENT_WLAN_ADD_BLOCK_ACK_SUCCESS: status = process_addba_success_event(info, - diag_msg_hdr->payload, + payload, payloadlen); if (status != WIFI_SUCCESS) { ALOGE("Failed to process addba success event"); @@ -910,7 +927,7 @@ static wifi_error process_fw_diag_msg(hal_info *info, u8* buf, u16 length) break; case EVENT_WLAN_ADD_BLOCK_ACK_FAILED: status = process_addba_failed_event(info, - diag_msg_hdr->payload, + payload, payloadlen); if (status != WIFI_SUCCESS) { ALOGE("Failed to process addba failed event"); @@ -919,7 +936,7 @@ static wifi_error process_fw_diag_msg(hal_info *info, u8* buf, u16 length) break; case EVENT_WLAN_BEACON_EVENT: status = process_beacon_received_event(info, - diag_msg_hdr->payload, + payload, payloadlen); if (status != WIFI_SUCCESS) { ALOGE("Failed to process beacon received event"); @@ -932,14 +949,25 @@ static wifi_error process_fw_diag_msg(hal_info *info, u8* buf, u16 length) } break; case WLAN_DIAG_TYPE_LOG: + case WLAN_DIAG_TYPE_LOG_V2: { - id = diag_msg_hdr->diag_id; - payloadlen = diag_msg_hdr->u.payload_len; - + if (WLAN_DIAG_TYPE_LOG == diag_msg_fixed_hdr->diag_event_type) { + diag_msg_hdr = (fw_diag_msg_hdr_t *)diag_msg_fixed_hdr; + id = diag_msg_hdr->diag_id; + payloadlen = diag_msg_hdr->u.payload_len; + hdr_size = sizeof(fw_diag_msg_hdr_t); + payload = diag_msg_hdr->payload; + } else { + diag_msg_hdr_v2 = (fw_diag_msg_hdr_v2_t *)diag_msg_fixed_hdr; + id = diag_msg_hdr_v2->diag_id; + payloadlen = diag_msg_hdr_v2->u.payload_len; + hdr_size = sizeof(fw_diag_msg_hdr_v2_t); + payload = diag_msg_hdr_v2->payload; + } switch (id) { case LOG_WLAN_EXTSCAN_CAPABILITIES: status = process_log_extscan_capabilities(info, - diag_msg_hdr->payload, + payload, payloadlen); if (status != WIFI_SUCCESS) { ALOGE("Failed to process extscan capabilities"); @@ -947,22 +975,46 @@ static wifi_error process_fw_diag_msg(hal_info *info, u8* buf, u16 length) } break; default: - return WIFI_SUCCESS; + break; } } break; case WLAN_DIAG_TYPE_MSG: - { + diag_msg_hdr = (fw_diag_msg_hdr_t *)diag_msg_fixed_hdr; + id = diag_msg_hdr->diag_id; /* Length field is only one byte for WLAN_DIAG_TYPE_MSG */ payloadlen = diag_msg_hdr->u.msg_hdr.payload_len; + hdr_size = sizeof(fw_diag_msg_hdr_t); + payload = diag_msg_hdr->payload; + process_firmware_prints(info, (u8 *)diag_msg_fixed_hdr, + payloadlen + hdr_size); + break; + case WLAN_DIAG_TYPE_MSG_V2: + diag_msg_hdr_v2 = (fw_diag_msg_hdr_v2_t *)diag_msg_fixed_hdr; + id = diag_msg_hdr_v2->diag_id; + /* Length field is only one byte for WLAN_DIAG_TYPE_MSG_V2 */ + payloadlen = diag_msg_hdr_v2->u.msg_hdr.payload_len; + hdr_size = sizeof(fw_diag_msg_hdr_v2_t); + payload = diag_msg_hdr_v2->payload; + process_firmware_prints(info, (u8 *)diag_msg_fixed_hdr, + payloadlen + hdr_size); + break; + case WLAN_DIAG_TYPE_CONFIG: + { + /* Base timestamp is part of this diag type */ + diag_msg_hdr = (fw_diag_msg_hdr_t *) diag_msg_fixed_hdr; + id = diag_msg_hdr->diag_id; + payload = diag_msg_hdr->payload; + payloadlen = diag_msg_hdr->u.payload_len; + hdr_size = sizeof(fw_diag_msg_hdr_t); process_firmware_prints(info, (u8 *)diag_msg_hdr, - payloadlen + sizeof(fw_diag_msg_hdr_t)); + payloadlen + hdr_size); } break; default: return WIFI_SUCCESS; } - count += payloadlen + sizeof(fw_diag_msg_hdr_t); + count += payloadlen + hdr_size; } return WIFI_SUCCESS; } diff --git a/qcwcn/wifi_hal/wifilogger_diag.h b/qcwcn/wifi_hal/wifilogger_diag.h index 11f08c4..ce64b1d 100644 --- a/qcwcn/wifi_hal/wifilogger_diag.h +++ b/qcwcn/wifi_hal/wifilogger_diag.h @@ -78,11 +78,14 @@ enum wifilogger_host_diag_type { }; enum wlan_diag_frame_type { - WLAN_DIAG_TYPE_CONFIG, - WLAN_DIAG_TYPE_EVENT, /* Diag Events */ - WLAN_DIAG_TYPE_LOG, /* Diag Logs */ - WLAN_DIAG_TYPE_MSG, /* F3 messages */ - WLAN_DIAG_TYPE_LEGACY_MSG, + WLAN_DIAG_TYPE_CONFIG, + WLAN_DIAG_TYPE_EVENT, /* Diag Events */ + WLAN_DIAG_TYPE_LOG, /* Diag Logs */ + WLAN_DIAG_TYPE_MSG, /* F3 messages */ + WLAN_DIAG_TYPE_LEGACY_MSG, + WLAN_DIAG_TYPE_EVENT_V2, + WLAN_DIAG_TYPE_LOG_V2, + WLAN_DIAG_TYPE_MSG_V2, }; static uint32_t get_le32(const uint8_t *pos) @@ -151,6 +154,12 @@ typedef struct fw_event_hdr_s typedef struct { + u32 reserved:24; + u32 diag_event_type:8; +}__attribute__((packed)) fw_diag_msg_fixed_hdr_t; + +typedef struct +{ u32 timestamp:24; u32 diag_event_type:8; /* Below 16-bit field has different formats based on event type */ @@ -166,6 +175,24 @@ typedef struct u8 payload[0]; }__attribute__((packed)) fw_diag_msg_hdr_t; +typedef struct +{ + u32 unused:24; + u32 diag_event_type:8; + u32 timestamp; + /* Below 16-bit field has different formats based on event type */ + union { + u16 payload_len; + struct { + u8 payload_len; + u8 vdev_level:3; + u8 vdev_id:5; + }__attribute__((packed)) msg_hdr; + }__attribute__((packed)) u; + u16 diag_id; + u8 payload[0]; +}__attribute__((packed)) fw_diag_msg_hdr_v2_t; + typedef struct wlan_wake_lock_event { u32 status; u32 reason; |