1/****************************************************************************** 2 * 3 * This file is provided under a dual BSD/GPLv2 license. When using or 4 * redistributing this file, you may do so under either license. 5 * 6 * GPL LICENSE SUMMARY 7 * 8 * Copyright(c) 2014 Intel Corporation. All rights reserved. 9 * Copyright(c) 2014 - 2015 Intel Mobile Communications GmbH 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of version 2 of the GNU General Public License as 13 * published by the Free Software Foundation. 14 * 15 * This program is distributed in the hope that it will be useful, but 16 * WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 23 * USA 24 * 25 * The full GNU General Public License is included in this distribution 26 * in the file called COPYING. 27 * 28 * Contact Information: 29 * Intel Linux Wireless <linuxwifi@intel.com> 30 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 31 * 32 * BSD LICENSE 33 * 34 * Copyright(c) 2014 Intel Corporation. All rights reserved. 35 * Copyright(c) 2014 - 2015 Intel Mobile Communications GmbH 36 * All rights reserved. 37 * 38 * Redistribution and use in source and binary forms, with or without 39 * modification, are permitted provided that the following conditions 40 * are met: 41 * 42 * * Redistributions of source code must retain the above copyright 43 * notice, this list of conditions and the following disclaimer. 44 * * Redistributions in binary form must reproduce the above copyright 45 * notice, this list of conditions and the following disclaimer in 46 * the documentation and/or other materials provided with the 47 * distribution. 48 * * Neither the name Intel Corporation nor the names of its 49 * contributors may be used to endorse or promote products derived 50 * from this software without specific prior written permission. 51 * 52 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 53 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 54 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 55 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 56 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 57 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 58 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 59 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 60 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 61 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 62 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 63 *****************************************************************************/ 64 65#ifndef __fw_error_dump_h__ 66#define __fw_error_dump_h__ 67 68#include <linux/types.h> 69 70#define IWL_FW_ERROR_DUMP_BARKER 0x14789632 71 72/** 73 * enum iwl_fw_error_dump_type - types of data in the dump file 74 * @IWL_FW_ERROR_DUMP_CSR: Control Status Registers - from offset 0 75 * @IWL_FW_ERROR_DUMP_RXF: 76 * @IWL_FW_ERROR_DUMP_TXCMD: last TX command data, structured as 77 * &struct iwl_fw_error_dump_txcmd packets 78 * @IWL_FW_ERROR_DUMP_DEV_FW_INFO: struct %iwl_fw_error_dump_info 79 * info on the device / firmware. 80 * @IWL_FW_ERROR_DUMP_FW_MONITOR: firmware monitor 81 * @IWL_FW_ERROR_DUMP_PRPH: range of periphery registers - there can be several 82 * sections like this in a single file. 83 * @IWL_FW_ERROR_DUMP_FH_REGS: range of FH registers 84 * @IWL_FW_ERROR_DUMP_MEM: chunk of memory 85 * @IWL_FW_ERROR_DUMP_ERROR_INFO: description of what triggered this dump. 86 * Structured as &struct iwl_fw_error_dump_trigger_desc. 87 * @IWL_FW_ERROR_DUMP_RB: the content of an RB structured as 88 * &struct iwl_fw_error_dump_rb 89 * @IWL_FW_ERROR_PAGING: UMAC's image memory segments which were 90 * paged to the DRAM. 91 * @IWL_FW_ERROR_DUMP_RADIO_REG: Dump the radio registers. 92 */ 93enum iwl_fw_error_dump_type { 94 /* 0 is deprecated */ 95 IWL_FW_ERROR_DUMP_CSR = 1, 96 IWL_FW_ERROR_DUMP_RXF = 2, 97 IWL_FW_ERROR_DUMP_TXCMD = 3, 98 IWL_FW_ERROR_DUMP_DEV_FW_INFO = 4, 99 IWL_FW_ERROR_DUMP_FW_MONITOR = 5, 100 IWL_FW_ERROR_DUMP_PRPH = 6, 101 IWL_FW_ERROR_DUMP_TXF = 7, 102 IWL_FW_ERROR_DUMP_FH_REGS = 8, 103 IWL_FW_ERROR_DUMP_MEM = 9, 104 IWL_FW_ERROR_DUMP_ERROR_INFO = 10, 105 IWL_FW_ERROR_DUMP_RB = 11, 106 IWL_FW_ERROR_DUMP_PAGING = 12, 107 IWL_FW_ERROR_DUMP_RADIO_REG = 13, 108 109 IWL_FW_ERROR_DUMP_MAX, 110}; 111 112/** 113 * struct iwl_fw_error_dump_data - data for one type 114 * @type: %enum iwl_fw_error_dump_type 115 * @len: the length starting from %data 116 * @data: the data itself 117 */ 118struct iwl_fw_error_dump_data { 119 __le32 type; 120 __le32 len; 121 __u8 data[]; 122} __packed; 123 124/** 125 * struct iwl_fw_error_dump_file - the layout of the header of the file 126 * @barker: must be %IWL_FW_ERROR_DUMP_BARKER 127 * @file_len: the length of all the file starting from %barker 128 * @data: array of %struct iwl_fw_error_dump_data 129 */ 130struct iwl_fw_error_dump_file { 131 __le32 barker; 132 __le32 file_len; 133 u8 data[0]; 134} __packed; 135 136/** 137 * struct iwl_fw_error_dump_txcmd - TX command data 138 * @cmdlen: original length of command 139 * @caplen: captured length of command (may be less) 140 * @data: captured command data, @caplen bytes 141 */ 142struct iwl_fw_error_dump_txcmd { 143 __le32 cmdlen; 144 __le32 caplen; 145 u8 data[]; 146} __packed; 147 148/** 149 * struct iwl_fw_error_dump_fifo - RX/TX FIFO data 150 * @fifo_num: number of FIFO (starting from 0) 151 * @available_bytes: num of bytes available in FIFO (may be less than FIFO size) 152 * @wr_ptr: position of write pointer 153 * @rd_ptr: position of read pointer 154 * @fence_ptr: position of fence pointer 155 * @fence_mode: the current mode of the fence (before locking) - 156 * 0=follow RD pointer ; 1 = freeze 157 * @data: all of the FIFO's data 158 */ 159struct iwl_fw_error_dump_fifo { 160 __le32 fifo_num; 161 __le32 available_bytes; 162 __le32 wr_ptr; 163 __le32 rd_ptr; 164 __le32 fence_ptr; 165 __le32 fence_mode; 166 u8 data[]; 167} __packed; 168 169enum iwl_fw_error_dump_family { 170 IWL_FW_ERROR_DUMP_FAMILY_7 = 7, 171 IWL_FW_ERROR_DUMP_FAMILY_8 = 8, 172}; 173 174/** 175 * struct iwl_fw_error_dump_info - info on the device / firmware 176 * @device_family: the family of the device (7 / 8) 177 * @hw_step: the step of the device 178 * @fw_human_readable: human readable FW version 179 * @dev_human_readable: name of the device 180 * @bus_human_readable: name of the bus used 181 */ 182struct iwl_fw_error_dump_info { 183 __le32 device_family; 184 __le32 hw_step; 185 u8 fw_human_readable[FW_VER_HUMAN_READABLE_SZ]; 186 u8 dev_human_readable[64]; 187 u8 bus_human_readable[8]; 188} __packed; 189 190/** 191 * struct iwl_fw_error_dump_fw_mon - FW monitor data 192 * @fw_mon_wr_ptr: the position of the write pointer in the cyclic buffer 193 * @fw_mon_base_ptr: base pointer of the data 194 * @fw_mon_cycle_cnt: number of wraparounds 195 * @reserved: for future use 196 * @data: captured data 197 */ 198struct iwl_fw_error_dump_fw_mon { 199 __le32 fw_mon_wr_ptr; 200 __le32 fw_mon_base_ptr; 201 __le32 fw_mon_cycle_cnt; 202 __le32 reserved[3]; 203 u8 data[]; 204} __packed; 205 206/** 207 * struct iwl_fw_error_dump_prph - periphery registers data 208 * @prph_start: address of the first register in this chunk 209 * @data: the content of the registers 210 */ 211struct iwl_fw_error_dump_prph { 212 __le32 prph_start; 213 __le32 data[]; 214}; 215 216enum iwl_fw_error_dump_mem_type { 217 IWL_FW_ERROR_DUMP_MEM_SRAM, 218 IWL_FW_ERROR_DUMP_MEM_SMEM, 219}; 220 221/** 222 * struct iwl_fw_error_dump_mem - chunk of memory 223 * @type: %enum iwl_fw_error_dump_mem_type 224 * @offset: the offset from which the memory was read 225 * @data: the content of the memory 226 */ 227struct iwl_fw_error_dump_mem { 228 __le32 type; 229 __le32 offset; 230 u8 data[]; 231}; 232 233/** 234 * struct iwl_fw_error_dump_rb - content of an Receive Buffer 235 * @index: the index of the Receive Buffer in the Rx queue 236 * @rxq: the RB's Rx queue 237 * @reserved: 238 * @data: the content of the Receive Buffer 239 */ 240struct iwl_fw_error_dump_rb { 241 __le32 index; 242 __le32 rxq; 243 __le32 reserved; 244 u8 data[]; 245}; 246 247/** 248 * struct iwl_fw_error_dump_paging - content of the UMAC's image page 249 * block on DRAM 250 * @index: the index of the page block 251 * @reserved: 252 * @data: the content of the page block 253 */ 254struct iwl_fw_error_dump_paging { 255 __le32 index; 256 __le32 reserved; 257 u8 data[]; 258}; 259 260/** 261 * iwl_fw_error_next_data - advance fw error dump data pointer 262 * @data: previous data block 263 * Returns: next data block 264 */ 265static inline struct iwl_fw_error_dump_data * 266iwl_fw_error_next_data(struct iwl_fw_error_dump_data *data) 267{ 268 return (void *)(data->data + le32_to_cpu(data->len)); 269} 270 271/** 272 * enum iwl_fw_dbg_trigger - triggers available 273 * 274 * @FW_DBG_TRIGGER_USER: trigger log collection by user 275 * This should not be defined as a trigger to the driver, but a value the 276 * driver should set to indicate that the trigger was initiated by the 277 * user. 278 * @FW_DBG_TRIGGER_FW_ASSERT: trigger log collection when the firmware asserts 279 * @FW_DBG_TRIGGER_MISSED_BEACONS: trigger log collection when beacons are 280 * missed. 281 * @FW_DBG_TRIGGER_CHANNEL_SWITCH: trigger log collection upon channel switch. 282 * @FW_DBG_TRIGGER_FW_NOTIF: trigger log collection when the firmware sends a 283 * command response or a notification. 284 * @FW_DBG_TRIGGER_MLME: trigger log collection upon MLME event. 285 * @FW_DBG_TRIGGER_STATS: trigger log collection upon statistics threshold. 286 * @FW_DBG_TRIGGER_RSSI: trigger log collection when the rssi of the beacon 287 * goes below a threshold. 288 * @FW_DBG_TRIGGER_TXQ_TIMERS: configures the timers for the Tx queue hang 289 * detection. 290 * @FW_DBG_TRIGGER_TIME_EVENT: trigger log collection upon time events related 291 * events. 292 * @FW_DBG_TRIGGER_BA: trigger log collection upon BlockAck related events. 293 * @FW_DBG_TX_LATENCY: trigger log collection when the tx latency goes above a 294 * threshold. 295 * @FW_DBG_TDLS: trigger log collection upon TDLS related events. 296 * @FW_DBG_TRIGGER_TX_STATUS: trigger log collection upon tx status when 297 * the firmware sends a tx reply. 298 */ 299enum iwl_fw_dbg_trigger { 300 FW_DBG_TRIGGER_INVALID = 0, 301 FW_DBG_TRIGGER_USER, 302 FW_DBG_TRIGGER_FW_ASSERT, 303 FW_DBG_TRIGGER_MISSED_BEACONS, 304 FW_DBG_TRIGGER_CHANNEL_SWITCH, 305 FW_DBG_TRIGGER_FW_NOTIF, 306 FW_DBG_TRIGGER_MLME, 307 FW_DBG_TRIGGER_STATS, 308 FW_DBG_TRIGGER_RSSI, 309 FW_DBG_TRIGGER_TXQ_TIMERS, 310 FW_DBG_TRIGGER_TIME_EVENT, 311 FW_DBG_TRIGGER_BA, 312 FW_DBG_TRIGGER_TX_LATENCY, 313 FW_DBG_TRIGGER_TDLS, 314 FW_DBG_TRIGGER_TX_STATUS, 315 316 /* must be last */ 317 FW_DBG_TRIGGER_MAX, 318}; 319 320/** 321 * struct iwl_fw_error_dump_trigger_desc - describes the trigger condition 322 * @type: %enum iwl_fw_dbg_trigger 323 * @data: raw data about what happened 324 */ 325struct iwl_fw_error_dump_trigger_desc { 326 __le32 type; 327 u8 data[]; 328}; 329 330#endif /* __fw_error_dump_h__ */ 331