summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubhani Shaik <subhanis@codeaurora.org>2016-05-31 16:02:09 -0700
committerEcco Park <eccopark@google.com>2016-06-28 00:07:07 +0000
commitd61feef589f6f3bd8840a61129d6da2e5c020577 (patch)
treea07918d97ecfe6c8e0d1b622965ba33ab6ec8994
parent6443b7f3e1bc7e31fc83965be8ba76859e3c1997 (diff)
downloadwlan-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.cpp98
-rw-r--r--qcwcn/wifi_hal/wifilogger_diag.h37
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;