1/* Copyright (c) 2015, The Linux Foundation. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions 5 * are met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#ifndef __WIFI_HAL_WIFILOGGER_DIAG_H__ 30#define __WIFI_HAL_WIFILOGGER_DIAG_H__ 31 32#include "common.h" 33#include "wifi_hal.h" 34#include "wifilogger_event_defs.h" 35 36#include <netlink/genl/genl.h> 37#include <netlink/genl/family.h> 38#include <netlink/genl/ctrl.h> 39#include <linux/rtnetlink.h> 40 41#define ANI_NL_MSG_BASE 0x10 /* Some arbitrary base */ 42#define WIFI_HAL_USER_SOCK_PORT 646 43#define WLAN_NL_MSG_CNSS_HOST_EVENT_LOG 17 44#define ANI_NL_MSG_LOG_HOST_EVENT_LOG_TYPE 0x5050 45#define ANI_NL_MSG_LOG_HOST_PRINT_TYPE 89 46#define ANI_NL_MSG_LOG_FW_MSG_TYPE 92 47 48#define WLAN_PKT_LOG_STATS 0x18E0 49#define FEATURE_NOT_SUPPORTED 0xFF 50 51/* 52 * - verbose_level 0 corresponds to no collection 53 * - verbose_level 1 correspond to normal log level, with minimal user impact. 54 * this is the default value 55 * - verbose_level 2 are enabled when user is lazily trying to reproduce a 56 problem, wifi performances and power 57 * can be impacted but device should not otherwise be significantly impacted 58 * - verbose_level 3+ are used when trying to actively debug a problem 59 */ 60 61enum wifilogger_verbose_level { 62 VERBOSE_NO_COLLECTION, 63 VERBOSE_NORMAL_LOG, 64 VERBOSE_REPRO_PROBLEM, 65 VERBOSE_DEBUG_PROBLEM 66}; 67 68enum wifilogger_fw_diag_type { 69 DIAG_TYPE_FW_EVENT, /* send fw event- to diag*/ 70 DIAG_TYPE_FW_LOG, /* send log event- to diag*/ 71 DIAG_TYPE_FW_DEBUG_MSG, /* send dbg message- to diag*/ 72 DIAG_TYPE_FW_MSG = 4, /* send fw message- to diag*/ 73}; 74 75enum wifilogger_host_diag_type { 76 DIAG_TYPE_HOST_LOG_MSGS=1, 77 DIAG_TYPE_HOST_EVENTS=2, 78}; 79 80enum wlan_diag_frame_type { 81 WLAN_DIAG_TYPE_CONFIG, 82 WLAN_DIAG_TYPE_EVENT, /* Diag Events */ 83 WLAN_DIAG_TYPE_LOG, /* Diag Logs */ 84 WLAN_DIAG_TYPE_MSG, /* F3 messages */ 85 WLAN_DIAG_TYPE_LEGACY_MSG, 86}; 87 88static uint32_t get_le32(const uint8_t *pos) 89{ 90 return pos[0] | (pos[1] << 8) | (pos[2] << 16) | (pos[3] << 24); 91} 92 93typedef struct event_remap { 94 int q_event; 95 int g_event; 96} event_remap_t; 97 98typedef struct { 99 u32 diag_type; 100 u32 timestamp; 101 u32 length; 102 u32 dropped; 103 /* max ATH6KL_FWLOG_PAYLOAD_SIZE bytes */ 104 u_int8_t payload[0]; 105}__attribute__((packed)) dbglog_slot; 106 107typedef enum eAniNlModuleTypes { 108 ANI_NL_MSG_PUMAC = ANI_NL_MSG_BASE + 0x01, 109 ANI_NL_MSG_CNSS_DIAG = ANI_NL_MSG_BASE + 0x0B, 110 ANI_NL_MSG_LOG, 111 ANI_NL_MSG_MAX 112} tAniNlModTypes; 113 114//All Netlink messages must contain this header 115typedef struct sAniHdr { 116 unsigned short type; 117 unsigned short length; 118} tAniHdr, tAniMsgHdr; 119 120/* 121 * This msg hdr will always follow tAniHdr in all the messages exchanged 122 * between the Applications in userspace the Pseudo Driver, in either 123 * direction. 124 */ 125typedef struct sAniNlMsg { 126 struct nlmsghdr nlh; // Netlink Header 127 int radio; // unit number of the radio 128 tAniHdr wmsg; // Airgo Message Header 129} tAniNlHdr; 130 131typedef struct sAniAppRegReq { 132 tAniNlModTypes type; /* The module id that the application is 133 registering for */ 134 int pid; /* Pid returned in the nl_sockaddr structure 135 in the call getsockbyname after the 136 application opens and binds a netlink 137 socket */ 138} tAniNlAppRegReq; 139 140typedef struct host_event_hdr_s 141{ 142 u16 event_id; 143 u16 length; 144} host_event_hdr_t; 145 146typedef struct fw_event_hdr_s 147{ 148 u16 diag_type; 149 u16 length; 150} fw_event_hdr_t; 151 152typedef struct 153{ 154 u32 timestamp:24; 155 u32 diag_event_type:8; 156 /* Below 16-bit field has different formats based on event type */ 157 union { 158 u16 payload_len; 159 struct { 160 u8 payload_len; 161 u8 vdev_level:3; 162 u8 vdev_id:5; 163 }__attribute__((packed)) msg_hdr; 164 }__attribute__((packed)) u; 165 u16 diag_id; 166 u8 payload[0]; 167}__attribute__((packed)) fw_diag_msg_hdr_t; 168 169typedef struct wlan_wake_lock_event { 170 u32 status; 171 u32 reason; 172 u32 timeout; 173 u32 name_len; 174 char name[]; 175} wlan_wake_lock_event_t; 176 177enum log_event_type { 178 WLAN_LOG_TYPE_NON_FATAL, 179 WLAN_LOG_TYPE_FATAL, 180}; 181 182enum log_event_indicator { 183 WLAN_LOG_INDICATOR_UNUSED, 184 WLAN_LOG_INDICATOR_FRAMEWORK, 185 WLAN_LOG_INDICATOR_HOST_DRIVER, 186 WLAN_LOG_INDICATOR_FIRMWARE, 187}; 188 189enum log_event_host_reason_code { 190 WLAN_LOG_REASON_CODE_UNUSED, 191 WLAN_LOG_REASON_COMMAND_UNSUCCESSFUL, 192 WLAN_LOG_REASON_ROAM_FAIL, 193 WLAN_LOG_REASON_THREAD_STUCK, 194 WLAN_LOG_REASON_DATA_STALL, 195 WLAN_LOG_REASON_SME_COMMAND_STUCK, 196 WLAN_LOG_REASON_ZERO_SCAN_RESULTS, 197 WLAN_LOG_REASON_QUEUE_FULL, 198 WLAN_LOG_REASON_POWER_COLLAPSE_FAIL, 199 WLAN_LOG_REASON_SSR_FAIL, 200 WLAN_LOG_REASON_DISCONNECT_FAIL, 201 WLAN_LOG_REASON_CLEAN_UP_FAIL, 202 WLAN_LOG_REASON_MALLOC_FAIL, 203 WLAN_LOG_REASON_VOS_MSG_UNDER_RUN, 204 WLAN_LOG_REASON_MSG_POST_FAIL, 205}; 206 207typedef struct { 208 u32 is_fatal; 209 u32 indicator; 210 u32 reason_code; 211 u32 reserved; 212} wlan_log_complete_event_t; 213 214wifi_error diag_message_handler(hal_info *info, nl_msg *msg); 215 216#endif /* __WIFI_HAL_WIFILOGGER_DIAG_H__ */ 217