iwl-fw-file.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  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) 2008 - 2014 Intel Corporation. All rights reserved.
  9. * Copyright(c) 2013 - 2014 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 <ilw@linux.intel.com>
  30. * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  31. *
  32. * BSD LICENSE
  33. *
  34. * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
  35. * Copyright(c) 2013 - 2014 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. #ifndef __iwl_fw_file_h__
  65. #define __iwl_fw_file_h__
  66. #include <linux/netdevice.h>
  67. /* v1/v2 uCode file layout */
  68. struct iwl_ucode_header {
  69. __le32 ver; /* major/minor/API/serial */
  70. union {
  71. struct {
  72. __le32 inst_size; /* bytes of runtime code */
  73. __le32 data_size; /* bytes of runtime data */
  74. __le32 init_size; /* bytes of init code */
  75. __le32 init_data_size; /* bytes of init data */
  76. __le32 boot_size; /* bytes of bootstrap code */
  77. u8 data[0]; /* in same order as sizes */
  78. } v1;
  79. struct {
  80. __le32 build; /* build number */
  81. __le32 inst_size; /* bytes of runtime code */
  82. __le32 data_size; /* bytes of runtime data */
  83. __le32 init_size; /* bytes of init code */
  84. __le32 init_data_size; /* bytes of init data */
  85. __le32 boot_size; /* bytes of bootstrap code */
  86. u8 data[0]; /* in same order as sizes */
  87. } v2;
  88. } u;
  89. };
  90. /*
  91. * new TLV uCode file layout
  92. *
  93. * The new TLV file format contains TLVs, that each specify
  94. * some piece of data.
  95. */
  96. enum iwl_ucode_tlv_type {
  97. IWL_UCODE_TLV_INVALID = 0, /* unused */
  98. IWL_UCODE_TLV_INST = 1,
  99. IWL_UCODE_TLV_DATA = 2,
  100. IWL_UCODE_TLV_INIT = 3,
  101. IWL_UCODE_TLV_INIT_DATA = 4,
  102. IWL_UCODE_TLV_BOOT = 5,
  103. IWL_UCODE_TLV_PROBE_MAX_LEN = 6, /* a u32 value */
  104. IWL_UCODE_TLV_PAN = 7,
  105. IWL_UCODE_TLV_RUNT_EVTLOG_PTR = 8,
  106. IWL_UCODE_TLV_RUNT_EVTLOG_SIZE = 9,
  107. IWL_UCODE_TLV_RUNT_ERRLOG_PTR = 10,
  108. IWL_UCODE_TLV_INIT_EVTLOG_PTR = 11,
  109. IWL_UCODE_TLV_INIT_EVTLOG_SIZE = 12,
  110. IWL_UCODE_TLV_INIT_ERRLOG_PTR = 13,
  111. IWL_UCODE_TLV_ENHANCE_SENS_TBL = 14,
  112. IWL_UCODE_TLV_PHY_CALIBRATION_SIZE = 15,
  113. IWL_UCODE_TLV_WOWLAN_INST = 16,
  114. IWL_UCODE_TLV_WOWLAN_DATA = 17,
  115. IWL_UCODE_TLV_FLAGS = 18,
  116. IWL_UCODE_TLV_SEC_RT = 19,
  117. IWL_UCODE_TLV_SEC_INIT = 20,
  118. IWL_UCODE_TLV_SEC_WOWLAN = 21,
  119. IWL_UCODE_TLV_DEF_CALIB = 22,
  120. IWL_UCODE_TLV_PHY_SKU = 23,
  121. IWL_UCODE_TLV_SECURE_SEC_RT = 24,
  122. IWL_UCODE_TLV_SECURE_SEC_INIT = 25,
  123. IWL_UCODE_TLV_SECURE_SEC_WOWLAN = 26,
  124. IWL_UCODE_TLV_NUM_OF_CPU = 27,
  125. IWL_UCODE_TLV_CSCHEME = 28,
  126. IWL_UCODE_TLV_API_CHANGES_SET = 29,
  127. IWL_UCODE_TLV_ENABLED_CAPABILITIES = 30,
  128. IWL_UCODE_TLV_N_SCAN_CHANNELS = 31,
  129. IWL_UCODE_TLV_SEC_RT_USNIFFER = 34,
  130. IWL_UCODE_TLV_FW_DBG_DEST = 38,
  131. IWL_UCODE_TLV_FW_DBG_CONF = 39,
  132. };
  133. struct iwl_ucode_tlv {
  134. __le32 type; /* see above */
  135. __le32 length; /* not including type/length fields */
  136. u8 data[0];
  137. };
  138. #define IWL_TLV_UCODE_MAGIC 0x0a4c5749
  139. #define FW_VER_HUMAN_READABLE_SZ 64
  140. struct iwl_tlv_ucode_header {
  141. /*
  142. * The TLV style ucode header is distinguished from
  143. * the v1/v2 style header by first four bytes being
  144. * zero, as such is an invalid combination of
  145. * major/minor/API/serial versions.
  146. */
  147. __le32 zero;
  148. __le32 magic;
  149. u8 human_readable[FW_VER_HUMAN_READABLE_SZ];
  150. __le32 ver; /* major/minor/API/serial */
  151. __le32 build;
  152. __le64 ignore;
  153. /*
  154. * The data contained herein has a TLV layout,
  155. * see above for the TLV header and types.
  156. * Note that each TLV is padded to a length
  157. * that is a multiple of 4 for alignment.
  158. */
  159. u8 data[0];
  160. };
  161. /*
  162. * ucode TLVs
  163. *
  164. * ability to get extension for: flags & capabilities from ucode binaries files
  165. */
  166. struct iwl_ucode_api {
  167. __le32 api_index;
  168. __le32 api_flags;
  169. } __packed;
  170. struct iwl_ucode_capa {
  171. __le32 api_index;
  172. __le32 api_capa;
  173. } __packed;
  174. /**
  175. * enum iwl_ucode_tlv_flag - ucode API flags
  176. * @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
  177. * was a separate TLV but moved here to save space.
  178. * @IWL_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behaviour on hidden SSID,
  179. * treats good CRC threshold as a boolean
  180. * @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
  181. * @IWL_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P.
  182. * @IWL_UCODE_TLV_FLAGS_DW_BC_TABLE: The SCD byte count table is in DWORDS
  183. * @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: This uCode image supports uAPSD
  184. * @IWL_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan
  185. * offload profile config command.
  186. * @IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six
  187. * (rather than two) IPv6 addresses
  188. * @IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID: not sending a probe with the SSID element
  189. * from the probe request template.
  190. * @IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL: new NS offload (small version)
  191. * @IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE: new NS offload (large version)
  192. * @IWL_UCODE_TLV_FLAGS_P2P_PM: P2P client supports PM as a stand alone MAC
  193. * @IWL_UCODE_TLV_FLAGS_P2P_BSS_PS_DCM: support power save on BSS station and
  194. * P2P client interfaces simultaneously if they are in different bindings.
  195. * @IWL_UCODE_TLV_FLAGS_P2P_BSS_PS_SCM: support power save on BSS station and
  196. * P2P client interfaces simultaneously if they are in same bindings.
  197. * @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: General support for uAPSD
  198. * @IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD: P2P client supports uAPSD power save
  199. * @IWL_UCODE_TLV_FLAGS_BCAST_FILTERING: uCode supports broadcast filtering.
  200. * @IWL_UCODE_TLV_FLAGS_GO_UAPSD: AP/GO interfaces support uAPSD clients
  201. * @IWL_UCODE_TLV_FLAGS_EBS_SUPPORT: this uCode image supports EBS.
  202. */
  203. enum iwl_ucode_tlv_flag {
  204. IWL_UCODE_TLV_FLAGS_PAN = BIT(0),
  205. IWL_UCODE_TLV_FLAGS_NEWSCAN = BIT(1),
  206. IWL_UCODE_TLV_FLAGS_MFP = BIT(2),
  207. IWL_UCODE_TLV_FLAGS_P2P = BIT(3),
  208. IWL_UCODE_TLV_FLAGS_DW_BC_TABLE = BIT(4),
  209. IWL_UCODE_TLV_FLAGS_SHORT_BL = BIT(7),
  210. IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS = BIT(10),
  211. IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID = BIT(12),
  212. IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL = BIT(15),
  213. IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE = BIT(16),
  214. IWL_UCODE_TLV_FLAGS_P2P_PM = BIT(21),
  215. IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_DCM = BIT(22),
  216. IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_SCM = BIT(23),
  217. IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT = BIT(24),
  218. IWL_UCODE_TLV_FLAGS_EBS_SUPPORT = BIT(25),
  219. IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD = BIT(26),
  220. IWL_UCODE_TLV_FLAGS_BCAST_FILTERING = BIT(29),
  221. IWL_UCODE_TLV_FLAGS_GO_UAPSD = BIT(30),
  222. };
  223. /**
  224. * enum iwl_ucode_tlv_api - ucode api
  225. * @IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID: wowlan config includes tid field.
  226. * @IWL_UCODE_TLV_CAPA_EXTENDED_BEACON: Support Extended beacon notification
  227. * @IWL_UCODE_TLV_API_BT_COEX_SPLIT: new API for BT Coex
  228. * @IWL_UCODE_TLV_API_CSA_FLOW: ucode can do unbind-bind flow for CSA.
  229. * @IWL_UCODE_TLV_API_DISABLE_STA_TX: ucode supports tx_disable bit.
  230. * @IWL_UCODE_TLV_API_LMAC_SCAN: This ucode uses LMAC unified scan API.
  231. * @IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF: ucode supports disabling dummy notif.
  232. * @IWL_UCODE_TLV_API_FRAGMENTED_SCAN: This ucode supports active dwell time
  233. * longer than the passive one, which is essential for fragmented scan.
  234. * @IWL_UCODE_TLV_API_BASIC_DWELL: use only basic dwell time in scan command,
  235. * regardless of the band or the number of the probes. FW will calculate
  236. * the actual dwell time.
  237. * @IWL_UCODE_TLV_API_SINGLE_SCAN_EBS: EBS is supported for single scans too.
  238. */
  239. enum iwl_ucode_tlv_api {
  240. IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID = BIT(0),
  241. IWL_UCODE_TLV_CAPA_EXTENDED_BEACON = BIT(1),
  242. IWL_UCODE_TLV_API_BT_COEX_SPLIT = BIT(3),
  243. IWL_UCODE_TLV_API_CSA_FLOW = BIT(4),
  244. IWL_UCODE_TLV_API_DISABLE_STA_TX = BIT(5),
  245. IWL_UCODE_TLV_API_LMAC_SCAN = BIT(6),
  246. IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF = BIT(7),
  247. IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8),
  248. IWL_UCODE_TLV_API_BASIC_DWELL = BIT(13),
  249. IWL_UCODE_TLV_API_SINGLE_SCAN_EBS = BIT(16),
  250. };
  251. /**
  252. * enum iwl_ucode_tlv_capa - ucode capabilities
  253. * @IWL_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3
  254. * @IWL_UCODE_TLV_CAPA_LAR_SUPPORT: supports Location Aware Regulatory
  255. * @IWL_UCODE_TLV_CAPA_UMAC_SCAN: supports UMAC scan.
  256. * @IWL_UCODE_TLV_CAPA_TDLS_SUPPORT: support basic TDLS functionality
  257. * @IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT: supports insertion of current
  258. * tx power value into TPC Report action frame and Link Measurement Report
  259. * action frame
  260. * @IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT: supports updating current
  261. * channel in DS parameter set element in probe requests.
  262. * @IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT: supports adding TPC Report IE in
  263. * probe requests.
  264. * @IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT: supports Quiet Period requests
  265. * @IWL_UCODE_TLV_CAPA_DQA_SUPPORT: supports dynamic queue allocation (DQA),
  266. * which also implies support for the scheduler configuration command
  267. * @IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH: supports TDLS channel switching
  268. * @IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT: supports Hot Spot Command
  269. */
  270. enum iwl_ucode_tlv_capa {
  271. IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0),
  272. IWL_UCODE_TLV_CAPA_LAR_SUPPORT = BIT(1),
  273. IWL_UCODE_TLV_CAPA_UMAC_SCAN = BIT(2),
  274. IWL_UCODE_TLV_CAPA_TDLS_SUPPORT = BIT(6),
  275. IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT = BIT(8),
  276. IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT = BIT(9),
  277. IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT = BIT(10),
  278. IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT = BIT(11),
  279. IWL_UCODE_TLV_CAPA_DQA_SUPPORT = BIT(12),
  280. IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH = BIT(13),
  281. IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT = BIT(18),
  282. };
  283. /* The default calibrate table size if not specified by firmware file */
  284. #define IWL_DEFAULT_STANDARD_PHY_CALIBRATE_TBL_SIZE 18
  285. #define IWL_MAX_STANDARD_PHY_CALIBRATE_TBL_SIZE 19
  286. #define IWL_MAX_PHY_CALIBRATE_TBL_SIZE 253
  287. /* The default max probe length if not specified by the firmware file */
  288. #define IWL_DEFAULT_MAX_PROBE_LENGTH 200
  289. /*
  290. * For 16.0 uCode and above, there is no differentiation between sections,
  291. * just an offset to the HW address.
  292. */
  293. #define IWL_UCODE_SECTION_MAX 12
  294. #define IWL_API_ARRAY_SIZE 1
  295. #define IWL_CAPABILITIES_ARRAY_SIZE 1
  296. #define CPU1_CPU2_SEPARATOR_SECTION 0xFFFFCCCC
  297. /* uCode version contains 4 values: Major/Minor/API/Serial */
  298. #define IWL_UCODE_MAJOR(ver) (((ver) & 0xFF000000) >> 24)
  299. #define IWL_UCODE_MINOR(ver) (((ver) & 0x00FF0000) >> 16)
  300. #define IWL_UCODE_API(ver) (((ver) & 0x0000FF00) >> 8)
  301. #define IWL_UCODE_SERIAL(ver) ((ver) & 0x000000FF)
  302. /*
  303. * Calibration control struct.
  304. * Sent as part of the phy configuration command.
  305. * @flow_trigger: bitmap for which calibrations to perform according to
  306. * flow triggers.
  307. * @event_trigger: bitmap for which calibrations to perform according to
  308. * event triggers.
  309. */
  310. struct iwl_tlv_calib_ctrl {
  311. __le32 flow_trigger;
  312. __le32 event_trigger;
  313. } __packed;
  314. enum iwl_fw_phy_cfg {
  315. FW_PHY_CFG_RADIO_TYPE_POS = 0,
  316. FW_PHY_CFG_RADIO_TYPE = 0x3 << FW_PHY_CFG_RADIO_TYPE_POS,
  317. FW_PHY_CFG_RADIO_STEP_POS = 2,
  318. FW_PHY_CFG_RADIO_STEP = 0x3 << FW_PHY_CFG_RADIO_STEP_POS,
  319. FW_PHY_CFG_RADIO_DASH_POS = 4,
  320. FW_PHY_CFG_RADIO_DASH = 0x3 << FW_PHY_CFG_RADIO_DASH_POS,
  321. FW_PHY_CFG_TX_CHAIN_POS = 16,
  322. FW_PHY_CFG_TX_CHAIN = 0xf << FW_PHY_CFG_TX_CHAIN_POS,
  323. FW_PHY_CFG_RX_CHAIN_POS = 20,
  324. FW_PHY_CFG_RX_CHAIN = 0xf << FW_PHY_CFG_RX_CHAIN_POS,
  325. };
  326. #define IWL_UCODE_MAX_CS 1
  327. /**
  328. * struct iwl_fw_cipher_scheme - a cipher scheme supported by FW.
  329. * @cipher: a cipher suite selector
  330. * @flags: cipher scheme flags (currently reserved for a future use)
  331. * @hdr_len: a size of MPDU security header
  332. * @pn_len: a size of PN
  333. * @pn_off: an offset of pn from the beginning of the security header
  334. * @key_idx_off: an offset of key index byte in the security header
  335. * @key_idx_mask: a bit mask of key_idx bits
  336. * @key_idx_shift: bit shift needed to get key_idx
  337. * @mic_len: mic length in bytes
  338. * @hw_cipher: a HW cipher index used in host commands
  339. */
  340. struct iwl_fw_cipher_scheme {
  341. __le32 cipher;
  342. u8 flags;
  343. u8 hdr_len;
  344. u8 pn_len;
  345. u8 pn_off;
  346. u8 key_idx_off;
  347. u8 key_idx_mask;
  348. u8 key_idx_shift;
  349. u8 mic_len;
  350. u8 hw_cipher;
  351. } __packed;
  352. enum iwl_fw_dbg_reg_operator {
  353. CSR_ASSIGN,
  354. CSR_SETBIT,
  355. CSR_CLEARBIT,
  356. PRPH_ASSIGN,
  357. PRPH_SETBIT,
  358. PRPH_CLEARBIT,
  359. };
  360. /**
  361. * struct iwl_fw_dbg_reg_op - an operation on a register
  362. *
  363. * @op: %enum iwl_fw_dbg_reg_operator
  364. * @addr: offset of the register
  365. * @val: value
  366. */
  367. struct iwl_fw_dbg_reg_op {
  368. u8 op;
  369. u8 reserved[3];
  370. __le32 addr;
  371. __le32 val;
  372. } __packed;
  373. /**
  374. * enum iwl_fw_dbg_monitor_mode - available monitor recording modes
  375. *
  376. * @SMEM_MODE: monitor stores the data in SMEM
  377. * @EXTERNAL_MODE: monitor stores the data in allocated DRAM
  378. * @MARBH_MODE: monitor stores the data in MARBH buffer
  379. */
  380. enum iwl_fw_dbg_monitor_mode {
  381. SMEM_MODE = 0,
  382. EXTERNAL_MODE = 1,
  383. MARBH_MODE = 2,
  384. };
  385. /**
  386. * struct iwl_fw_dbg_dest_tlv - configures the destination of the debug data
  387. *
  388. * @version: version of the TLV - currently 0
  389. * @monitor_mode: %enum iwl_fw_dbg_monitor_mode
  390. * @base_reg: addr of the base addr register (PRPH)
  391. * @end_reg: addr of the end addr register (PRPH)
  392. * @write_ptr_reg: the addr of the reg of the write pointer
  393. * @wrap_count: the addr of the reg of the wrap_count
  394. * @base_shift: shift right of the base addr reg
  395. * @end_shift: shift right of the end addr reg
  396. * @reg_ops: array of registers operations
  397. *
  398. * This parses IWL_UCODE_TLV_FW_DBG_DEST
  399. */
  400. struct iwl_fw_dbg_dest_tlv {
  401. u8 version;
  402. u8 monitor_mode;
  403. u8 reserved[2];
  404. __le32 base_reg;
  405. __le32 end_reg;
  406. __le32 write_ptr_reg;
  407. __le32 wrap_count;
  408. u8 base_shift;
  409. u8 end_shift;
  410. struct iwl_fw_dbg_reg_op reg_ops[0];
  411. } __packed;
  412. struct iwl_fw_dbg_conf_hcmd {
  413. u8 id;
  414. u8 reserved;
  415. __le16 len;
  416. u8 data[0];
  417. } __packed;
  418. /**
  419. * struct iwl_fw_dbg_trigger - a TLV that describes a debug configuration
  420. *
  421. * @enabled: is this trigger enabled
  422. * @reserved:
  423. * @len: length, in bytes, of the %trigger field
  424. * @trigger: pointer to a trigger struct
  425. */
  426. struct iwl_fw_dbg_trigger {
  427. u8 enabled;
  428. u8 reserved;
  429. u8 len;
  430. u8 trigger[0];
  431. } __packed;
  432. /**
  433. * enum iwl_fw_dbg_conf - configurations available
  434. *
  435. * @FW_DBG_CUSTOM: take this configuration from alive
  436. * Note that the trigger is NO-OP for this configuration
  437. */
  438. enum iwl_fw_dbg_conf {
  439. FW_DBG_CUSTOM = 0,
  440. /* must be last */
  441. FW_DBG_MAX,
  442. FW_DBG_INVALID = 0xff,
  443. };
  444. /**
  445. * struct iwl_fw_dbg_conf_tlv - a TLV that describes a debug configuration
  446. *
  447. * @id: %enum iwl_fw_dbg_conf
  448. * @usniffer: should the uSniffer image be used
  449. * @num_of_hcmds: how many HCMDs to send are present here
  450. * @hcmd: a variable length host command to be sent to apply the configuration.
  451. * If there is more than one HCMD to send, they will appear one after the
  452. * other and be sent in the order that they appear in.
  453. * This parses IWL_UCODE_TLV_FW_DBG_CONF
  454. */
  455. struct iwl_fw_dbg_conf_tlv {
  456. u8 id;
  457. u8 usniffer;
  458. u8 reserved;
  459. u8 num_of_hcmds;
  460. struct iwl_fw_dbg_conf_hcmd hcmd;
  461. /* struct iwl_fw_dbg_trigger sits after all variable length hcmds */
  462. } __packed;
  463. #endif /* __iwl_fw_file_h__ */