if_iwnreg.h revision 1.1 1 1.1 ober /* $OpenBSD: if_iwnreg.h,v 1.9 2007/11/27 20:59:40 damien Exp $ */
2 1.1 ober
3 1.1 ober /*-
4 1.1 ober * Copyright (c) 2007
5 1.1 ober * Damien Bergamini <damien.bergamini (at) free.fr>
6 1.1 ober *
7 1.1 ober * Permission to use, copy, modify, and distribute this software for any
8 1.1 ober * purpose with or without fee is hereby granted, provided that the above
9 1.1 ober * copyright notice and this permission notice appear in all copies.
10 1.1 ober *
11 1.1 ober * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 1.1 ober * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 1.1 ober * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 1.1 ober * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 1.1 ober * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 1.1 ober * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 1.1 ober * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 1.1 ober */
19 1.1 ober
20 1.1 ober #define IWN_TX_RING_COUNT 256
21 1.1 ober #define IWN_RX_RING_COUNT 64
22 1.1 ober
23 1.1 ober #define IWN_NTXQUEUES 16
24 1.1 ober #define IWN_NTXCHAINS 2
25 1.1 ober
26 1.1 ober #define IWN_BUF_ALIGN 4096
27 1.1 ober
28 1.1 ober /*
29 1.1 ober * Rings must be aligned on a 256-byte boundary.
30 1.1 ober */
31 1.1 ober #define IWN_RING_DMA_ALIGN 256
32 1.1 ober
33 1.1 ober /* maximum scatter/gather */
34 1.1 ober #define IWN_MAX_SCATTER 20
35 1.1 ober
36 1.1 ober /* Rx buffers must be large enough to hold a full 4K A-MPDU */
37 1.1 ober #define IWN_RBUF_SIZE (4 * 1024)
38 1.1 ober
39 1.1 ober /*
40 1.1 ober * Control and status registers.
41 1.1 ober */
42 1.1 ober #define IWN_HWCONFIG 0x000
43 1.1 ober #define IWN_INTR_MIT 0x004
44 1.1 ober #define IWN_INTR 0x008
45 1.1 ober #define IWN_MASK 0x00c
46 1.1 ober #define IWN_INTR_STATUS 0x010
47 1.1 ober #define IWN_RESET 0x020
48 1.1 ober #define IWN_GPIO_CTL 0x024
49 1.1 ober #define IWN_EEPROM_CTL 0x02c
50 1.1 ober #define IWN_UCODE_CLR 0x05c
51 1.1 ober #define IWN_CHICKEN 0x100
52 1.1 ober #define IWN_QUEUE_OFFSET(qid) (0x380 + (qid) * 8)
53 1.1 ober #define IWN_MEM_WADDR 0x410
54 1.1 ober #define IWN_MEM_WDATA 0x418
55 1.1 ober #define IWN_WRITE_MEM_ADDR 0x444
56 1.1 ober #define IWN_READ_MEM_ADDR 0x448
57 1.1 ober #define IWN_WRITE_MEM_DATA 0x44c
58 1.1 ober #define IWN_READ_MEM_DATA 0x450
59 1.1 ober #define IWN_TX_WIDX 0x460
60 1.1 ober
61 1.1 ober #define IWN_KW_BASE 0x197c
62 1.1 ober #define IWN_TX_BASE(qid) (0x19d0 + (qid) * 4)
63 1.1 ober #define IWN_RW_WIDX_PTR 0x1bc0
64 1.1 ober #define IWN_RX_BASE 0x1bc4
65 1.1 ober #define IWN_RX_WIDX 0x1bc8
66 1.1 ober #define IWN_RX_CONFIG 0x1c00
67 1.1 ober #define IWN_RX_STATUS 0x1c44
68 1.1 ober #define IWN_TX_CONFIG(qid) (0x1d00 + (qid) * 32)
69 1.1 ober #define IWN_TX_STATUS 0x1eb0
70 1.1 ober
71 1.1 ober #define IWN_SRAM_BASE 0xa02c00
72 1.1 ober #define IWN_TX_ACTIVE (IWN_SRAM_BASE + 0x01c)
73 1.1 ober #define IWN_QUEUE_RIDX(qid) (IWN_SRAM_BASE + 0x064 + (qid) * 4)
74 1.1 ober #define IWN_SELECT_QCHAIN (IWN_SRAM_BASE + 0x0d0)
75 1.1 ober #define IWN_QUEUE_INTR_MASK (IWN_SRAM_BASE + 0x0e4)
76 1.1 ober #define IWN_TXQ_STATUS(qid) (IWN_SRAM_BASE + 0x104 + (qid) * 4)
77 1.1 ober
78 1.1 ober /*
79 1.1 ober * NIC internal memory offsets.
80 1.1 ober */
81 1.1 ober #define IWN_CLOCK_CTL 0x3000
82 1.1 ober #define IWN_MEM_CLOCK2 0x3008
83 1.1 ober #define IWN_MEM_POWER 0x300c
84 1.1 ober #define IWN_MEM_PCIDEV 0x3010
85 1.1 ober #define IWN_MEM_UCODE_CTL 0x3400
86 1.1 ober #define IWN_MEM_UCODE_SRC 0x3404
87 1.1 ober #define IWN_MEM_UCODE_DST 0x3408
88 1.1 ober #define IWN_MEM_UCODE_SIZE 0x340c
89 1.1 ober #define IWN_MEM_TEXT_BASE 0x3490
90 1.1 ober #define IWN_MEM_TEXT_SIZE 0x3494
91 1.1 ober #define IWN_MEM_DATA_BASE 0x3498
92 1.1 ober #define IWN_MEM_DATA_SIZE 0x349c
93 1.1 ober #define IWN_MEM_UCODE_BASE 0x3800
94 1.1 ober
95 1.1 ober
96 1.1 ober /* possible flags for register IWN_HWCONFIG */
97 1.1 ober #define IWN_HW_EEPROM_LOCKED (1 << 21)
98 1.1 ober
99 1.1 ober /* possible flags for registers IWN_READ_MEM_ADDR/IWN_WRITE_MEM_ADDR */
100 1.1 ober #define IWN_MEM_4 ((sizeof (uint32_t) - 1) << 24)
101 1.1 ober
102 1.1 ober /* possible values for IWN_MEM_UCODE_DST */
103 1.1 ober #define IWN_FW_TEXT 0x00000000
104 1.1 ober
105 1.1 ober /* possible flags for register IWN_RESET */
106 1.1 ober #define IWN_NEVO_RESET (1 << 0)
107 1.1 ober #define IWN_SW_RESET (1 << 7)
108 1.1 ober #define IWN_MASTER_DISABLED (1 << 8)
109 1.1 ober #define IWN_STOP_MASTER (1 << 9)
110 1.1 ober
111 1.1 ober /* possible flags for register IWN_GPIO_CTL */
112 1.1 ober #define IWN_GPIO_CLOCK (1 << 0)
113 1.1 ober #define IWN_GPIO_INIT (1 << 2)
114 1.1 ober #define IWN_GPIO_MAC (1 << 3)
115 1.1 ober #define IWN_GPIO_SLEEP (1 << 4)
116 1.1 ober #define IWN_GPIO_PWR_STATUS 0x07000000
117 1.1 ober #define IWN_GPIO_PWR_SLEEP (4 << 24)
118 1.1 ober #define IWN_GPIO_RF_ENABLED (1 << 27)
119 1.1 ober
120 1.1 ober /* possible flags for register IWN_CHICKEN */
121 1.1 ober #define IWN_CHICKEN_DISLOS (1 << 29)
122 1.1 ober
123 1.1 ober /* possible flags for register IWN_UCODE_CLR */
124 1.1 ober #define IWN_RADIO_OFF (1 << 1)
125 1.1 ober #define IWN_DISABLE_CMD (1 << 2)
126 1.1 ober #define IWN_CTEMP_STOP_RF (1 << 3)
127 1.1 ober
128 1.1 ober /* possible flags for IWN_RX_STATUS */
129 1.1 ober #define IWN_RX_IDLE (1 << 24)
130 1.1 ober
131 1.1 ober /* possible flags for register IWN_UC_CTL */
132 1.1 ober #define IWN_UC_ENABLE (1 << 30)
133 1.1 ober #define IWN_UC_RUN (1 << 31)
134 1.1 ober
135 1.1 ober /* possible flags for register IWN_INTR */
136 1.1 ober #define IWN_ALIVE_INTR (1 << 0)
137 1.1 ober #define IWN_WAKEUP_INTR (1 << 1)
138 1.1 ober #define IWN_SW_RX_INTR (1 << 3)
139 1.1 ober #define IWN_CT_REACHED (1 << 6)
140 1.1 ober #define IWN_RF_TOGGLED (1 << 7)
141 1.1 ober #define IWN_SW_ERROR (1 << 25)
142 1.1 ober #define IWN_TX_INTR (1 << 27)
143 1.1 ober #define IWN_HW_ERROR (1 << 29)
144 1.1 ober #define IWN_RX_INTR (1 << 31)
145 1.1 ober
146 1.1 ober #define IWN_INTR_MASK \
147 1.1 ober (IWN_SW_ERROR | IWN_HW_ERROR | IWN_TX_INTR | IWN_RX_INTR | \
148 1.1 ober IWN_ALIVE_INTR | IWN_WAKEUP_INTR | IWN_SW_RX_INTR | \
149 1.1 ober IWN_CT_REACHED | IWN_RF_TOGGLED)
150 1.1 ober
151 1.1 ober /* possible flags for register IWN_INTR_STATUS */
152 1.1 ober #define IWN_STATUS_TXQ(x) (1 << (x))
153 1.1 ober #define IWN_STATUS_RXQ(x) (1 << ((x) + 16))
154 1.1 ober #define IWN_STATUS_PRI (1 << 30)
155 1.1 ober /* shortcuts for the above */
156 1.1 ober #define IWN_TX_STATUS_INTR \
157 1.1 ober (IWN_STATUS_TXQ(0) | IWN_STATUS_TXQ(1) | IWN_STATUS_TXQ(6))
158 1.1 ober #define IWN_RX_STATUS_INTR \
159 1.1 ober (IWN_STATUS_RXQ(0) | IWN_STATUS_RXQ(1) | IWN_STATUS_RXQ(2) | \
160 1.1 ober IWN_STATUS_PRI)
161 1.1 ober
162 1.1 ober /* possible flags for register IWN_TX_STATUS */
163 1.1 ober #define IWN_TX_IDLE(qid) (1 << ((qid) + 24) | 1 << ((qid) + 16))
164 1.1 ober
165 1.1 ober /* possible flags for register IWN_EEPROM_CTL */
166 1.1 ober #define IWN_EEPROM_READY (1 << 0)
167 1.1 ober #define IWN_EEPROM_CMD (1 << 1)
168 1.1 ober
169 1.1 ober /* possible flags for register IWN_TXQ_STATUS */
170 1.1 ober #define IWN_TXQ_STATUS_ACTIVE 0x0007fc01
171 1.1 ober
172 1.1 ober /* possible flags for register IWN_MEM_POWER */
173 1.1 ober #define IWN_POWER_RESET (1 << 26)
174 1.1 ober
175 1.1 ober /* possible flags for register IWN_MEM_TEXT_SIZE */
176 1.1 ober #define IWN_FW_UPDATED (1 << 31)
177 1.1 ober
178 1.1 ober /* possible flags for device-specific PCI register 0xe8 */
179 1.1 ober #define IWN_DIS_NOSNOOP (1 << 11)
180 1.1 ober
181 1.1 ober /* possible flags for device-specific PCI register 0xf0 */
182 1.1 ober #define IWN_ENA_L1 (1 << 1)
183 1.1 ober
184 1.1 ober
185 1.1 ober #define IWN_TX_WINDOW 64
186 1.1 ober struct iwn_shared {
187 1.1 ober uint16_t len[IWN_NTXQUEUES][512]; /* 16KB total */
188 1.1 ober uint16_t closed_count;
189 1.1 ober uint16_t closed_rx_count;
190 1.1 ober uint16_t finished_count;
191 1.1 ober uint16_t finished_rx_count;
192 1.1 ober uint32_t reserved[2];
193 1.1 ober } __packed;
194 1.1 ober
195 1.1 ober struct iwn_tx_desc {
196 1.1 ober uint32_t flags;
197 1.1 ober struct {
198 1.1 ober uint32_t w1;
199 1.1 ober uint32_t w2;
200 1.1 ober uint32_t w3;
201 1.1 ober } __packed segs[IWN_MAX_SCATTER / 2];
202 1.1 ober /* pad to 128 bytes */
203 1.1 ober uint32_t reserved;
204 1.1 ober } __packed;
205 1.1 ober
206 1.1 ober #define IWN_SET_DESC_NSEGS(d, x) \
207 1.1 ober (d)->flags = htole32(((x) & 0x1f) << 24)
208 1.1 ober
209 1.1 ober /* set a segment physical address and length in a Tx descriptor */
210 1.1 ober #define IWN_SET_DESC_SEG(d, n, addr, size) do { \
211 1.1 ober if ((n) & 1) { \
212 1.1 ober (d)->segs[(n) / 2].w2 |= \
213 1.1 ober htole32(((addr) & 0xffff) << 16); \
214 1.1 ober (d)->segs[(n) / 2].w3 = \
215 1.1 ober htole32((((addr) >> 16) & 0xffff) | (size) << 20); \
216 1.1 ober } else { \
217 1.1 ober (d)->segs[(n) / 2].w1 = htole32(addr); \
218 1.1 ober (d)->segs[(n) / 2].w2 = htole32((size) << 4); \
219 1.1 ober } \
220 1.1 ober } while (0)
221 1.1 ober
222 1.1 ober struct iwn_rx_desc {
223 1.1 ober uint32_t len;
224 1.1 ober uint8_t type;
225 1.1 ober #define IWN_UC_READY 1
226 1.1 ober #define IWN_ADD_NODE_DONE 24
227 1.1 ober #define IWN_TX_DONE 28
228 1.1 ober #define IWN_START_SCAN 130
229 1.1 ober #define IWN_STOP_SCAN 132
230 1.1 ober #define IWN_RX_STATISTICS 156
231 1.1 ober #define IWN_BEACON_STATISTICS 157
232 1.1 ober #define IWN_STATE_CHANGED 161
233 1.1 ober #define IWN_BEACON_MISSED 162
234 1.1 ober #define IWN_AMPDU_RX_START 192
235 1.1 ober #define IWN_AMPDU_RX_DONE 193
236 1.1 ober #define IWN_RX_DONE 195
237 1.1 ober
238 1.1 ober uint8_t flags;
239 1.1 ober uint8_t idx;
240 1.1 ober uint8_t qid;
241 1.1 ober } __packed;
242 1.1 ober
243 1.1 ober /* possible Rx status flags */
244 1.1 ober #define IWN_RX_NO_CRC_ERR (1 << 0)
245 1.1 ober #define IWN_RX_NO_OVFL_ERR (1 << 1)
246 1.1 ober /* shortcut for the above */
247 1.1 ober #define IWN_RX_NOERROR (IWN_RX_NO_CRC_ERR | IWN_RX_NO_OVFL_ERR)
248 1.1 ober
249 1.1 ober struct iwn_tx_cmd {
250 1.1 ober uint8_t code;
251 1.1 ober #define IWN_CMD_CONFIGURE 16
252 1.1 ober #define IWN_CMD_ASSOCIATE 17
253 1.1 ober #define IWN_CMD_SET_WME 19
254 1.1 ober #define IWN_CMD_TSF 20
255 1.1 ober #define IWN_CMD_ADD_NODE 24
256 1.1 ober #define IWN_CMD_TX_DATA 28
257 1.1 ober #define IWN_CMD_NODE_MRR_SETUP 78
258 1.1 ober #define IWN_CMD_SET_LED 72
259 1.1 ober #define IWN_CMD_SET_POWER_MODE 119
260 1.1 ober #define IWN_CMD_SCAN 128
261 1.1 ober #define IWN_CMD_SET_BEACON 145
262 1.1 ober #define IWN_CMD_TXPOWER 151
263 1.1 ober #define IWN_CMD_BLUETOOTH 155
264 1.1 ober #define IWN_CMD_GET_STATISTICS 156
265 1.1 ober #define IWN_CMD_SET_CRITICAL_TEMP 164
266 1.1 ober #define IWN_SENSITIVITY 168
267 1.1 ober #define IWN_PHY_CALIB 176
268 1.1 ober
269 1.1 ober uint8_t flags;
270 1.1 ober uint8_t idx;
271 1.1 ober uint8_t qid;
272 1.1 ober uint8_t data[136];
273 1.1 ober } __packed;
274 1.1 ober
275 1.1 ober /* structure for command IWN_CMD_CONFIGURE */
276 1.1 ober struct iwn_config {
277 1.1 ober uint8_t myaddr[IEEE80211_ADDR_LEN];
278 1.1 ober uint16_t reserved1;
279 1.1 ober uint8_t bssid[IEEE80211_ADDR_LEN];
280 1.1 ober uint16_t reserved2;
281 1.1 ober uint8_t wlap[IEEE80211_ADDR_LEN];
282 1.1 ober uint16_t reserved3;
283 1.1 ober uint8_t mode;
284 1.1 ober #define IWN_MODE_HOSTAP 1
285 1.1 ober #define IWN_MODE_STA 3
286 1.1 ober #define IWN_MODE_IBSS 4
287 1.1 ober #define IWN_MODE_MONITOR 6
288 1.1 ober
289 1.1 ober uint8_t reserved4;
290 1.1 ober uint16_t rxchain;
291 1.1 ober #define IWN_RXCHAIN_ANTMSK_SHIFT 1
292 1.1 ober #define IWN_RXCHAIN_FORCE_MIMO (1 << 14)
293 1.1 ober
294 1.1 ober uint8_t ofdm_mask;
295 1.1 ober uint8_t cck_mask;
296 1.1 ober uint16_t associd;
297 1.1 ober uint32_t flags;
298 1.1 ober #define IWN_CONFIG_24GHZ (1 << 0)
299 1.1 ober #define IWN_CONFIG_CCK (1 << 1)
300 1.1 ober #define IWN_CONFIG_AUTO (1 << 2)
301 1.1 ober #define IWN_CONFIG_SHSLOT (1 << 4)
302 1.1 ober #define IWN_CONFIG_SHPREAMBLE (1 << 5)
303 1.1 ober #define IWN_CONFIG_NODIVERSITY (1 << 7)
304 1.1 ober #define IWN_CONFIG_ANTENNA_A (1 << 8)
305 1.1 ober #define IWN_CONFIG_ANTENNA_B (1 << 9)
306 1.1 ober #define IWN_CONFIG_TSF (1 << 15)
307 1.1 ober
308 1.1 ober uint32_t filter;
309 1.1 ober #define IWN_FILTER_PROMISC (1 << 0)
310 1.1 ober #define IWN_FILTER_CTL (1 << 1)
311 1.1 ober #define IWN_FILTER_MULTICAST (1 << 2)
312 1.1 ober #define IWN_FILTER_NODECRYPT (1 << 3)
313 1.1 ober #define IWN_FILTER_BSS (1 << 5)
314 1.1 ober
315 1.1 ober uint8_t chan;
316 1.1 ober uint8_t reserved5;
317 1.1 ober uint8_t ht_single_mask;
318 1.1 ober uint8_t ht_dual_mask;
319 1.1 ober } __packed;
320 1.1 ober
321 1.1 ober /* structure for command IWN_CMD_ASSOCIATE */
322 1.1 ober struct iwn_assoc {
323 1.1 ober uint32_t flags;
324 1.1 ober uint32_t filter;
325 1.1 ober uint8_t ofdm_mask;
326 1.1 ober uint8_t cck_mask;
327 1.1 ober uint16_t reserved;
328 1.1 ober } __packed;
329 1.1 ober
330 1.1 ober /* structure for command IWN_CMD_SET_WME */
331 1.1 ober struct iwn_wme_setup {
332 1.1 ober uint32_t flags;
333 1.1 ober #define IWN_EDCA_UPDATE (1 << 0)
334 1.1 ober #define IWN_EDCA_TXOP (1 << 4)
335 1.1 ober
336 1.1 ober struct {
337 1.1 ober uint16_t cwmin;
338 1.1 ober uint16_t cwmax;
339 1.1 ober uint8_t aifsn;
340 1.1 ober uint8_t reserved;
341 1.1 ober uint16_t txop;
342 1.1 ober } __packed ac[WME_NUM_AC];
343 1.1 ober } __packed;
344 1.1 ober
345 1.1 ober /* structure for command IWN_CMD_TSF */
346 1.1 ober struct iwn_cmd_tsf {
347 1.1 ober uint64_t tstamp;
348 1.1 ober uint16_t bintval;
349 1.1 ober uint16_t atim;
350 1.1 ober uint32_t binitval;
351 1.1 ober uint16_t lintval;
352 1.1 ober uint16_t reserved;
353 1.1 ober } __packed;
354 1.1 ober
355 1.1 ober /* structure for command IWN_CMD_ADD_NODE */
356 1.1 ober struct iwn_node_info {
357 1.1 ober uint8_t control;
358 1.1 ober #define IWN_NODE_UPDATE (1 << 0)
359 1.1 ober
360 1.1 ober uint8_t reserved1[3];
361 1.1 ober uint8_t macaddr[IEEE80211_ADDR_LEN];
362 1.1 ober uint16_t reserved2;
363 1.1 ober uint8_t id;
364 1.1 ober #define IWN_ID_BSS 0
365 1.1 ober #define IWN_ID_BROADCAST 31
366 1.1 ober
367 1.1 ober uint8_t flags;
368 1.1 ober #define IWN_FLAG_SET_KEY (1 << 0)
369 1.1 ober
370 1.1 ober uint16_t reserved3;
371 1.1 ober uint16_t security;
372 1.1 ober uint8_t tsc2; /* TKIP TSC2 */
373 1.1 ober uint8_t reserved4;
374 1.1 ober uint16_t ttak[5];
375 1.1 ober uint16_t reserved5;
376 1.1 ober uint8_t key[IEEE80211_KEYBUF_SIZE];
377 1.1 ober uint32_t htflags;
378 1.1 ober #define IWN_AMDPU_SIZE_FACTOR_SHIFT 19
379 1.1 ober #define IWN_AMDPU_DENSITY_SHIFT 23
380 1.1 ober
381 1.1 ober uint32_t mask;
382 1.1 ober uint16_t tid;
383 1.1 ober uint8_t rate;
384 1.1 ober uint8_t rflags;
385 1.1 ober #define IWN_RFLAG_CCK (1 << 1)
386 1.1 ober #define IWN_RFLAG_ANT_A (1 << 6)
387 1.1 ober #define IWN_RFLAG_ANT_B (1 << 7)
388 1.1 ober
389 1.1 ober uint8_t add_imm;
390 1.1 ober uint8_t del_imm;
391 1.1 ober uint16_t add_imm_start;
392 1.1 ober uint32_t reserved6;
393 1.1 ober } __packed;
394 1.1 ober
395 1.1 ober /* structure for command IWN_CMD_TX_DATA */
396 1.1 ober struct iwn_cmd_data {
397 1.1 ober uint16_t len;
398 1.1 ober uint16_t lnext;
399 1.1 ober uint32_t flags;
400 1.1 ober #define IWN_TX_NEED_RTS (1 << 1)
401 1.1 ober #define IWN_TX_NEED_CTS (1 << 2)
402 1.1 ober #define IWN_TX_NEED_ACK (1 << 3)
403 1.1 ober #define IWN_TX_USE_NODE_RATE (1 << 4)
404 1.1 ober #define IWN_TX_FULL_TXOP (1 << 7)
405 1.1 ober #define IWN_TX_BT_DISABLE (1 << 12) /* bluetooth coexistence */
406 1.1 ober #define IWN_TX_AUTO_SEQ (1 << 13)
407 1.1 ober #define IWN_TX_INSERT_TSTAMP (1 << 16)
408 1.1 ober #define IWN_TX_NEED_PADDING (1 << 20)
409 1.1 ober
410 1.1 ober uint8_t ntries;
411 1.1 ober uint8_t bluetooth;
412 1.1 ober uint16_t reserved1;
413 1.1 ober uint8_t rate;
414 1.1 ober uint8_t rflags;
415 1.1 ober uint16_t xrflags;
416 1.1 ober uint8_t id;
417 1.1 ober uint8_t security;
418 1.1 ober #define IWN_CIPHER_WEP40 1
419 1.1 ober #define IWN_CIPHER_CCMP 2
420 1.1 ober #define IWN_CIPHER_TKIP 3
421 1.1 ober #define IWN_CIPHER_WEP104 9
422 1.1 ober
423 1.1 ober uint8_t ridx;
424 1.1 ober uint8_t reserved2;
425 1.1 ober uint8_t key[IEEE80211_KEYBUF_SIZE];
426 1.1 ober uint16_t fnext;
427 1.1 ober uint16_t reserved3;
428 1.1 ober uint32_t lifetime;
429 1.1 ober #define IWN_LIFETIME_INFINITE 0xffffffff
430 1.1 ober
431 1.1 ober uint32_t loaddr;
432 1.1 ober uint8_t hiaddr;
433 1.1 ober uint8_t rts_ntries;
434 1.1 ober uint8_t data_ntries;
435 1.1 ober uint8_t tid;
436 1.1 ober uint16_t timeout;
437 1.1 ober uint16_t txop;
438 1.1 ober } __packed;
439 1.1 ober
440 1.1 ober /* structure for command IWN_CMD_SET_BEACON */
441 1.1 ober struct iwn_cmd_beacon {
442 1.1 ober uint16_t len;
443 1.1 ober uint16_t reserved1;
444 1.1 ober uint32_t flags; /* same as iwn_cmd_data */
445 1.1 ober uint8_t rate;
446 1.1 ober uint8_t id;
447 1.1 ober uint8_t reserved2[30];
448 1.1 ober uint32_t lifetime;
449 1.1 ober uint8_t ofdm_mask;
450 1.1 ober uint8_t cck_mask;
451 1.1 ober uint16_t reserved3[3];
452 1.1 ober uint16_t tim;
453 1.1 ober uint8_t timsz;
454 1.1 ober uint8_t reserved4;
455 1.1 ober struct ieee80211_frame wh;
456 1.1 ober } __packed;
457 1.1 ober
458 1.1 ober /* structure for command IWN_CMD_MRR_NODE_SETUP */
459 1.1 ober #define IWN_MAX_TX_RETRIES 16
460 1.1 ober struct iwn_cmd_mrr {
461 1.1 ober uint8_t id;
462 1.1 ober uint8_t reserved1;
463 1.1 ober uint16_t ctl;
464 1.1 ober uint8_t flags;
465 1.1 ober uint8_t mimo;
466 1.1 ober uint8_t ssmask;
467 1.1 ober uint8_t dsmask;
468 1.1 ober uint8_t ridx[WME_NUM_AC];
469 1.1 ober uint16_t ampdu_limit;
470 1.1 ober uint8_t ampdu_disable;
471 1.1 ober uint8_t ampdu_max;
472 1.1 ober uint32_t reserved2;
473 1.1 ober struct {
474 1.1 ober uint8_t rate;
475 1.1 ober #define IWN_CCK1 0
476 1.1 ober #define IWN_CCK11 3
477 1.1 ober #define IWN_OFDM6 4
478 1.1 ober #define IWN_OFDM54 11
479 1.1 ober
480 1.1 ober uint8_t rflags;
481 1.1 ober uint16_t xrflags;
482 1.1 ober } table[IWN_MAX_TX_RETRIES];
483 1.1 ober uint32_t reserved3;
484 1.1 ober } __packed;
485 1.1 ober
486 1.1 ober /* structure for command IWN_CMD_SET_LED */
487 1.1 ober struct iwn_cmd_led {
488 1.1 ober uint32_t unit; /* multiplier (in usecs) */
489 1.1 ober uint8_t which;
490 1.1 ober #define IWN_LED_ACTIVITY 1
491 1.1 ober #define IWN_LED_LINK 2
492 1.1 ober
493 1.1 ober uint8_t off;
494 1.1 ober uint8_t on;
495 1.1 ober uint8_t reserved;
496 1.1 ober } __packed;
497 1.1 ober
498 1.1 ober /* structure for command IWN_CMD_SET_POWER_MODE */
499 1.1 ober struct iwn_power {
500 1.1 ober uint16_t flags;
501 1.1 ober #define IWN_POWER_CAM 0 /* constantly awake mode */
502 1.1 ober
503 1.1 ober uint8_t alive;
504 1.1 ober uint8_t debug;
505 1.1 ober uint32_t rx_timeout;
506 1.1 ober uint32_t tx_timeout;
507 1.1 ober uint32_t sleep[5];
508 1.1 ober uint32_t beacons;
509 1.1 ober } __packed;
510 1.1 ober
511 1.1 ober /* structures for command IWN_CMD_SCAN */
512 1.1 ober struct iwn_scan_essid {
513 1.1 ober uint8_t id;
514 1.1 ober uint8_t len;
515 1.1 ober uint8_t data[IEEE80211_NWID_LEN];
516 1.1 ober } __packed;
517 1.1 ober
518 1.1 ober struct iwn_scan_hdr {
519 1.1 ober uint16_t len;
520 1.1 ober uint8_t reserved1;
521 1.1 ober uint8_t nchan;
522 1.1 ober uint16_t quiet;
523 1.1 ober uint16_t plcp_threshold;
524 1.1 ober uint16_t crc_threshold;
525 1.1 ober uint16_t rxchain;
526 1.1 ober uint32_t max_svc; /* background scans */
527 1.1 ober uint32_t pause_svc; /* background scans */
528 1.1 ober uint32_t flags;
529 1.1 ober uint32_t filter;
530 1.1 ober
531 1.1 ober /* followed by a struct iwn_cmd_data */
532 1.1 ober /* followed by an array of 4x struct iwn_scan_essid */
533 1.1 ober /* followed by probe request body */
534 1.1 ober /* followed by nchan x struct iwn_scan_chan */
535 1.1 ober } __packed;
536 1.1 ober
537 1.1 ober struct iwn_scan_chan {
538 1.1 ober uint8_t flags;
539 1.1 ober #define IWN_CHAN_ACTIVE (1 << 0)
540 1.1 ober #define IWN_CHAN_DIRECT (1 << 1)
541 1.1 ober
542 1.1 ober uint8_t chan;
543 1.1 ober uint8_t rf_gain;
544 1.1 ober uint8_t dsp_gain;
545 1.1 ober uint16_t active; /* msecs */
546 1.1 ober uint16_t passive; /* msecs */
547 1.1 ober } __packed;
548 1.1 ober
549 1.1 ober /* structure for command IWN_CMD_TXPOWER */
550 1.1 ober #define IWN_RIDX_MAX 32
551 1.1 ober struct iwn_cmd_txpower {
552 1.1 ober uint8_t band;
553 1.1 ober uint8_t reserved1;
554 1.1 ober uint8_t chan;
555 1.1 ober uint8_t reserved2;
556 1.1 ober struct {
557 1.1 ober uint8_t rf_gain[IWN_NTXCHAINS];
558 1.1 ober uint8_t dsp_gain[IWN_NTXCHAINS];
559 1.1 ober } power[IWN_RIDX_MAX + 1];
560 1.1 ober } __packed;
561 1.1 ober
562 1.1 ober /* structure for command IWN_CMD_BLUETOOTH */
563 1.1 ober struct iwn_bluetooth {
564 1.1 ober uint8_t flags;
565 1.1 ober uint8_t lead;
566 1.1 ober uint8_t kill;
567 1.1 ober uint8_t reserved;
568 1.1 ober uint32_t ack;
569 1.1 ober uint32_t cts;
570 1.1 ober } __packed;
571 1.1 ober
572 1.1 ober /* structure for command IWN_CMD_SET_CRITICAL_TEMP */
573 1.1 ober struct iwn_critical_temp {
574 1.1 ober uint32_t reserved;
575 1.1 ober uint32_t tempM;
576 1.1 ober uint32_t tempR;
577 1.1 ober /* degK <-> degC conversion macros */
578 1.1 ober #define IWN_CTOK(c) ((c) + 273)
579 1.1 ober #define IWN_KTOC(k) ((k) - 273)
580 1.1 ober #define IWN_CTOMUK(c) (((c) * 1000000) + 273150000)
581 1.1 ober } __packed;
582 1.1 ober
583 1.1 ober /* structure for command IWN_SENSITIVITY */
584 1.1 ober struct iwn_sensitivity_cmd {
585 1.1 ober uint16_t which;
586 1.1 ober #define IWN_SENSITIVITY_DEFAULTTBL 0
587 1.1 ober #define IWN_SENSITIVITY_WORKTBL 1
588 1.1 ober
589 1.1 ober uint16_t energy_cck;
590 1.1 ober uint16_t energy_ofdm;
591 1.1 ober uint16_t corr_ofdm_x1;
592 1.1 ober uint16_t corr_ofdm_mrc_x1;
593 1.1 ober uint16_t corr_cck_mrc_x4;
594 1.1 ober uint16_t corr_ofdm_x4;
595 1.1 ober uint16_t corr_ofdm_mrc_x4;
596 1.1 ober uint16_t corr_barker;
597 1.1 ober uint16_t corr_barker_mrc;
598 1.1 ober uint16_t corr_cck_x4;
599 1.1 ober uint16_t energy_ofdm_th;
600 1.1 ober } __packed;
601 1.1 ober
602 1.1 ober /* structure for command IWN_PHY_CALIB */
603 1.1 ober struct iwn_phy_calib_cmd {
604 1.1 ober uint8_t code;
605 1.1 ober #define IWN_SET_DIFF_GAIN 7
606 1.1 ober
607 1.1 ober uint8_t flags;
608 1.1 ober uint16_t reserved1;
609 1.1 ober int8_t gain[3];
610 1.1 ober #define IWN_GAIN_SET (1 << 2)
611 1.1 ober
612 1.1 ober uint8_t reserved2;
613 1.1 ober } __packed;
614 1.1 ober
615 1.1 ober
616 1.1 ober /* structure for IWN_UC_READY notification */
617 1.1 ober #define IWN_NATTEN_GROUPS 5
618 1.1 ober struct iwn_ucode_info {
619 1.1 ober uint8_t minor;
620 1.1 ober uint8_t major;
621 1.1 ober uint16_t reserved1;
622 1.1 ober uint8_t revision[8];
623 1.1 ober uint8_t type;
624 1.1 ober uint8_t subtype;
625 1.1 ober #define IWN_UCODE_RUNTIME 0
626 1.1 ober #define IWN_UCODE_INIT 9
627 1.1 ober
628 1.1 ober uint16_t reserved2;
629 1.1 ober uint32_t logptr;
630 1.1 ober uint32_t errorptr;
631 1.1 ober uint32_t tstamp;
632 1.1 ober uint32_t valid;
633 1.1 ober
634 1.1 ober /* the following fields are for UCODE_INIT only */
635 1.1 ober int32_t volt;
636 1.1 ober struct {
637 1.1 ober int32_t chan20MHz;
638 1.1 ober int32_t chan40MHz;
639 1.1 ober } __packed temp[4];
640 1.1 ober int32_t atten[IWN_NATTEN_GROUPS][IWN_NTXCHAINS];
641 1.1 ober } __packed;
642 1.1 ober
643 1.1 ober /* structure for IWN_TX_DONE notification */
644 1.1 ober struct iwn_tx_stat {
645 1.1 ober uint8_t nframes;
646 1.1 ober uint8_t nkill;
647 1.1 ober uint8_t nrts;
648 1.1 ober uint8_t ntries;
649 1.1 ober uint8_t rate;
650 1.1 ober uint8_t rflags;
651 1.1 ober uint16_t xrflags;
652 1.1 ober uint16_t duration;
653 1.1 ober uint16_t reserved;
654 1.1 ober uint32_t power[2];
655 1.1 ober uint32_t status;
656 1.1 ober } __packed;
657 1.1 ober
658 1.1 ober /* structure for IWN_BEACON_MISSED notification */
659 1.1 ober struct iwn_beacon_missed {
660 1.1 ober uint32_t consecutive;
661 1.1 ober uint32_t total;
662 1.1 ober uint32_t expected;
663 1.1 ober uint32_t received;
664 1.1 ober } __packed;
665 1.1 ober
666 1.1 ober /* structure for IWN_AMPDU_RX_DONE notification */
667 1.1 ober struct iwn_rx_ampdu {
668 1.1 ober uint16_t len;
669 1.1 ober uint16_t reserved;
670 1.1 ober } __packed;
671 1.1 ober
672 1.1 ober /* structure for IWN_RX_DONE and IWN_AMPDU_RX_START notifications */
673 1.1 ober struct iwn_rx_stat {
674 1.1 ober uint8_t phy_len;
675 1.1 ober uint8_t cfg_phy_len;
676 1.1 ober #define IWN_STAT_MAXLEN 20
677 1.1 ober
678 1.1 ober uint8_t id;
679 1.1 ober uint8_t reserved1;
680 1.1 ober uint64_t tstamp;
681 1.1 ober uint32_t beacon;
682 1.1 ober uint16_t flags;
683 1.1 ober uint16_t chan;
684 1.1 ober uint16_t antenna;
685 1.1 ober uint16_t agc;
686 1.1 ober uint8_t rssi[6];
687 1.1 ober #define IWN_RSSI_TO_DBM 44
688 1.1 ober
689 1.1 ober uint8_t reserved2[22];
690 1.1 ober uint8_t rate;
691 1.1 ober uint8_t rflags;
692 1.1 ober uint16_t xrflags;
693 1.1 ober uint16_t len;
694 1.1 ober uint16_t reserve3;
695 1.1 ober } __packed;
696 1.1 ober
697 1.1 ober /* structure for IWN_START_SCAN notification */
698 1.1 ober struct iwn_start_scan {
699 1.1 ober uint64_t tstamp;
700 1.1 ober uint32_t tbeacon;
701 1.1 ober uint8_t chan;
702 1.1 ober uint8_t band;
703 1.1 ober uint16_t reserved;
704 1.1 ober uint32_t status;
705 1.1 ober } __packed;
706 1.1 ober
707 1.1 ober /* structure for IWN_STOP_SCAN notification */
708 1.1 ober struct iwn_stop_scan {
709 1.1 ober uint8_t nchan;
710 1.1 ober uint8_t status;
711 1.1 ober uint8_t reserved;
712 1.1 ober uint8_t chan;
713 1.1 ober uint64_t tsf;
714 1.1 ober } __packed;
715 1.1 ober
716 1.1 ober /* structure for IWN_{RX,BEACON}_STATISTICS notification */
717 1.1 ober struct iwn_rx_phy_stats {
718 1.1 ober uint32_t ina;
719 1.1 ober uint32_t fina;
720 1.1 ober uint32_t bad_plcp;
721 1.1 ober uint32_t bad_crc32;
722 1.1 ober uint32_t overrun;
723 1.1 ober uint32_t eoverrun;
724 1.1 ober uint32_t good_crc32;
725 1.1 ober uint32_t fa;
726 1.1 ober uint32_t bad_fina_sync;
727 1.1 ober uint32_t sfd_timeout;
728 1.1 ober uint32_t fina_timeout;
729 1.1 ober uint32_t no_rts_ack;
730 1.1 ober uint32_t rxe_limit;
731 1.1 ober uint32_t ack;
732 1.1 ober uint32_t cts;
733 1.1 ober uint32_t ba_resp;
734 1.1 ober uint32_t dsp_kill;
735 1.1 ober uint32_t bad_mh;
736 1.1 ober uint32_t rssi_sum;
737 1.1 ober uint32_t reserved;
738 1.1 ober } __packed;
739 1.1 ober
740 1.1 ober struct iwn_rx_general_stats {
741 1.1 ober uint32_t bad_cts;
742 1.1 ober uint32_t bad_ack;
743 1.1 ober uint32_t not_bss;
744 1.1 ober uint32_t filtered;
745 1.1 ober uint32_t bad_chan;
746 1.1 ober uint32_t beacons;
747 1.1 ober uint32_t missed_beacons;
748 1.1 ober uint32_t adc_saturated; /* time in 0.8us */
749 1.1 ober uint32_t ina_searched; /* time in 0.8us */
750 1.1 ober uint32_t noise[3];
751 1.1 ober uint32_t flags;
752 1.1 ober uint32_t load;
753 1.1 ober uint32_t fa;
754 1.1 ober uint32_t rssi[3];
755 1.1 ober uint32_t energy[3];
756 1.1 ober } __packed;
757 1.1 ober
758 1.1 ober struct iwn_rx_ht_phy_stats {
759 1.1 ober uint32_t bad_plcp;
760 1.1 ober uint32_t overrun;
761 1.1 ober uint32_t eoverrun;
762 1.1 ober uint32_t good_crc32;
763 1.1 ober uint32_t bad_crc32;
764 1.1 ober uint32_t bad_mh;
765 1.1 ober uint32_t good_ampdu_crc32;
766 1.1 ober uint32_t ampdu;
767 1.1 ober uint32_t fragment;
768 1.1 ober uint32_t reserved;
769 1.1 ober } __packed;
770 1.1 ober
771 1.1 ober struct iwn_rx_stats {
772 1.1 ober struct iwn_rx_phy_stats ofdm;
773 1.1 ober struct iwn_rx_phy_stats cck;
774 1.1 ober struct iwn_rx_general_stats general;
775 1.1 ober struct iwn_rx_ht_phy_stats ht;
776 1.1 ober } __packed;
777 1.1 ober
778 1.1 ober struct iwn_tx_stats {
779 1.1 ober uint32_t preamble;
780 1.1 ober uint32_t rx_detected;
781 1.1 ober uint32_t bt_defer;
782 1.1 ober uint32_t bt_kill;
783 1.1 ober uint32_t short_len;
784 1.1 ober uint32_t cts_timeout;
785 1.1 ober uint32_t ack_timeout;
786 1.1 ober uint32_t exp_ack;
787 1.1 ober uint32_t ack;
788 1.1 ober uint32_t msdu;
789 1.1 ober uint32_t busrt_err1;
790 1.1 ober uint32_t burst_err2;
791 1.1 ober uint32_t cts_collision;
792 1.1 ober uint32_t ack_collision;
793 1.1 ober uint32_t ba_timeout;
794 1.1 ober uint32_t ba_resched;
795 1.1 ober uint32_t query_ampdu;
796 1.1 ober uint32_t query;
797 1.1 ober uint32_t query_ampdu_frag;
798 1.1 ober uint32_t query_mismatch;
799 1.1 ober uint32_t not_ready;
800 1.1 ober uint32_t underrun;
801 1.1 ober uint32_t bt_ht_kill;
802 1.1 ober uint32_t rx_ba_resp;
803 1.1 ober uint32_t reserved[2];
804 1.1 ober } __packed;
805 1.1 ober
806 1.1 ober struct iwn_general_stats {
807 1.1 ober uint32_t temp;
808 1.1 ober uint32_t temp_m;
809 1.1 ober uint32_t burst_check;
810 1.1 ober uint32_t burst;
811 1.1 ober uint32_t reserved1[4];
812 1.1 ober uint32_t sleep;
813 1.1 ober uint32_t slot_out;
814 1.1 ober uint32_t slot_idle;
815 1.1 ober uint32_t ttl_tstamp;
816 1.1 ober uint32_t tx_ant_a;
817 1.1 ober uint32_t tx_ant_b;
818 1.1 ober uint32_t exec;
819 1.1 ober uint32_t probe;
820 1.1 ober uint32_t reserved2[2];
821 1.1 ober uint32_t rx_enabled;
822 1.1 ober uint32_t reserved3[3];
823 1.1 ober } __packed;
824 1.1 ober
825 1.1 ober struct iwn_stats {
826 1.1 ober uint32_t flags;
827 1.1 ober struct iwn_rx_stats rx;
828 1.1 ober struct iwn_tx_stats tx;
829 1.1 ober struct iwn_general_stats general;
830 1.1 ober } __packed;
831 1.1 ober
832 1.1 ober
833 1.1 ober /* firmware image header */
834 1.1 ober struct iwn_firmware_hdr {
835 1.1 ober uint32_t version;
836 1.1 ober uint32_t main_textsz;
837 1.1 ober uint32_t main_datasz;
838 1.1 ober uint32_t init_textsz;
839 1.1 ober uint32_t init_datasz;
840 1.1 ober uint32_t boot_textsz;
841 1.1 ober } __packed;
842 1.1 ober
843 1.1 ober #define IWN_FW_MAIN_TEXT_MAXSZ (96 * 1024)
844 1.1 ober #define IWN_FW_MAIN_DATA_MAXSZ (40 * 1024)
845 1.1 ober #define IWN_FW_INIT_TEXT_MAXSZ (96 * 1024)
846 1.1 ober #define IWN_FW_INIT_DATA_MAXSZ (40 * 1024)
847 1.1 ober #define IWN_FW_BOOT_TEXT_MAXSZ 1024
848 1.1 ober
849 1.1 ober
850 1.1 ober /*
851 1.1 ober * Offsets into EEPROM.
852 1.1 ober */
853 1.1 ober #define IWN_EEPROM_MAC 0x015
854 1.1 ober #define IWN_EEPROM_DOMAIN 0x060
855 1.1 ober #define IWN_EEPROM_BAND1 0x063
856 1.1 ober #define IWN_EEPROM_BAND2 0x072
857 1.1 ober #define IWN_EEPROM_BAND3 0x080
858 1.1 ober #define IWN_EEPROM_BAND4 0x08d
859 1.1 ober #define IWN_EEPROM_BAND5 0x099
860 1.1 ober #define IWN_EEPROM_BAND6 0x0a0
861 1.1 ober #define IWN_EEPROM_BAND7 0x0a8
862 1.1 ober #define IWN_EEPROM_MAXPOW 0x0e8
863 1.1 ober #define IWN_EEPROM_VOLTAGE 0x0e9
864 1.1 ober #define IWN_EEPROM_BANDS 0x0ea
865 1.1 ober
866 1.1 ober struct iwn_eeprom_chan {
867 1.1 ober uint8_t flags;
868 1.1 ober #define IWN_EEPROM_CHAN_VALID (1 << 0)
869 1.1 ober #define IWN_EEPROM_CHAN_IBSS (1 << 1)
870 1.1 ober #define IWN_EEPROM_CHAN_ACTIVE (1 << 3)
871 1.1 ober #define IWN_EEPROM_CHAN_RADAR (1 << 4)
872 1.1 ober
873 1.1 ober int8_t maxpwr;
874 1.1 ober } __packed;
875 1.1 ober
876 1.1 ober #define IWN_NSAMPLES 3
877 1.1 ober struct iwn_eeprom_chan_samples {
878 1.1 ober uint8_t num;
879 1.1 ober struct {
880 1.1 ober uint8_t temp;
881 1.1 ober uint8_t gain;
882 1.1 ober uint8_t power;
883 1.1 ober int8_t pa_det;
884 1.1 ober } samples[IWN_NTXCHAINS][IWN_NSAMPLES];
885 1.1 ober } __packed;
886 1.1 ober
887 1.1 ober #define IWN_NBANDS 8
888 1.1 ober struct iwn_eeprom_band {
889 1.1 ober uint8_t lo; /* low channel number */
890 1.1 ober uint8_t hi; /* high channel number */
891 1.1 ober struct iwn_eeprom_chan_samples chans[2];
892 1.1 ober } __packed;
893 1.1 ober
894 1.1 ober #define IWN_CHAN_BANDS_COUNT 7
895 1.1 ober #define IWN_MAX_CHAN_PER_BAND 14
896 1.1 ober static const struct iwn_chan_band {
897 1.1 ober uint32_t addr; /* offset in EEPROM */
898 1.1 ober uint8_t nchan;
899 1.1 ober uint8_t chan[IWN_MAX_CHAN_PER_BAND];
900 1.1 ober } iwn_bands[] = {
901 1.1 ober { IWN_EEPROM_BAND1, 14,
902 1.1 ober { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } },
903 1.1 ober { IWN_EEPROM_BAND2, 13,
904 1.1 ober { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } },
905 1.1 ober { IWN_EEPROM_BAND3, 12,
906 1.1 ober { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } },
907 1.1 ober { IWN_EEPROM_BAND4, 11,
908 1.1 ober { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } },
909 1.1 ober { IWN_EEPROM_BAND5, 6,
910 1.1 ober { 145, 149, 153, 157, 161, 165 } },
911 1.1 ober { IWN_EEPROM_BAND6, 7,
912 1.1 ober { 1, 2, 3, 4, 5, 6, 7 } },
913 1.1 ober { IWN_EEPROM_BAND7, 11,
914 1.1 ober { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } }
915 1.1 ober };
916 1.1 ober
917 1.1 ober static const uint8_t iwn_ridx_to_plcp[] = {
918 1.1 ober 10, 20, 55, 110, /* CCK */
919 1.1 ober 0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3, 0x3 /* OFDM R1-R4 */
920 1.1 ober };
921 1.1 ober
922 1.1 ober /* allow fallback from CCK11 to OFDM9 and from OFDM6 to CCK5 */
923 1.1 ober static const uint8_t iwn_prev_ridx[] = {
924 1.1 ober 0, 0, 1, 5, /* CCK */
925 1.1 ober 2, 4, 3, 6, 7, 8, 9, 10, 10 /* OFDM */
926 1.1 ober };
927 1.1 ober
928 1.1 ober #define IWN_MAX_PWR_INDEX 107
929 1.1 ober
930 1.1 ober /*
931 1.1 ober * RF Tx gain values from highest to lowest power (values obtained from
932 1.1 ober * the reference driver.)
933 1.1 ober */
934 1.1 ober static const uint8_t iwn_rf_gain_2ghz[IWN_MAX_PWR_INDEX + 1] = {
935 1.1 ober 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c,
936 1.1 ober 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38,
937 1.1 ober 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x35, 0x35,
938 1.1 ober 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x31, 0x31,
939 1.1 ober 0x31, 0x30, 0x30, 0x30, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04,
940 1.1 ober 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
941 1.1 ober 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
942 1.1 ober 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
943 1.1 ober 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
944 1.1 ober 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
945 1.1 ober };
946 1.1 ober
947 1.1 ober static const uint8_t iwn_rf_gain_5ghz[IWN_MAX_PWR_INDEX + 1] = {
948 1.1 ober 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d,
949 1.1 ober 0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39,
950 1.1 ober 0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35,
951 1.1 ober 0x35, 0x35, 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32,
952 1.1 ober 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x25, 0x25, 0x25, 0x24, 0x24,
953 1.1 ober 0x24, 0x23, 0x23, 0x23, 0x22, 0x18, 0x18, 0x17, 0x17, 0x17, 0x16,
954 1.1 ober 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13,
955 1.1 ober 0x12, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05,
956 1.1 ober 0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01,
957 1.1 ober 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
958 1.1 ober };
959 1.1 ober
960 1.1 ober /*
961 1.1 ober * DSP pre-DAC gain values from highest to lowest power (values obtained
962 1.1 ober * from the reference driver.)
963 1.1 ober */
964 1.1 ober static const uint8_t iwn_dsp_gain_2ghz[IWN_MAX_PWR_INDEX + 1] = {
965 1.1 ober 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
966 1.1 ober 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
967 1.1 ober 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
968 1.1 ober 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
969 1.1 ober 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
970 1.1 ober 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
971 1.1 ober 0x6e, 0x68, 0x62, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a,
972 1.1 ober 0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f,
973 1.1 ober 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44,
974 1.1 ober 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b
975 1.1 ober };
976 1.1 ober
977 1.1 ober static const uint8_t iwn_dsp_gain_5ghz[IWN_MAX_PWR_INDEX + 1] = {
978 1.1 ober 0x7b, 0x75, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
979 1.1 ober 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
980 1.1 ober 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
981 1.1 ober 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
982 1.1 ober 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
983 1.1 ober 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
984 1.1 ober 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62,
985 1.1 ober 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68,
986 1.1 ober 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e,
987 1.1 ober 0x68, 0x62, 0x6e, 0x68, 0x62, 0x5d, 0x58, 0x53, 0x4e
988 1.1 ober };
989 1.1 ober
990 1.1 ober #define IWN_READ(sc, reg) \
991 1.1 ober bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
992 1.1 ober
993 1.1 ober #define IWN_WRITE(sc, reg, val) \
994 1.1 ober bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
995 1.1 ober
996 1.1 ober #define IWN_WRITE_REGION_4(sc, offset, datap, count) \
997 1.1 ober bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset), \
998 1.1 ober (datap), (count))
999