diff options
Diffstat (limited to 'drivers')
21 files changed, 5337 insertions, 2208 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-commands.h b/drivers/net/wireless/iwlwifi/iwl-3945-commands.h new file mode 100644 index 000000000000..2c71195a08e3 --- /dev/null +++ b/drivers/net/wireless/iwlwifi/iwl-3945-commands.h | |||
@@ -0,0 +1,1467 @@ | |||
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) 2005 - 2007 Intel Corporation. All rights reserved. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of version 2 of the GNU General Public License as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, but | ||
15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, | ||
22 | * USA | ||
23 | * | ||
24 | * The full GNU General Public License is included in this distribution | ||
25 | * in the file called LICENSE.GPL. | ||
26 | * | ||
27 | * Contact Information: | ||
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | ||
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
30 | * | ||
31 | * BSD LICENSE | ||
32 | * | ||
33 | * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved. | ||
34 | * All rights reserved. | ||
35 | * | ||
36 | * Redistribution and use in source and binary forms, with or without | ||
37 | * modification, are permitted provided that the following conditions | ||
38 | * are met: | ||
39 | * | ||
40 | * * Redistributions of source code must retain the above copyright | ||
41 | * notice, this list of conditions and the following disclaimer. | ||
42 | * * Redistributions in binary form must reproduce the above copyright | ||
43 | * notice, this list of conditions and the following disclaimer in | ||
44 | * the documentation and/or other materials provided with the | ||
45 | * distribution. | ||
46 | * * Neither the name Intel Corporation nor the names of its | ||
47 | * contributors may be used to endorse or promote products derived | ||
48 | * from this software without specific prior written permission. | ||
49 | * | ||
50 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
51 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
52 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
53 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
54 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
55 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
56 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
57 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
58 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
59 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
60 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
61 | * | ||
62 | *****************************************************************************/ | ||
63 | |||
64 | #ifndef __iwl_3945_commands_h__ | ||
65 | #define __iwl_3945_commands_h__ | ||
66 | |||
67 | enum { | ||
68 | REPLY_ALIVE = 0x1, | ||
69 | REPLY_ERROR = 0x2, | ||
70 | |||
71 | /* RXON and QOS commands */ | ||
72 | REPLY_RXON = 0x10, | ||
73 | REPLY_RXON_ASSOC = 0x11, | ||
74 | REPLY_QOS_PARAM = 0x13, | ||
75 | REPLY_RXON_TIMING = 0x14, | ||
76 | |||
77 | /* Multi-Station support */ | ||
78 | REPLY_ADD_STA = 0x18, | ||
79 | REPLY_REMOVE_STA = 0x19, /* not used */ | ||
80 | REPLY_REMOVE_ALL_STA = 0x1a, /* not used */ | ||
81 | |||
82 | /* RX, TX, LEDs */ | ||
83 | REPLY_3945_RX = 0x1b, /* 3945 only */ | ||
84 | REPLY_TX = 0x1c, | ||
85 | REPLY_RATE_SCALE = 0x47, /* 3945 only */ | ||
86 | REPLY_LEDS_CMD = 0x48, | ||
87 | REPLY_TX_LINK_QUALITY_CMD = 0x4e, /* 4965 only */ | ||
88 | |||
89 | /* 802.11h related */ | ||
90 | RADAR_NOTIFICATION = 0x70, /* not used */ | ||
91 | REPLY_QUIET_CMD = 0x71, /* not used */ | ||
92 | REPLY_CHANNEL_SWITCH = 0x72, | ||
93 | CHANNEL_SWITCH_NOTIFICATION = 0x73, | ||
94 | REPLY_SPECTRUM_MEASUREMENT_CMD = 0x74, | ||
95 | SPECTRUM_MEASURE_NOTIFICATION = 0x75, | ||
96 | |||
97 | /* Power Management */ | ||
98 | POWER_TABLE_CMD = 0x77, | ||
99 | PM_SLEEP_NOTIFICATION = 0x7A, | ||
100 | PM_DEBUG_STATISTIC_NOTIFIC = 0x7B, | ||
101 | |||
102 | /* Scan commands and notifications */ | ||
103 | REPLY_SCAN_CMD = 0x80, | ||
104 | REPLY_SCAN_ABORT_CMD = 0x81, | ||
105 | SCAN_START_NOTIFICATION = 0x82, | ||
106 | SCAN_RESULTS_NOTIFICATION = 0x83, | ||
107 | SCAN_COMPLETE_NOTIFICATION = 0x84, | ||
108 | |||
109 | /* IBSS/AP commands */ | ||
110 | BEACON_NOTIFICATION = 0x90, | ||
111 | REPLY_TX_BEACON = 0x91, | ||
112 | WHO_IS_AWAKE_NOTIFICATION = 0x94, /* not used */ | ||
113 | |||
114 | /* Miscellaneous commands */ | ||
115 | QUIET_NOTIFICATION = 0x96, /* not used */ | ||
116 | REPLY_TX_PWR_TABLE_CMD = 0x97, | ||
117 | MEASURE_ABORT_NOTIFICATION = 0x99, /* not used */ | ||
118 | |||
119 | /* BT config command */ | ||
120 | REPLY_BT_CONFIG = 0x9b, | ||
121 | |||
122 | /* 4965 Statistics */ | ||
123 | REPLY_STATISTICS_CMD = 0x9c, | ||
124 | STATISTICS_NOTIFICATION = 0x9d, | ||
125 | |||
126 | /* RF-KILL commands and notifications */ | ||
127 | REPLY_CARD_STATE_CMD = 0xa0, | ||
128 | CARD_STATE_NOTIFICATION = 0xa1, | ||
129 | |||
130 | /* Missed beacons notification */ | ||
131 | MISSED_BEACONS_NOTIFICATION = 0xa2, | ||
132 | |||
133 | REPLY_MAX = 0xff | ||
134 | }; | ||
135 | |||
136 | /****************************************************************************** | ||
137 | * (0) | ||
138 | * Header | ||
139 | * | ||
140 | *****************************************************************************/ | ||
141 | |||
142 | #define IWL_CMD_FAILED_MSK 0x40 | ||
143 | |||
144 | struct iwl_cmd_header { | ||
145 | u8 cmd; | ||
146 | u8 flags; | ||
147 | /* We have 15 LSB to use as we please (MSB indicates | ||
148 | * a frame Rx'd from the HW). We encode the following | ||
149 | * information into the sequence field: | ||
150 | * | ||
151 | * 0:7 index in fifo | ||
152 | * 8:13 fifo selection | ||
153 | * 14:14 bit indicating if this packet references the 'extra' | ||
154 | * storage at the end of the memory queue | ||
155 | * 15:15 (Rx indication) | ||
156 | * | ||
157 | */ | ||
158 | __le16 sequence; | ||
159 | |||
160 | /* command data follows immediately */ | ||
161 | u8 data[0]; | ||
162 | } __attribute__ ((packed)); | ||
163 | |||
164 | /****************************************************************************** | ||
165 | * (0a) | ||
166 | * Alive and Error Commands & Responses: | ||
167 | * | ||
168 | *****************************************************************************/ | ||
169 | |||
170 | #define UCODE_VALID_OK __constant_cpu_to_le32(0x1) | ||
171 | #define INITIALIZE_SUBTYPE (9) | ||
172 | |||
173 | /* | ||
174 | * REPLY_ALIVE = 0x1 (response only, not a command) | ||
175 | */ | ||
176 | struct iwl_alive_resp { | ||
177 | u8 ucode_minor; | ||
178 | u8 ucode_major; | ||
179 | __le16 reserved1; | ||
180 | u8 sw_rev[8]; | ||
181 | u8 ver_type; | ||
182 | u8 ver_subtype; | ||
183 | __le16 reserved2; | ||
184 | __le32 log_event_table_ptr; | ||
185 | __le32 error_event_table_ptr; | ||
186 | __le32 timestamp; | ||
187 | __le32 is_valid; | ||
188 | } __attribute__ ((packed)); | ||
189 | |||
190 | struct iwl_init_alive_resp { | ||
191 | u8 ucode_minor; | ||
192 | u8 ucode_major; | ||
193 | __le16 reserved1; | ||
194 | u8 sw_rev[8]; | ||
195 | u8 ver_type; | ||
196 | u8 ver_subtype; | ||
197 | __le16 reserved2; | ||
198 | __le32 log_event_table_ptr; | ||
199 | __le32 error_event_table_ptr; | ||
200 | __le32 timestamp; | ||
201 | __le32 is_valid; | ||
202 | } __attribute__ ((packed)); | ||
203 | |||
204 | union tsf { | ||
205 | u8 byte[8]; | ||
206 | __le16 word[4]; | ||
207 | __le32 dw[2]; | ||
208 | }; | ||
209 | |||
210 | /* | ||
211 | * REPLY_ERROR = 0x2 (response only, not a command) | ||
212 | */ | ||
213 | struct iwl_error_resp { | ||
214 | __le32 error_type; | ||
215 | u8 cmd_id; | ||
216 | u8 reserved1; | ||
217 | __le16 bad_cmd_seq_num; | ||
218 | __le16 reserved2; | ||
219 | __le32 error_info; | ||
220 | union tsf timestamp; | ||
221 | } __attribute__ ((packed)); | ||
222 | |||
223 | /****************************************************************************** | ||
224 | * (1) | ||
225 | * RXON Commands & Responses: | ||
226 | * | ||
227 | *****************************************************************************/ | ||
228 | |||
229 | /* | ||
230 | * Rx config defines & structure | ||
231 | */ | ||
232 | /* rx_config device types */ | ||
233 | enum { | ||
234 | RXON_DEV_TYPE_AP = 1, | ||
235 | RXON_DEV_TYPE_ESS = 3, | ||
236 | RXON_DEV_TYPE_IBSS = 4, | ||
237 | RXON_DEV_TYPE_SNIFFER = 6, | ||
238 | }; | ||
239 | |||
240 | /* rx_config flags */ | ||
241 | /* band & modulation selection */ | ||
242 | #define RXON_FLG_BAND_24G_MSK __constant_cpu_to_le32(1 << 0) | ||
243 | #define RXON_FLG_CCK_MSK __constant_cpu_to_le32(1 << 1) | ||
244 | /* auto detection enable */ | ||
245 | #define RXON_FLG_AUTO_DETECT_MSK __constant_cpu_to_le32(1 << 2) | ||
246 | /* TGg protection when tx */ | ||
247 | #define RXON_FLG_TGG_PROTECT_MSK __constant_cpu_to_le32(1 << 3) | ||
248 | /* cck short slot & preamble */ | ||
249 | #define RXON_FLG_SHORT_SLOT_MSK __constant_cpu_to_le32(1 << 4) | ||
250 | #define RXON_FLG_SHORT_PREAMBLE_MSK __constant_cpu_to_le32(1 << 5) | ||
251 | /* antenna selection */ | ||
252 | #define RXON_FLG_DIS_DIV_MSK __constant_cpu_to_le32(1 << 7) | ||
253 | #define RXON_FLG_ANT_SEL_MSK __constant_cpu_to_le32(0x0f00) | ||
254 | #define RXON_FLG_ANT_A_MSK __constant_cpu_to_le32(1 << 8) | ||
255 | #define RXON_FLG_ANT_B_MSK __constant_cpu_to_le32(1 << 9) | ||
256 | /* radar detection enable */ | ||
257 | #define RXON_FLG_RADAR_DETECT_MSK __constant_cpu_to_le32(1 << 12) | ||
258 | #define RXON_FLG_TGJ_NARROW_BAND_MSK __constant_cpu_to_le32(1 << 13) | ||
259 | /* rx response to host with 8-byte TSF | ||
260 | * (according to ON_AIR deassertion) */ | ||
261 | #define RXON_FLG_TSF2HOST_MSK __constant_cpu_to_le32(1 << 15) | ||
262 | |||
263 | /* rx_config filter flags */ | ||
264 | /* accept all data frames */ | ||
265 | #define RXON_FILTER_PROMISC_MSK __constant_cpu_to_le32(1 << 0) | ||
266 | /* pass control & management to host */ | ||
267 | #define RXON_FILTER_CTL2HOST_MSK __constant_cpu_to_le32(1 << 1) | ||
268 | /* accept multi-cast */ | ||
269 | #define RXON_FILTER_ACCEPT_GRP_MSK __constant_cpu_to_le32(1 << 2) | ||
270 | /* don't decrypt uni-cast frames */ | ||
271 | #define RXON_FILTER_DIS_DECRYPT_MSK __constant_cpu_to_le32(1 << 3) | ||
272 | /* don't decrypt multi-cast frames */ | ||
273 | #define RXON_FILTER_DIS_GRP_DECRYPT_MSK __constant_cpu_to_le32(1 << 4) | ||
274 | /* STA is associated */ | ||
275 | #define RXON_FILTER_ASSOC_MSK __constant_cpu_to_le32(1 << 5) | ||
276 | /* transfer to host non bssid beacons in associated state */ | ||
277 | #define RXON_FILTER_BCON_AWARE_MSK __constant_cpu_to_le32(1 << 6) | ||
278 | |||
279 | /* | ||
280 | * REPLY_RXON = 0x10 (command, has simple generic response) | ||
281 | */ | ||
282 | struct iwl_rxon_cmd { | ||
283 | u8 node_addr[6]; | ||
284 | __le16 reserved1; | ||
285 | u8 bssid_addr[6]; | ||
286 | __le16 reserved2; | ||
287 | u8 wlap_bssid_addr[6]; | ||
288 | __le16 reserved3; | ||
289 | u8 dev_type; | ||
290 | u8 air_propagation; | ||
291 | __le16 reserved4; | ||
292 | u8 ofdm_basic_rates; | ||
293 | u8 cck_basic_rates; | ||
294 | __le16 assoc_id; | ||
295 | __le32 flags; | ||
296 | __le32 filter_flags; | ||
297 | __le16 channel; | ||
298 | __le16 reserved5; | ||
299 | } __attribute__ ((packed)); | ||
300 | |||
301 | /* | ||
302 | * REPLY_RXON_ASSOC = 0x11 (command, has simple generic response) | ||
303 | */ | ||
304 | struct iwl_rxon_assoc_cmd { | ||
305 | __le32 flags; | ||
306 | __le32 filter_flags; | ||
307 | u8 ofdm_basic_rates; | ||
308 | u8 cck_basic_rates; | ||
309 | __le16 reserved; | ||
310 | } __attribute__ ((packed)); | ||
311 | |||
312 | /* | ||
313 | * REPLY_RXON_TIMING = 0x14 (command, has simple generic response) | ||
314 | */ | ||
315 | struct iwl_rxon_time_cmd { | ||
316 | union tsf timestamp; | ||
317 | __le16 beacon_interval; | ||
318 | __le16 atim_window; | ||
319 | __le32 beacon_init_val; | ||
320 | __le16 listen_interval; | ||
321 | __le16 reserved; | ||
322 | } __attribute__ ((packed)); | ||
323 | |||
324 | struct iwl_tx_power { | ||
325 | u8 tx_gain; /* gain for analog radio */ | ||
326 | u8 dsp_atten; /* gain for DSP */ | ||
327 | } __attribute__ ((packed)); | ||
328 | |||
329 | struct iwl_power_per_rate { | ||
330 | u8 rate; /* plcp */ | ||
331 | struct iwl_tx_power tpc; | ||
332 | u8 reserved; | ||
333 | } __attribute__ ((packed)); | ||
334 | |||
335 | /* | ||
336 | * REPLY_CHANNEL_SWITCH = 0x72 (command, has simple generic response) | ||
337 | */ | ||
338 | struct iwl_channel_switch_cmd { | ||
339 | u8 band; | ||
340 | u8 expect_beacon; | ||
341 | __le16 channel; | ||
342 | __le32 rxon_flags; | ||
343 | __le32 rxon_filter_flags; | ||
344 | __le32 switch_time; | ||
345 | struct iwl_power_per_rate power[IWL_MAX_RATES]; | ||
346 | } __attribute__ ((packed)); | ||
347 | |||
348 | /* | ||
349 | * CHANNEL_SWITCH_NOTIFICATION = 0x73 (notification only, not a command) | ||
350 | */ | ||
351 | struct iwl_csa_notification { | ||
352 | __le16 band; | ||
353 | __le16 channel; | ||
354 | __le32 status; /* 0 - OK, 1 - fail */ | ||
355 | } __attribute__ ((packed)); | ||
356 | |||
357 | /****************************************************************************** | ||
358 | * (2) | ||
359 | * Quality-of-Service (QOS) Commands & Responses: | ||
360 | * | ||
361 | *****************************************************************************/ | ||
362 | struct iwl_ac_qos { | ||
363 | __le16 cw_min; | ||
364 | __le16 cw_max; | ||
365 | u8 aifsn; | ||
366 | u8 reserved1; | ||
367 | __le16 edca_txop; | ||
368 | } __attribute__ ((packed)); | ||
369 | |||
370 | /* QoS flags defines */ | ||
371 | #define QOS_PARAM_FLG_UPDATE_EDCA_MSK __constant_cpu_to_le32(0x01) | ||
372 | #define QOS_PARAM_FLG_TGN_MSK __constant_cpu_to_le32(0x02) | ||
373 | #define QOS_PARAM_FLG_TXOP_TYPE_MSK __constant_cpu_to_le32(0x10) | ||
374 | |||
375 | /* | ||
376 | * TXFIFO Queue number defines | ||
377 | */ | ||
378 | /* number of Access categories (AC) (EDCA), queues 0..3 */ | ||
379 | #define AC_NUM 4 | ||
380 | |||
381 | /* | ||
382 | * REPLY_QOS_PARAM = 0x13 (command, has simple generic response) | ||
383 | */ | ||
384 | struct iwl_qosparam_cmd { | ||
385 | __le32 qos_flags; | ||
386 | struct iwl_ac_qos ac[AC_NUM]; | ||
387 | } __attribute__ ((packed)); | ||
388 | |||
389 | /****************************************************************************** | ||
390 | * (3) | ||
391 | * Add/Modify Stations Commands & Responses: | ||
392 | * | ||
393 | *****************************************************************************/ | ||
394 | /* | ||
395 | * Multi station support | ||
396 | */ | ||
397 | #define IWL_AP_ID 0 | ||
398 | #define IWL_MULTICAST_ID 1 | ||
399 | #define IWL_STA_ID 2 | ||
400 | |||
401 | #define IWL3945_BROADCAST_ID 24 | ||
402 | #define IWL3945_STATION_COUNT 25 | ||
403 | |||
404 | #define IWL4965_BROADCAST_ID 31 | ||
405 | #define IWL4965_STATION_COUNT 32 | ||
406 | |||
407 | #define IWL_STATION_COUNT 32 /* MAX(3945,4965)*/ | ||
408 | #define IWL_INVALID_STATION 255 | ||
409 | |||
410 | #define STA_FLG_TX_RATE_MSK __constant_cpu_to_le32(1<<2); | ||
411 | #define STA_FLG_PWR_SAVE_MSK __constant_cpu_to_le32(1<<8); | ||
412 | |||
413 | #define STA_CONTROL_MODIFY_MSK 0x01 | ||
414 | |||
415 | /* key flags __le16*/ | ||
416 | #define STA_KEY_FLG_ENCRYPT_MSK __constant_cpu_to_le16(0x7) | ||
417 | #define STA_KEY_FLG_NO_ENC __constant_cpu_to_le16(0x0) | ||
418 | #define STA_KEY_FLG_WEP __constant_cpu_to_le16(0x1) | ||
419 | #define STA_KEY_FLG_CCMP __constant_cpu_to_le16(0x2) | ||
420 | #define STA_KEY_FLG_TKIP __constant_cpu_to_le16(0x3) | ||
421 | |||
422 | #define STA_KEY_FLG_KEYID_POS 8 | ||
423 | #define STA_KEY_FLG_INVALID __constant_cpu_to_le16(0x0800) | ||
424 | |||
425 | /* modify flags */ | ||
426 | #define STA_MODIFY_KEY_MASK 0x01 | ||
427 | #define STA_MODIFY_TID_DISABLE_TX 0x02 | ||
428 | #define STA_MODIFY_TX_RATE_MSK 0x04 | ||
429 | #define STA_MODIFY_ADDBA_TID_MSK 0x08 | ||
430 | #define STA_MODIFY_DELBA_TID_MSK 0x10 | ||
431 | #define BUILD_RAxTID(sta_id, tid) (((sta_id) << 4) + (tid)) | ||
432 | |||
433 | /* | ||
434 | * Antenna masks: | ||
435 | * bit14:15 01 B inactive, A active | ||
436 | * 10 B active, A inactive | ||
437 | * 11 Both active | ||
438 | */ | ||
439 | #define RATE_MCS_ANT_A_POS 14 | ||
440 | #define RATE_MCS_ANT_B_POS 15 | ||
441 | #define RATE_MCS_ANT_A_MSK 0x4000 | ||
442 | #define RATE_MCS_ANT_B_MSK 0x8000 | ||
443 | #define RATE_MCS_ANT_AB_MSK 0xc000 | ||
444 | |||
445 | struct iwl_keyinfo { | ||
446 | __le16 key_flags; | ||
447 | u8 tkip_rx_tsc_byte2; /* TSC[2] for key mix ph1 detection */ | ||
448 | u8 reserved1; | ||
449 | __le16 tkip_rx_ttak[5]; /* 10-byte unicast TKIP TTAK */ | ||
450 | __le16 reserved2; | ||
451 | u8 key[16]; /* 16-byte unicast decryption key */ | ||
452 | } __attribute__ ((packed)); | ||
453 | |||
454 | struct sta_id_modify { | ||
455 | u8 addr[ETH_ALEN]; | ||
456 | __le16 reserved1; | ||
457 | u8 sta_id; | ||
458 | u8 modify_mask; | ||
459 | __le16 reserved2; | ||
460 | } __attribute__ ((packed)); | ||
461 | |||
462 | /* | ||
463 | * REPLY_ADD_STA = 0x18 (command) | ||
464 | */ | ||
465 | struct iwl_addsta_cmd { | ||
466 | u8 mode; | ||
467 | u8 reserved[3]; | ||
468 | struct sta_id_modify sta; | ||
469 | struct iwl_keyinfo key; | ||
470 | __le32 station_flags; | ||
471 | __le32 station_flags_msk; | ||
472 | __le16 tid_disable_tx; | ||
473 | __le16 rate_n_flags; | ||
474 | u8 add_immediate_ba_tid; | ||
475 | u8 remove_immediate_ba_tid; | ||
476 | __le16 add_immediate_ba_ssn; | ||
477 | } __attribute__ ((packed)); | ||
478 | |||
479 | /* | ||
480 | * REPLY_ADD_STA = 0x18 (response) | ||
481 | */ | ||
482 | struct iwl_add_sta_resp { | ||
483 | u8 status; | ||
484 | } __attribute__ ((packed)); | ||
485 | |||
486 | #define ADD_STA_SUCCESS_MSK 0x1 | ||
487 | |||
488 | /****************************************************************************** | ||
489 | * (4) | ||
490 | * Rx Responses: | ||
491 | * | ||
492 | *****************************************************************************/ | ||
493 | |||
494 | struct iwl_rx_frame_stats { | ||
495 | u8 phy_count; | ||
496 | u8 id; | ||
497 | u8 rssi; | ||
498 | u8 agc; | ||
499 | __le16 sig_avg; | ||
500 | __le16 noise_diff; | ||
501 | u8 payload[0]; | ||
502 | } __attribute__ ((packed)); | ||
503 | |||
504 | struct iwl_rx_frame_hdr { | ||
505 | __le16 channel; | ||
506 | __le16 phy_flags; | ||
507 | u8 reserved1; | ||
508 | u8 rate; | ||
509 | __le16 len; | ||
510 | u8 payload[0]; | ||
511 | } __attribute__ ((packed)); | ||
512 | |||
513 | #define RX_RES_STATUS_NO_CRC32_ERROR __constant_cpu_to_le32(1 << 0) | ||
514 | #define RX_RES_STATUS_NO_RXE_OVERFLOW __constant_cpu_to_le32(1 << 1) | ||
515 | |||
516 | #define RX_RES_PHY_FLAGS_BAND_24_MSK __constant_cpu_to_le16(1 << 0) | ||
517 | #define RX_RES_PHY_FLAGS_MOD_CCK_MSK __constant_cpu_to_le16(1 << 1) | ||
518 | #define RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK __constant_cpu_to_le16(1 << 2) | ||
519 | #define RX_RES_PHY_FLAGS_NARROW_BAND_MSK __constant_cpu_to_le16(1 << 3) | ||
520 | #define RX_RES_PHY_FLAGS_ANTENNA_MSK __constant_cpu_to_le16(0xf0) | ||
521 | |||
522 | #define RX_RES_STATUS_SEC_TYPE_MSK (0x7 << 8) | ||
523 | #define RX_RES_STATUS_SEC_TYPE_NONE (0x0 << 8) | ||
524 | #define RX_RES_STATUS_SEC_TYPE_WEP (0x1 << 8) | ||
525 | #define RX_RES_STATUS_SEC_TYPE_CCMP (0x2 << 8) | ||
526 | #define RX_RES_STATUS_SEC_TYPE_TKIP (0x3 << 8) | ||
527 | |||
528 | #define RX_RES_STATUS_DECRYPT_TYPE_MSK (0x3 << 11) | ||
529 | #define RX_RES_STATUS_NOT_DECRYPT (0x0 << 11) | ||
530 | #define RX_RES_STATUS_DECRYPT_OK (0x3 << 11) | ||
531 | #define RX_RES_STATUS_BAD_ICV_MIC (0x1 << 11) | ||
532 | #define RX_RES_STATUS_BAD_KEY_TTAK (0x2 << 11) | ||
533 | |||
534 | struct iwl_rx_frame_end { | ||
535 | __le32 status; | ||
536 | __le64 timestamp; | ||
537 | __le32 beacon_timestamp; | ||
538 | } __attribute__ ((packed)); | ||
539 | |||
540 | /* | ||
541 | * REPLY_3945_RX = 0x1b (response only, not a command) | ||
542 | * | ||
543 | * NOTE: DO NOT dereference from casts to this structure | ||
544 | * It is provided only for calculating minimum data set size. | ||
545 | * The actual offsets of the hdr and end are dynamic based on | ||
546 | * stats.phy_count | ||
547 | */ | ||
548 | struct iwl_rx_frame { | ||
549 | struct iwl_rx_frame_stats stats; | ||
550 | struct iwl_rx_frame_hdr hdr; | ||
551 | struct iwl_rx_frame_end end; | ||
552 | } __attribute__ ((packed)); | ||
553 | |||
554 | /* Fixed (non-configurable) rx data from phy */ | ||
555 | #define RX_PHY_FLAGS_ANTENNAE_OFFSET (4) | ||
556 | #define RX_PHY_FLAGS_ANTENNAE_MASK (0x70) | ||
557 | #define IWL_AGC_DB_MASK (0x3f80) /* MASK(7,13) */ | ||
558 | #define IWL_AGC_DB_POS (7) | ||
559 | struct iwl4965_rx_non_cfg_phy { | ||
560 | __le16 ant_selection; /* ant A bit 4, ant B bit 5, ant C bit 6 */ | ||
561 | __le16 agc_info; /* agc code 0:6, agc dB 7:13, reserved 14:15 */ | ||
562 | u8 rssi_info[6]; /* we use even entries, 0/2/4 for A/B/C rssi */ | ||
563 | u8 pad[0]; | ||
564 | } __attribute__ ((packed)); | ||
565 | |||
566 | /* | ||
567 | * REPLY_4965_RX = 0xc3 (response only, not a command) | ||
568 | * Used only for legacy (non 11n) frames. | ||
569 | */ | ||
570 | #define RX_RES_PHY_CNT 14 | ||
571 | struct iwl4965_rx_phy_res { | ||
572 | u8 non_cfg_phy_cnt; /* non configurable DSP phy data byte count */ | ||
573 | u8 cfg_phy_cnt; /* configurable DSP phy data byte count */ | ||
574 | u8 stat_id; /* configurable DSP phy data set ID */ | ||
575 | u8 reserved1; | ||
576 | __le64 timestamp; /* TSF at on air rise */ | ||
577 | __le32 beacon_time_stamp; /* beacon at on-air rise */ | ||
578 | __le16 phy_flags; /* general phy flags: band, modulation, ... */ | ||
579 | __le16 channel; /* channel number */ | ||
580 | __le16 non_cfg_phy[RX_RES_PHY_CNT]; /* upto 14 phy entries */ | ||
581 | __le32 reserved2; | ||
582 | __le32 rate_n_flags; | ||
583 | __le16 byte_count; /* frame's byte-count */ | ||
584 | __le16 reserved3; | ||
585 | } __attribute__ ((packed)); | ||
586 | |||
587 | struct iwl4965_rx_mpdu_res_start { | ||
588 | __le16 byte_count; | ||
589 | __le16 reserved; | ||
590 | } __attribute__ ((packed)); | ||
591 | |||
592 | |||
593 | /****************************************************************************** | ||
594 | * (5) | ||
595 | * Tx Commands & Responses: | ||
596 | * | ||
597 | *****************************************************************************/ | ||
598 | |||
599 | /* Tx flags */ | ||
600 | #define TX_CMD_FLG_RTS_MSK __constant_cpu_to_le32(1 << 1) | ||
601 | #define TX_CMD_FLG_CTS_MSK __constant_cpu_to_le32(1 << 2) | ||
602 | #define TX_CMD_FLG_ACK_MSK __constant_cpu_to_le32(1 << 3) | ||
603 | #define TX_CMD_FLG_STA_RATE_MSK __constant_cpu_to_le32(1 << 4) | ||
604 | #define TX_CMD_FLG_IMM_BA_RSP_MASK __constant_cpu_to_le32(1 << 6) | ||
605 | #define TX_CMD_FLG_FULL_TXOP_PROT_MSK __constant_cpu_to_le32(1 << 7) | ||
606 | #define TX_CMD_FLG_ANT_SEL_MSK __constant_cpu_to_le32(0xf00) | ||
607 | #define TX_CMD_FLG_ANT_A_MSK __constant_cpu_to_le32(1 << 8) | ||
608 | #define TX_CMD_FLG_ANT_B_MSK __constant_cpu_to_le32(1 << 9) | ||
609 | |||
610 | /* ucode ignores BT priority for this frame */ | ||
611 | #define TX_CMD_FLG_BT_DIS_MSK __constant_cpu_to_le32(1 << 12) | ||
612 | |||
613 | /* ucode overrides sequence control */ | ||
614 | #define TX_CMD_FLG_SEQ_CTL_MSK __constant_cpu_to_le32(1 << 13) | ||
615 | |||
616 | /* signal that this frame is non-last MPDU */ | ||
617 | #define TX_CMD_FLG_MORE_FRAG_MSK __constant_cpu_to_le32(1 << 14) | ||
618 | |||
619 | /* calculate TSF in outgoing frame */ | ||
620 | #define TX_CMD_FLG_TSF_MSK __constant_cpu_to_le32(1 << 16) | ||
621 | |||
622 | /* activate TX calibration. */ | ||
623 | #define TX_CMD_FLG_CALIB_MSK __constant_cpu_to_le32(1 << 17) | ||
624 | |||
625 | /* signals that 2 bytes pad was inserted | ||
626 | after the MAC header */ | ||
627 | #define TX_CMD_FLG_MH_PAD_MSK __constant_cpu_to_le32(1 << 20) | ||
628 | |||
629 | /* HCCA-AP - disable duration overwriting. */ | ||
630 | #define TX_CMD_FLG_DUR_MSK __constant_cpu_to_le32(1 << 25) | ||
631 | |||
632 | /* | ||
633 | * TX command security control | ||
634 | */ | ||
635 | #define TX_CMD_SEC_WEP 0x01 | ||
636 | #define TX_CMD_SEC_CCM 0x02 | ||
637 | #define TX_CMD_SEC_TKIP 0x03 | ||
638 | #define TX_CMD_SEC_MSK 0x03 | ||
639 | #define TX_CMD_SEC_SHIFT 6 | ||
640 | #define TX_CMD_SEC_KEY128 0x08 | ||
641 | |||
642 | /* | ||
643 | * TX command Frame life time | ||
644 | */ | ||
645 | |||
646 | struct iwl_dram_scratch { | ||
647 | u8 try_cnt; | ||
648 | u8 bt_kill_cnt; | ||
649 | __le16 reserved; | ||
650 | } __attribute__ ((packed)); | ||
651 | |||
652 | /* | ||
653 | * REPLY_TX = 0x1c (command) | ||
654 | */ | ||
655 | struct iwl_tx_cmd { | ||
656 | __le16 len; | ||
657 | __le16 next_frame_len; | ||
658 | __le32 tx_flags; | ||
659 | u8 rate; | ||
660 | u8 sta_id; | ||
661 | u8 tid_tspec; | ||
662 | u8 sec_ctl; | ||
663 | u8 key[16]; | ||
664 | union { | ||
665 | u8 byte[8]; | ||
666 | __le16 word[4]; | ||
667 | __le32 dw[2]; | ||
668 | } tkip_mic; | ||
669 | __le32 next_frame_info; | ||
670 | union { | ||
671 | __le32 life_time; | ||
672 | __le32 attempt; | ||
673 | } stop_time; | ||
674 | u8 supp_rates[2]; | ||
675 | u8 rts_retry_limit; /*byte 50 */ | ||
676 | u8 data_retry_limit; /*byte 51 */ | ||
677 | union { | ||
678 | __le16 pm_frame_timeout; | ||
679 | __le16 attempt_duration; | ||
680 | } timeout; | ||
681 | __le16 driver_txop; | ||
682 | u8 payload[0]; | ||
683 | struct ieee80211_hdr hdr[0]; | ||
684 | } __attribute__ ((packed)); | ||
685 | |||
686 | /* TX command response is sent after *all* transmission attempts. | ||
687 | * | ||
688 | * NOTES: | ||
689 | * | ||
690 | * TX_STATUS_FAIL_NEXT_FRAG | ||
691 | * | ||
692 | * If the fragment flag in the MAC header for the frame being transmitted | ||
693 | * is set and there is insufficient time to transmit the next frame, the | ||
694 | * TX status will be returned with 'TX_STATUS_FAIL_NEXT_FRAG'. | ||
695 | * | ||
696 | * TX_STATUS_FIFO_UNDERRUN | ||
697 | * | ||
698 | * Indicates the host did not provide bytes to the FIFO fast enough while | ||
699 | * a TX was in progress. | ||
700 | * | ||
701 | * TX_STATUS_FAIL_MGMNT_ABORT | ||
702 | * | ||
703 | * This status is only possible if the ABORT ON MGMT RX parameter was | ||
704 | * set to true with the TX command. | ||
705 | * | ||
706 | * If the MSB of the status parameter is set then an abort sequence is | ||
707 | * required. This sequence consists of the host activating the TX Abort | ||
708 | * control line, and then waiting for the TX Abort command response. This | ||
709 | * indicates that a the device is no longer in a transmit state, and that the | ||
710 | * command FIFO has been cleared. The host must then deactivate the TX Abort | ||
711 | * control line. Receiving is still allowed in this case. | ||
712 | */ | ||
713 | enum { | ||
714 | TX_STATUS_SUCCESS = 0x01, | ||
715 | TX_STATUS_DIRECT_DONE = 0x02, | ||
716 | TX_STATUS_FAIL_SHORT_LIMIT = 0x82, | ||
717 | TX_STATUS_FAIL_LONG_LIMIT = 0x83, | ||
718 | TX_STATUS_FAIL_FIFO_UNDERRUN = 0x84, | ||
719 | TX_STATUS_FAIL_MGMNT_ABORT = 0x85, | ||
720 | TX_STATUS_FAIL_NEXT_FRAG = 0x86, | ||
721 | TX_STATUS_FAIL_LIFE_EXPIRE = 0x87, | ||
722 | TX_STATUS_FAIL_DEST_PS = 0x88, | ||
723 | TX_STATUS_FAIL_ABORTED = 0x89, | ||
724 | TX_STATUS_FAIL_BT_RETRY = 0x8a, | ||
725 | TX_STATUS_FAIL_STA_INVALID = 0x8b, | ||
726 | TX_STATUS_FAIL_FRAG_DROPPED = 0x8c, | ||
727 | TX_STATUS_FAIL_TID_DISABLE = 0x8d, | ||
728 | TX_STATUS_FAIL_FRAME_FLUSHED = 0x8e, | ||
729 | TX_STATUS_FAIL_INSUFFICIENT_CF_POLL = 0x8f, | ||
730 | TX_STATUS_FAIL_TX_LOCKED = 0x90, | ||
731 | TX_STATUS_FAIL_NO_BEACON_ON_RADAR = 0x91, | ||
732 | }; | ||
733 | |||
734 | #define TX_PACKET_MODE_REGULAR 0x0000 | ||
735 | #define TX_PACKET_MODE_BURST_SEQ 0x0100 | ||
736 | #define TX_PACKET_MODE_BURST_FIRST 0x0200 | ||
737 | |||
738 | enum { | ||
739 | TX_POWER_PA_NOT_ACTIVE = 0x0, | ||
740 | }; | ||
741 | |||
742 | enum { | ||
743 | TX_STATUS_MSK = 0x000000ff, /* bits 0:7 */ | ||
744 | TX_STATUS_DELAY_MSK = 0x00000040, | ||
745 | TX_STATUS_ABORT_MSK = 0x00000080, | ||
746 | TX_PACKET_MODE_MSK = 0x0000ff00, /* bits 8:15 */ | ||
747 | TX_FIFO_NUMBER_MSK = 0x00070000, /* bits 16:18 */ | ||
748 | TX_RESERVED = 0x00780000, /* bits 19:22 */ | ||
749 | TX_POWER_PA_DETECT_MSK = 0x7f800000, /* bits 23:30 */ | ||
750 | TX_ABORT_REQUIRED_MSK = 0x80000000, /* bits 31:31 */ | ||
751 | }; | ||
752 | |||
753 | /* ******************************* | ||
754 | * TX aggregation state | ||
755 | ******************************* */ | ||
756 | |||
757 | enum { | ||
758 | AGG_TX_STATE_TRANSMITTED = 0x00, | ||
759 | AGG_TX_STATE_UNDERRUN_MSK = 0x01, | ||
760 | AGG_TX_STATE_BT_PRIO_MSK = 0x02, | ||
761 | AGG_TX_STATE_FEW_BYTES_MSK = 0x04, | ||
762 | AGG_TX_STATE_ABORT_MSK = 0x08, | ||
763 | AGG_TX_STATE_LAST_SENT_TTL_MSK = 0x10, | ||
764 | AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK = 0x20, | ||
765 | AGG_TX_STATE_LAST_SENT_BT_KILL_MSK = 0x40, | ||
766 | AGG_TX_STATE_SCD_QUERY_MSK = 0x80, | ||
767 | AGG_TX_STATE_TEST_BAD_CRC32_MSK = 0x100, | ||
768 | AGG_TX_STATE_RESPONSE_MSK = 0x1ff, | ||
769 | AGG_TX_STATE_DUMP_TX_MSK = 0x200, | ||
770 | AGG_TX_STATE_DELAY_TX_MSK = 0x400 | ||
771 | }; | ||
772 | |||
773 | #define AGG_TX_STATE_LAST_SENT_MSK \ | ||
774 | (AGG_TX_STATE_LAST_SENT_TTL_MSK | \ | ||
775 | AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK | \ | ||
776 | AGG_TX_STATE_LAST_SENT_BT_KILL_MSK) | ||
777 | |||
778 | #define AGG_TX_STATE_TRY_CNT_POS 12 | ||
779 | #define AGG_TX_STATE_TRY_CNT_MSK 0xf000 | ||
780 | |||
781 | #define AGG_TX_STATE_SEQ_NUM_POS 16 | ||
782 | #define AGG_TX_STATE_SEQ_NUM_MSK 0xffff0000 | ||
783 | |||
784 | /* | ||
785 | * REPLY_TX = 0x1c (response) | ||
786 | */ | ||
787 | struct iwl_tx_resp { | ||
788 | u8 failure_rts; | ||
789 | u8 failure_frame; | ||
790 | u8 bt_kill_count; | ||
791 | u8 rate; | ||
792 | __le32 wireless_media_time; | ||
793 | __le32 status; /* TX status (for aggregation status of 1st frame) */ | ||
794 | } __attribute__ ((packed)); | ||
795 | |||
796 | /* | ||
797 | * REPLY_COMPRESSED_BA = 0xc5 (response only, not a command) | ||
798 | */ | ||
799 | struct iwl_compressed_ba_resp { | ||
800 | __le32 sta_addr_lo32; | ||
801 | __le16 sta_addr_hi16; | ||
802 | __le16 reserved; | ||
803 | u8 sta_id; | ||
804 | u8 tid; | ||
805 | __le16 ba_seq_ctl; | ||
806 | __le32 ba_bitmap0; | ||
807 | __le32 ba_bitmap1; | ||
808 | __le16 scd_flow; | ||
809 | __le16 scd_ssn; | ||
810 | } __attribute__ ((packed)); | ||
811 | |||
812 | /* | ||
813 | * REPLY_TX_PWR_TABLE_CMD = 0x97 (command, has simple generic response) | ||
814 | */ | ||
815 | struct iwl_txpowertable_cmd { | ||
816 | u8 band; /* 0: 5 GHz, 1: 2.4 GHz */ | ||
817 | u8 reserved; | ||
818 | __le16 channel; | ||
819 | struct iwl_power_per_rate power[IWL_MAX_RATES]; | ||
820 | } __attribute__ ((packed)); | ||
821 | |||
822 | struct iwl_rate_scaling_info { | ||
823 | __le16 rate_n_flags; | ||
824 | u8 try_cnt; | ||
825 | u8 next_rate_index; | ||
826 | } __attribute__ ((packed)); | ||
827 | |||
828 | /** | ||
829 | * struct iwl_rate_scaling_cmd - Rate Scaling Command & Response | ||
830 | * | ||
831 | * REPLY_RATE_SCALE = 0x47 (command, has simple generic response) | ||
832 | * | ||
833 | * NOTE: The table of rates passed to the uCode via the | ||
834 | * RATE_SCALE command sets up the corresponding order of | ||
835 | * rates used for all related commands, including rate | ||
836 | * masks, etc. | ||
837 | * | ||
838 | * For example, if you set 9MB (PLCP 0x0f) as the first | ||
839 | * rate in the rate table, the bit mask for that rate | ||
840 | * when passed through ofdm_basic_rates on the REPLY_RXON | ||
841 | * command would be bit 0 (1<<0) | ||
842 | */ | ||
843 | struct iwl_rate_scaling_cmd { | ||
844 | u8 table_id; | ||
845 | u8 reserved[3]; | ||
846 | struct iwl_rate_scaling_info table[IWL_MAX_RATES]; | ||
847 | } __attribute__ ((packed)); | ||
848 | |||
849 | /* | ||
850 | * REPLY_BT_CONFIG = 0x9b (command, has simple generic response) | ||
851 | */ | ||
852 | struct iwl_bt_cmd { | ||
853 | u8 flags; | ||
854 | u8 lead_time; | ||
855 | u8 max_kill; | ||
856 | u8 reserved; | ||
857 | __le32 kill_ack_mask; | ||
858 | __le32 kill_cts_mask; | ||
859 | } __attribute__ ((packed)); | ||
860 | |||
861 | /****************************************************************************** | ||
862 | * (6) | ||
863 | * Spectrum Management (802.11h) Commands, Responses, Notifications: | ||
864 | * | ||
865 | *****************************************************************************/ | ||
866 | |||
867 | /* | ||
868 | * Spectrum Management | ||
869 | */ | ||
870 | #define MEASUREMENT_FILTER_FLAG (RXON_FILTER_PROMISC_MSK | \ | ||
871 | RXON_FILTER_CTL2HOST_MSK | \ | ||
872 | RXON_FILTER_ACCEPT_GRP_MSK | \ | ||
873 | RXON_FILTER_DIS_DECRYPT_MSK | \ | ||
874 | RXON_FILTER_DIS_GRP_DECRYPT_MSK | \ | ||
875 | RXON_FILTER_ASSOC_MSK | \ | ||
876 | RXON_FILTER_BCON_AWARE_MSK) | ||
877 | |||
878 | struct iwl_measure_channel { | ||
879 | __le32 duration; /* measurement duration in extended beacon | ||
880 | * format */ | ||
881 | u8 channel; /* channel to measure */ | ||
882 | u8 type; /* see enum iwl_measure_type */ | ||
883 | __le16 reserved; | ||
884 | } __attribute__ ((packed)); | ||
885 | |||
886 | /* | ||
887 | * REPLY_SPECTRUM_MEASUREMENT_CMD = 0x74 (command) | ||
888 | */ | ||
889 | struct iwl_spectrum_cmd { | ||
890 | __le16 len; /* number of bytes starting from token */ | ||
891 | u8 token; /* token id */ | ||
892 | u8 id; /* measurement id -- 0 or 1 */ | ||
893 | u8 origin; /* 0 = TGh, 1 = other, 2 = TGk */ | ||
894 | u8 periodic; /* 1 = periodic */ | ||
895 | __le16 path_loss_timeout; | ||
896 | __le32 start_time; /* start time in extended beacon format */ | ||
897 | __le32 reserved2; | ||
898 | __le32 flags; /* rxon flags */ | ||
899 | __le32 filter_flags; /* rxon filter flags */ | ||
900 | __le16 channel_count; /* minimum 1, maximum 10 */ | ||
901 | __le16 reserved3; | ||
902 | struct iwl_measure_channel channels[10]; | ||
903 | } __attribute__ ((packed)); | ||
904 | |||
905 | /* | ||
906 | * REPLY_SPECTRUM_MEASUREMENT_CMD = 0x74 (response) | ||
907 | */ | ||
908 | struct iwl_spectrum_resp { | ||
909 | u8 token; | ||
910 | u8 id; /* id of the prior command replaced, or 0xff */ | ||
911 | __le16 status; /* 0 - command will be handled | ||
912 | * 1 - cannot handle (conflicts with another | ||
913 | * measurement) */ | ||
914 | } __attribute__ ((packed)); | ||
915 | |||
916 | enum iwl_measurement_state { | ||
917 | IWL_MEASUREMENT_START = 0, | ||
918 | IWL_MEASUREMENT_STOP = 1, | ||
919 | }; | ||
920 | |||
921 | enum iwl_measurement_status { | ||
922 | IWL_MEASUREMENT_OK = 0, | ||
923 | IWL_MEASUREMENT_CONCURRENT = 1, | ||
924 | IWL_MEASUREMENT_CSA_CONFLICT = 2, | ||
925 | IWL_MEASUREMENT_TGH_CONFLICT = 3, | ||
926 | /* 4-5 reserved */ | ||
927 | IWL_MEASUREMENT_STOPPED = 6, | ||
928 | IWL_MEASUREMENT_TIMEOUT = 7, | ||
929 | IWL_MEASUREMENT_PERIODIC_FAILED = 8, | ||
930 | }; | ||
931 | |||
932 | #define NUM_ELEMENTS_IN_HISTOGRAM 8 | ||
933 | |||
934 | struct iwl_measurement_histogram { | ||
935 | __le32 ofdm[NUM_ELEMENTS_IN_HISTOGRAM]; /* in 0.8usec counts */ | ||
936 | __le32 cck[NUM_ELEMENTS_IN_HISTOGRAM]; /* in 1usec counts */ | ||
937 | } __attribute__ ((packed)); | ||
938 | |||
939 | /* clear channel availability counters */ | ||
940 | struct iwl_measurement_cca_counters { | ||
941 | __le32 ofdm; | ||
942 | __le32 cck; | ||
943 | } __attribute__ ((packed)); | ||
944 | |||
945 | enum iwl_measure_type { | ||
946 | IWL_MEASURE_BASIC = (1 << 0), | ||
947 | IWL_MEASURE_CHANNEL_LOAD = (1 << 1), | ||
948 | IWL_MEASURE_HISTOGRAM_RPI = (1 << 2), | ||
949 | IWL_MEASURE_HISTOGRAM_NOISE = (1 << 3), | ||
950 | IWL_MEASURE_FRAME = (1 << 4), | ||
951 | /* bits 5:6 are reserved */ | ||
952 | IWL_MEASURE_IDLE = (1 << 7), | ||
953 | }; | ||
954 | |||
955 | /* | ||
956 | * SPECTRUM_MEASURE_NOTIFICATION = 0x75 (notification only, not a command) | ||
957 | */ | ||
958 | struct iwl_spectrum_notification { | ||
959 | u8 id; /* measurement id -- 0 or 1 */ | ||
960 | u8 token; | ||
961 | u8 channel_index; /* index in measurement channel list */ | ||
962 | u8 state; /* 0 - start, 1 - stop */ | ||
963 | __le32 start_time; /* lower 32-bits of TSF */ | ||
964 | u8 band; /* 0 - 5.2GHz, 1 - 2.4GHz */ | ||
965 | u8 channel; | ||
966 | u8 type; /* see enum iwl_measurement_type */ | ||
967 | u8 reserved1; | ||
968 | /* NOTE: cca_ofdm, cca_cck, basic_type, and histogram are only only | ||
969 | * valid if applicable for measurement type requested. */ | ||
970 | __le32 cca_ofdm; /* cca fraction time in 40Mhz clock periods */ | ||
971 | __le32 cca_cck; /* cca fraction time in 44Mhz clock periods */ | ||
972 | __le32 cca_time; /* channel load time in usecs */ | ||
973 | u8 basic_type; /* 0 - bss, 1 - ofdm preamble, 2 - | ||
974 | * unidentified */ | ||
975 | u8 reserved2[3]; | ||
976 | struct iwl_measurement_histogram histogram; | ||
977 | __le32 stop_time; /* lower 32-bits of TSF */ | ||
978 | __le32 status; /* see iwl_measurement_status */ | ||
979 | } __attribute__ ((packed)); | ||
980 | |||
981 | /****************************************************************************** | ||
982 | * (7) | ||
983 | * Power Management Commands, Responses, Notifications: | ||
984 | * | ||
985 | *****************************************************************************/ | ||
986 | |||
987 | /** | ||
988 | * struct iwl_powertable_cmd - Power Table Command | ||
989 | * @flags: See below: | ||
990 | * | ||
991 | * POWER_TABLE_CMD = 0x77 (command, has simple generic response) | ||
992 | * | ||
993 | * PM allow: | ||
994 | * bit 0 - '0' Driver not allow power management | ||
995 | * '1' Driver allow PM (use rest of parameters) | ||
996 | * uCode send sleep notifications: | ||
997 | * bit 1 - '0' Don't send sleep notification | ||
998 | * '1' send sleep notification (SEND_PM_NOTIFICATION) | ||
999 | * Sleep over DTIM | ||
1000 | * bit 2 - '0' PM have to walk up every DTIM | ||
1001 | * '1' PM could sleep over DTIM till listen Interval. | ||
1002 | * PCI power managed | ||
1003 | * bit 3 - '0' (PCI_LINK_CTRL & 0x1) | ||
1004 | * '1' !(PCI_LINK_CTRL & 0x1) | ||
1005 | * Force sleep Modes | ||
1006 | * bit 31/30- '00' use both mac/xtal sleeps | ||
1007 | * '01' force Mac sleep | ||
1008 | * '10' force xtal sleep | ||
1009 | * '11' Illegal set | ||
1010 | * | ||
1011 | * NOTE: if sleep_interval[SLEEP_INTRVL_TABLE_SIZE-1] > DTIM period then | ||
1012 | * ucode assume sleep over DTIM is allowed and we don't need to wakeup | ||
1013 | * for every DTIM. | ||
1014 | */ | ||
1015 | #define IWL_POWER_VEC_SIZE 5 | ||
1016 | |||
1017 | #define IWL_POWER_DRIVER_ALLOW_SLEEP_MSK __constant_cpu_to_le32(1<<0) | ||
1018 | #define IWL_POWER_SLEEP_OVER_DTIM_MSK __constant_cpu_to_le32(1<<2) | ||
1019 | #define IWL_POWER_PCI_PM_MSK __constant_cpu_to_le32(1<<3) | ||
1020 | struct iwl_powertable_cmd { | ||
1021 | __le32 flags; | ||
1022 | __le32 rx_data_timeout; | ||
1023 | __le32 tx_data_timeout; | ||
1024 | __le32 sleep_interval[IWL_POWER_VEC_SIZE]; | ||
1025 | } __attribute__((packed)); | ||
1026 | |||
1027 | /* | ||
1028 | * PM_SLEEP_NOTIFICATION = 0x7A (notification only, not a command) | ||
1029 | * 3945 and 4965 identical. | ||
1030 | */ | ||
1031 | struct iwl_sleep_notification { | ||
1032 | u8 pm_sleep_mode; | ||
1033 | u8 pm_wakeup_src; | ||
1034 | __le16 reserved; | ||
1035 | __le32 sleep_time; | ||
1036 | __le32 tsf_low; | ||
1037 | __le32 bcon_timer; | ||
1038 | } __attribute__ ((packed)); | ||
1039 | |||
1040 | /* Sleep states. 3945 and 4965 identical. */ | ||
1041 | enum { | ||
1042 | IWL_PM_NO_SLEEP = 0, | ||
1043 | IWL_PM_SLP_MAC = 1, | ||
1044 | IWL_PM_SLP_FULL_MAC_UNASSOCIATE = 2, | ||
1045 | IWL_PM_SLP_FULL_MAC_CARD_STATE = 3, | ||
1046 | IWL_PM_SLP_PHY = 4, | ||
1047 | IWL_PM_SLP_REPENT = 5, | ||
1048 | IWL_PM_WAKEUP_BY_TIMER = 6, | ||
1049 | IWL_PM_WAKEUP_BY_DRIVER = 7, | ||
1050 | IWL_PM_WAKEUP_BY_RFKILL = 8, | ||
1051 | /* 3 reserved */ | ||
1052 | IWL_PM_NUM_OF_MODES = 12, | ||
1053 | }; | ||
1054 | |||
1055 | /* | ||
1056 | * REPLY_CARD_STATE_CMD = 0xa0 (command, has simple generic response) | ||
1057 | */ | ||
1058 | #define CARD_STATE_CMD_DISABLE 0x00 /* Put card to sleep */ | ||
1059 | #define CARD_STATE_CMD_ENABLE 0x01 /* Wake up card */ | ||
1060 | #define CARD_STATE_CMD_HALT 0x02 /* Power down permanently */ | ||
1061 | struct iwl_card_state_cmd { | ||
1062 | __le32 status; /* CARD_STATE_CMD_* request new power state */ | ||
1063 | } __attribute__ ((packed)); | ||
1064 | |||
1065 | /* | ||
1066 | * CARD_STATE_NOTIFICATION = 0xa1 (notification only, not a command) | ||
1067 | */ | ||
1068 | struct iwl_card_state_notif { | ||
1069 | __le32 flags; | ||
1070 | } __attribute__ ((packed)); | ||
1071 | |||
1072 | #define HW_CARD_DISABLED 0x01 | ||
1073 | #define SW_CARD_DISABLED 0x02 | ||
1074 | #define RF_CARD_DISABLED 0x04 | ||
1075 | #define RXON_CARD_DISABLED 0x10 | ||
1076 | |||
1077 | struct iwl_ct_kill_config { | ||
1078 | __le32 reserved; | ||
1079 | __le32 critical_temperature_M; | ||
1080 | __le32 critical_temperature_R; | ||
1081 | } __attribute__ ((packed)); | ||
1082 | |||
1083 | /****************************************************************************** | ||
1084 | * (8) | ||
1085 | * Scan Commands, Responses, Notifications: | ||
1086 | * | ||
1087 | *****************************************************************************/ | ||
1088 | |||
1089 | struct iwl_scan_channel { | ||
1090 | /* type is defined as: | ||
1091 | * 0:0 active (0 - passive) | ||
1092 | * 1:4 SSID direct | ||
1093 | * If 1 is set then corresponding SSID IE is transmitted in probe | ||
1094 | * 5:7 reserved | ||
1095 | */ | ||
1096 | u8 type; | ||
1097 | u8 channel; | ||
1098 | struct iwl_tx_power tpc; | ||
1099 | __le16 active_dwell; | ||
1100 | __le16 passive_dwell; | ||
1101 | } __attribute__ ((packed)); | ||
1102 | |||
1103 | struct iwl_ssid_ie { | ||
1104 | u8 id; | ||
1105 | u8 len; | ||
1106 | u8 ssid[32]; | ||
1107 | } __attribute__ ((packed)); | ||
1108 | |||
1109 | #define PROBE_OPTION_MAX 0x4 | ||
1110 | #define TX_CMD_LIFE_TIME_INFINITE __constant_cpu_to_le32(0xFFFFFFFF) | ||
1111 | #define IWL_GOOD_CRC_TH __constant_cpu_to_le16(1) | ||
1112 | #define IWL_MAX_SCAN_SIZE 1024 | ||
1113 | |||
1114 | /* | ||
1115 | * REPLY_SCAN_CMD = 0x80 (command) | ||
1116 | */ | ||
1117 | struct iwl_scan_cmd { | ||
1118 | __le16 len; | ||
1119 | u8 reserved0; | ||
1120 | u8 channel_count; | ||
1121 | __le16 quiet_time; /* dwell only this long on quiet chnl | ||
1122 | * (active scan) */ | ||
1123 | __le16 quiet_plcp_th; /* quiet chnl is < this # pkts (typ. 1) */ | ||
1124 | __le16 good_CRC_th; /* passive -> active promotion threshold */ | ||
1125 | __le16 reserved1; | ||
1126 | __le32 max_out_time; /* max usec to be out of associated (service) | ||
1127 | * chnl */ | ||
1128 | __le32 suspend_time; /* pause scan this long when returning to svc | ||
1129 | * chnl. | ||
1130 | * 3945 -- 31:24 # beacons, 19:0 additional usec, | ||
1131 | * 4965 -- 31:22 # beacons, 21:0 additional usec. | ||
1132 | */ | ||
1133 | __le32 flags; | ||
1134 | __le32 filter_flags; | ||
1135 | |||
1136 | struct iwl_tx_cmd tx_cmd; | ||
1137 | struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX]; | ||
1138 | |||
1139 | u8 data[0]; | ||
1140 | /* | ||
1141 | * The channels start after the probe request payload and are of type: | ||
1142 | * | ||
1143 | * struct iwl_scan_channel channels[0]; | ||
1144 | * | ||
1145 | * NOTE: Only one band of channels can be scanned per pass. You | ||
1146 | * can not mix 2.4GHz channels and 5.2GHz channels and must | ||
1147 | * request a scan multiple times (not concurrently) | ||
1148 | * | ||
1149 | */ | ||
1150 | } __attribute__ ((packed)); | ||
1151 | |||
1152 | /* Can abort will notify by complete notification with abort status. */ | ||
1153 | #define CAN_ABORT_STATUS __constant_cpu_to_le32(0x1) | ||
1154 | /* complete notification statuses */ | ||
1155 | #define ABORT_STATUS 0x2 | ||
1156 | |||
1157 | /* | ||
1158 | * REPLY_SCAN_CMD = 0x80 (response) | ||
1159 | */ | ||
1160 | struct iwl_scanreq_notification { | ||
1161 | __le32 status; /* 1: okay, 2: cannot fulfill request */ | ||
1162 | } __attribute__ ((packed)); | ||
1163 | |||
1164 | /* | ||
1165 | * SCAN_START_NOTIFICATION = 0x82 (notification only, not a command) | ||
1166 | */ | ||
1167 | struct iwl_scanstart_notification { | ||
1168 | __le32 tsf_low; | ||
1169 | __le32 tsf_high; | ||
1170 | __le32 beacon_timer; | ||
1171 | u8 channel; | ||
1172 | u8 band; | ||
1173 | u8 reserved[2]; | ||
1174 | __le32 status; | ||
1175 | } __attribute__ ((packed)); | ||
1176 | |||
1177 | #define SCAN_OWNER_STATUS 0x1; | ||
1178 | #define MEASURE_OWNER_STATUS 0x2; | ||
1179 | |||
1180 | #define NUMBER_OF_STATISTICS 1 /* first __le32 is good CRC */ | ||
1181 | /* | ||
1182 | * SCAN_RESULTS_NOTIFICATION = 0x83 (notification only, not a command) | ||
1183 | */ | ||
1184 | struct iwl_scanresults_notification { | ||
1185 | u8 channel; | ||
1186 | u8 band; | ||
1187 | u8 reserved[2]; | ||
1188 | __le32 tsf_low; | ||
1189 | __le32 tsf_high; | ||
1190 | __le32 statistics[NUMBER_OF_STATISTICS]; | ||
1191 | } __attribute__ ((packed)); | ||
1192 | |||
1193 | /* | ||
1194 | * SCAN_COMPLETE_NOTIFICATION = 0x84 (notification only, not a command) | ||
1195 | */ | ||
1196 | struct iwl_scancomplete_notification { | ||
1197 | u8 scanned_channels; | ||
1198 | u8 status; | ||
1199 | u8 reserved; | ||
1200 | u8 last_channel; | ||
1201 | __le32 tsf_low; | ||
1202 | __le32 tsf_high; | ||
1203 | } __attribute__ ((packed)); | ||
1204 | |||
1205 | |||
1206 | /****************************************************************************** | ||
1207 | * (9) | ||
1208 | * IBSS/AP Commands and Notifications: | ||
1209 | * | ||
1210 | *****************************************************************************/ | ||
1211 | |||
1212 | /* | ||
1213 | * BEACON_NOTIFICATION = 0x90 (notification only, not a command) | ||
1214 | */ | ||
1215 | struct iwl_beacon_notif { | ||
1216 | struct iwl_tx_resp beacon_notify_hdr; | ||
1217 | __le32 low_tsf; | ||
1218 | __le32 high_tsf; | ||
1219 | __le32 ibss_mgr_status; | ||
1220 | } __attribute__ ((packed)); | ||
1221 | |||
1222 | /* | ||
1223 | * REPLY_TX_BEACON = 0x91 (command, has simple generic response) | ||
1224 | */ | ||
1225 | struct iwl_tx_beacon_cmd { | ||
1226 | struct iwl_tx_cmd tx; | ||
1227 | __le16 tim_idx; | ||
1228 | u8 tim_size; | ||
1229 | u8 reserved1; | ||
1230 | struct ieee80211_hdr frame[0]; /* beacon frame */ | ||
1231 | } __attribute__ ((packed)); | ||
1232 | |||
1233 | /****************************************************************************** | ||
1234 | * (10) | ||
1235 | * Statistics Commands and Notifications: | ||
1236 | * | ||
1237 | *****************************************************************************/ | ||
1238 | |||
1239 | #define IWL_TEMP_CONVERT 260 | ||
1240 | |||
1241 | #define SUP_RATE_11A_MAX_NUM_CHANNELS 8 | ||
1242 | #define SUP_RATE_11B_MAX_NUM_CHANNELS 4 | ||
1243 | #define SUP_RATE_11G_MAX_NUM_CHANNELS 12 | ||
1244 | |||
1245 | /* Used for passing to driver number of successes and failures per rate */ | ||
1246 | struct rate_histogram { | ||
1247 | union { | ||
1248 | __le32 a[SUP_RATE_11A_MAX_NUM_CHANNELS]; | ||
1249 | __le32 b[SUP_RATE_11B_MAX_NUM_CHANNELS]; | ||
1250 | __le32 g[SUP_RATE_11G_MAX_NUM_CHANNELS]; | ||
1251 | } success; | ||
1252 | union { | ||
1253 | __le32 a[SUP_RATE_11A_MAX_NUM_CHANNELS]; | ||
1254 | __le32 b[SUP_RATE_11B_MAX_NUM_CHANNELS]; | ||
1255 | __le32 g[SUP_RATE_11G_MAX_NUM_CHANNELS]; | ||
1256 | } failed; | ||
1257 | } __attribute__ ((packed)); | ||
1258 | |||
1259 | /* statistics command response */ | ||
1260 | |||
1261 | struct statistics_rx_phy { | ||
1262 | __le32 ina_cnt; | ||
1263 | __le32 fina_cnt; | ||
1264 | __le32 plcp_err; | ||
1265 | __le32 crc32_err; | ||
1266 | __le32 overrun_err; | ||
1267 | __le32 early_overrun_err; | ||
1268 | __le32 crc32_good; | ||
1269 | __le32 false_alarm_cnt; | ||
1270 | __le32 fina_sync_err_cnt; | ||
1271 | __le32 sfd_timeout; | ||
1272 | __le32 fina_timeout; | ||
1273 | __le32 unresponded_rts; | ||
1274 | __le32 rxe_frame_limit_overrun; | ||
1275 | __le32 sent_ack_cnt; | ||
1276 | __le32 sent_cts_cnt; | ||
1277 | } __attribute__ ((packed)); | ||
1278 | |||
1279 | struct statistics_rx_non_phy { | ||
1280 | __le32 bogus_cts; /* CTS received when not expecting CTS */ | ||
1281 | __le32 bogus_ack; /* ACK received when not expecting ACK */ | ||
1282 | __le32 non_bssid_frames; /* number of frames with BSSID that | ||
1283 | * doesn't belong to the STA BSSID */ | ||
1284 | __le32 filtered_frames; /* count frames that were dumped in the | ||
1285 | * filtering process */ | ||
1286 | __le32 non_channel_beacons; /* beacons with our bss id but not on | ||
1287 | * our serving channel */ | ||
1288 | } __attribute__ ((packed)); | ||
1289 | |||
1290 | struct statistics_rx { | ||
1291 | struct statistics_rx_phy ofdm; | ||
1292 | struct statistics_rx_phy cck; | ||
1293 | struct statistics_rx_non_phy general; | ||
1294 | } __attribute__ ((packed)); | ||
1295 | |||
1296 | struct statistics_tx { | ||
1297 | __le32 preamble_cnt; | ||
1298 | __le32 rx_detected_cnt; | ||
1299 | __le32 bt_prio_defer_cnt; | ||
1300 | __le32 bt_prio_kill_cnt; | ||
1301 | __le32 few_bytes_cnt; | ||
1302 | __le32 cts_timeout; | ||
1303 | __le32 ack_timeout; | ||
1304 | __le32 expected_ack_cnt; | ||
1305 | __le32 actual_ack_cnt; | ||
1306 | } __attribute__ ((packed)); | ||
1307 | |||
1308 | struct statistics_dbg { | ||
1309 | __le32 burst_check; | ||
1310 | __le32 burst_count; | ||
1311 | __le32 reserved[4]; | ||
1312 | } __attribute__ ((packed)); | ||
1313 | |||
1314 | struct statistics_div { | ||
1315 | __le32 tx_on_a; | ||
1316 | __le32 tx_on_b; | ||
1317 | __le32 exec_time; | ||
1318 | __le32 probe_time; | ||
1319 | } __attribute__ ((packed)); | ||
1320 | |||
1321 | struct statistics_general { | ||
1322 | __le32 temperature; | ||
1323 | struct statistics_dbg dbg; | ||
1324 | __le32 sleep_time; | ||
1325 | __le32 slots_out; | ||
1326 | __le32 slots_idle; | ||
1327 | __le32 ttl_timestamp; | ||
1328 | struct statistics_div div; | ||
1329 | } __attribute__ ((packed)); | ||
1330 | |||
1331 | /* | ||
1332 | * REPLY_STATISTICS_CMD = 0x9c, | ||
1333 | * 3945 and 4965 identical. | ||
1334 | * | ||
1335 | * This command triggers an immediate response containing uCode statistics. | ||
1336 | * The response is in the same format as STATISTICS_NOTIFICATION 0x9d, below. | ||
1337 | * | ||
1338 | * If the CLEAR_STATS configuration flag is set, uCode will clear its | ||
1339 | * internal copy of the statistics (counters) after issuing the response. | ||
1340 | * This flag does not affect STATISTICS_NOTIFICATIONs after beacons (see below). | ||
1341 | * | ||
1342 | * If the DISABLE_NOTIF configuration flag is set, uCode will not issue | ||
1343 | * STATISTICS_NOTIFICATIONs after received beacons (see below). This flag | ||
1344 | * does not affect the response to the REPLY_STATISTICS_CMD 0x9c itself. | ||
1345 | */ | ||
1346 | #define IWL_STATS_CONF_CLEAR_STATS __constant_cpu_to_le32(0x1) /* see above */ | ||
1347 | #define IWL_STATS_CONF_DISABLE_NOTIF __constant_cpu_to_le32(0x2)/* see above */ | ||
1348 | struct iwl_statistics_cmd { | ||
1349 | __le32 configuration_flags; /* IWL_STATS_CONF_* */ | ||
1350 | } __attribute__ ((packed)); | ||
1351 | |||
1352 | /* | ||
1353 | * STATISTICS_NOTIFICATION = 0x9d (notification only, not a command) | ||
1354 | * | ||
1355 | * By default, uCode issues this notification after receiving a beacon | ||
1356 | * while associated. To disable this behavior, set DISABLE_NOTIF flag in the | ||
1357 | * REPLY_STATISTICS_CMD 0x9c, above. | ||
1358 | * | ||
1359 | * Statistics counters continue to increment beacon after beacon, but are | ||
1360 | * cleared when changing channels or when driver issues REPLY_STATISTICS_CMD | ||
1361 | * 0x9c with CLEAR_STATS bit set (see above). | ||
1362 | * | ||
1363 | * uCode also issues this notification during scans. uCode clears statistics | ||
1364 | * appropriately so that each notification contains statistics for only the | ||
1365 | * one channel that has just been scanned. | ||
1366 | */ | ||
1367 | #define STATISTICS_REPLY_FLG_BAND_24G_MSK __constant_cpu_to_le32(0x2) | ||
1368 | #define STATISTICS_REPLY_FLG_FAT_MODE_MSK __constant_cpu_to_le32(0x8) | ||
1369 | struct iwl_notif_statistics { | ||
1370 | __le32 flag; | ||
1371 | struct statistics_rx rx; | ||
1372 | struct statistics_tx tx; | ||
1373 | struct statistics_general general; | ||
1374 | } __attribute__ ((packed)); | ||
1375 | |||
1376 | |||
1377 | /* | ||
1378 | * MISSED_BEACONS_NOTIFICATION = 0xa2 (notification only, not a command) | ||
1379 | */ | ||
1380 | /* if ucode missed CONSECUTIVE_MISSED_BCONS_TH beacons in a row, | ||
1381 | * then this notification will be sent. */ | ||
1382 | #define CONSECUTIVE_MISSED_BCONS_TH 20 | ||
1383 | |||
1384 | struct iwl_missed_beacon_notif { | ||
1385 | __le32 consequtive_missed_beacons; | ||
1386 | __le32 total_missed_becons; | ||
1387 | __le32 num_expected_beacons; | ||
1388 | __le32 num_recvd_beacons; | ||
1389 | } __attribute__ ((packed)); | ||
1390 | |||
1391 | /****************************************************************************** | ||
1392 | * (11) | ||
1393 | * Rx Calibration Commands: | ||
1394 | * | ||
1395 | *****************************************************************************/ | ||
1396 | |||
1397 | #define PHY_CALIBRATE_DIFF_GAIN_CMD (7) | ||
1398 | #define HD_TABLE_SIZE (11) | ||
1399 | |||
1400 | struct iwl_sensitivity_cmd { | ||
1401 | __le16 control; | ||
1402 | __le16 table[HD_TABLE_SIZE]; | ||
1403 | } __attribute__ ((packed)); | ||
1404 | |||
1405 | struct iwl_calibration_cmd { | ||
1406 | u8 opCode; | ||
1407 | u8 flags; | ||
1408 | __le16 reserved; | ||
1409 | s8 diff_gain_a; | ||
1410 | s8 diff_gain_b; | ||
1411 | s8 diff_gain_c; | ||
1412 | u8 reserved1; | ||
1413 | } __attribute__ ((packed)); | ||
1414 | |||
1415 | /****************************************************************************** | ||
1416 | * (12) | ||
1417 | * Miscellaneous Commands: | ||
1418 | * | ||
1419 | *****************************************************************************/ | ||
1420 | |||
1421 | /* | ||
1422 | * LEDs Command & Response | ||
1423 | * REPLY_LEDS_CMD = 0x48 (command, has simple generic response) | ||
1424 | * | ||
1425 | * For each of 3 possible LEDs (Activity/Link/Tech, selected by "id" field), | ||
1426 | * this command turns it on or off, or sets up a periodic blinking cycle. | ||
1427 | */ | ||
1428 | struct iwl_led_cmd { | ||
1429 | __le32 interval; /* "interval" in uSec */ | ||
1430 | u8 id; /* 1: Activity, 2: Link, 3: Tech */ | ||
1431 | u8 off; /* # intervals off while blinking; | ||
1432 | * "0", with >0 "on" value, turns LED on */ | ||
1433 | u8 on; /* # intervals on while blinking; | ||
1434 | * "0", regardless of "off", turns LED off */ | ||
1435 | u8 reserved; | ||
1436 | } __attribute__ ((packed)); | ||
1437 | |||
1438 | /****************************************************************************** | ||
1439 | * (13) | ||
1440 | * Union of all expected notifications/responses: | ||
1441 | * | ||
1442 | *****************************************************************************/ | ||
1443 | |||
1444 | struct iwl_rx_packet { | ||
1445 | __le32 len; | ||
1446 | struct iwl_cmd_header hdr; | ||
1447 | union { | ||
1448 | struct iwl_alive_resp alive_frame; | ||
1449 | struct iwl_rx_frame rx_frame; | ||
1450 | struct iwl_tx_resp tx_resp; | ||
1451 | struct iwl_spectrum_notification spectrum_notif; | ||
1452 | struct iwl_csa_notification csa_notif; | ||
1453 | struct iwl_error_resp err_resp; | ||
1454 | struct iwl_card_state_notif card_state_notif; | ||
1455 | struct iwl_beacon_notif beacon_status; | ||
1456 | struct iwl_add_sta_resp add_sta; | ||
1457 | struct iwl_sleep_notification sleep_notif; | ||
1458 | struct iwl_spectrum_resp spectrum; | ||
1459 | struct iwl_notif_statistics stats; | ||
1460 | __le32 status; | ||
1461 | u8 raw[0]; | ||
1462 | } u; | ||
1463 | } __attribute__ ((packed)); | ||
1464 | |||
1465 | #define IWL_RX_FRAME_SIZE (4 + sizeof(struct iwl_rx_frame)) | ||
1466 | |||
1467 | #endif /* __iwl_3945_commands_h__ */ | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.h b/drivers/net/wireless/iwlwifi/iwl-3945-debug.h index 72318d78957e..72318d78957e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debug.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-debug.h | |||
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h index 90d4249fa7f2..0a5a08d19f55 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h | |||
@@ -64,6 +64,633 @@ | |||
64 | #ifndef __iwl_3945_hw__ | 64 | #ifndef __iwl_3945_hw__ |
65 | #define __iwl_3945_hw__ | 65 | #define __iwl_3945_hw__ |
66 | 66 | ||
67 | /* uCode queue management definitions */ | ||
68 | #define IWL_CMD_QUEUE_NUM 4 | ||
69 | #define IWL_CMD_FIFO_NUM 4 | ||
70 | #define IWL_BACK_QUEUE_FIRST_ID 7 | ||
71 | |||
72 | /* Tx rates */ | ||
73 | #define IWL_CCK_RATES 4 | ||
74 | #define IWL_OFDM_RATES 8 | ||
75 | |||
76 | #define IWL_HT_RATES 0 | ||
77 | |||
78 | #define IWL_MAX_RATES (IWL_CCK_RATES+IWL_OFDM_RATES+IWL_HT_RATES) | ||
79 | |||
80 | /* Time constants */ | ||
81 | #define SHORT_SLOT_TIME 9 | ||
82 | #define LONG_SLOT_TIME 20 | ||
83 | |||
84 | /* RSSI to dBm */ | ||
85 | #define IWL_RSSI_OFFSET 95 | ||
86 | |||
87 | /* | ||
88 | * This file defines EEPROM related constants, enums, and inline functions. | ||
89 | * | ||
90 | */ | ||
91 | |||
92 | #define IWL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */ | ||
93 | #define IWL_EEPROM_ACCESS_DELAY 10 /* uSec */ | ||
94 | /* EEPROM field values */ | ||
95 | #define ANTENNA_SWITCH_NORMAL 0 | ||
96 | #define ANTENNA_SWITCH_INVERSE 1 | ||
97 | |||
98 | enum { | ||
99 | EEPROM_CHANNEL_VALID = (1 << 0), /* usable for this SKU/geo */ | ||
100 | EEPROM_CHANNEL_IBSS = (1 << 1), /* usable as an IBSS channel */ | ||
101 | /* Bit 2 Reserved */ | ||
102 | EEPROM_CHANNEL_ACTIVE = (1 << 3), /* active scanning allowed */ | ||
103 | EEPROM_CHANNEL_RADAR = (1 << 4), /* radar detection required */ | ||
104 | EEPROM_CHANNEL_WIDE = (1 << 5), | ||
105 | EEPROM_CHANNEL_NARROW = (1 << 6), | ||
106 | EEPROM_CHANNEL_DFS = (1 << 7), /* dynamic freq selection candidate */ | ||
107 | }; | ||
108 | |||
109 | /* EEPROM field lengths */ | ||
110 | #define EEPROM_BOARD_PBA_NUMBER_LENGTH 11 | ||
111 | |||
112 | /* EEPROM field lengths */ | ||
113 | #define EEPROM_BOARD_PBA_NUMBER_LENGTH 11 | ||
114 | #define EEPROM_REGULATORY_SKU_ID_LENGTH 4 | ||
115 | #define EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH 14 | ||
116 | #define EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH 13 | ||
117 | #define EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH 12 | ||
118 | #define EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH 11 | ||
119 | #define EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH 6 | ||
120 | |||
121 | #define EEPROM_REGULATORY_CHANNELS_LENGTH ( \ | ||
122 | EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH + \ | ||
123 | EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH + \ | ||
124 | EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH + \ | ||
125 | EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH + \ | ||
126 | EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH) | ||
127 | |||
128 | #define EEPROM_REGULATORY_NUMBER_OF_BANDS 5 | ||
129 | |||
130 | /* SKU Capabilities */ | ||
131 | #define EEPROM_SKU_CAP_SW_RF_KILL_ENABLE (1 << 0) | ||
132 | #define EEPROM_SKU_CAP_HW_RF_KILL_ENABLE (1 << 1) | ||
133 | #define EEPROM_SKU_CAP_OP_MODE_MRC (1 << 7) | ||
134 | |||
135 | /* *regulatory* channel data from eeprom, one for each channel */ | ||
136 | struct iwl_eeprom_channel { | ||
137 | u8 flags; /* flags copied from EEPROM */ | ||
138 | s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ | ||
139 | } __attribute__ ((packed)); | ||
140 | |||
141 | /* | ||
142 | * Mapping of a Tx power level, at factory calibration temperature, | ||
143 | * to a radio/DSP gain table index. | ||
144 | * One for each of 5 "sample" power levels in each band. | ||
145 | * v_det is measured at the factory, using the 3945's built-in power amplifier | ||
146 | * (PA) output voltage detector. This same detector is used during Tx of | ||
147 | * long packets in normal operation to provide feedback as to proper output | ||
148 | * level. | ||
149 | * Data copied from EEPROM. | ||
150 | */ | ||
151 | struct iwl_eeprom_txpower_sample { | ||
152 | u8 gain_index; /* index into power (gain) setup table ... */ | ||
153 | s8 power; /* ... for this pwr level for this chnl group */ | ||
154 | u16 v_det; /* PA output voltage */ | ||
155 | } __attribute__ ((packed)); | ||
156 | |||
157 | /* | ||
158 | * Mappings of Tx power levels -> nominal radio/DSP gain table indexes. | ||
159 | * One for each channel group (a.k.a. "band") (1 for BG, 4 for A). | ||
160 | * Tx power setup code interpolates between the 5 "sample" power levels | ||
161 | * to determine the nominal setup for a requested power level. | ||
162 | * Data copied from EEPROM. | ||
163 | * DO NOT ALTER THIS STRUCTURE!!! | ||
164 | */ | ||
165 | struct iwl_eeprom_txpower_group { | ||
166 | struct iwl_eeprom_txpower_sample samples[5]; /* 5 power levels */ | ||
167 | s32 a, b, c, d, e; /* coefficients for voltage->power | ||
168 | * formula (signed) */ | ||
169 | s32 Fa, Fb, Fc, Fd, Fe; /* these modify coeffs based on | ||
170 | * frequency (signed) */ | ||
171 | s8 saturation_power; /* highest power possible by h/w in this | ||
172 | * band */ | ||
173 | u8 group_channel; /* "representative" channel # in this band */ | ||
174 | s16 temperature; /* h/w temperature at factory calib this band | ||
175 | * (signed) */ | ||
176 | } __attribute__ ((packed)); | ||
177 | |||
178 | /* | ||
179 | * Temperature-based Tx-power compensation data, not band-specific. | ||
180 | * These coefficients are use to modify a/b/c/d/e coeffs based on | ||
181 | * difference between current temperature and factory calib temperature. | ||
182 | * Data copied from EEPROM. | ||
183 | */ | ||
184 | struct iwl_eeprom_temperature_corr { | ||
185 | u32 Ta; | ||
186 | u32 Tb; | ||
187 | u32 Tc; | ||
188 | u32 Td; | ||
189 | u32 Te; | ||
190 | } __attribute__ ((packed)); | ||
191 | |||
192 | struct iwl_eeprom { | ||
193 | u8 reserved0[16]; | ||
194 | #define EEPROM_DEVICE_ID (2*0x08) /* 2 bytes */ | ||
195 | u16 device_id; /* abs.ofs: 16 */ | ||
196 | u8 reserved1[2]; | ||
197 | #define EEPROM_PMC (2*0x0A) /* 2 bytes */ | ||
198 | u16 pmc; /* abs.ofs: 20 */ | ||
199 | u8 reserved2[20]; | ||
200 | #define EEPROM_MAC_ADDRESS (2*0x15) /* 6 bytes */ | ||
201 | u8 mac_address[6]; /* abs.ofs: 42 */ | ||
202 | u8 reserved3[58]; | ||
203 | #define EEPROM_BOARD_REVISION (2*0x35) /* 2 bytes */ | ||
204 | u16 board_revision; /* abs.ofs: 106 */ | ||
205 | u8 reserved4[11]; | ||
206 | #define EEPROM_BOARD_PBA_NUMBER (2*0x3B+1) /* 9 bytes */ | ||
207 | u8 board_pba_number[9]; /* abs.ofs: 119 */ | ||
208 | u8 reserved5[8]; | ||
209 | #define EEPROM_VERSION (2*0x44) /* 2 bytes */ | ||
210 | u16 version; /* abs.ofs: 136 */ | ||
211 | #define EEPROM_SKU_CAP (2*0x45) /* 1 bytes */ | ||
212 | u8 sku_cap; /* abs.ofs: 138 */ | ||
213 | #define EEPROM_LEDS_MODE (2*0x45+1) /* 1 bytes */ | ||
214 | u8 leds_mode; /* abs.ofs: 139 */ | ||
215 | #define EEPROM_OEM_MODE (2*0x46) /* 2 bytes */ | ||
216 | u16 oem_mode; | ||
217 | #define EEPROM_WOWLAN_MODE (2*0x47) /* 2 bytes */ | ||
218 | u16 wowlan_mode; /* abs.ofs: 142 */ | ||
219 | #define EEPROM_LEDS_TIME_INTERVAL (2*0x48) /* 2 bytes */ | ||
220 | u16 leds_time_interval; /* abs.ofs: 144 */ | ||
221 | #define EEPROM_LEDS_OFF_TIME (2*0x49) /* 1 bytes */ | ||
222 | u8 leds_off_time; /* abs.ofs: 146 */ | ||
223 | #define EEPROM_LEDS_ON_TIME (2*0x49+1) /* 1 bytes */ | ||
224 | u8 leds_on_time; /* abs.ofs: 147 */ | ||
225 | #define EEPROM_ALMGOR_M_VERSION (2*0x4A) /* 1 bytes */ | ||
226 | u8 almgor_m_version; /* abs.ofs: 148 */ | ||
227 | #define EEPROM_ANTENNA_SWITCH_TYPE (2*0x4A+1) /* 1 bytes */ | ||
228 | u8 antenna_switch_type; /* abs.ofs: 149 */ | ||
229 | u8 reserved6[42]; | ||
230 | #define EEPROM_REGULATORY_SKU_ID (2*0x60) /* 4 bytes */ | ||
231 | u8 sku_id[4]; /* abs.ofs: 192 */ | ||
232 | #define EEPROM_REGULATORY_BAND_1 (2*0x62) /* 2 bytes */ | ||
233 | u16 band_1_count; /* abs.ofs: 196 */ | ||
234 | #define EEPROM_REGULATORY_BAND_1_CHANNELS (2*0x63) /* 28 bytes */ | ||
235 | struct iwl_eeprom_channel band_1_channels[14]; /* abs.ofs: 196 */ | ||
236 | #define EEPROM_REGULATORY_BAND_2 (2*0x71) /* 2 bytes */ | ||
237 | u16 band_2_count; /* abs.ofs: 226 */ | ||
238 | #define EEPROM_REGULATORY_BAND_2_CHANNELS (2*0x72) /* 26 bytes */ | ||
239 | struct iwl_eeprom_channel band_2_channels[13]; /* abs.ofs: 228 */ | ||
240 | #define EEPROM_REGULATORY_BAND_3 (2*0x7F) /* 2 bytes */ | ||
241 | u16 band_3_count; /* abs.ofs: 254 */ | ||
242 | #define EEPROM_REGULATORY_BAND_3_CHANNELS (2*0x80) /* 24 bytes */ | ||
243 | struct iwl_eeprom_channel band_3_channels[12]; /* abs.ofs: 256 */ | ||
244 | #define EEPROM_REGULATORY_BAND_4 (2*0x8C) /* 2 bytes */ | ||
245 | u16 band_4_count; /* abs.ofs: 280 */ | ||
246 | #define EEPROM_REGULATORY_BAND_4_CHANNELS (2*0x8D) /* 22 bytes */ | ||
247 | struct iwl_eeprom_channel band_4_channels[11]; /* abs.ofs: 282 */ | ||
248 | #define EEPROM_REGULATORY_BAND_5 (2*0x98) /* 2 bytes */ | ||
249 | u16 band_5_count; /* abs.ofs: 304 */ | ||
250 | #define EEPROM_REGULATORY_BAND_5_CHANNELS (2*0x99) /* 12 bytes */ | ||
251 | struct iwl_eeprom_channel band_5_channels[6]; /* abs.ofs: 306 */ | ||
252 | |||
253 | u8 reserved9[194]; | ||
254 | |||
255 | #define EEPROM_TXPOWER_CALIB_GROUP0 0x200 | ||
256 | #define EEPROM_TXPOWER_CALIB_GROUP1 0x240 | ||
257 | #define EEPROM_TXPOWER_CALIB_GROUP2 0x280 | ||
258 | #define EEPROM_TXPOWER_CALIB_GROUP3 0x2c0 | ||
259 | #define EEPROM_TXPOWER_CALIB_GROUP4 0x300 | ||
260 | #define IWL_NUM_TX_CALIB_GROUPS 5 | ||
261 | struct iwl_eeprom_txpower_group groups[IWL_NUM_TX_CALIB_GROUPS]; | ||
262 | /* abs.ofs: 512 */ | ||
263 | #define EEPROM_CALIB_TEMPERATURE_CORRECT 0x340 | ||
264 | struct iwl_eeprom_temperature_corr corrections; /* abs.ofs: 832 */ | ||
265 | u8 reserved16[172]; /* fill out to full 1024 byte block */ | ||
266 | } __attribute__ ((packed)); | ||
267 | |||
268 | #define IWL_EEPROM_IMAGE_SIZE 1024 | ||
269 | |||
270 | |||
271 | #include "iwl-3945-commands.h" | ||
272 | |||
273 | #define PCI_LINK_CTRL 0x0F0 | ||
274 | #define PCI_POWER_SOURCE 0x0C8 | ||
275 | #define PCI_REG_WUM8 0x0E8 | ||
276 | #define PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT (0x80000000) | ||
277 | |||
278 | /*=== CSR (control and status registers) ===*/ | ||
279 | #define CSR_BASE (0x000) | ||
280 | |||
281 | #define CSR_SW_VER (CSR_BASE+0x000) | ||
282 | #define CSR_HW_IF_CONFIG_REG (CSR_BASE+0x000) /* hardware interface config */ | ||
283 | #define CSR_INT_COALESCING (CSR_BASE+0x004) /* accum ints, 32-usec units */ | ||
284 | #define CSR_INT (CSR_BASE+0x008) /* host interrupt status/ack */ | ||
285 | #define CSR_INT_MASK (CSR_BASE+0x00c) /* host interrupt enable */ | ||
286 | #define CSR_FH_INT_STATUS (CSR_BASE+0x010) /* busmaster int status/ack*/ | ||
287 | #define CSR_GPIO_IN (CSR_BASE+0x018) /* read external chip pins */ | ||
288 | #define CSR_RESET (CSR_BASE+0x020) /* busmaster enable, NMI, etc*/ | ||
289 | #define CSR_GP_CNTRL (CSR_BASE+0x024) | ||
290 | #define CSR_HW_REV (CSR_BASE+0x028) | ||
291 | #define CSR_EEPROM_REG (CSR_BASE+0x02c) | ||
292 | #define CSR_EEPROM_GP (CSR_BASE+0x030) | ||
293 | #define CSR_GP_UCODE (CSR_BASE+0x044) | ||
294 | #define CSR_UCODE_DRV_GP1 (CSR_BASE+0x054) | ||
295 | #define CSR_UCODE_DRV_GP1_SET (CSR_BASE+0x058) | ||
296 | #define CSR_UCODE_DRV_GP1_CLR (CSR_BASE+0x05c) | ||
297 | #define CSR_UCODE_DRV_GP2 (CSR_BASE+0x060) | ||
298 | #define CSR_LED_REG (CSR_BASE+0x094) | ||
299 | #define CSR_DRAM_INT_TBL_CTL (CSR_BASE+0x0A0) | ||
300 | #define CSR_GIO_CHICKEN_BITS (CSR_BASE+0x100) | ||
301 | #define CSR_ANA_PLL_CFG (CSR_BASE+0x20c) | ||
302 | #define CSR_HW_REV_WA_REG (CSR_BASE+0x22C) | ||
303 | |||
304 | /* HW I/F configuration */ | ||
305 | #define CSR_HW_IF_CONFIG_REG_BIT_ALMAGOR_MB (0x00000100) | ||
306 | #define CSR_HW_IF_CONFIG_REG_BIT_ALMAGOR_MM (0x00000200) | ||
307 | #define CSR_HW_IF_CONFIG_REG_BIT_SKU_MRC (0x00000400) | ||
308 | #define CSR_HW_IF_CONFIG_REG_BIT_BOARD_TYPE (0x00000800) | ||
309 | #define CSR_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_A (0x00000000) | ||
310 | #define CSR_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_B (0x00001000) | ||
311 | #define CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM (0x00200000) | ||
312 | |||
313 | /* interrupt flags in INTA, set by uCode or hardware (e.g. dma), | ||
314 | * acknowledged (reset) by host writing "1" to flagged bits. */ | ||
315 | #define CSR_INT_BIT_FH_RX (1<<31) /* Rx DMA, cmd responses, FH_INT[17:16] */ | ||
316 | #define CSR_INT_BIT_HW_ERR (1<<29) /* DMA hardware error FH_INT[31] */ | ||
317 | #define CSR_INT_BIT_DNLD (1<<28) /* uCode Download */ | ||
318 | #define CSR_INT_BIT_FH_TX (1<<27) /* Tx DMA FH_INT[1:0] */ | ||
319 | #define CSR_INT_BIT_MAC_CLK_ACTV (1<<26) /* NIC controller's clock toggled on/off */ | ||
320 | #define CSR_INT_BIT_SW_ERR (1<<25) /* uCode error */ | ||
321 | #define CSR_INT_BIT_RF_KILL (1<<7) /* HW RFKILL switch GP_CNTRL[27] toggled */ | ||
322 | #define CSR_INT_BIT_CT_KILL (1<<6) /* Critical temp (chip too hot) rfkill */ | ||
323 | #define CSR_INT_BIT_SW_RX (1<<3) /* Rx, command responses, 3945 */ | ||
324 | #define CSR_INT_BIT_WAKEUP (1<<1) /* NIC controller waking up (pwr mgmt) */ | ||
325 | #define CSR_INT_BIT_ALIVE (1<<0) /* uCode interrupts once it initializes */ | ||
326 | |||
327 | #define CSR_INI_SET_MASK (CSR_INT_BIT_FH_RX | \ | ||
328 | CSR_INT_BIT_HW_ERR | \ | ||
329 | CSR_INT_BIT_FH_TX | \ | ||
330 | CSR_INT_BIT_SW_ERR | \ | ||
331 | CSR_INT_BIT_RF_KILL | \ | ||
332 | CSR_INT_BIT_SW_RX | \ | ||
333 | CSR_INT_BIT_WAKEUP | \ | ||
334 | CSR_INT_BIT_ALIVE) | ||
335 | |||
336 | /* interrupt flags in FH (flow handler) (PCI busmaster DMA) */ | ||
337 | #define CSR_FH_INT_BIT_ERR (1<<31) /* Error */ | ||
338 | #define CSR_FH_INT_BIT_HI_PRIOR (1<<30) /* High priority Rx, bypass coalescing */ | ||
339 | #define CSR_FH_INT_BIT_RX_CHNL2 (1<<18) /* Rx channel 2 (3945 only) */ | ||
340 | #define CSR_FH_INT_BIT_RX_CHNL1 (1<<17) /* Rx channel 1 */ | ||
341 | #define CSR_FH_INT_BIT_RX_CHNL0 (1<<16) /* Rx channel 0 */ | ||
342 | #define CSR_FH_INT_BIT_TX_CHNL6 (1<<6) /* Tx channel 6 (3945 only) */ | ||
343 | #define CSR_FH_INT_BIT_TX_CHNL1 (1<<1) /* Tx channel 1 */ | ||
344 | #define CSR_FH_INT_BIT_TX_CHNL0 (1<<0) /* Tx channel 0 */ | ||
345 | |||
346 | #define CSR_FH_INT_RX_MASK (CSR_FH_INT_BIT_HI_PRIOR | \ | ||
347 | CSR_FH_INT_BIT_RX_CHNL2 | \ | ||
348 | CSR_FH_INT_BIT_RX_CHNL1 | \ | ||
349 | CSR_FH_INT_BIT_RX_CHNL0) | ||
350 | |||
351 | #define CSR_FH_INT_TX_MASK (CSR_FH_INT_BIT_TX_CHNL6 | \ | ||
352 | CSR_FH_INT_BIT_TX_CHNL1 | \ | ||
353 | CSR_FH_INT_BIT_TX_CHNL0 ) | ||
354 | |||
355 | |||
356 | /* RESET */ | ||
357 | #define CSR_RESET_REG_FLAG_NEVO_RESET (0x00000001) | ||
358 | #define CSR_RESET_REG_FLAG_FORCE_NMI (0x00000002) | ||
359 | #define CSR_RESET_REG_FLAG_SW_RESET (0x00000080) | ||
360 | #define CSR_RESET_REG_FLAG_MASTER_DISABLED (0x00000100) | ||
361 | #define CSR_RESET_REG_FLAG_STOP_MASTER (0x00000200) | ||
362 | |||
363 | /* GP (general purpose) CONTROL */ | ||
364 | #define CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY (0x00000001) | ||
365 | #define CSR_GP_CNTRL_REG_FLAG_INIT_DONE (0x00000004) | ||
366 | #define CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ (0x00000008) | ||
367 | #define CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP (0x00000010) | ||
368 | |||
369 | #define CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN (0x00000001) | ||
370 | |||
371 | #define CSR_GP_CNTRL_REG_MSK_POWER_SAVE_TYPE (0x07000000) | ||
372 | #define CSR_GP_CNTRL_REG_FLAG_MAC_POWER_SAVE (0x04000000) | ||
373 | #define CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW (0x08000000) | ||
374 | |||
375 | |||
376 | /* EEPROM REG */ | ||
377 | #define CSR_EEPROM_REG_READ_VALID_MSK (0x00000001) | ||
378 | #define CSR_EEPROM_REG_BIT_CMD (0x00000002) | ||
379 | |||
380 | /* EEPROM GP */ | ||
381 | #define CSR_EEPROM_GP_VALID_MSK (0x00000006) | ||
382 | #define CSR_EEPROM_GP_BAD_SIGNATURE (0x00000000) | ||
383 | #define CSR_EEPROM_GP_IF_OWNER_MSK (0x00000180) | ||
384 | |||
385 | /* UCODE DRV GP */ | ||
386 | #define CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP (0x00000001) | ||
387 | #define CSR_UCODE_SW_BIT_RFKILL (0x00000002) | ||
388 | #define CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED (0x00000004) | ||
389 | #define CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT (0x00000008) | ||
390 | |||
391 | /* GPIO */ | ||
392 | #define CSR_GPIO_IN_BIT_AUX_POWER (0x00000200) | ||
393 | #define CSR_GPIO_IN_VAL_VAUX_PWR_SRC (0x00000000) | ||
394 | #define CSR_GPIO_IN_VAL_VMAIN_PWR_SRC CSR_GPIO_IN_BIT_AUX_POWER | ||
395 | |||
396 | /* GI Chicken Bits */ | ||
397 | #define CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX (0x00800000) | ||
398 | #define CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER (0x20000000) | ||
399 | |||
400 | /* CSR_ANA_PLL_CFG */ | ||
401 | #define CSR_ANA_PLL_CFG_SH (0x00880300) | ||
402 | |||
403 | #define CSR_LED_REG_TRUN_ON (0x00000078) | ||
404 | #define CSR_LED_REG_TRUN_OFF (0x00000038) | ||
405 | #define CSR_LED_BSM_CTRL_MSK (0xFFFFFFDF) | ||
406 | |||
407 | /* DRAM_INT_TBL_CTRL */ | ||
408 | #define CSR_DRAM_INT_TBL_CTRL_EN (1<<31) | ||
409 | #define CSR_DRAM_INT_TBL_CTRL_WRAP_CHK (1<<27) | ||
410 | |||
411 | /*=== HBUS (Host-side Bus) ===*/ | ||
412 | #define HBUS_BASE (0x400) | ||
413 | |||
414 | #define HBUS_TARG_MEM_RADDR (HBUS_BASE+0x00c) | ||
415 | #define HBUS_TARG_MEM_WADDR (HBUS_BASE+0x010) | ||
416 | #define HBUS_TARG_MEM_WDAT (HBUS_BASE+0x018) | ||
417 | #define HBUS_TARG_MEM_RDAT (HBUS_BASE+0x01c) | ||
418 | #define HBUS_TARG_PRPH_WADDR (HBUS_BASE+0x044) | ||
419 | #define HBUS_TARG_PRPH_RADDR (HBUS_BASE+0x048) | ||
420 | #define HBUS_TARG_PRPH_WDAT (HBUS_BASE+0x04c) | ||
421 | #define HBUS_TARG_PRPH_RDAT (HBUS_BASE+0x050) | ||
422 | #define HBUS_TARG_WRPTR (HBUS_BASE+0x060) | ||
423 | |||
424 | #define HBUS_TARG_MBX_C (HBUS_BASE+0x030) | ||
425 | |||
426 | |||
427 | /* SCD (Scheduler) */ | ||
428 | #define SCD_BASE (CSR_BASE + 0x2E00) | ||
429 | |||
430 | #define SCD_MODE_REG (SCD_BASE + 0x000) | ||
431 | #define SCD_ARASTAT_REG (SCD_BASE + 0x004) | ||
432 | #define SCD_TXFACT_REG (SCD_BASE + 0x010) | ||
433 | #define SCD_TXF4MF_REG (SCD_BASE + 0x014) | ||
434 | #define SCD_TXF5MF_REG (SCD_BASE + 0x020) | ||
435 | #define SCD_SBYP_MODE_1_REG (SCD_BASE + 0x02C) | ||
436 | #define SCD_SBYP_MODE_2_REG (SCD_BASE + 0x030) | ||
437 | |||
438 | /*=== FH (data Flow Handler) ===*/ | ||
439 | #define FH_BASE (0x800) | ||
440 | |||
441 | #define FH_CBCC_TABLE (FH_BASE+0x140) | ||
442 | #define FH_TFDB_TABLE (FH_BASE+0x180) | ||
443 | #define FH_RCSR_TABLE (FH_BASE+0x400) | ||
444 | #define FH_RSSR_TABLE (FH_BASE+0x4c0) | ||
445 | #define FH_TCSR_TABLE (FH_BASE+0x500) | ||
446 | #define FH_TSSR_TABLE (FH_BASE+0x680) | ||
447 | |||
448 | /* TFDB (Transmit Frame Buffer Descriptor) */ | ||
449 | #define FH_TFDB(_channel, buf) \ | ||
450 | (FH_TFDB_TABLE+((_channel)*2+(buf))*0x28) | ||
451 | #define ALM_FH_TFDB_CHNL_BUF_CTRL_REG(_channel) \ | ||
452 | (FH_TFDB_TABLE + 0x50 * _channel) | ||
453 | /* CBCC _channel is [0,2] */ | ||
454 | #define FH_CBCC(_channel) (FH_CBCC_TABLE+(_channel)*0x8) | ||
455 | #define FH_CBCC_CTRL(_channel) (FH_CBCC(_channel)+0x00) | ||
456 | #define FH_CBCC_BASE(_channel) (FH_CBCC(_channel)+0x04) | ||
457 | |||
458 | /* RCSR _channel is [0,2] */ | ||
459 | #define FH_RCSR(_channel) (FH_RCSR_TABLE+(_channel)*0x40) | ||
460 | #define FH_RCSR_CONFIG(_channel) (FH_RCSR(_channel)+0x00) | ||
461 | #define FH_RCSR_RBD_BASE(_channel) (FH_RCSR(_channel)+0x04) | ||
462 | #define FH_RCSR_WPTR(_channel) (FH_RCSR(_channel)+0x20) | ||
463 | #define FH_RCSR_RPTR_ADDR(_channel) (FH_RCSR(_channel)+0x24) | ||
464 | |||
465 | #define FH_RSCSR_CHNL0_WPTR (FH_RCSR_WPTR(0)) | ||
466 | |||
467 | /* RSSR */ | ||
468 | #define FH_RSSR_CTRL (FH_RSSR_TABLE+0x000) | ||
469 | #define FH_RSSR_STATUS (FH_RSSR_TABLE+0x004) | ||
470 | /* TCSR */ | ||
471 | #define FH_TCSR(_channel) (FH_TCSR_TABLE+(_channel)*0x20) | ||
472 | #define FH_TCSR_CONFIG(_channel) (FH_TCSR(_channel)+0x00) | ||
473 | #define FH_TCSR_CREDIT(_channel) (FH_TCSR(_channel)+0x04) | ||
474 | #define FH_TCSR_BUFF_STTS(_channel) (FH_TCSR(_channel)+0x08) | ||
475 | /* TSSR */ | ||
476 | #define FH_TSSR_CBB_BASE (FH_TSSR_TABLE+0x000) | ||
477 | #define FH_TSSR_MSG_CONFIG (FH_TSSR_TABLE+0x008) | ||
478 | #define FH_TSSR_TX_STATUS (FH_TSSR_TABLE+0x010) | ||
479 | /* 18 - reserved */ | ||
480 | |||
481 | /* card static random access memory (SRAM) for processor data and instructs */ | ||
482 | #define RTC_INST_LOWER_BOUND (0x000000) | ||
483 | #define RTC_DATA_LOWER_BOUND (0x800000) | ||
484 | |||
485 | |||
486 | /* DBM */ | ||
487 | |||
488 | #define ALM_FH_SRVC_CHNL (6) | ||
489 | |||
490 | #define ALM_FH_RCSR_RX_CONFIG_REG_POS_RBDC_SIZE (20) | ||
491 | #define ALM_FH_RCSR_RX_CONFIG_REG_POS_IRQ_RBTH (4) | ||
492 | |||
493 | #define ALM_FH_RCSR_RX_CONFIG_REG_BIT_WR_STTS_EN (0x08000000) | ||
494 | |||
495 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_DMA_CHNL_EN_ENABLE (0x80000000) | ||
496 | |||
497 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_RDRBD_EN_ENABLE (0x20000000) | ||
498 | |||
499 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_MAX_FRAG_SIZE_128 (0x01000000) | ||
500 | |||
501 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_IRQ_DEST_INT_HOST (0x00001000) | ||
502 | |||
503 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_MSG_MODE_FH (0x00000000) | ||
504 | |||
505 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_TXF (0x00000000) | ||
506 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_DRIVER (0x00000001) | ||
507 | |||
508 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE_VAL (0x00000000) | ||
509 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE_VAL (0x00000008) | ||
510 | |||
511 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_IFTFD (0x00200000) | ||
512 | |||
513 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_RTC_NOINT (0x00000000) | ||
514 | |||
515 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE (0x00000000) | ||
516 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE (0x80000000) | ||
517 | |||
518 | #define ALM_FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID (0x00004000) | ||
519 | |||
520 | #define ALM_FH_TCSR_CHNL_TX_BUF_STS_REG_BIT_TFDB_WPTR (0x00000001) | ||
521 | |||
522 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TXPD_ON (0xFF000000) | ||
523 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_TXPD_ON (0x00FF0000) | ||
524 | |||
525 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_MAX_FRAG_SIZE_128B (0x00000400) | ||
526 | |||
527 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TFD_ON (0x00000100) | ||
528 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_CBB_ON (0x00000080) | ||
529 | |||
530 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RSP_WAIT_TH (0x00000020) | ||
531 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_RSP_WAIT_TH (0x00000005) | ||
532 | |||
533 | #define ALM_TB_MAX_BYTES_COUNT (0xFFF0) | ||
534 | |||
535 | #define ALM_FH_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_channel) \ | ||
536 | ((1LU << _channel) << 24) | ||
537 | #define ALM_FH_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_channel) \ | ||
538 | ((1LU << _channel) << 16) | ||
539 | |||
540 | #define ALM_FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(_channel) \ | ||
541 | (ALM_FH_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_channel) | \ | ||
542 | ALM_FH_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_channel)) | ||
543 | #define PCI_CFG_REV_ID_BIT_BASIC_SKU (0x40) /* bit 6 */ | ||
544 | #define PCI_CFG_REV_ID_BIT_RTP (0x80) /* bit 7 */ | ||
545 | |||
546 | #define HBUS_TARG_MBX_C_REG_BIT_CMD_BLOCKED (0x00000004) | ||
547 | |||
548 | #define TFD_QUEUE_MIN 0 | ||
549 | #define TFD_QUEUE_MAX 6 | ||
550 | #define TFD_QUEUE_SIZE_MAX (256) | ||
551 | |||
552 | /* spectrum and channel data structures */ | ||
553 | #define IWL_NUM_SCAN_RATES (2) | ||
554 | |||
555 | #define IWL_SCAN_FLAG_24GHZ (1<<0) | ||
556 | #define IWL_SCAN_FLAG_52GHZ (1<<1) | ||
557 | #define IWL_SCAN_FLAG_ACTIVE (1<<2) | ||
558 | #define IWL_SCAN_FLAG_DIRECT (1<<3) | ||
559 | |||
560 | #define IWL_MAX_CMD_SIZE 1024 | ||
561 | |||
562 | #define IWL_DEFAULT_TX_RETRY 15 | ||
563 | #define IWL_MAX_TX_RETRY 16 | ||
564 | |||
565 | /*********************************************/ | ||
566 | |||
567 | #define RFD_SIZE 4 | ||
568 | #define NUM_TFD_CHUNKS 4 | ||
569 | |||
570 | #define RX_QUEUE_SIZE 256 | ||
571 | #define RX_QUEUE_MASK 255 | ||
572 | #define RX_QUEUE_SIZE_LOG 8 | ||
573 | |||
574 | /* QoS definitions */ | ||
575 | |||
576 | #define CW_MIN_OFDM 15 | ||
577 | #define CW_MAX_OFDM 1023 | ||
578 | #define CW_MIN_CCK 31 | ||
579 | #define CW_MAX_CCK 1023 | ||
580 | |||
581 | #define QOS_TX0_CW_MIN_OFDM CW_MIN_OFDM | ||
582 | #define QOS_TX1_CW_MIN_OFDM CW_MIN_OFDM | ||
583 | #define QOS_TX2_CW_MIN_OFDM ((CW_MIN_OFDM + 1) / 2 - 1) | ||
584 | #define QOS_TX3_CW_MIN_OFDM ((CW_MIN_OFDM + 1) / 4 - 1) | ||
585 | |||
586 | #define QOS_TX0_CW_MIN_CCK CW_MIN_CCK | ||
587 | #define QOS_TX1_CW_MIN_CCK CW_MIN_CCK | ||
588 | #define QOS_TX2_CW_MIN_CCK ((CW_MIN_CCK + 1) / 2 - 1) | ||
589 | #define QOS_TX3_CW_MIN_CCK ((CW_MIN_CCK + 1) / 4 - 1) | ||
590 | |||
591 | #define QOS_TX0_CW_MAX_OFDM CW_MAX_OFDM | ||
592 | #define QOS_TX1_CW_MAX_OFDM CW_MAX_OFDM | ||
593 | #define QOS_TX2_CW_MAX_OFDM CW_MIN_OFDM | ||
594 | #define QOS_TX3_CW_MAX_OFDM ((CW_MIN_OFDM + 1) / 2 - 1) | ||
595 | |||
596 | #define QOS_TX0_CW_MAX_CCK CW_MAX_CCK | ||
597 | #define QOS_TX1_CW_MAX_CCK CW_MAX_CCK | ||
598 | #define QOS_TX2_CW_MAX_CCK CW_MIN_CCK | ||
599 | #define QOS_TX3_CW_MAX_CCK ((CW_MIN_CCK + 1) / 2 - 1) | ||
600 | |||
601 | #define QOS_TX0_AIFS 3 | ||
602 | #define QOS_TX1_AIFS 7 | ||
603 | #define QOS_TX2_AIFS 2 | ||
604 | #define QOS_TX3_AIFS 2 | ||
605 | |||
606 | #define QOS_TX0_ACM 0 | ||
607 | #define QOS_TX1_ACM 0 | ||
608 | #define QOS_TX2_ACM 0 | ||
609 | #define QOS_TX3_ACM 0 | ||
610 | |||
611 | #define QOS_TX0_TXOP_LIMIT_CCK 0 | ||
612 | #define QOS_TX1_TXOP_LIMIT_CCK 0 | ||
613 | #define QOS_TX2_TXOP_LIMIT_CCK 6016 | ||
614 | #define QOS_TX3_TXOP_LIMIT_CCK 3264 | ||
615 | |||
616 | #define QOS_TX0_TXOP_LIMIT_OFDM 0 | ||
617 | #define QOS_TX1_TXOP_LIMIT_OFDM 0 | ||
618 | #define QOS_TX2_TXOP_LIMIT_OFDM 3008 | ||
619 | #define QOS_TX3_TXOP_LIMIT_OFDM 1504 | ||
620 | |||
621 | #define DEF_TX0_CW_MIN_OFDM CW_MIN_OFDM | ||
622 | #define DEF_TX1_CW_MIN_OFDM CW_MIN_OFDM | ||
623 | #define DEF_TX2_CW_MIN_OFDM CW_MIN_OFDM | ||
624 | #define DEF_TX3_CW_MIN_OFDM CW_MIN_OFDM | ||
625 | |||
626 | #define DEF_TX0_CW_MIN_CCK CW_MIN_CCK | ||
627 | #define DEF_TX1_CW_MIN_CCK CW_MIN_CCK | ||
628 | #define DEF_TX2_CW_MIN_CCK CW_MIN_CCK | ||
629 | #define DEF_TX3_CW_MIN_CCK CW_MIN_CCK | ||
630 | |||
631 | #define DEF_TX0_CW_MAX_OFDM CW_MAX_OFDM | ||
632 | #define DEF_TX1_CW_MAX_OFDM CW_MAX_OFDM | ||
633 | #define DEF_TX2_CW_MAX_OFDM CW_MAX_OFDM | ||
634 | #define DEF_TX3_CW_MAX_OFDM CW_MAX_OFDM | ||
635 | |||
636 | #define DEF_TX0_CW_MAX_CCK CW_MAX_CCK | ||
637 | #define DEF_TX1_CW_MAX_CCK CW_MAX_CCK | ||
638 | #define DEF_TX2_CW_MAX_CCK CW_MAX_CCK | ||
639 | #define DEF_TX3_CW_MAX_CCK CW_MAX_CCK | ||
640 | |||
641 | #define DEF_TX0_AIFS (2) | ||
642 | #define DEF_TX1_AIFS (2) | ||
643 | #define DEF_TX2_AIFS (2) | ||
644 | #define DEF_TX3_AIFS (2) | ||
645 | |||
646 | #define DEF_TX0_ACM 0 | ||
647 | #define DEF_TX1_ACM 0 | ||
648 | #define DEF_TX2_ACM 0 | ||
649 | #define DEF_TX3_ACM 0 | ||
650 | |||
651 | #define DEF_TX0_TXOP_LIMIT_CCK 0 | ||
652 | #define DEF_TX1_TXOP_LIMIT_CCK 0 | ||
653 | #define DEF_TX2_TXOP_LIMIT_CCK 0 | ||
654 | #define DEF_TX3_TXOP_LIMIT_CCK 0 | ||
655 | |||
656 | #define DEF_TX0_TXOP_LIMIT_OFDM 0 | ||
657 | #define DEF_TX1_TXOP_LIMIT_OFDM 0 | ||
658 | #define DEF_TX2_TXOP_LIMIT_OFDM 0 | ||
659 | #define DEF_TX3_TXOP_LIMIT_OFDM 0 | ||
660 | |||
661 | #define QOS_QOS_SETS 3 | ||
662 | #define QOS_PARAM_SET_ACTIVE 0 | ||
663 | #define QOS_PARAM_SET_DEF_CCK 1 | ||
664 | #define QOS_PARAM_SET_DEF_OFDM 2 | ||
665 | |||
666 | #define CTRL_QOS_NO_ACK (0x0020) | ||
667 | #define DCT_FLAG_EXT_QOS_ENABLED (0x10) | ||
668 | |||
669 | #define U32_PAD(n) ((4-(n))&0x3) | ||
670 | |||
671 | /* | ||
672 | * Generic queue structure | ||
673 | * | ||
674 | * Contains common data for Rx and Tx queues | ||
675 | */ | ||
676 | #define TFD_CTL_COUNT_SET(n) (n<<24) | ||
677 | #define TFD_CTL_COUNT_GET(ctl) ((ctl>>24) & 7) | ||
678 | #define TFD_CTL_PAD_SET(n) (n<<28) | ||
679 | #define TFD_CTL_PAD_GET(ctl) (ctl>>28) | ||
680 | |||
681 | #define TFD_TX_CMD_SLOTS 256 | ||
682 | #define TFD_CMD_SLOTS 32 | ||
683 | |||
684 | #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_cmd) - \ | ||
685 | sizeof(struct iwl_cmd_meta)) | ||
686 | |||
687 | /* | ||
688 | * RX related structures and functions | ||
689 | */ | ||
690 | #define RX_FREE_BUFFERS 64 | ||
691 | #define RX_LOW_WATERMARK 8 | ||
692 | |||
693 | |||
67 | #define IWL_RX_BUF_SIZE 3000 | 694 | #define IWL_RX_BUF_SIZE 3000 |
68 | /* card static random access memory (SRAM) for processor data and instructs */ | 695 | /* card static random access memory (SRAM) for processor data and instructs */ |
69 | #define ALM_RTC_INST_UPPER_BOUND (0x014000) | 696 | #define ALM_RTC_INST_UPPER_BOUND (0x014000) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-io.h b/drivers/net/wireless/iwlwifi/iwl-3945-io.h index 43afcda6f73e..89253e133533 100644 --- a/drivers/net/wireless/iwlwifi/iwl-io.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-io.h | |||
@@ -31,7 +31,7 @@ | |||
31 | 31 | ||
32 | #include <linux/io.h> | 32 | #include <linux/io.h> |
33 | 33 | ||
34 | #include "iwl-debug.h" | 34 | #include "iwl-3945-debug.h" |
35 | 35 | ||
36 | /* | 36 | /* |
37 | * IO, register, and NIC memory access functions | 37 | * IO, register, and NIC memory access functions |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c index a6cb97ac43ef..e3a507513e8b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c | |||
@@ -37,11 +37,9 @@ | |||
37 | 37 | ||
38 | #include <linux/workqueue.h> | 38 | #include <linux/workqueue.h> |
39 | 39 | ||
40 | #define IWL 3945 | ||
41 | |||
42 | #include "../net/mac80211/ieee80211_rate.h" | 40 | #include "../net/mac80211/ieee80211_rate.h" |
43 | 41 | ||
44 | #include "iwlwifi.h" | 42 | #include "iwl-3945.h" |
45 | 43 | ||
46 | #define RS_NAME "iwl-3945-rs" | 44 | #define RS_NAME "iwl-3945-rs" |
47 | 45 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index faaba2927177..53fe9c1c1747 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -39,11 +39,8 @@ | |||
39 | 39 | ||
40 | #include <linux/etherdevice.h> | 40 | #include <linux/etherdevice.h> |
41 | 41 | ||
42 | #define IWL 3945 | ||
43 | |||
44 | #include "iwlwifi.h" | ||
45 | #include "iwl-helpers.h" | ||
46 | #include "iwl-3945.h" | 42 | #include "iwl-3945.h" |
43 | #include "iwl-helpers.h" | ||
47 | #include "iwl-3945-rs.h" | 44 | #include "iwl-3945-rs.h" |
48 | 45 | ||
49 | #define IWL_DECLARE_RATE_INFO(r, ip, in, rp, rn, pp, np) \ | 46 | #define IWL_DECLARE_RATE_INFO(r, ip, in, rp, rn, pp, np) \ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h index adb5d672e711..ab8412270f6f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |||
@@ -27,6 +27,684 @@ | |||
27 | #ifndef __iwl_3945_h__ | 27 | #ifndef __iwl_3945_h__ |
28 | #define __iwl_3945_h__ | 28 | #define __iwl_3945_h__ |
29 | 29 | ||
30 | #include <linux/pci.h> /* for struct pci_device_id */ | ||
31 | #include <linux/kernel.h> | ||
32 | #include <net/ieee80211_radiotap.h> | ||
33 | |||
34 | struct iwl_priv; | ||
35 | |||
36 | /* Hardware specific file defines the PCI IDs table for that hardware module */ | ||
37 | extern struct pci_device_id iwl_hw_card_ids[]; | ||
38 | |||
39 | #define DRV_NAME "iwl3945" | ||
40 | #include "iwl-3945-hw.h" | ||
41 | #include "iwl-prph.h" | ||
42 | #include "iwl-3945-debug.h" | ||
43 | |||
44 | /* Default noise level to report when noise measurement is not available. | ||
45 | * This may be because we're: | ||
46 | * 1) Not associated (4965, no beacon statistics being sent to driver) | ||
47 | * 2) Scanning (noise measurement does not apply to associated channel) | ||
48 | * 3) Receiving CCK (3945 delivers noise info only for OFDM frames) | ||
49 | * Use default noise value of -127 ... this is below the range of measurable | ||
50 | * Rx dBm for either 3945 or 4965, so it can indicate "unmeasurable" to user. | ||
51 | * Also, -127 works better than 0 when averaging frames with/without | ||
52 | * noise info (e.g. averaging might be done in app); measured dBm values are | ||
53 | * always negative ... using a negative value as the default keeps all | ||
54 | * averages within an s8's (used in some apps) range of negative values. */ | ||
55 | #define IWL_NOISE_MEAS_NOT_AVAILABLE (-127) | ||
56 | |||
57 | /* Module parameters accessible from iwl-*.c */ | ||
58 | extern int iwl_param_hwcrypto; | ||
59 | extern int iwl_param_queues_num; | ||
60 | |||
61 | enum iwl_antenna { | ||
62 | IWL_ANTENNA_DIVERSITY, | ||
63 | IWL_ANTENNA_MAIN, | ||
64 | IWL_ANTENNA_AUX | ||
65 | }; | ||
66 | |||
67 | /* | ||
68 | * RTS threshold here is total size [2347] minus 4 FCS bytes | ||
69 | * Per spec: | ||
70 | * a value of 0 means RTS on all data/management packets | ||
71 | * a value > max MSDU size means no RTS | ||
72 | * else RTS for data/management frames where MPDU is larger | ||
73 | * than RTS value. | ||
74 | */ | ||
75 | #define DEFAULT_RTS_THRESHOLD 2347U | ||
76 | #define MIN_RTS_THRESHOLD 0U | ||
77 | #define MAX_RTS_THRESHOLD 2347U | ||
78 | #define MAX_MSDU_SIZE 2304U | ||
79 | #define MAX_MPDU_SIZE 2346U | ||
80 | #define DEFAULT_BEACON_INTERVAL 100U | ||
81 | #define DEFAULT_SHORT_RETRY_LIMIT 7U | ||
82 | #define DEFAULT_LONG_RETRY_LIMIT 4U | ||
83 | |||
84 | struct iwl_rx_mem_buffer { | ||
85 | dma_addr_t dma_addr; | ||
86 | struct sk_buff *skb; | ||
87 | struct list_head list; | ||
88 | }; | ||
89 | |||
90 | struct iwl_rt_rx_hdr { | ||
91 | struct ieee80211_radiotap_header rt_hdr; | ||
92 | __le64 rt_tsf; /* TSF */ | ||
93 | u8 rt_flags; /* radiotap packet flags */ | ||
94 | u8 rt_rate; /* rate in 500kb/s */ | ||
95 | __le16 rt_channelMHz; /* channel in MHz */ | ||
96 | __le16 rt_chbitmask; /* channel bitfield */ | ||
97 | s8 rt_dbmsignal; /* signal in dBm, kluged to signed */ | ||
98 | s8 rt_dbmnoise; | ||
99 | u8 rt_antenna; /* antenna number */ | ||
100 | u8 payload[0]; /* payload... */ | ||
101 | } __attribute__ ((packed)); | ||
102 | |||
103 | struct iwl_rt_tx_hdr { | ||
104 | struct ieee80211_radiotap_header rt_hdr; | ||
105 | u8 rt_rate; /* rate in 500kb/s */ | ||
106 | __le16 rt_channel; /* channel in mHz */ | ||
107 | __le16 rt_chbitmask; /* channel bitfield */ | ||
108 | s8 rt_dbmsignal; /* signal in dBm, kluged to signed */ | ||
109 | u8 rt_antenna; /* antenna number */ | ||
110 | u8 payload[0]; /* payload... */ | ||
111 | } __attribute__ ((packed)); | ||
112 | |||
113 | /* | ||
114 | * Generic queue structure | ||
115 | * | ||
116 | * Contains common data for Rx and Tx queues | ||
117 | */ | ||
118 | struct iwl_queue { | ||
119 | int n_bd; /* number of BDs in this queue */ | ||
120 | int write_ptr; /* 1-st empty entry (index) host_w*/ | ||
121 | int read_ptr; /* last used entry (index) host_r*/ | ||
122 | dma_addr_t dma_addr; /* physical addr for BD's */ | ||
123 | int n_window; /* safe queue window */ | ||
124 | u32 id; | ||
125 | int low_mark; /* low watermark, resume queue if free | ||
126 | * space more than this */ | ||
127 | int high_mark; /* high watermark, stop queue if free | ||
128 | * space less than this */ | ||
129 | } __attribute__ ((packed)); | ||
130 | |||
131 | #define MAX_NUM_OF_TBS (20) | ||
132 | |||
133 | struct iwl_tx_info { | ||
134 | struct ieee80211_tx_status status; | ||
135 | struct sk_buff *skb[MAX_NUM_OF_TBS]; | ||
136 | }; | ||
137 | |||
138 | /** | ||
139 | * struct iwl_tx_queue - Tx Queue for DMA | ||
140 | * @need_update: need to update read/write index | ||
141 | * @shed_retry: queue is HT AGG enabled | ||
142 | * | ||
143 | * Queue consists of circular buffer of BD's and required locking structures. | ||
144 | */ | ||
145 | struct iwl_tx_queue { | ||
146 | struct iwl_queue q; | ||
147 | struct iwl_tfd_frame *bd; | ||
148 | struct iwl_cmd *cmd; | ||
149 | dma_addr_t dma_addr_cmd; | ||
150 | struct iwl_tx_info *txb; | ||
151 | int need_update; | ||
152 | int sched_retry; | ||
153 | int active; | ||
154 | }; | ||
155 | |||
156 | #define IWL_NUM_SCAN_RATES (2) | ||
157 | |||
158 | struct iwl_channel_tgd_info { | ||
159 | u8 type; | ||
160 | s8 max_power; | ||
161 | }; | ||
162 | |||
163 | struct iwl_channel_tgh_info { | ||
164 | s64 last_radar_time; | ||
165 | }; | ||
166 | |||
167 | /* current Tx power values to use, one for each rate for each channel. | ||
168 | * requested power is limited by: | ||
169 | * -- regulatory EEPROM limits for this channel | ||
170 | * -- hardware capabilities (clip-powers) | ||
171 | * -- spectrum management | ||
172 | * -- user preference (e.g. iwconfig) | ||
173 | * when requested power is set, base power index must also be set. */ | ||
174 | struct iwl_channel_power_info { | ||
175 | struct iwl_tx_power tpc; /* actual radio and DSP gain settings */ | ||
176 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
177 | s8 base_power_index; /* gain index for power at factory temp. */ | ||
178 | s8 requested_power; /* power (dBm) requested for this chnl/rate */ | ||
179 | }; | ||
180 | |||
181 | /* current scan Tx power values to use, one for each scan rate for each | ||
182 | * channel. */ | ||
183 | struct iwl_scan_power_info { | ||
184 | struct iwl_tx_power tpc; /* actual radio and DSP gain settings */ | ||
185 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
186 | s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */ | ||
187 | }; | ||
188 | |||
189 | /* Channel unlock period is 15 seconds. If no beacon or probe response | ||
190 | * has been received within 15 seconds on a locked channel then the channel | ||
191 | * remains locked. */ | ||
192 | #define TX_UNLOCK_PERIOD 15 | ||
193 | |||
194 | /* CSA lock period is 15 seconds. If a CSA has been received on a channel in | ||
195 | * the last 15 seconds, the channel is locked */ | ||
196 | #define CSA_LOCK_PERIOD 15 | ||
197 | /* | ||
198 | * One for each channel, holds all channel setup data | ||
199 | * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant | ||
200 | * with one another! | ||
201 | */ | ||
202 | #define IWL4965_MAX_RATE (33) | ||
203 | |||
204 | struct iwl_channel_info { | ||
205 | struct iwl_channel_tgd_info tgd; | ||
206 | struct iwl_channel_tgh_info tgh; | ||
207 | struct iwl_eeprom_channel eeprom; /* EEPROM regulatory limit */ | ||
208 | struct iwl_eeprom_channel fat_eeprom; /* EEPROM regulatory limit for | ||
209 | * FAT channel */ | ||
210 | |||
211 | u8 channel; /* channel number */ | ||
212 | u8 flags; /* flags copied from EEPROM */ | ||
213 | s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ | ||
214 | s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */ | ||
215 | s8 min_power; /* always 0 */ | ||
216 | s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */ | ||
217 | |||
218 | u8 group_index; /* 0-4, maps channel to group1/2/3/4/5 */ | ||
219 | u8 band_index; /* 0-4, maps channel to band1/2/3/4/5 */ | ||
220 | u8 phymode; /* MODE_IEEE80211{A,B,G} */ | ||
221 | |||
222 | /* Radio/DSP gain settings for each "normal" data Tx rate. | ||
223 | * These include, in addition to RF and DSP gain, a few fields for | ||
224 | * remembering/modifying gain settings (indexes). */ | ||
225 | struct iwl_channel_power_info power_info[IWL4965_MAX_RATE]; | ||
226 | |||
227 | /* Radio/DSP gain settings for each scan rate, for directed scans. */ | ||
228 | struct iwl_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES]; | ||
229 | }; | ||
230 | |||
231 | struct iwl_clip_group { | ||
232 | /* maximum power level to prevent clipping for each rate, derived by | ||
233 | * us from this band's saturation power in EEPROM */ | ||
234 | const s8 clip_powers[IWL_MAX_RATES]; | ||
235 | }; | ||
236 | |||
237 | #include "iwl-3945-rs.h" | ||
238 | |||
239 | #define IWL_TX_FIFO_AC0 0 | ||
240 | #define IWL_TX_FIFO_AC1 1 | ||
241 | #define IWL_TX_FIFO_AC2 2 | ||
242 | #define IWL_TX_FIFO_AC3 3 | ||
243 | #define IWL_TX_FIFO_HCCA_1 5 | ||
244 | #define IWL_TX_FIFO_HCCA_2 6 | ||
245 | #define IWL_TX_FIFO_NONE 7 | ||
246 | |||
247 | /* Minimum number of queues. MAX_NUM is defined in hw specific files */ | ||
248 | #define IWL_MIN_NUM_QUEUES 4 | ||
249 | |||
250 | /* Power management (not Tx power) structures */ | ||
251 | |||
252 | struct iwl_power_vec_entry { | ||
253 | struct iwl_powertable_cmd cmd; | ||
254 | u8 no_dtim; | ||
255 | }; | ||
256 | #define IWL_POWER_RANGE_0 (0) | ||
257 | #define IWL_POWER_RANGE_1 (1) | ||
258 | |||
259 | #define IWL_POWER_MODE_CAM 0x00 /* Continuously Aware Mode, always on */ | ||
260 | #define IWL_POWER_INDEX_3 0x03 | ||
261 | #define IWL_POWER_INDEX_5 0x05 | ||
262 | #define IWL_POWER_AC 0x06 | ||
263 | #define IWL_POWER_BATTERY 0x07 | ||
264 | #define IWL_POWER_LIMIT 0x07 | ||
265 | #define IWL_POWER_MASK 0x0F | ||
266 | #define IWL_POWER_ENABLED 0x10 | ||
267 | #define IWL_POWER_LEVEL(x) ((x) & IWL_POWER_MASK) | ||
268 | |||
269 | struct iwl_power_mgr { | ||
270 | spinlock_t lock; | ||
271 | struct iwl_power_vec_entry pwr_range_0[IWL_POWER_AC]; | ||
272 | struct iwl_power_vec_entry pwr_range_1[IWL_POWER_AC]; | ||
273 | u8 active_index; | ||
274 | u32 dtim_val; | ||
275 | }; | ||
276 | |||
277 | #define IEEE80211_DATA_LEN 2304 | ||
278 | #define IEEE80211_4ADDR_LEN 30 | ||
279 | #define IEEE80211_HLEN (IEEE80211_4ADDR_LEN) | ||
280 | #define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) | ||
281 | |||
282 | struct iwl_frame { | ||
283 | union { | ||
284 | struct ieee80211_hdr frame; | ||
285 | struct iwl_tx_beacon_cmd beacon; | ||
286 | u8 raw[IEEE80211_FRAME_LEN]; | ||
287 | u8 cmd[360]; | ||
288 | } u; | ||
289 | struct list_head list; | ||
290 | }; | ||
291 | |||
292 | #define SEQ_TO_QUEUE(x) ((x >> 8) & 0xbf) | ||
293 | #define QUEUE_TO_SEQ(x) ((x & 0xbf) << 8) | ||
294 | #define SEQ_TO_INDEX(x) (x & 0xff) | ||
295 | #define INDEX_TO_SEQ(x) (x & 0xff) | ||
296 | #define SEQ_HUGE_FRAME (0x4000) | ||
297 | #define SEQ_RX_FRAME __constant_cpu_to_le16(0x8000) | ||
298 | #define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4) | ||
299 | #define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ) | ||
300 | #define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4) | ||
301 | |||
302 | enum { | ||
303 | /* CMD_SIZE_NORMAL = 0, */ | ||
304 | CMD_SIZE_HUGE = (1 << 0), | ||
305 | /* CMD_SYNC = 0, */ | ||
306 | CMD_ASYNC = (1 << 1), | ||
307 | /* CMD_NO_SKB = 0, */ | ||
308 | CMD_WANT_SKB = (1 << 2), | ||
309 | }; | ||
310 | |||
311 | struct iwl_cmd; | ||
312 | struct iwl_priv; | ||
313 | |||
314 | struct iwl_cmd_meta { | ||
315 | struct iwl_cmd_meta *source; | ||
316 | union { | ||
317 | struct sk_buff *skb; | ||
318 | int (*callback)(struct iwl_priv *priv, | ||
319 | struct iwl_cmd *cmd, struct sk_buff *skb); | ||
320 | } __attribute__ ((packed)) u; | ||
321 | |||
322 | /* The CMD_SIZE_HUGE flag bit indicates that the command | ||
323 | * structure is stored at the end of the shared queue memory. */ | ||
324 | u32 flags; | ||
325 | |||
326 | } __attribute__ ((packed)); | ||
327 | |||
328 | struct iwl_cmd { | ||
329 | struct iwl_cmd_meta meta; | ||
330 | struct iwl_cmd_header hdr; | ||
331 | union { | ||
332 | struct iwl_addsta_cmd addsta; | ||
333 | struct iwl_led_cmd led; | ||
334 | u32 flags; | ||
335 | u8 val8; | ||
336 | u16 val16; | ||
337 | u32 val32; | ||
338 | struct iwl_bt_cmd bt; | ||
339 | struct iwl_rxon_time_cmd rxon_time; | ||
340 | struct iwl_powertable_cmd powertable; | ||
341 | struct iwl_qosparam_cmd qosparam; | ||
342 | struct iwl_tx_cmd tx; | ||
343 | struct iwl_tx_beacon_cmd tx_beacon; | ||
344 | struct iwl_rxon_assoc_cmd rxon_assoc; | ||
345 | u8 *indirect; | ||
346 | u8 payload[360]; | ||
347 | } __attribute__ ((packed)) cmd; | ||
348 | } __attribute__ ((packed)); | ||
349 | |||
350 | struct iwl_host_cmd { | ||
351 | u8 id; | ||
352 | u16 len; | ||
353 | struct iwl_cmd_meta meta; | ||
354 | const void *data; | ||
355 | }; | ||
356 | |||
357 | #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_cmd) - \ | ||
358 | sizeof(struct iwl_cmd_meta)) | ||
359 | |||
360 | /* | ||
361 | * RX related structures and functions | ||
362 | */ | ||
363 | #define RX_FREE_BUFFERS 64 | ||
364 | #define RX_LOW_WATERMARK 8 | ||
365 | |||
366 | #define SUP_RATE_11A_MAX_NUM_CHANNELS 8 | ||
367 | #define SUP_RATE_11B_MAX_NUM_CHANNELS 4 | ||
368 | #define SUP_RATE_11G_MAX_NUM_CHANNELS 12 | ||
369 | |||
370 | /** | ||
371 | * struct iwl_rx_queue - Rx queue | ||
372 | * @processed: Internal index to last handled Rx packet | ||
373 | * @read: Shared index to newest available Rx buffer | ||
374 | * @write: Shared index to oldest written Rx packet | ||
375 | * @free_count: Number of pre-allocated buffers in rx_free | ||
376 | * @rx_free: list of free SKBs for use | ||
377 | * @rx_used: List of Rx buffers with no SKB | ||
378 | * @need_update: flag to indicate we need to update read/write index | ||
379 | * | ||
380 | * NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers | ||
381 | */ | ||
382 | struct iwl_rx_queue { | ||
383 | __le32 *bd; | ||
384 | dma_addr_t dma_addr; | ||
385 | struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS]; | ||
386 | struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE]; | ||
387 | u32 processed; | ||
388 | u32 read; | ||
389 | u32 write; | ||
390 | u32 free_count; | ||
391 | struct list_head rx_free; | ||
392 | struct list_head rx_used; | ||
393 | int need_update; | ||
394 | spinlock_t lock; | ||
395 | }; | ||
396 | |||
397 | #define IWL_SUPPORTED_RATES_IE_LEN 8 | ||
398 | |||
399 | #define SCAN_INTERVAL 100 | ||
400 | |||
401 | #define MAX_A_CHANNELS 252 | ||
402 | #define MIN_A_CHANNELS 7 | ||
403 | |||
404 | #define MAX_B_CHANNELS 14 | ||
405 | #define MIN_B_CHANNELS 1 | ||
406 | |||
407 | #define STATUS_HCMD_ACTIVE 0 /* host command in progress */ | ||
408 | #define STATUS_INT_ENABLED 1 | ||
409 | #define STATUS_RF_KILL_HW 2 | ||
410 | #define STATUS_RF_KILL_SW 3 | ||
411 | #define STATUS_INIT 4 | ||
412 | #define STATUS_ALIVE 5 | ||
413 | #define STATUS_READY 6 | ||
414 | #define STATUS_TEMPERATURE 7 | ||
415 | #define STATUS_GEO_CONFIGURED 8 | ||
416 | #define STATUS_EXIT_PENDING 9 | ||
417 | #define STATUS_IN_SUSPEND 10 | ||
418 | #define STATUS_STATISTICS 11 | ||
419 | #define STATUS_SCANNING 12 | ||
420 | #define STATUS_SCAN_ABORTING 13 | ||
421 | #define STATUS_SCAN_HW 14 | ||
422 | #define STATUS_POWER_PMI 15 | ||
423 | #define STATUS_FW_ERROR 16 | ||
424 | |||
425 | #define MAX_TID_COUNT 9 | ||
426 | |||
427 | #define IWL_INVALID_RATE 0xFF | ||
428 | #define IWL_INVALID_VALUE -1 | ||
429 | |||
430 | struct iwl_tid_data { | ||
431 | u16 seq_number; | ||
432 | }; | ||
433 | |||
434 | struct iwl_hw_key { | ||
435 | enum ieee80211_key_alg alg; | ||
436 | int keylen; | ||
437 | u8 key[32]; | ||
438 | }; | ||
439 | |||
440 | union iwl_ht_rate_supp { | ||
441 | u16 rates; | ||
442 | struct { | ||
443 | u8 siso_rate; | ||
444 | u8 mimo_rate; | ||
445 | }; | ||
446 | }; | ||
447 | |||
448 | #ifdef CONFIG_IWLWIFI_HT | ||
449 | #define CFG_HT_RX_AMPDU_FACTOR_DEF (0x3) | ||
450 | #define HT_IE_MAX_AMSDU_SIZE_4K (0) | ||
451 | #define CFG_HT_MPDU_DENSITY_2USEC (0x5) | ||
452 | #define CFG_HT_MPDU_DENSITY_DEF CFG_HT_MPDU_DENSITY_2USEC | ||
453 | |||
454 | struct sta_ht_info { | ||
455 | u8 is_ht; | ||
456 | u16 rx_mimo_ps_mode; | ||
457 | u16 tx_mimo_ps_mode; | ||
458 | u16 control_channel; | ||
459 | u8 max_amsdu_size; | ||
460 | u8 ampdu_factor; | ||
461 | u8 mpdu_density; | ||
462 | u8 operating_mode; | ||
463 | u8 supported_chan_width; | ||
464 | u8 extension_chan_offset; | ||
465 | u8 is_green_field; | ||
466 | u8 sgf; | ||
467 | u8 supp_rates[16]; | ||
468 | u8 tx_chan_width; | ||
469 | u8 chan_width_cap; | ||
470 | }; | ||
471 | #endif /*CONFIG_IWLWIFI_HT */ | ||
472 | |||
473 | #ifdef CONFIG_IWLWIFI_QOS | ||
474 | |||
475 | union iwl_qos_capabity { | ||
476 | struct { | ||
477 | u8 edca_count:4; /* bit 0-3 */ | ||
478 | u8 q_ack:1; /* bit 4 */ | ||
479 | u8 queue_request:1; /* bit 5 */ | ||
480 | u8 txop_request:1; /* bit 6 */ | ||
481 | u8 reserved:1; /* bit 7 */ | ||
482 | } q_AP; | ||
483 | struct { | ||
484 | u8 acvo_APSD:1; /* bit 0 */ | ||
485 | u8 acvi_APSD:1; /* bit 1 */ | ||
486 | u8 ac_bk_APSD:1; /* bit 2 */ | ||
487 | u8 ac_be_APSD:1; /* bit 3 */ | ||
488 | u8 q_ack:1; /* bit 4 */ | ||
489 | u8 max_len:2; /* bit 5-6 */ | ||
490 | u8 more_data_ack:1; /* bit 7 */ | ||
491 | } q_STA; | ||
492 | u8 val; | ||
493 | }; | ||
494 | |||
495 | /* QoS structures */ | ||
496 | struct iwl_qos_info { | ||
497 | int qos_enable; | ||
498 | int qos_active; | ||
499 | union iwl_qos_capabity qos_cap; | ||
500 | struct iwl_qosparam_cmd def_qos_parm; | ||
501 | }; | ||
502 | #endif /*CONFIG_IWLWIFI_QOS */ | ||
503 | |||
504 | #define STA_PS_STATUS_WAKE 0 | ||
505 | #define STA_PS_STATUS_SLEEP 1 | ||
506 | |||
507 | struct iwl_station_entry { | ||
508 | struct iwl_addsta_cmd sta; | ||
509 | struct iwl_tid_data tid[MAX_TID_COUNT]; | ||
510 | union { | ||
511 | struct { | ||
512 | u8 rate; | ||
513 | u8 flags; | ||
514 | } s; | ||
515 | u16 rate_n_flags; | ||
516 | } current_rate; | ||
517 | u8 used; | ||
518 | u8 ps_status; | ||
519 | struct iwl_hw_key keyinfo; | ||
520 | }; | ||
521 | |||
522 | /* one for each uCode image (inst/data, boot/init/runtime) */ | ||
523 | struct fw_desc { | ||
524 | void *v_addr; /* access by driver */ | ||
525 | dma_addr_t p_addr; /* access by card's busmaster DMA */ | ||
526 | u32 len; /* bytes */ | ||
527 | }; | ||
528 | |||
529 | /* uCode file layout */ | ||
530 | struct iwl_ucode { | ||
531 | __le32 ver; /* major/minor/subminor */ | ||
532 | __le32 inst_size; /* bytes of runtime instructions */ | ||
533 | __le32 data_size; /* bytes of runtime data */ | ||
534 | __le32 init_size; /* bytes of initialization instructions */ | ||
535 | __le32 init_data_size; /* bytes of initialization data */ | ||
536 | __le32 boot_size; /* bytes of bootstrap instructions */ | ||
537 | u8 data[0]; /* data in same order as "size" elements */ | ||
538 | }; | ||
539 | |||
540 | #define IWL_IBSS_MAC_HASH_SIZE 32 | ||
541 | |||
542 | struct iwl_ibss_seq { | ||
543 | u8 mac[ETH_ALEN]; | ||
544 | u16 seq_num; | ||
545 | u16 frag_num; | ||
546 | unsigned long packet_time; | ||
547 | struct list_head list; | ||
548 | }; | ||
549 | |||
550 | struct iwl_driver_hw_info { | ||
551 | u16 max_txq_num; | ||
552 | u16 ac_queue_count; | ||
553 | u16 tx_cmd_len; | ||
554 | u16 max_rxq_size; | ||
555 | u32 rx_buffer_size; | ||
556 | u16 max_rxq_log; | ||
557 | u8 max_stations; | ||
558 | u8 bcast_sta_id; | ||
559 | void *shared_virt; | ||
560 | dma_addr_t shared_phys; | ||
561 | }; | ||
562 | |||
563 | |||
564 | #define STA_FLG_RTS_MIMO_PROT_MSK __constant_cpu_to_le32(1 << 17) | ||
565 | #define STA_FLG_AGG_MPDU_8US_MSK __constant_cpu_to_le32(1 << 18) | ||
566 | #define STA_FLG_MAX_AGG_SIZE_POS (19) | ||
567 | #define STA_FLG_MAX_AGG_SIZE_MSK __constant_cpu_to_le32(3 << 19) | ||
568 | #define STA_FLG_FAT_EN_MSK __constant_cpu_to_le32(1 << 21) | ||
569 | #define STA_FLG_MIMO_DIS_MSK __constant_cpu_to_le32(1 << 22) | ||
570 | #define STA_FLG_AGG_MPDU_DENSITY_POS (23) | ||
571 | #define STA_FLG_AGG_MPDU_DENSITY_MSK __constant_cpu_to_le32(7 << 23) | ||
572 | #define HT_SHORT_GI_20MHZ_ONLY (1 << 0) | ||
573 | #define HT_SHORT_GI_40MHZ_ONLY (1 << 1) | ||
574 | |||
575 | |||
576 | #define IWL_RX_HDR(x) ((struct iwl_rx_frame_hdr *)(\ | ||
577 | x->u.rx_frame.stats.payload + \ | ||
578 | x->u.rx_frame.stats.phy_count)) | ||
579 | #define IWL_RX_END(x) ((struct iwl_rx_frame_end *)(\ | ||
580 | IWL_RX_HDR(x)->payload + \ | ||
581 | le16_to_cpu(IWL_RX_HDR(x)->len))) | ||
582 | #define IWL_RX_STATS(x) (&x->u.rx_frame.stats) | ||
583 | #define IWL_RX_DATA(x) (IWL_RX_HDR(x)->payload) | ||
584 | |||
585 | |||
586 | /****************************************************************************** | ||
587 | * | ||
588 | * Functions implemented in iwl-base.c which are forward declared here | ||
589 | * for use by iwl-*.c | ||
590 | * | ||
591 | *****************************************************************************/ | ||
592 | struct iwl_addsta_cmd; | ||
593 | extern int iwl_send_add_station(struct iwl_priv *priv, | ||
594 | struct iwl_addsta_cmd *sta, u8 flags); | ||
595 | extern u8 iwl_add_station(struct iwl_priv *priv, const u8 *bssid, | ||
596 | int is_ap, u8 flags); | ||
597 | extern int iwl_is_network_packet(struct iwl_priv *priv, | ||
598 | struct ieee80211_hdr *header); | ||
599 | extern int iwl_power_init_handle(struct iwl_priv *priv); | ||
600 | extern int iwl_eeprom_init(struct iwl_priv *priv); | ||
601 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
602 | extern void iwl_report_frame(struct iwl_priv *priv, | ||
603 | struct iwl_rx_packet *pkt, | ||
604 | struct ieee80211_hdr *header, int group100); | ||
605 | #else | ||
606 | static inline void iwl_report_frame(struct iwl_priv *priv, | ||
607 | struct iwl_rx_packet *pkt, | ||
608 | struct ieee80211_hdr *header, | ||
609 | int group100) {} | ||
610 | #endif | ||
611 | extern void iwl_handle_data_packet_monitor(struct iwl_priv *priv, | ||
612 | struct iwl_rx_mem_buffer *rxb, | ||
613 | void *data, short len, | ||
614 | struct ieee80211_rx_status *stats, | ||
615 | u16 phy_flags); | ||
616 | extern int is_duplicate_packet(struct iwl_priv *priv, struct ieee80211_hdr | ||
617 | *header); | ||
618 | extern int iwl_rx_queue_alloc(struct iwl_priv *priv); | ||
619 | extern void iwl_rx_queue_reset(struct iwl_priv *priv, | ||
620 | struct iwl_rx_queue *rxq); | ||
621 | extern int iwl_calc_db_from_ratio(int sig_ratio); | ||
622 | extern int iwl_calc_sig_qual(int rssi_dbm, int noise_dbm); | ||
623 | extern int iwl_tx_queue_init(struct iwl_priv *priv, | ||
624 | struct iwl_tx_queue *txq, int count, u32 id); | ||
625 | extern void iwl_rx_replenish(void *data); | ||
626 | extern void iwl_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq); | ||
627 | extern int iwl_send_cmd_pdu(struct iwl_priv *priv, u8 id, u16 len, | ||
628 | const void *data); | ||
629 | extern int __must_check iwl_send_cmd(struct iwl_priv *priv, | ||
630 | struct iwl_host_cmd *cmd); | ||
631 | extern unsigned int iwl_fill_beacon_frame(struct iwl_priv *priv, | ||
632 | struct ieee80211_hdr *hdr, | ||
633 | const u8 *dest, int left); | ||
634 | extern int iwl_rx_queue_update_write_ptr(struct iwl_priv *priv, | ||
635 | struct iwl_rx_queue *q); | ||
636 | extern int iwl_send_statistics_request(struct iwl_priv *priv); | ||
637 | extern void iwl_set_decrypted_flag(struct iwl_priv *priv, struct sk_buff *skb, | ||
638 | u32 decrypt_res, | ||
639 | struct ieee80211_rx_status *stats); | ||
640 | extern const u8 BROADCAST_ADDR[ETH_ALEN]; | ||
641 | |||
642 | /* | ||
643 | * Currently used by iwl-3945-rs... look at restructuring so that it doesn't | ||
644 | * call this... todo... fix that. | ||
645 | */ | ||
646 | extern u8 iwl_sync_station(struct iwl_priv *priv, int sta_id, | ||
647 | u16 tx_rate, u8 flags); | ||
648 | |||
649 | /****************************************************************************** | ||
650 | * | ||
651 | * Functions implemented in iwl-[34]*.c which are forward declared here | ||
652 | * for use by iwl-base.c | ||
653 | * | ||
654 | * NOTE: The implementation of these functions are hardware specific | ||
655 | * which is why they are in the hardware specific files (vs. iwl-base.c) | ||
656 | * | ||
657 | * Naming convention -- | ||
658 | * iwl_ <-- Its part of iwlwifi (should be changed to iwl_) | ||
659 | * iwl_hw_ <-- Hardware specific (implemented in iwl-XXXX.c by all HW) | ||
660 | * iwlXXXX_ <-- Hardware specific (implemented in iwl-XXXX.c for XXXX) | ||
661 | * iwl_bg_ <-- Called from work queue context | ||
662 | * iwl_mac_ <-- mac80211 callback | ||
663 | * | ||
664 | ****************************************************************************/ | ||
665 | extern void iwl_hw_rx_handler_setup(struct iwl_priv *priv); | ||
666 | extern void iwl_hw_setup_deferred_work(struct iwl_priv *priv); | ||
667 | extern void iwl_hw_cancel_deferred_work(struct iwl_priv *priv); | ||
668 | extern int iwl_hw_rxq_stop(struct iwl_priv *priv); | ||
669 | extern int iwl_hw_set_hw_setting(struct iwl_priv *priv); | ||
670 | extern int iwl_hw_nic_init(struct iwl_priv *priv); | ||
671 | extern int iwl_hw_nic_stop_master(struct iwl_priv *priv); | ||
672 | extern void iwl_hw_txq_ctx_free(struct iwl_priv *priv); | ||
673 | extern void iwl_hw_txq_ctx_stop(struct iwl_priv *priv); | ||
674 | extern int iwl_hw_nic_reset(struct iwl_priv *priv); | ||
675 | extern int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *tfd, | ||
676 | dma_addr_t addr, u16 len); | ||
677 | extern int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq); | ||
678 | extern int iwl_hw_get_temperature(struct iwl_priv *priv); | ||
679 | extern int iwl_hw_tx_queue_init(struct iwl_priv *priv, | ||
680 | struct iwl_tx_queue *txq); | ||
681 | extern unsigned int iwl_hw_get_beacon_cmd(struct iwl_priv *priv, | ||
682 | struct iwl_frame *frame, u8 rate); | ||
683 | extern int iwl_hw_get_rx_read(struct iwl_priv *priv); | ||
684 | extern void iwl_hw_build_tx_cmd_rate(struct iwl_priv *priv, | ||
685 | struct iwl_cmd *cmd, | ||
686 | struct ieee80211_tx_control *ctrl, | ||
687 | struct ieee80211_hdr *hdr, | ||
688 | int sta_id, int tx_id); | ||
689 | extern int iwl_hw_reg_send_txpower(struct iwl_priv *priv); | ||
690 | extern int iwl_hw_reg_set_txpower(struct iwl_priv *priv, s8 power); | ||
691 | extern void iwl_hw_rx_statistics(struct iwl_priv *priv, | ||
692 | struct iwl_rx_mem_buffer *rxb); | ||
693 | extern void iwl_disable_events(struct iwl_priv *priv); | ||
694 | extern int iwl4965_get_temperature(const struct iwl_priv *priv); | ||
695 | |||
696 | /** | ||
697 | * iwl_hw_find_station - Find station id for a given BSSID | ||
698 | * @bssid: MAC address of station ID to find | ||
699 | * | ||
700 | * NOTE: This should not be hardware specific but the code has | ||
701 | * not yet been merged into a single common layer for managing the | ||
702 | * station tables. | ||
703 | */ | ||
704 | extern u8 iwl_hw_find_station(struct iwl_priv *priv, const u8 *bssid); | ||
705 | |||
706 | extern int iwl_hw_channel_switch(struct iwl_priv *priv, u16 channel); | ||
707 | |||
30 | /* | 708 | /* |
31 | * Forward declare iwl-3945.c functions for iwl-base.c | 709 | * Forward declare iwl-3945.c functions for iwl-base.c |
32 | */ | 710 | */ |
@@ -37,4 +715,286 @@ extern void iwl3945_reg_txpower_periodic(struct iwl_priv *priv); | |||
37 | extern int iwl3945_txpower_set_from_eeprom(struct iwl_priv *priv); | 715 | extern int iwl3945_txpower_set_from_eeprom(struct iwl_priv *priv); |
38 | extern u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id, | 716 | extern u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id, |
39 | u16 tx_rate, u8 flags); | 717 | u16 tx_rate, u8 flags); |
718 | |||
719 | |||
720 | #ifdef CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT | ||
721 | |||
722 | enum { | ||
723 | MEASUREMENT_READY = (1 << 0), | ||
724 | MEASUREMENT_ACTIVE = (1 << 1), | ||
725 | }; | ||
726 | |||
727 | #endif | ||
728 | |||
729 | struct iwl_priv { | ||
730 | |||
731 | /* ieee device used by generic ieee processing code */ | ||
732 | struct ieee80211_hw *hw; | ||
733 | struct ieee80211_channel *ieee_channels; | ||
734 | struct ieee80211_rate *ieee_rates; | ||
735 | |||
736 | /* temporary frame storage list */ | ||
737 | struct list_head free_frames; | ||
738 | int frames_count; | ||
739 | |||
740 | u8 phymode; | ||
741 | int alloc_rxb_skb; | ||
742 | |||
743 | void (*rx_handlers[REPLY_MAX])(struct iwl_priv *priv, | ||
744 | struct iwl_rx_mem_buffer *rxb); | ||
745 | |||
746 | const struct ieee80211_hw_mode *modes; | ||
747 | |||
748 | #ifdef CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT | ||
749 | /* spectrum measurement report caching */ | ||
750 | struct iwl_spectrum_notification measure_report; | ||
751 | u8 measurement_status; | ||
752 | #endif | ||
753 | /* ucode beacon time */ | ||
754 | u32 ucode_beacon_time; | ||
755 | |||
756 | /* we allocate array of iwl_channel_info for NIC's valid channels. | ||
757 | * Access via channel # using indirect index array */ | ||
758 | struct iwl_channel_info *channel_info; /* channel info array */ | ||
759 | u8 channel_count; /* # of channels */ | ||
760 | |||
761 | /* each calibration channel group in the EEPROM has a derived | ||
762 | * clip setting for each rate. */ | ||
763 | const struct iwl_clip_group clip_groups[5]; | ||
764 | |||
765 | /* thermal calibration */ | ||
766 | s32 temperature; /* degrees Kelvin */ | ||
767 | s32 last_temperature; | ||
768 | |||
769 | /* Scan related variables */ | ||
770 | unsigned long last_scan_jiffies; | ||
771 | unsigned long scan_start; | ||
772 | unsigned long scan_pass_start; | ||
773 | unsigned long scan_start_tsf; | ||
774 | int scan_bands; | ||
775 | int one_direct_scan; | ||
776 | u8 direct_ssid_len; | ||
777 | u8 direct_ssid[IW_ESSID_MAX_SIZE]; | ||
778 | struct iwl_scan_cmd *scan; | ||
779 | u8 only_active_channel; | ||
780 | |||
781 | /* spinlock */ | ||
782 | spinlock_t lock; /* protect general shared data */ | ||
783 | spinlock_t hcmd_lock; /* protect hcmd */ | ||
784 | struct mutex mutex; | ||
785 | |||
786 | /* basic pci-network driver stuff */ | ||
787 | struct pci_dev *pci_dev; | ||
788 | |||
789 | /* pci hardware address support */ | ||
790 | void __iomem *hw_base; | ||
791 | |||
792 | /* uCode images, save to reload in case of failure */ | ||
793 | struct fw_desc ucode_code; /* runtime inst */ | ||
794 | struct fw_desc ucode_data; /* runtime data original */ | ||
795 | struct fw_desc ucode_data_backup; /* runtime data save/restore */ | ||
796 | struct fw_desc ucode_init; /* initialization inst */ | ||
797 | struct fw_desc ucode_init_data; /* initialization data */ | ||
798 | struct fw_desc ucode_boot; /* bootstrap inst */ | ||
799 | |||
800 | |||
801 | struct iwl_rxon_time_cmd rxon_timing; | ||
802 | |||
803 | /* We declare this const so it can only be | ||
804 | * changed via explicit cast within the | ||
805 | * routines that actually update the physical | ||
806 | * hardware */ | ||
807 | const struct iwl_rxon_cmd active_rxon; | ||
808 | struct iwl_rxon_cmd staging_rxon; | ||
809 | |||
810 | int error_recovering; | ||
811 | struct iwl_rxon_cmd recovery_rxon; | ||
812 | |||
813 | /* 1st responses from initialize and runtime uCode images. | ||
814 | * 4965's initialize alive response contains some calibration data. */ | ||
815 | struct iwl_init_alive_resp card_alive_init; | ||
816 | struct iwl_alive_resp card_alive; | ||
817 | |||
818 | #ifdef LED | ||
819 | /* LED related variables */ | ||
820 | struct iwl_activity_blink activity; | ||
821 | unsigned long led_packets; | ||
822 | int led_state; | ||
823 | #endif | ||
824 | |||
825 | u16 active_rate; | ||
826 | u16 active_rate_basic; | ||
827 | |||
828 | u8 call_post_assoc_from_beacon; | ||
829 | u8 assoc_station_added; | ||
830 | /* Rate scaling data */ | ||
831 | s8 data_retry_limit; | ||
832 | u8 retry_rate; | ||
833 | |||
834 | wait_queue_head_t wait_command_queue; | ||
835 | |||
836 | int activity_timer_active; | ||
837 | |||
838 | /* Rx and Tx DMA processing queues */ | ||
839 | struct iwl_rx_queue rxq; | ||
840 | struct iwl_tx_queue txq[IWL_MAX_NUM_QUEUES]; | ||
841 | |||
842 | unsigned long status; | ||
843 | u32 config; | ||
844 | |||
845 | int last_rx_rssi; /* From Rx packet statisitics */ | ||
846 | int last_rx_noise; /* From beacon statistics */ | ||
847 | |||
848 | struct iwl_power_mgr power_data; | ||
849 | |||
850 | struct iwl_notif_statistics statistics; | ||
851 | unsigned long last_statistics_time; | ||
852 | |||
853 | /* context information */ | ||
854 | u8 essid[IW_ESSID_MAX_SIZE]; | ||
855 | u8 essid_len; | ||
856 | u16 rates_mask; | ||
857 | |||
858 | u32 power_mode; | ||
859 | u32 antenna; | ||
860 | u8 bssid[ETH_ALEN]; | ||
861 | u16 rts_threshold; | ||
862 | u8 mac_addr[ETH_ALEN]; | ||
863 | |||
864 | /*station table variables */ | ||
865 | spinlock_t sta_lock; | ||
866 | int num_stations; | ||
867 | struct iwl_station_entry stations[IWL_STATION_COUNT]; | ||
868 | |||
869 | /* Indication if ieee80211_ops->open has been called */ | ||
870 | int is_open; | ||
871 | |||
872 | u8 mac80211_registered; | ||
873 | int is_abg; | ||
874 | |||
875 | u32 notif_missed_beacons; | ||
876 | |||
877 | /* Rx'd packet timing information */ | ||
878 | u32 last_beacon_time; | ||
879 | u64 last_tsf; | ||
880 | |||
881 | /* Duplicate packet detection */ | ||
882 | u16 last_seq_num; | ||
883 | u16 last_frag_num; | ||
884 | unsigned long last_packet_time; | ||
885 | struct list_head ibss_mac_hash[IWL_IBSS_MAC_HASH_SIZE]; | ||
886 | |||
887 | /* eeprom */ | ||
888 | struct iwl_eeprom eeprom; | ||
889 | |||
890 | int iw_mode; | ||
891 | |||
892 | struct sk_buff *ibss_beacon; | ||
893 | |||
894 | /* Last Rx'd beacon timestamp */ | ||
895 | u32 timestamp0; | ||
896 | u32 timestamp1; | ||
897 | u16 beacon_int; | ||
898 | struct iwl_driver_hw_info hw_setting; | ||
899 | int interface_id; | ||
900 | |||
901 | /* Current association information needed to configure the | ||
902 | * hardware */ | ||
903 | u16 assoc_id; | ||
904 | u16 assoc_capability; | ||
905 | u8 ps_mode; | ||
906 | |||
907 | #ifdef CONFIG_IWLWIFI_QOS | ||
908 | struct iwl_qos_info qos_data; | ||
909 | #endif /*CONFIG_IWLWIFI_QOS */ | ||
910 | |||
911 | struct workqueue_struct *workqueue; | ||
912 | |||
913 | struct work_struct up; | ||
914 | struct work_struct restart; | ||
915 | struct work_struct calibrated_work; | ||
916 | struct work_struct scan_completed; | ||
917 | struct work_struct rx_replenish; | ||
918 | struct work_struct rf_kill; | ||
919 | struct work_struct abort_scan; | ||
920 | struct work_struct update_link_led; | ||
921 | struct work_struct auth_work; | ||
922 | struct work_struct report_work; | ||
923 | struct work_struct request_scan; | ||
924 | struct work_struct beacon_update; | ||
925 | |||
926 | struct tasklet_struct irq_tasklet; | ||
927 | |||
928 | struct delayed_work init_alive_start; | ||
929 | struct delayed_work alive_start; | ||
930 | struct delayed_work activity_timer; | ||
931 | struct delayed_work thermal_periodic; | ||
932 | struct delayed_work gather_stats; | ||
933 | struct delayed_work scan_check; | ||
934 | struct delayed_work post_associate; | ||
935 | |||
936 | #define IWL_DEFAULT_TX_POWER 0x0F | ||
937 | s8 user_txpower_limit; | ||
938 | s8 max_channel_txpower_limit; | ||
939 | |||
940 | #ifdef CONFIG_PM | ||
941 | u32 pm_state[16]; | ||
942 | #endif | ||
943 | |||
944 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
945 | /* debugging info */ | ||
946 | u32 framecnt_to_us; | ||
947 | atomic_t restrict_refcnt; | ||
948 | #endif | ||
949 | }; /*iwl_priv */ | ||
950 | |||
951 | static inline int iwl_is_associated(struct iwl_priv *priv) | ||
952 | { | ||
953 | return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; | ||
954 | } | ||
955 | |||
956 | static inline int is_channel_valid(const struct iwl_channel_info *ch_info) | ||
957 | { | ||
958 | if (ch_info == NULL) | ||
959 | return 0; | ||
960 | return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0; | ||
961 | } | ||
962 | |||
963 | static inline int is_channel_narrow(const struct iwl_channel_info *ch_info) | ||
964 | { | ||
965 | return (ch_info->flags & EEPROM_CHANNEL_NARROW) ? 1 : 0; | ||
966 | } | ||
967 | |||
968 | static inline int is_channel_radar(const struct iwl_channel_info *ch_info) | ||
969 | { | ||
970 | return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0; | ||
971 | } | ||
972 | |||
973 | static inline u8 is_channel_a_band(const struct iwl_channel_info *ch_info) | ||
974 | { | ||
975 | return ch_info->phymode == MODE_IEEE80211A; | ||
976 | } | ||
977 | |||
978 | static inline u8 is_channel_bg_band(const struct iwl_channel_info *ch_info) | ||
979 | { | ||
980 | return ((ch_info->phymode == MODE_IEEE80211B) || | ||
981 | (ch_info->phymode == MODE_IEEE80211G)); | ||
982 | } | ||
983 | |||
984 | static inline int is_channel_passive(const struct iwl_channel_info *ch) | ||
985 | { | ||
986 | return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0; | ||
987 | } | ||
988 | |||
989 | static inline int is_channel_ibss(const struct iwl_channel_info *ch) | ||
990 | { | ||
991 | return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0; | ||
992 | } | ||
993 | |||
994 | extern const struct iwl_channel_info *iwl_get_channel_info( | ||
995 | const struct iwl_priv *priv, int phymode, u16 channel); | ||
996 | |||
997 | /* Requires full declaration of iwl_priv before including */ | ||
998 | #include "iwl-3945-io.h" | ||
999 | |||
40 | #endif | 1000 | #endif |
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-4965-commands.h index d852a77d112e..5524bf77e882 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-4965-commands.h | |||
@@ -80,9 +80,6 @@ enum { | |||
80 | REPLY_REMOVE_ALL_STA = 0x1a, /* not used */ | 80 | REPLY_REMOVE_ALL_STA = 0x1a, /* not used */ |
81 | 81 | ||
82 | /* RX, TX, LEDs */ | 82 | /* RX, TX, LEDs */ |
83 | #if IWL == 3945 | ||
84 | REPLY_3945_RX = 0x1b, /* 3945 only */ | ||
85 | #endif | ||
86 | REPLY_TX = 0x1c, | 83 | REPLY_TX = 0x1c, |
87 | REPLY_RATE_SCALE = 0x47, /* 3945 only */ | 84 | REPLY_RATE_SCALE = 0x47, /* 3945 only */ |
88 | REPLY_LEDS_CMD = 0x48, | 85 | REPLY_LEDS_CMD = 0x48, |
@@ -132,7 +129,6 @@ enum { | |||
132 | /* Missed beacons notification */ | 129 | /* Missed beacons notification */ |
133 | MISSED_BEACONS_NOTIFICATION = 0xa2, | 130 | MISSED_BEACONS_NOTIFICATION = 0xa2, |
134 | 131 | ||
135 | #if IWL == 4965 | ||
136 | REPLY_CT_KILL_CONFIG_CMD = 0xa4, | 132 | REPLY_CT_KILL_CONFIG_CMD = 0xa4, |
137 | SENSITIVITY_CMD = 0xa8, | 133 | SENSITIVITY_CMD = 0xa8, |
138 | REPLY_PHY_CALIBRATION_CMD = 0xb0, | 134 | REPLY_PHY_CALIBRATION_CMD = 0xb0, |
@@ -140,7 +136,6 @@ enum { | |||
140 | REPLY_RX_MPDU_CMD = 0xc1, | 136 | REPLY_RX_MPDU_CMD = 0xc1, |
141 | REPLY_4965_RX = 0xc3, | 137 | REPLY_4965_RX = 0xc3, |
142 | REPLY_COMPRESSED_BA = 0xc5, | 138 | REPLY_COMPRESSED_BA = 0xc5, |
143 | #endif | ||
144 | REPLY_MAX = 0xff | 139 | REPLY_MAX = 0xff |
145 | }; | 140 | }; |
146 | 141 | ||
@@ -211,7 +206,6 @@ struct iwl_init_alive_resp { | |||
211 | __le32 timestamp; | 206 | __le32 timestamp; |
212 | __le32 is_valid; | 207 | __le32 is_valid; |
213 | 208 | ||
214 | #if IWL == 4965 | ||
215 | /* calibration values from "initialize" uCode */ | 209 | /* calibration values from "initialize" uCode */ |
216 | __le32 voltage; /* signed */ | 210 | __le32 voltage; /* signed */ |
217 | __le32 therm_r1[2]; /* signed 1st for normal, 2nd for FAT channel */ | 211 | __le32 therm_r1[2]; /* signed 1st for normal, 2nd for FAT channel */ |
@@ -220,7 +214,6 @@ struct iwl_init_alive_resp { | |||
220 | __le32 therm_r4[2]; /* signed */ | 214 | __le32 therm_r4[2]; /* signed */ |
221 | __le32 tx_atten[5][2]; /* signed MIMO gain comp, 5 freq groups, | 215 | __le32 tx_atten[5][2]; /* signed MIMO gain comp, 5 freq groups, |
222 | * 2 Tx chains */ | 216 | * 2 Tx chains */ |
223 | #endif | ||
224 | } __attribute__ ((packed)); | 217 | } __attribute__ ((packed)); |
225 | 218 | ||
226 | union tsf { | 219 | union tsf { |
@@ -237,9 +230,6 @@ struct iwl_error_resp { | |||
237 | u8 cmd_id; | 230 | u8 cmd_id; |
238 | u8 reserved1; | 231 | u8 reserved1; |
239 | __le16 bad_cmd_seq_num; | 232 | __le16 bad_cmd_seq_num; |
240 | #if IWL == 3945 | ||
241 | __le16 reserved2; | ||
242 | #endif | ||
243 | __le32 error_info; | 233 | __le32 error_info; |
244 | union tsf timestamp; | 234 | union tsf timestamp; |
245 | } __attribute__ ((packed)); | 235 | } __attribute__ ((packed)); |
@@ -312,23 +302,15 @@ struct iwl_rxon_cmd { | |||
312 | __le16 reserved3; | 302 | __le16 reserved3; |
313 | u8 dev_type; | 303 | u8 dev_type; |
314 | u8 air_propagation; | 304 | u8 air_propagation; |
315 | #if IWL == 3945 | ||
316 | __le16 reserved4; | ||
317 | #elif IWL == 4965 | ||
318 | __le16 rx_chain; | 305 | __le16 rx_chain; |
319 | #endif | ||
320 | u8 ofdm_basic_rates; | 306 | u8 ofdm_basic_rates; |
321 | u8 cck_basic_rates; | 307 | u8 cck_basic_rates; |
322 | __le16 assoc_id; | 308 | __le16 assoc_id; |
323 | __le32 flags; | 309 | __le32 flags; |
324 | __le32 filter_flags; | 310 | __le32 filter_flags; |
325 | __le16 channel; | 311 | __le16 channel; |
326 | #if IWL == 3945 | ||
327 | __le16 reserved5; | ||
328 | #elif IWL == 4965 | ||
329 | u8 ofdm_ht_single_stream_basic_rates; | 312 | u8 ofdm_ht_single_stream_basic_rates; |
330 | u8 ofdm_ht_dual_stream_basic_rates; | 313 | u8 ofdm_ht_dual_stream_basic_rates; |
331 | #endif | ||
332 | } __attribute__ ((packed)); | 314 | } __attribute__ ((packed)); |
333 | 315 | ||
334 | /* | 316 | /* |
@@ -339,11 +321,9 @@ struct iwl_rxon_assoc_cmd { | |||
339 | __le32 filter_flags; | 321 | __le32 filter_flags; |
340 | u8 ofdm_basic_rates; | 322 | u8 ofdm_basic_rates; |
341 | u8 cck_basic_rates; | 323 | u8 cck_basic_rates; |
342 | #if IWL == 4965 | ||
343 | u8 ofdm_ht_single_stream_basic_rates; | 324 | u8 ofdm_ht_single_stream_basic_rates; |
344 | u8 ofdm_ht_dual_stream_basic_rates; | 325 | u8 ofdm_ht_dual_stream_basic_rates; |
345 | __le16 rx_chain_select_flags; | 326 | __le16 rx_chain_select_flags; |
346 | #endif | ||
347 | __le16 reserved; | 327 | __le16 reserved; |
348 | } __attribute__ ((packed)); | 328 | } __attribute__ ((packed)); |
349 | 329 | ||
@@ -364,14 +344,6 @@ struct iwl_tx_power { | |||
364 | u8 dsp_atten; /* gain for DSP */ | 344 | u8 dsp_atten; /* gain for DSP */ |
365 | } __attribute__ ((packed)); | 345 | } __attribute__ ((packed)); |
366 | 346 | ||
367 | #if IWL == 3945 | ||
368 | struct iwl_power_per_rate { | ||
369 | u8 rate; /* plcp */ | ||
370 | struct iwl_tx_power tpc; | ||
371 | u8 reserved; | ||
372 | } __attribute__ ((packed)); | ||
373 | |||
374 | #elif IWL == 4965 | ||
375 | #define POWER_TABLE_NUM_ENTRIES 33 | 347 | #define POWER_TABLE_NUM_ENTRIES 33 |
376 | #define POWER_TABLE_NUM_HT_OFDM_ENTRIES 32 | 348 | #define POWER_TABLE_NUM_HT_OFDM_ENTRIES 32 |
377 | #define POWER_TABLE_CCK_ENTRY 32 | 349 | #define POWER_TABLE_CCK_ENTRY 32 |
@@ -382,7 +354,6 @@ struct tx_power_dual_stream { | |||
382 | struct iwl_tx_power_db { | 354 | struct iwl_tx_power_db { |
383 | struct tx_power_dual_stream power_tbl[POWER_TABLE_NUM_ENTRIES]; | 355 | struct tx_power_dual_stream power_tbl[POWER_TABLE_NUM_ENTRIES]; |
384 | } __attribute__ ((packed)); | 356 | } __attribute__ ((packed)); |
385 | #endif | ||
386 | 357 | ||
387 | /* | 358 | /* |
388 | * REPLY_CHANNEL_SWITCH = 0x72 (command, has simple generic response) | 359 | * REPLY_CHANNEL_SWITCH = 0x72 (command, has simple generic response) |
@@ -394,11 +365,7 @@ struct iwl_channel_switch_cmd { | |||
394 | __le32 rxon_flags; | 365 | __le32 rxon_flags; |
395 | __le32 rxon_filter_flags; | 366 | __le32 rxon_filter_flags; |
396 | __le32 switch_time; | 367 | __le32 switch_time; |
397 | #if IWL == 3945 | ||
398 | struct iwl_power_per_rate power[IWL_MAX_RATES]; | ||
399 | #elif IWL == 4965 | ||
400 | struct iwl_tx_power_db tx_power; | 368 | struct iwl_tx_power_db tx_power; |
401 | #endif | ||
402 | } __attribute__ ((packed)); | 369 | } __attribute__ ((packed)); |
403 | 370 | ||
404 | /* | 371 | /* |
@@ -463,9 +430,6 @@ struct iwl_qosparam_cmd { | |||
463 | #define IWL_STATION_COUNT 32 /* MAX(3945,4965)*/ | 430 | #define IWL_STATION_COUNT 32 /* MAX(3945,4965)*/ |
464 | #define IWL_INVALID_STATION 255 | 431 | #define IWL_INVALID_STATION 255 |
465 | 432 | ||
466 | #if IWL == 3945 | ||
467 | #define STA_FLG_TX_RATE_MSK __constant_cpu_to_le32(1<<2); | ||
468 | #endif | ||
469 | #define STA_FLG_PWR_SAVE_MSK __constant_cpu_to_le32(1<<8); | 433 | #define STA_FLG_PWR_SAVE_MSK __constant_cpu_to_le32(1<<8); |
470 | 434 | ||
471 | #define STA_CONTROL_MODIFY_MSK 0x01 | 435 | #define STA_CONTROL_MODIFY_MSK 0x01 |
@@ -528,17 +492,11 @@ struct iwl_addsta_cmd { | |||
528 | __le32 station_flags; | 492 | __le32 station_flags; |
529 | __le32 station_flags_msk; | 493 | __le32 station_flags_msk; |
530 | __le16 tid_disable_tx; | 494 | __le16 tid_disable_tx; |
531 | #if IWL == 3945 | ||
532 | __le16 rate_n_flags; | ||
533 | #else | ||
534 | __le16 reserved1; | 495 | __le16 reserved1; |
535 | #endif | ||
536 | u8 add_immediate_ba_tid; | 496 | u8 add_immediate_ba_tid; |
537 | u8 remove_immediate_ba_tid; | 497 | u8 remove_immediate_ba_tid; |
538 | __le16 add_immediate_ba_ssn; | 498 | __le16 add_immediate_ba_ssn; |
539 | #if IWL == 4965 | ||
540 | __le32 reserved2; | 499 | __le32 reserved2; |
541 | #endif | ||
542 | } __attribute__ ((packed)); | 500 | } __attribute__ ((packed)); |
543 | 501 | ||
544 | /* | 502 | /* |
@@ -721,47 +679,24 @@ struct iwl_tx_cmd { | |||
721 | __le16 len; | 679 | __le16 len; |
722 | __le16 next_frame_len; | 680 | __le16 next_frame_len; |
723 | __le32 tx_flags; | 681 | __le32 tx_flags; |
724 | #if IWL == 3945 | ||
725 | u8 rate; | ||
726 | u8 sta_id; | ||
727 | u8 tid_tspec; | ||
728 | #elif IWL == 4965 | ||
729 | struct iwl_dram_scratch scratch; | 682 | struct iwl_dram_scratch scratch; |
730 | __le32 rate_n_flags; | 683 | __le32 rate_n_flags; |
731 | u8 sta_id; | 684 | u8 sta_id; |
732 | #endif | ||
733 | u8 sec_ctl; | 685 | u8 sec_ctl; |
734 | #if IWL == 4965 | ||
735 | u8 initial_rate_index; | 686 | u8 initial_rate_index; |
736 | u8 reserved; | 687 | u8 reserved; |
737 | #endif | ||
738 | u8 key[16]; | 688 | u8 key[16]; |
739 | #if IWL == 3945 | ||
740 | union { | ||
741 | u8 byte[8]; | ||
742 | __le16 word[4]; | ||
743 | __le32 dw[2]; | ||
744 | } tkip_mic; | ||
745 | __le32 next_frame_info; | ||
746 | #elif IWL == 4965 | ||
747 | __le16 next_frame_flags; | 689 | __le16 next_frame_flags; |
748 | __le16 reserved2; | 690 | __le16 reserved2; |
749 | #endif | ||
750 | union { | 691 | union { |
751 | __le32 life_time; | 692 | __le32 life_time; |
752 | __le32 attempt; | 693 | __le32 attempt; |
753 | } stop_time; | 694 | } stop_time; |
754 | #if IWL == 3945 | ||
755 | u8 supp_rates[2]; | ||
756 | #elif IWL == 4965 | ||
757 | __le32 dram_lsb_ptr; | 695 | __le32 dram_lsb_ptr; |
758 | u8 dram_msb_ptr; | 696 | u8 dram_msb_ptr; |
759 | #endif | ||
760 | u8 rts_retry_limit; /*byte 50 */ | 697 | u8 rts_retry_limit; /*byte 50 */ |
761 | u8 data_retry_limit; /*byte 51 */ | 698 | u8 data_retry_limit; /*byte 51 */ |
762 | #if IWL == 4965 | ||
763 | u8 tid_tspec; | 699 | u8 tid_tspec; |
764 | #endif | ||
765 | union { | 700 | union { |
766 | __le16 pm_frame_timeout; | 701 | __le16 pm_frame_timeout; |
767 | __le16 attempt_duration; | 702 | __le16 attempt_duration; |
@@ -872,7 +807,6 @@ enum { | |||
872 | /* | 807 | /* |
873 | * REPLY_TX = 0x1c (response) | 808 | * REPLY_TX = 0x1c (response) |
874 | */ | 809 | */ |
875 | #if IWL == 4965 | ||
876 | struct iwl_tx_resp { | 810 | struct iwl_tx_resp { |
877 | u8 frame_count; /* 1 no aggregation, >1 aggregation */ | 811 | u8 frame_count; /* 1 no aggregation, >1 aggregation */ |
878 | u8 bt_kill_count; | 812 | u8 bt_kill_count; |
@@ -886,17 +820,6 @@ struct iwl_tx_resp { | |||
886 | __le32 status; /* TX status (for aggregation status of 1st frame) */ | 820 | __le32 status; /* TX status (for aggregation status of 1st frame) */ |
887 | } __attribute__ ((packed)); | 821 | } __attribute__ ((packed)); |
888 | 822 | ||
889 | #elif IWL == 3945 | ||
890 | struct iwl_tx_resp { | ||
891 | u8 failure_rts; | ||
892 | u8 failure_frame; | ||
893 | u8 bt_kill_count; | ||
894 | u8 rate; | ||
895 | __le32 wireless_media_time; | ||
896 | __le32 status; /* TX status (for aggregation status of 1st frame) */ | ||
897 | } __attribute__ ((packed)); | ||
898 | #endif | ||
899 | |||
900 | /* | 823 | /* |
901 | * REPLY_COMPRESSED_BA = 0xc5 (response only, not a command) | 824 | * REPLY_COMPRESSED_BA = 0xc5 (response only, not a command) |
902 | */ | 825 | */ |
@@ -920,43 +843,9 @@ struct iwl_txpowertable_cmd { | |||
920 | u8 band; /* 0: 5 GHz, 1: 2.4 GHz */ | 843 | u8 band; /* 0: 5 GHz, 1: 2.4 GHz */ |
921 | u8 reserved; | 844 | u8 reserved; |
922 | __le16 channel; | 845 | __le16 channel; |
923 | #if IWL == 3945 | ||
924 | struct iwl_power_per_rate power[IWL_MAX_RATES]; | ||
925 | #elif IWL == 4965 | ||
926 | struct iwl_tx_power_db tx_power; | 846 | struct iwl_tx_power_db tx_power; |
927 | #endif | ||
928 | } __attribute__ ((packed)); | ||
929 | |||
930 | #if IWL == 3945 | ||
931 | struct iwl_rate_scaling_info { | ||
932 | __le16 rate_n_flags; | ||
933 | u8 try_cnt; | ||
934 | u8 next_rate_index; | ||
935 | } __attribute__ ((packed)); | 847 | } __attribute__ ((packed)); |
936 | 848 | ||
937 | /** | ||
938 | * struct iwl_rate_scaling_cmd - Rate Scaling Command & Response | ||
939 | * | ||
940 | * REPLY_RATE_SCALE = 0x47 (command, has simple generic response) | ||
941 | * | ||
942 | * NOTE: The table of rates passed to the uCode via the | ||
943 | * RATE_SCALE command sets up the corresponding order of | ||
944 | * rates used for all related commands, including rate | ||
945 | * masks, etc. | ||
946 | * | ||
947 | * For example, if you set 9MB (PLCP 0x0f) as the first | ||
948 | * rate in the rate table, the bit mask for that rate | ||
949 | * when passed through ofdm_basic_rates on the REPLY_RXON | ||
950 | * command would be bit 0 (1<<0) | ||
951 | */ | ||
952 | struct iwl_rate_scaling_cmd { | ||
953 | u8 table_id; | ||
954 | u8 reserved[3]; | ||
955 | struct iwl_rate_scaling_info table[IWL_MAX_RATES]; | ||
956 | } __attribute__ ((packed)); | ||
957 | |||
958 | #elif IWL == 4965 | ||
959 | |||
960 | /*RS_NEW_API: only TLC_RTS remains and moved to bit 0 */ | 849 | /*RS_NEW_API: only TLC_RTS remains and moved to bit 0 */ |
961 | #define LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK (1<<0) | 850 | #define LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK (1<<0) |
962 | 851 | ||
@@ -996,7 +885,6 @@ struct iwl_link_quality_cmd { | |||
996 | } rs_table[LINK_QUAL_MAX_RETRY_NUM]; | 885 | } rs_table[LINK_QUAL_MAX_RETRY_NUM]; |
997 | __le32 reserved2; | 886 | __le32 reserved2; |
998 | } __attribute__ ((packed)); | 887 | } __attribute__ ((packed)); |
999 | #endif | ||
1000 | 888 | ||
1001 | /* | 889 | /* |
1002 | * REPLY_BT_CONFIG = 0x9b (command, has simple generic response) | 890 | * REPLY_BT_CONFIG = 0x9b (command, has simple generic response) |
@@ -1166,21 +1054,6 @@ struct iwl_spectrum_notification { | |||
1166 | */ | 1054 | */ |
1167 | #define IWL_POWER_VEC_SIZE 5 | 1055 | #define IWL_POWER_VEC_SIZE 5 |
1168 | 1056 | ||
1169 | |||
1170 | #if IWL == 3945 | ||
1171 | |||
1172 | #define IWL_POWER_DRIVER_ALLOW_SLEEP_MSK __constant_cpu_to_le32(1<<0) | ||
1173 | #define IWL_POWER_SLEEP_OVER_DTIM_MSK __constant_cpu_to_le32(1<<2) | ||
1174 | #define IWL_POWER_PCI_PM_MSK __constant_cpu_to_le32(1<<3) | ||
1175 | struct iwl_powertable_cmd { | ||
1176 | __le32 flags; | ||
1177 | __le32 rx_data_timeout; | ||
1178 | __le32 tx_data_timeout; | ||
1179 | __le32 sleep_interval[IWL_POWER_VEC_SIZE]; | ||
1180 | } __attribute__((packed)); | ||
1181 | |||
1182 | #elif IWL == 4965 | ||
1183 | |||
1184 | #define IWL_POWER_DRIVER_ALLOW_SLEEP_MSK __constant_cpu_to_le16(1<<0) | 1057 | #define IWL_POWER_DRIVER_ALLOW_SLEEP_MSK __constant_cpu_to_le16(1<<0) |
1185 | #define IWL_POWER_SLEEP_OVER_DTIM_MSK __constant_cpu_to_le16(1<<2) | 1058 | #define IWL_POWER_SLEEP_OVER_DTIM_MSK __constant_cpu_to_le16(1<<2) |
1186 | #define IWL_POWER_PCI_PM_MSK __constant_cpu_to_le16(1<<3) | 1059 | #define IWL_POWER_PCI_PM_MSK __constant_cpu_to_le16(1<<3) |
@@ -1194,7 +1067,6 @@ struct iwl_powertable_cmd { | |||
1194 | __le32 sleep_interval[IWL_POWER_VEC_SIZE]; | 1067 | __le32 sleep_interval[IWL_POWER_VEC_SIZE]; |
1195 | __le32 keep_alive_beacons; | 1068 | __le32 keep_alive_beacons; |
1196 | } __attribute__ ((packed)); | 1069 | } __attribute__ ((packed)); |
1197 | #endif | ||
1198 | 1070 | ||
1199 | /* | 1071 | /* |
1200 | * PM_SLEEP_NOTIFICATION = 0x7A (notification only, not a command) | 1072 | * PM_SLEEP_NOTIFICATION = 0x7A (notification only, not a command) |
@@ -1294,11 +1166,7 @@ struct iwl_scan_cmd { | |||
1294 | * (active scan) */ | 1166 | * (active scan) */ |
1295 | __le16 quiet_plcp_th; /* quiet chnl is < this # pkts (typ. 1) */ | 1167 | __le16 quiet_plcp_th; /* quiet chnl is < this # pkts (typ. 1) */ |
1296 | __le16 good_CRC_th; /* passive -> active promotion threshold */ | 1168 | __le16 good_CRC_th; /* passive -> active promotion threshold */ |
1297 | #if IWL == 3945 | ||
1298 | __le16 reserved1; | ||
1299 | #elif IWL == 4965 | ||
1300 | __le16 rx_chain; | 1169 | __le16 rx_chain; |
1301 | #endif | ||
1302 | __le32 max_out_time; /* max usec to be out of associated (service) | 1170 | __le32 max_out_time; /* max usec to be out of associated (service) |
1303 | * chnl */ | 1171 | * chnl */ |
1304 | __le32 suspend_time; /* pause scan this long when returning to svc | 1172 | __le32 suspend_time; /* pause scan this long when returning to svc |
@@ -1450,16 +1318,13 @@ struct statistics_rx_phy { | |||
1450 | __le32 rxe_frame_limit_overrun; | 1318 | __le32 rxe_frame_limit_overrun; |
1451 | __le32 sent_ack_cnt; | 1319 | __le32 sent_ack_cnt; |
1452 | __le32 sent_cts_cnt; | 1320 | __le32 sent_cts_cnt; |
1453 | #if IWL == 4965 | ||
1454 | __le32 sent_ba_rsp_cnt; | 1321 | __le32 sent_ba_rsp_cnt; |
1455 | __le32 dsp_self_kill; | 1322 | __le32 dsp_self_kill; |
1456 | __le32 mh_format_err; | 1323 | __le32 mh_format_err; |
1457 | __le32 re_acq_main_rssi_sum; | 1324 | __le32 re_acq_main_rssi_sum; |
1458 | __le32 reserved3; | 1325 | __le32 reserved3; |
1459 | #endif | ||
1460 | } __attribute__ ((packed)); | 1326 | } __attribute__ ((packed)); |
1461 | 1327 | ||
1462 | #if IWL == 4965 | ||
1463 | struct statistics_rx_ht_phy { | 1328 | struct statistics_rx_ht_phy { |
1464 | __le32 plcp_err; | 1329 | __le32 plcp_err; |
1465 | __le32 overrun_err; | 1330 | __le32 overrun_err; |
@@ -1472,7 +1337,6 @@ struct statistics_rx_ht_phy { | |||
1472 | __le32 agg_cnt; | 1337 | __le32 agg_cnt; |
1473 | __le32 reserved2; | 1338 | __le32 reserved2; |
1474 | } __attribute__ ((packed)); | 1339 | } __attribute__ ((packed)); |
1475 | #endif | ||
1476 | 1340 | ||
1477 | struct statistics_rx_non_phy { | 1341 | struct statistics_rx_non_phy { |
1478 | __le32 bogus_cts; /* CTS received when not expecting CTS */ | 1342 | __le32 bogus_cts; /* CTS received when not expecting CTS */ |
@@ -1483,7 +1347,6 @@ struct statistics_rx_non_phy { | |||
1483 | * filtering process */ | 1347 | * filtering process */ |
1484 | __le32 non_channel_beacons; /* beacons with our bss id but not on | 1348 | __le32 non_channel_beacons; /* beacons with our bss id but not on |
1485 | * our serving channel */ | 1349 | * our serving channel */ |
1486 | #if IWL == 4965 | ||
1487 | __le32 channel_beacons; /* beacons with our bss id and in our | 1350 | __le32 channel_beacons; /* beacons with our bss id and in our |
1488 | * serving channel */ | 1351 | * serving channel */ |
1489 | __le32 num_missed_bcon; /* number of missed beacons */ | 1352 | __le32 num_missed_bcon; /* number of missed beacons */ |
@@ -1506,19 +1369,15 @@ struct statistics_rx_non_phy { | |||
1506 | __le32 beacon_energy_a; | 1369 | __le32 beacon_energy_a; |
1507 | __le32 beacon_energy_b; | 1370 | __le32 beacon_energy_b; |
1508 | __le32 beacon_energy_c; | 1371 | __le32 beacon_energy_c; |
1509 | #endif | ||
1510 | } __attribute__ ((packed)); | 1372 | } __attribute__ ((packed)); |
1511 | 1373 | ||
1512 | struct statistics_rx { | 1374 | struct statistics_rx { |
1513 | struct statistics_rx_phy ofdm; | 1375 | struct statistics_rx_phy ofdm; |
1514 | struct statistics_rx_phy cck; | 1376 | struct statistics_rx_phy cck; |
1515 | struct statistics_rx_non_phy general; | 1377 | struct statistics_rx_non_phy general; |
1516 | #if IWL == 4965 | ||
1517 | struct statistics_rx_ht_phy ofdm_ht; | 1378 | struct statistics_rx_ht_phy ofdm_ht; |
1518 | #endif | ||
1519 | } __attribute__ ((packed)); | 1379 | } __attribute__ ((packed)); |
1520 | 1380 | ||
1521 | #if IWL == 4965 | ||
1522 | struct statistics_tx_non_phy_agg { | 1381 | struct statistics_tx_non_phy_agg { |
1523 | __le32 ba_timeout; | 1382 | __le32 ba_timeout; |
1524 | __le32 ba_reschedule_frames; | 1383 | __le32 ba_reschedule_frames; |
@@ -1533,7 +1392,6 @@ struct statistics_tx_non_phy_agg { | |||
1533 | __le32 reserved2; | 1392 | __le32 reserved2; |
1534 | __le32 reserved3; | 1393 | __le32 reserved3; |
1535 | } __attribute__ ((packed)); | 1394 | } __attribute__ ((packed)); |
1536 | #endif | ||
1537 | 1395 | ||
1538 | struct statistics_tx { | 1396 | struct statistics_tx { |
1539 | __le32 preamble_cnt; | 1397 | __le32 preamble_cnt; |
@@ -1545,14 +1403,12 @@ struct statistics_tx { | |||
1545 | __le32 ack_timeout; | 1403 | __le32 ack_timeout; |
1546 | __le32 expected_ack_cnt; | 1404 | __le32 expected_ack_cnt; |
1547 | __le32 actual_ack_cnt; | 1405 | __le32 actual_ack_cnt; |
1548 | #if IWL == 4965 | ||
1549 | __le32 dump_msdu_cnt; | 1406 | __le32 dump_msdu_cnt; |
1550 | __le32 burst_abort_next_frame_mismatch_cnt; | 1407 | __le32 burst_abort_next_frame_mismatch_cnt; |
1551 | __le32 burst_abort_missing_next_frame_cnt; | 1408 | __le32 burst_abort_missing_next_frame_cnt; |
1552 | __le32 cts_timeout_collision; | 1409 | __le32 cts_timeout_collision; |
1553 | __le32 ack_or_ba_timeout_collision; | 1410 | __le32 ack_or_ba_timeout_collision; |
1554 | struct statistics_tx_non_phy_agg agg; | 1411 | struct statistics_tx_non_phy_agg agg; |
1555 | #endif | ||
1556 | } __attribute__ ((packed)); | 1412 | } __attribute__ ((packed)); |
1557 | 1413 | ||
1558 | struct statistics_dbg { | 1414 | struct statistics_dbg { |
@@ -1566,29 +1422,23 @@ struct statistics_div { | |||
1566 | __le32 tx_on_b; | 1422 | __le32 tx_on_b; |
1567 | __le32 exec_time; | 1423 | __le32 exec_time; |
1568 | __le32 probe_time; | 1424 | __le32 probe_time; |
1569 | #if IWL == 4965 | ||
1570 | __le32 reserved1; | 1425 | __le32 reserved1; |
1571 | __le32 reserved2; | 1426 | __le32 reserved2; |
1572 | #endif | ||
1573 | } __attribute__ ((packed)); | 1427 | } __attribute__ ((packed)); |
1574 | 1428 | ||
1575 | struct statistics_general { | 1429 | struct statistics_general { |
1576 | __le32 temperature; | 1430 | __le32 temperature; |
1577 | #if IWL == 4965 | ||
1578 | __le32 temperature_m; | 1431 | __le32 temperature_m; |
1579 | #endif | ||
1580 | struct statistics_dbg dbg; | 1432 | struct statistics_dbg dbg; |
1581 | __le32 sleep_time; | 1433 | __le32 sleep_time; |
1582 | __le32 slots_out; | 1434 | __le32 slots_out; |
1583 | __le32 slots_idle; | 1435 | __le32 slots_idle; |
1584 | __le32 ttl_timestamp; | 1436 | __le32 ttl_timestamp; |
1585 | struct statistics_div div; | 1437 | struct statistics_div div; |
1586 | #if IWL == 4965 | ||
1587 | __le32 rx_enable_counter; | 1438 | __le32 rx_enable_counter; |
1588 | __le32 reserved1; | 1439 | __le32 reserved1; |
1589 | __le32 reserved2; | 1440 | __le32 reserved2; |
1590 | __le32 reserved3; | 1441 | __le32 reserved3; |
1591 | #endif | ||
1592 | } __attribute__ ((packed)); | 1442 | } __attribute__ ((packed)); |
1593 | 1443 | ||
1594 | /* | 1444 | /* |
@@ -1720,10 +1570,8 @@ struct iwl_rx_packet { | |||
1720 | struct iwl_sleep_notification sleep_notif; | 1570 | struct iwl_sleep_notification sleep_notif; |
1721 | struct iwl_spectrum_resp spectrum; | 1571 | struct iwl_spectrum_resp spectrum; |
1722 | struct iwl_notif_statistics stats; | 1572 | struct iwl_notif_statistics stats; |
1723 | #if IWL == 4965 | ||
1724 | struct iwl_compressed_ba_resp compressed_ba; | 1573 | struct iwl_compressed_ba_resp compressed_ba; |
1725 | struct iwl_missed_beacon_notif missed_beacon; | 1574 | struct iwl_missed_beacon_notif missed_beacon; |
1726 | #endif | ||
1727 | __le32 status; | 1575 | __le32 status; |
1728 | u8 raw[0]; | 1576 | u8 raw[0]; |
1729 | } u; | 1577 | } u; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-debug.h b/drivers/net/wireless/iwlwifi/iwl-4965-debug.h new file mode 100644 index 000000000000..72318d78957e --- /dev/null +++ b/drivers/net/wireless/iwlwifi/iwl-4965-debug.h | |||
@@ -0,0 +1,152 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Copyright(c) 2003 - 2007 Intel Corporation. All rights reserved. | ||
4 | * | ||
5 | * Portions of this file are derived from the ipw3945 project. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of version 2 of the GNU General Public License as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
14 | * more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along with | ||
17 | * this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA | ||
19 | * | ||
20 | * The full GNU General Public License is included in this distribution in the | ||
21 | * file called LICENSE. | ||
22 | * | ||
23 | * Contact Information: | ||
24 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | ||
25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
26 | * | ||
27 | *****************************************************************************/ | ||
28 | |||
29 | #ifndef __iwl_debug_h__ | ||
30 | #define __iwl_debug_h__ | ||
31 | |||
32 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
33 | extern u32 iwl_debug_level; | ||
34 | #define IWL_DEBUG(level, fmt, args...) \ | ||
35 | do { if (iwl_debug_level & (level)) \ | ||
36 | printk(KERN_ERR DRV_NAME": %c %s " fmt, \ | ||
37 | in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0) | ||
38 | |||
39 | #define IWL_DEBUG_LIMIT(level, fmt, args...) \ | ||
40 | do { if ((iwl_debug_level & (level)) && net_ratelimit()) \ | ||
41 | printk(KERN_ERR DRV_NAME": %c %s " fmt, \ | ||
42 | in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0) | ||
43 | #else | ||
44 | static inline void IWL_DEBUG(int level, const char *fmt, ...) | ||
45 | { | ||
46 | } | ||
47 | static inline void IWL_DEBUG_LIMIT(int level, const char *fmt, ...) | ||
48 | { | ||
49 | } | ||
50 | #endif /* CONFIG_IWLWIFI_DEBUG */ | ||
51 | |||
52 | /* | ||
53 | * To use the debug system; | ||
54 | * | ||
55 | * If you are defining a new debug classification, simply add it to the #define | ||
56 | * list here in the form of: | ||
57 | * | ||
58 | * #define IWL_DL_xxxx VALUE | ||
59 | * | ||
60 | * shifting value to the left one bit from the previous entry. xxxx should be | ||
61 | * the name of the classification (for example, WEP) | ||
62 | * | ||
63 | * You then need to either add a IWL_xxxx_DEBUG() macro definition for your | ||
64 | * classification, or use IWL_DEBUG(IWL_DL_xxxx, ...) whenever you want | ||
65 | * to send output to that classification. | ||
66 | * | ||
67 | * To add your debug level to the list of levels seen when you perform | ||
68 | * | ||
69 | * % cat /proc/net/iwl/debug_level | ||
70 | * | ||
71 | * you simply need to add your entry to the iwl_debug_levels array. | ||
72 | * | ||
73 | * If you do not see debug_level in /proc/net/iwl then you do not have | ||
74 | * CONFIG_IWLWIFI_DEBUG defined in your kernel configuration | ||
75 | * | ||
76 | */ | ||
77 | |||
78 | #define IWL_DL_INFO (1<<0) | ||
79 | #define IWL_DL_MAC80211 (1<<1) | ||
80 | #define IWL_DL_HOST_COMMAND (1<<2) | ||
81 | #define IWL_DL_STATE (1<<3) | ||
82 | |||
83 | #define IWL_DL_RADIO (1<<7) | ||
84 | #define IWL_DL_POWER (1<<8) | ||
85 | #define IWL_DL_TEMP (1<<9) | ||
86 | |||
87 | #define IWL_DL_NOTIF (1<<10) | ||
88 | #define IWL_DL_SCAN (1<<11) | ||
89 | #define IWL_DL_ASSOC (1<<12) | ||
90 | #define IWL_DL_DROP (1<<13) | ||
91 | |||
92 | #define IWL_DL_TXPOWER (1<<14) | ||
93 | |||
94 | #define IWL_DL_AP (1<<15) | ||
95 | |||
96 | #define IWL_DL_FW (1<<16) | ||
97 | #define IWL_DL_RF_KILL (1<<17) | ||
98 | #define IWL_DL_FW_ERRORS (1<<18) | ||
99 | |||
100 | #define IWL_DL_LED (1<<19) | ||
101 | |||
102 | #define IWL_DL_RATE (1<<20) | ||
103 | |||
104 | #define IWL_DL_CALIB (1<<21) | ||
105 | #define IWL_DL_WEP (1<<22) | ||
106 | #define IWL_DL_TX (1<<23) | ||
107 | #define IWL_DL_RX (1<<24) | ||
108 | #define IWL_DL_ISR (1<<25) | ||
109 | #define IWL_DL_HT (1<<26) | ||
110 | #define IWL_DL_IO (1<<27) | ||
111 | #define IWL_DL_11H (1<<28) | ||
112 | |||
113 | #define IWL_DL_STATS (1<<29) | ||
114 | #define IWL_DL_TX_REPLY (1<<30) | ||
115 | #define IWL_DL_QOS (1<<31) | ||
116 | |||
117 | #define IWL_ERROR(f, a...) printk(KERN_ERR DRV_NAME ": " f, ## a) | ||
118 | #define IWL_WARNING(f, a...) printk(KERN_WARNING DRV_NAME ": " f, ## a) | ||
119 | #define IWL_DEBUG_INFO(f, a...) IWL_DEBUG(IWL_DL_INFO, f, ## a) | ||
120 | |||
121 | #define IWL_DEBUG_MAC80211(f, a...) IWL_DEBUG(IWL_DL_MAC80211, f, ## a) | ||
122 | #define IWL_DEBUG_TEMP(f, a...) IWL_DEBUG(IWL_DL_TEMP, f, ## a) | ||
123 | #define IWL_DEBUG_SCAN(f, a...) IWL_DEBUG(IWL_DL_SCAN, f, ## a) | ||
124 | #define IWL_DEBUG_RX(f, a...) IWL_DEBUG(IWL_DL_RX, f, ## a) | ||
125 | #define IWL_DEBUG_TX(f, a...) IWL_DEBUG(IWL_DL_TX, f, ## a) | ||
126 | #define IWL_DEBUG_ISR(f, a...) IWL_DEBUG(IWL_DL_ISR, f, ## a) | ||
127 | #define IWL_DEBUG_LED(f, a...) IWL_DEBUG(IWL_DL_LED, f, ## a) | ||
128 | #define IWL_DEBUG_WEP(f, a...) IWL_DEBUG(IWL_DL_WEP, f, ## a) | ||
129 | #define IWL_DEBUG_HC(f, a...) IWL_DEBUG(IWL_DL_HOST_COMMAND, f, ## a) | ||
130 | #define IWL_DEBUG_CALIB(f, a...) IWL_DEBUG(IWL_DL_CALIB, f, ## a) | ||
131 | #define IWL_DEBUG_FW(f, a...) IWL_DEBUG(IWL_DL_FW, f, ## a) | ||
132 | #define IWL_DEBUG_RF_KILL(f, a...) IWL_DEBUG(IWL_DL_RF_KILL, f, ## a) | ||
133 | #define IWL_DEBUG_DROP(f, a...) IWL_DEBUG(IWL_DL_DROP, f, ## a) | ||
134 | #define IWL_DEBUG_DROP_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_DROP, f, ## a) | ||
135 | #define IWL_DEBUG_AP(f, a...) IWL_DEBUG(IWL_DL_AP, f, ## a) | ||
136 | #define IWL_DEBUG_TXPOWER(f, a...) IWL_DEBUG(IWL_DL_TXPOWER, f, ## a) | ||
137 | #define IWL_DEBUG_IO(f, a...) IWL_DEBUG(IWL_DL_IO, f, ## a) | ||
138 | #define IWL_DEBUG_RATE(f, a...) IWL_DEBUG(IWL_DL_RATE, f, ## a) | ||
139 | #define IWL_DEBUG_RATE_LIMIT(f, a...) IWL_DEBUG_LIMIT(IWL_DL_RATE, f, ## a) | ||
140 | #define IWL_DEBUG_NOTIF(f, a...) IWL_DEBUG(IWL_DL_NOTIF, f, ## a) | ||
141 | #define IWL_DEBUG_ASSOC(f, a...) IWL_DEBUG(IWL_DL_ASSOC | IWL_DL_INFO, f, ## a) | ||
142 | #define IWL_DEBUG_ASSOC_LIMIT(f, a...) \ | ||
143 | IWL_DEBUG_LIMIT(IWL_DL_ASSOC | IWL_DL_INFO, f, ## a) | ||
144 | #define IWL_DEBUG_HT(f, a...) IWL_DEBUG(IWL_DL_HT, f, ## a) | ||
145 | #define IWL_DEBUG_STATS(f, a...) IWL_DEBUG(IWL_DL_STATS, f, ## a) | ||
146 | #define IWL_DEBUG_TX_REPLY(f, a...) IWL_DEBUG(IWL_DL_TX_REPLY, f, ## a) | ||
147 | #define IWL_DEBUG_QOS(f, a...) IWL_DEBUG(IWL_DL_QOS, f, ## a) | ||
148 | #define IWL_DEBUG_RADIO(f, a...) IWL_DEBUG(IWL_DL_RADIO, f, ## a) | ||
149 | #define IWL_DEBUG_POWER(f, a...) IWL_DEBUG(IWL_DL_POWER, f, ## a) | ||
150 | #define IWL_DEBUG_11H(f, a...) IWL_DEBUG(IWL_DL_11H, f, ## a) | ||
151 | |||
152 | #endif | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-hw.h b/drivers/net/wireless/iwlwifi/iwl-4965-hw.h index 5fc707b1ea7d..21c75774cf4e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-4965-hw.h | |||
@@ -64,6 +64,683 @@ | |||
64 | #ifndef __iwl_4965_hw_h__ | 64 | #ifndef __iwl_4965_hw_h__ |
65 | #define __iwl_4965_hw_h__ | 65 | #define __iwl_4965_hw_h__ |
66 | 66 | ||
67 | /* uCode queue management definitions */ | ||
68 | #define IWL_CMD_QUEUE_NUM 4 | ||
69 | #define IWL_CMD_FIFO_NUM 4 | ||
70 | #define IWL_BACK_QUEUE_FIRST_ID 7 | ||
71 | |||
72 | /* Tx rates */ | ||
73 | #define IWL_CCK_RATES 4 | ||
74 | #define IWL_OFDM_RATES 8 | ||
75 | |||
76 | #define IWL_HT_RATES 16 | ||
77 | |||
78 | #define IWL_MAX_RATES (IWL_CCK_RATES+IWL_OFDM_RATES+IWL_HT_RATES) | ||
79 | |||
80 | /* Time constants */ | ||
81 | #define SHORT_SLOT_TIME 9 | ||
82 | #define LONG_SLOT_TIME 20 | ||
83 | |||
84 | /* RSSI to dBm */ | ||
85 | #define IWL_RSSI_OFFSET 44 | ||
86 | |||
87 | /* | ||
88 | * This file defines EEPROM related constants, enums, and inline functions. | ||
89 | * | ||
90 | */ | ||
91 | |||
92 | #define IWL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */ | ||
93 | #define IWL_EEPROM_ACCESS_DELAY 10 /* uSec */ | ||
94 | /* EEPROM field values */ | ||
95 | #define ANTENNA_SWITCH_NORMAL 0 | ||
96 | #define ANTENNA_SWITCH_INVERSE 1 | ||
97 | |||
98 | enum { | ||
99 | EEPROM_CHANNEL_VALID = (1 << 0), /* usable for this SKU/geo */ | ||
100 | EEPROM_CHANNEL_IBSS = (1 << 1), /* usable as an IBSS channel */ | ||
101 | /* Bit 2 Reserved */ | ||
102 | EEPROM_CHANNEL_ACTIVE = (1 << 3), /* active scanning allowed */ | ||
103 | EEPROM_CHANNEL_RADAR = (1 << 4), /* radar detection required */ | ||
104 | EEPROM_CHANNEL_WIDE = (1 << 5), | ||
105 | EEPROM_CHANNEL_NARROW = (1 << 6), | ||
106 | EEPROM_CHANNEL_DFS = (1 << 7), /* dynamic freq selection candidate */ | ||
107 | }; | ||
108 | |||
109 | /* EEPROM field lengths */ | ||
110 | #define EEPROM_BOARD_PBA_NUMBER_LENGTH 11 | ||
111 | |||
112 | /* EEPROM field lengths */ | ||
113 | #define EEPROM_BOARD_PBA_NUMBER_LENGTH 11 | ||
114 | #define EEPROM_REGULATORY_SKU_ID_LENGTH 4 | ||
115 | #define EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH 14 | ||
116 | #define EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH 13 | ||
117 | #define EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH 12 | ||
118 | #define EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH 11 | ||
119 | #define EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH 6 | ||
120 | |||
121 | #define EEPROM_REGULATORY_BAND_24_FAT_CHANNELS_LENGTH 7 | ||
122 | #define EEPROM_REGULATORY_BAND_52_FAT_CHANNELS_LENGTH 11 | ||
123 | #define EEPROM_REGULATORY_CHANNELS_LENGTH ( \ | ||
124 | EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH + \ | ||
125 | EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH + \ | ||
126 | EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH + \ | ||
127 | EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH + \ | ||
128 | EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH + \ | ||
129 | EEPROM_REGULATORY_BAND_24_FAT_CHANNELS_LENGTH + \ | ||
130 | EEPROM_REGULATORY_BAND_52_FAT_CHANNELS_LENGTH) | ||
131 | |||
132 | #define EEPROM_REGULATORY_NUMBER_OF_BANDS 5 | ||
133 | |||
134 | /* SKU Capabilities */ | ||
135 | #define EEPROM_SKU_CAP_SW_RF_KILL_ENABLE (1 << 0) | ||
136 | #define EEPROM_SKU_CAP_HW_RF_KILL_ENABLE (1 << 1) | ||
137 | #define EEPROM_SKU_CAP_OP_MODE_MRC (1 << 7) | ||
138 | |||
139 | /* *regulatory* channel data from eeprom, one for each channel */ | ||
140 | struct iwl_eeprom_channel { | ||
141 | u8 flags; /* flags copied from EEPROM */ | ||
142 | s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ | ||
143 | } __attribute__ ((packed)); | ||
144 | |||
145 | /* | ||
146 | * Mapping of a Tx power level, at factory calibration temperature, | ||
147 | * to a radio/DSP gain table index. | ||
148 | * One for each of 5 "sample" power levels in each band. | ||
149 | * v_det is measured at the factory, using the 3945's built-in power amplifier | ||
150 | * (PA) output voltage detector. This same detector is used during Tx of | ||
151 | * long packets in normal operation to provide feedback as to proper output | ||
152 | * level. | ||
153 | * Data copied from EEPROM. | ||
154 | */ | ||
155 | struct iwl_eeprom_txpower_sample { | ||
156 | u8 gain_index; /* index into power (gain) setup table ... */ | ||
157 | s8 power; /* ... for this pwr level for this chnl group */ | ||
158 | u16 v_det; /* PA output voltage */ | ||
159 | } __attribute__ ((packed)); | ||
160 | |||
161 | /* | ||
162 | * Mappings of Tx power levels -> nominal radio/DSP gain table indexes. | ||
163 | * One for each channel group (a.k.a. "band") (1 for BG, 4 for A). | ||
164 | * Tx power setup code interpolates between the 5 "sample" power levels | ||
165 | * to determine the nominal setup for a requested power level. | ||
166 | * Data copied from EEPROM. | ||
167 | * DO NOT ALTER THIS STRUCTURE!!! | ||
168 | */ | ||
169 | struct iwl_eeprom_txpower_group { | ||
170 | struct iwl_eeprom_txpower_sample samples[5]; /* 5 power levels */ | ||
171 | s32 a, b, c, d, e; /* coefficients for voltage->power | ||
172 | * formula (signed) */ | ||
173 | s32 Fa, Fb, Fc, Fd, Fe; /* these modify coeffs based on | ||
174 | * frequency (signed) */ | ||
175 | s8 saturation_power; /* highest power possible by h/w in this | ||
176 | * band */ | ||
177 | u8 group_channel; /* "representative" channel # in this band */ | ||
178 | s16 temperature; /* h/w temperature at factory calib this band | ||
179 | * (signed) */ | ||
180 | } __attribute__ ((packed)); | ||
181 | |||
182 | /* | ||
183 | * Temperature-based Tx-power compensation data, not band-specific. | ||
184 | * These coefficients are use to modify a/b/c/d/e coeffs based on | ||
185 | * difference between current temperature and factory calib temperature. | ||
186 | * Data copied from EEPROM. | ||
187 | */ | ||
188 | struct iwl_eeprom_temperature_corr { | ||
189 | u32 Ta; | ||
190 | u32 Tb; | ||
191 | u32 Tc; | ||
192 | u32 Td; | ||
193 | u32 Te; | ||
194 | } __attribute__ ((packed)); | ||
195 | |||
196 | #define EEPROM_TX_POWER_TX_CHAINS (2) | ||
197 | #define EEPROM_TX_POWER_BANDS (8) | ||
198 | #define EEPROM_TX_POWER_MEASUREMENTS (3) | ||
199 | #define EEPROM_TX_POWER_VERSION (2) | ||
200 | #define EEPROM_TX_POWER_VERSION_NEW (5) | ||
201 | |||
202 | struct iwl_eeprom_calib_measure { | ||
203 | u8 temperature; | ||
204 | u8 gain_idx; | ||
205 | u8 actual_pow; | ||
206 | s8 pa_det; | ||
207 | } __attribute__ ((packed)); | ||
208 | |||
209 | struct iwl_eeprom_calib_ch_info { | ||
210 | u8 ch_num; | ||
211 | struct iwl_eeprom_calib_measure measurements[EEPROM_TX_POWER_TX_CHAINS] | ||
212 | [EEPROM_TX_POWER_MEASUREMENTS]; | ||
213 | } __attribute__ ((packed)); | ||
214 | |||
215 | struct iwl_eeprom_calib_subband_info { | ||
216 | u8 ch_from; | ||
217 | u8 ch_to; | ||
218 | struct iwl_eeprom_calib_ch_info ch1; | ||
219 | struct iwl_eeprom_calib_ch_info ch2; | ||
220 | } __attribute__ ((packed)); | ||
221 | |||
222 | struct iwl_eeprom_calib_info { | ||
223 | u8 saturation_power24; | ||
224 | u8 saturation_power52; | ||
225 | s16 voltage; /* signed */ | ||
226 | struct iwl_eeprom_calib_subband_info band_info[EEPROM_TX_POWER_BANDS]; | ||
227 | } __attribute__ ((packed)); | ||
228 | |||
229 | |||
230 | struct iwl_eeprom { | ||
231 | u8 reserved0[16]; | ||
232 | #define EEPROM_DEVICE_ID (2*0x08) /* 2 bytes */ | ||
233 | u16 device_id; /* abs.ofs: 16 */ | ||
234 | u8 reserved1[2]; | ||
235 | #define EEPROM_PMC (2*0x0A) /* 2 bytes */ | ||
236 | u16 pmc; /* abs.ofs: 20 */ | ||
237 | u8 reserved2[20]; | ||
238 | #define EEPROM_MAC_ADDRESS (2*0x15) /* 6 bytes */ | ||
239 | u8 mac_address[6]; /* abs.ofs: 42 */ | ||
240 | u8 reserved3[58]; | ||
241 | #define EEPROM_BOARD_REVISION (2*0x35) /* 2 bytes */ | ||
242 | u16 board_revision; /* abs.ofs: 106 */ | ||
243 | u8 reserved4[11]; | ||
244 | #define EEPROM_BOARD_PBA_NUMBER (2*0x3B+1) /* 9 bytes */ | ||
245 | u8 board_pba_number[9]; /* abs.ofs: 119 */ | ||
246 | u8 reserved5[8]; | ||
247 | #define EEPROM_VERSION (2*0x44) /* 2 bytes */ | ||
248 | u16 version; /* abs.ofs: 136 */ | ||
249 | #define EEPROM_SKU_CAP (2*0x45) /* 1 bytes */ | ||
250 | u8 sku_cap; /* abs.ofs: 138 */ | ||
251 | #define EEPROM_LEDS_MODE (2*0x45+1) /* 1 bytes */ | ||
252 | u8 leds_mode; /* abs.ofs: 139 */ | ||
253 | #define EEPROM_OEM_MODE (2*0x46) /* 2 bytes */ | ||
254 | u16 oem_mode; | ||
255 | #define EEPROM_WOWLAN_MODE (2*0x47) /* 2 bytes */ | ||
256 | u16 wowlan_mode; /* abs.ofs: 142 */ | ||
257 | #define EEPROM_LEDS_TIME_INTERVAL (2*0x48) /* 2 bytes */ | ||
258 | u16 leds_time_interval; /* abs.ofs: 144 */ | ||
259 | #define EEPROM_LEDS_OFF_TIME (2*0x49) /* 1 bytes */ | ||
260 | u8 leds_off_time; /* abs.ofs: 146 */ | ||
261 | #define EEPROM_LEDS_ON_TIME (2*0x49+1) /* 1 bytes */ | ||
262 | u8 leds_on_time; /* abs.ofs: 147 */ | ||
263 | #define EEPROM_ALMGOR_M_VERSION (2*0x4A) /* 1 bytes */ | ||
264 | u8 almgor_m_version; /* abs.ofs: 148 */ | ||
265 | #define EEPROM_ANTENNA_SWITCH_TYPE (2*0x4A+1) /* 1 bytes */ | ||
266 | u8 antenna_switch_type; /* abs.ofs: 149 */ | ||
267 | u8 reserved6[8]; | ||
268 | #define EEPROM_4965_BOARD_REVISION (2*0x4F) /* 2 bytes */ | ||
269 | u16 board_revision_4965; /* abs.ofs: 158 */ | ||
270 | u8 reserved7[13]; | ||
271 | #define EEPROM_4965_BOARD_PBA (2*0x56+1) /* 9 bytes */ | ||
272 | u8 board_pba_number_4965[9]; /* abs.ofs: 173 */ | ||
273 | u8 reserved8[10]; | ||
274 | #define EEPROM_REGULATORY_SKU_ID (2*0x60) /* 4 bytes */ | ||
275 | u8 sku_id[4]; /* abs.ofs: 192 */ | ||
276 | #define EEPROM_REGULATORY_BAND_1 (2*0x62) /* 2 bytes */ | ||
277 | u16 band_1_count; /* abs.ofs: 196 */ | ||
278 | #define EEPROM_REGULATORY_BAND_1_CHANNELS (2*0x63) /* 28 bytes */ | ||
279 | struct iwl_eeprom_channel band_1_channels[14]; /* abs.ofs: 196 */ | ||
280 | #define EEPROM_REGULATORY_BAND_2 (2*0x71) /* 2 bytes */ | ||
281 | u16 band_2_count; /* abs.ofs: 226 */ | ||
282 | #define EEPROM_REGULATORY_BAND_2_CHANNELS (2*0x72) /* 26 bytes */ | ||
283 | struct iwl_eeprom_channel band_2_channels[13]; /* abs.ofs: 228 */ | ||
284 | #define EEPROM_REGULATORY_BAND_3 (2*0x7F) /* 2 bytes */ | ||
285 | u16 band_3_count; /* abs.ofs: 254 */ | ||
286 | #define EEPROM_REGULATORY_BAND_3_CHANNELS (2*0x80) /* 24 bytes */ | ||
287 | struct iwl_eeprom_channel band_3_channels[12]; /* abs.ofs: 256 */ | ||
288 | #define EEPROM_REGULATORY_BAND_4 (2*0x8C) /* 2 bytes */ | ||
289 | u16 band_4_count; /* abs.ofs: 280 */ | ||
290 | #define EEPROM_REGULATORY_BAND_4_CHANNELS (2*0x8D) /* 22 bytes */ | ||
291 | struct iwl_eeprom_channel band_4_channels[11]; /* abs.ofs: 282 */ | ||
292 | #define EEPROM_REGULATORY_BAND_5 (2*0x98) /* 2 bytes */ | ||
293 | u16 band_5_count; /* abs.ofs: 304 */ | ||
294 | #define EEPROM_REGULATORY_BAND_5_CHANNELS (2*0x99) /* 12 bytes */ | ||
295 | struct iwl_eeprom_channel band_5_channels[6]; /* abs.ofs: 306 */ | ||
296 | |||
297 | u8 reserved10[2]; | ||
298 | #define EEPROM_REGULATORY_BAND_24_FAT_CHANNELS (2*0xA0) /* 14 bytes */ | ||
299 | struct iwl_eeprom_channel band_24_channels[7]; /* abs.ofs: 320 */ | ||
300 | u8 reserved11[2]; | ||
301 | #define EEPROM_REGULATORY_BAND_52_FAT_CHANNELS (2*0xA8) /* 22 bytes */ | ||
302 | struct iwl_eeprom_channel band_52_channels[11]; /* abs.ofs: 336 */ | ||
303 | u8 reserved12[6]; | ||
304 | #define EEPROM_CALIB_VERSION_OFFSET (2*0xB6) /* 2 bytes */ | ||
305 | u16 calib_version; /* abs.ofs: 364 */ | ||
306 | u8 reserved13[2]; | ||
307 | #define EEPROM_SATURATION_POWER_OFFSET (2*0xB8) /* 2 bytes */ | ||
308 | u16 satruation_power; /* abs.ofs: 368 */ | ||
309 | u8 reserved14[94]; | ||
310 | #define EEPROM_IWL_CALIB_TXPOWER_OFFSET (2*0xE8) /* 48 bytes */ | ||
311 | struct iwl_eeprom_calib_info calib_info; /* abs.ofs: 464 */ | ||
312 | |||
313 | u8 reserved16[140]; /* fill out to full 1024 byte block */ | ||
314 | |||
315 | |||
316 | } __attribute__ ((packed)); | ||
317 | |||
318 | #define IWL_EEPROM_IMAGE_SIZE 1024 | ||
319 | |||
320 | |||
321 | #include "iwl-4965-commands.h" | ||
322 | |||
323 | #define PCI_LINK_CTRL 0x0F0 | ||
324 | #define PCI_POWER_SOURCE 0x0C8 | ||
325 | #define PCI_REG_WUM8 0x0E8 | ||
326 | #define PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT (0x80000000) | ||
327 | |||
328 | /*=== CSR (control and status registers) ===*/ | ||
329 | #define CSR_BASE (0x000) | ||
330 | |||
331 | #define CSR_SW_VER (CSR_BASE+0x000) | ||
332 | #define CSR_HW_IF_CONFIG_REG (CSR_BASE+0x000) /* hardware interface config */ | ||
333 | #define CSR_INT_COALESCING (CSR_BASE+0x004) /* accum ints, 32-usec units */ | ||
334 | #define CSR_INT (CSR_BASE+0x008) /* host interrupt status/ack */ | ||
335 | #define CSR_INT_MASK (CSR_BASE+0x00c) /* host interrupt enable */ | ||
336 | #define CSR_FH_INT_STATUS (CSR_BASE+0x010) /* busmaster int status/ack*/ | ||
337 | #define CSR_GPIO_IN (CSR_BASE+0x018) /* read external chip pins */ | ||
338 | #define CSR_RESET (CSR_BASE+0x020) /* busmaster enable, NMI, etc*/ | ||
339 | #define CSR_GP_CNTRL (CSR_BASE+0x024) | ||
340 | #define CSR_HW_REV (CSR_BASE+0x028) | ||
341 | #define CSR_EEPROM_REG (CSR_BASE+0x02c) | ||
342 | #define CSR_EEPROM_GP (CSR_BASE+0x030) | ||
343 | #define CSR_GP_UCODE (CSR_BASE+0x044) | ||
344 | #define CSR_UCODE_DRV_GP1 (CSR_BASE+0x054) | ||
345 | #define CSR_UCODE_DRV_GP1_SET (CSR_BASE+0x058) | ||
346 | #define CSR_UCODE_DRV_GP1_CLR (CSR_BASE+0x05c) | ||
347 | #define CSR_UCODE_DRV_GP2 (CSR_BASE+0x060) | ||
348 | #define CSR_LED_REG (CSR_BASE+0x094) | ||
349 | #define CSR_DRAM_INT_TBL_CTL (CSR_BASE+0x0A0) | ||
350 | #define CSR_GIO_CHICKEN_BITS (CSR_BASE+0x100) | ||
351 | #define CSR_ANA_PLL_CFG (CSR_BASE+0x20c) | ||
352 | #define CSR_HW_REV_WA_REG (CSR_BASE+0x22C) | ||
353 | |||
354 | /* HW I/F configuration */ | ||
355 | #define CSR_HW_IF_CONFIG_REG_BIT_ALMAGOR_MB (0x00000100) | ||
356 | #define CSR_HW_IF_CONFIG_REG_BIT_ALMAGOR_MM (0x00000200) | ||
357 | #define CSR_HW_IF_CONFIG_REG_BIT_SKU_MRC (0x00000400) | ||
358 | #define CSR_HW_IF_CONFIG_REG_BIT_BOARD_TYPE (0x00000800) | ||
359 | #define CSR_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_A (0x00000000) | ||
360 | #define CSR_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_B (0x00001000) | ||
361 | #define CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM (0x00200000) | ||
362 | |||
363 | /* interrupt flags in INTA, set by uCode or hardware (e.g. dma), | ||
364 | * acknowledged (reset) by host writing "1" to flagged bits. */ | ||
365 | #define CSR_INT_BIT_FH_RX (1<<31) /* Rx DMA, cmd responses, FH_INT[17:16] */ | ||
366 | #define CSR_INT_BIT_HW_ERR (1<<29) /* DMA hardware error FH_INT[31] */ | ||
367 | #define CSR_INT_BIT_DNLD (1<<28) /* uCode Download */ | ||
368 | #define CSR_INT_BIT_FH_TX (1<<27) /* Tx DMA FH_INT[1:0] */ | ||
369 | #define CSR_INT_BIT_MAC_CLK_ACTV (1<<26) /* NIC controller's clock toggled on/off */ | ||
370 | #define CSR_INT_BIT_SW_ERR (1<<25) /* uCode error */ | ||
371 | #define CSR_INT_BIT_RF_KILL (1<<7) /* HW RFKILL switch GP_CNTRL[27] toggled */ | ||
372 | #define CSR_INT_BIT_CT_KILL (1<<6) /* Critical temp (chip too hot) rfkill */ | ||
373 | #define CSR_INT_BIT_SW_RX (1<<3) /* Rx, command responses, 3945 */ | ||
374 | #define CSR_INT_BIT_WAKEUP (1<<1) /* NIC controller waking up (pwr mgmt) */ | ||
375 | #define CSR_INT_BIT_ALIVE (1<<0) /* uCode interrupts once it initializes */ | ||
376 | |||
377 | #define CSR_INI_SET_MASK (CSR_INT_BIT_FH_RX | \ | ||
378 | CSR_INT_BIT_HW_ERR | \ | ||
379 | CSR_INT_BIT_FH_TX | \ | ||
380 | CSR_INT_BIT_SW_ERR | \ | ||
381 | CSR_INT_BIT_RF_KILL | \ | ||
382 | CSR_INT_BIT_SW_RX | \ | ||
383 | CSR_INT_BIT_WAKEUP | \ | ||
384 | CSR_INT_BIT_ALIVE) | ||
385 | |||
386 | /* interrupt flags in FH (flow handler) (PCI busmaster DMA) */ | ||
387 | #define CSR_FH_INT_BIT_ERR (1<<31) /* Error */ | ||
388 | #define CSR_FH_INT_BIT_HI_PRIOR (1<<30) /* High priority Rx, bypass coalescing */ | ||
389 | #define CSR_FH_INT_BIT_RX_CHNL2 (1<<18) /* Rx channel 2 (3945 only) */ | ||
390 | #define CSR_FH_INT_BIT_RX_CHNL1 (1<<17) /* Rx channel 1 */ | ||
391 | #define CSR_FH_INT_BIT_RX_CHNL0 (1<<16) /* Rx channel 0 */ | ||
392 | #define CSR_FH_INT_BIT_TX_CHNL6 (1<<6) /* Tx channel 6 (3945 only) */ | ||
393 | #define CSR_FH_INT_BIT_TX_CHNL1 (1<<1) /* Tx channel 1 */ | ||
394 | #define CSR_FH_INT_BIT_TX_CHNL0 (1<<0) /* Tx channel 0 */ | ||
395 | |||
396 | #define CSR_FH_INT_RX_MASK (CSR_FH_INT_BIT_HI_PRIOR | \ | ||
397 | CSR_FH_INT_BIT_RX_CHNL2 | \ | ||
398 | CSR_FH_INT_BIT_RX_CHNL1 | \ | ||
399 | CSR_FH_INT_BIT_RX_CHNL0) | ||
400 | |||
401 | #define CSR_FH_INT_TX_MASK (CSR_FH_INT_BIT_TX_CHNL6 | \ | ||
402 | CSR_FH_INT_BIT_TX_CHNL1 | \ | ||
403 | CSR_FH_INT_BIT_TX_CHNL0 ) | ||
404 | |||
405 | |||
406 | /* RESET */ | ||
407 | #define CSR_RESET_REG_FLAG_NEVO_RESET (0x00000001) | ||
408 | #define CSR_RESET_REG_FLAG_FORCE_NMI (0x00000002) | ||
409 | #define CSR_RESET_REG_FLAG_SW_RESET (0x00000080) | ||
410 | #define CSR_RESET_REG_FLAG_MASTER_DISABLED (0x00000100) | ||
411 | #define CSR_RESET_REG_FLAG_STOP_MASTER (0x00000200) | ||
412 | |||
413 | /* GP (general purpose) CONTROL */ | ||
414 | #define CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY (0x00000001) | ||
415 | #define CSR_GP_CNTRL_REG_FLAG_INIT_DONE (0x00000004) | ||
416 | #define CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ (0x00000008) | ||
417 | #define CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP (0x00000010) | ||
418 | |||
419 | #define CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN (0x00000001) | ||
420 | |||
421 | #define CSR_GP_CNTRL_REG_MSK_POWER_SAVE_TYPE (0x07000000) | ||
422 | #define CSR_GP_CNTRL_REG_FLAG_MAC_POWER_SAVE (0x04000000) | ||
423 | #define CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW (0x08000000) | ||
424 | |||
425 | |||
426 | /* EEPROM REG */ | ||
427 | #define CSR_EEPROM_REG_READ_VALID_MSK (0x00000001) | ||
428 | #define CSR_EEPROM_REG_BIT_CMD (0x00000002) | ||
429 | |||
430 | /* EEPROM GP */ | ||
431 | #define CSR_EEPROM_GP_VALID_MSK (0x00000006) | ||
432 | #define CSR_EEPROM_GP_BAD_SIGNATURE (0x00000000) | ||
433 | #define CSR_EEPROM_GP_IF_OWNER_MSK (0x00000180) | ||
434 | |||
435 | /* UCODE DRV GP */ | ||
436 | #define CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP (0x00000001) | ||
437 | #define CSR_UCODE_SW_BIT_RFKILL (0x00000002) | ||
438 | #define CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED (0x00000004) | ||
439 | #define CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT (0x00000008) | ||
440 | |||
441 | /* GPIO */ | ||
442 | #define CSR_GPIO_IN_BIT_AUX_POWER (0x00000200) | ||
443 | #define CSR_GPIO_IN_VAL_VAUX_PWR_SRC (0x00000000) | ||
444 | #define CSR_GPIO_IN_VAL_VMAIN_PWR_SRC CSR_GPIO_IN_BIT_AUX_POWER | ||
445 | |||
446 | /* GI Chicken Bits */ | ||
447 | #define CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX (0x00800000) | ||
448 | #define CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER (0x20000000) | ||
449 | |||
450 | /* CSR_ANA_PLL_CFG */ | ||
451 | #define CSR_ANA_PLL_CFG_SH (0x00880300) | ||
452 | |||
453 | #define CSR_LED_REG_TRUN_ON (0x00000078) | ||
454 | #define CSR_LED_REG_TRUN_OFF (0x00000038) | ||
455 | #define CSR_LED_BSM_CTRL_MSK (0xFFFFFFDF) | ||
456 | |||
457 | /* DRAM_INT_TBL_CTRL */ | ||
458 | #define CSR_DRAM_INT_TBL_CTRL_EN (1<<31) | ||
459 | #define CSR_DRAM_INT_TBL_CTRL_WRAP_CHK (1<<27) | ||
460 | |||
461 | /*=== HBUS (Host-side Bus) ===*/ | ||
462 | #define HBUS_BASE (0x400) | ||
463 | |||
464 | #define HBUS_TARG_MEM_RADDR (HBUS_BASE+0x00c) | ||
465 | #define HBUS_TARG_MEM_WADDR (HBUS_BASE+0x010) | ||
466 | #define HBUS_TARG_MEM_WDAT (HBUS_BASE+0x018) | ||
467 | #define HBUS_TARG_MEM_RDAT (HBUS_BASE+0x01c) | ||
468 | #define HBUS_TARG_PRPH_WADDR (HBUS_BASE+0x044) | ||
469 | #define HBUS_TARG_PRPH_RADDR (HBUS_BASE+0x048) | ||
470 | #define HBUS_TARG_PRPH_WDAT (HBUS_BASE+0x04c) | ||
471 | #define HBUS_TARG_PRPH_RDAT (HBUS_BASE+0x050) | ||
472 | #define HBUS_TARG_WRPTR (HBUS_BASE+0x060) | ||
473 | |||
474 | #define HBUS_TARG_MBX_C (HBUS_BASE+0x030) | ||
475 | |||
476 | |||
477 | /* SCD (Scheduler) */ | ||
478 | #define SCD_BASE (CSR_BASE + 0x2E00) | ||
479 | |||
480 | #define SCD_MODE_REG (SCD_BASE + 0x000) | ||
481 | #define SCD_ARASTAT_REG (SCD_BASE + 0x004) | ||
482 | #define SCD_TXFACT_REG (SCD_BASE + 0x010) | ||
483 | #define SCD_TXF4MF_REG (SCD_BASE + 0x014) | ||
484 | #define SCD_TXF5MF_REG (SCD_BASE + 0x020) | ||
485 | #define SCD_SBYP_MODE_1_REG (SCD_BASE + 0x02C) | ||
486 | #define SCD_SBYP_MODE_2_REG (SCD_BASE + 0x030) | ||
487 | |||
488 | /*=== FH (data Flow Handler) ===*/ | ||
489 | #define FH_BASE (0x800) | ||
490 | |||
491 | #define FH_CBCC_TABLE (FH_BASE+0x140) | ||
492 | #define FH_TFDB_TABLE (FH_BASE+0x180) | ||
493 | #define FH_RCSR_TABLE (FH_BASE+0x400) | ||
494 | #define FH_RSSR_TABLE (FH_BASE+0x4c0) | ||
495 | #define FH_TCSR_TABLE (FH_BASE+0x500) | ||
496 | #define FH_TSSR_TABLE (FH_BASE+0x680) | ||
497 | |||
498 | /* TFDB (Transmit Frame Buffer Descriptor) */ | ||
499 | #define FH_TFDB(_channel, buf) \ | ||
500 | (FH_TFDB_TABLE+((_channel)*2+(buf))*0x28) | ||
501 | #define ALM_FH_TFDB_CHNL_BUF_CTRL_REG(_channel) \ | ||
502 | (FH_TFDB_TABLE + 0x50 * _channel) | ||
503 | /* CBCC _channel is [0,2] */ | ||
504 | #define FH_CBCC(_channel) (FH_CBCC_TABLE+(_channel)*0x8) | ||
505 | #define FH_CBCC_CTRL(_channel) (FH_CBCC(_channel)+0x00) | ||
506 | #define FH_CBCC_BASE(_channel) (FH_CBCC(_channel)+0x04) | ||
507 | |||
508 | /* RCSR _channel is [0,2] */ | ||
509 | #define FH_RCSR(_channel) (FH_RCSR_TABLE+(_channel)*0x40) | ||
510 | #define FH_RCSR_CONFIG(_channel) (FH_RCSR(_channel)+0x00) | ||
511 | #define FH_RCSR_RBD_BASE(_channel) (FH_RCSR(_channel)+0x04) | ||
512 | #define FH_RCSR_WPTR(_channel) (FH_RCSR(_channel)+0x20) | ||
513 | #define FH_RCSR_RPTR_ADDR(_channel) (FH_RCSR(_channel)+0x24) | ||
514 | |||
515 | #define FH_RSCSR_CHNL0_WPTR (FH_RSCSR_CHNL0_RBDCB_WPTR_REG) | ||
516 | |||
517 | /* RSSR */ | ||
518 | #define FH_RSSR_CTRL (FH_RSSR_TABLE+0x000) | ||
519 | #define FH_RSSR_STATUS (FH_RSSR_TABLE+0x004) | ||
520 | /* TCSR */ | ||
521 | #define FH_TCSR(_channel) (FH_TCSR_TABLE+(_channel)*0x20) | ||
522 | #define FH_TCSR_CONFIG(_channel) (FH_TCSR(_channel)+0x00) | ||
523 | #define FH_TCSR_CREDIT(_channel) (FH_TCSR(_channel)+0x04) | ||
524 | #define FH_TCSR_BUFF_STTS(_channel) (FH_TCSR(_channel)+0x08) | ||
525 | /* TSSR */ | ||
526 | #define FH_TSSR_CBB_BASE (FH_TSSR_TABLE+0x000) | ||
527 | #define FH_TSSR_MSG_CONFIG (FH_TSSR_TABLE+0x008) | ||
528 | #define FH_TSSR_TX_STATUS (FH_TSSR_TABLE+0x010) | ||
529 | /* 18 - reserved */ | ||
530 | |||
531 | /* card static random access memory (SRAM) for processor data and instructs */ | ||
532 | #define RTC_INST_LOWER_BOUND (0x000000) | ||
533 | #define RTC_DATA_LOWER_BOUND (0x800000) | ||
534 | |||
535 | |||
536 | /* DBM */ | ||
537 | |||
538 | #define ALM_FH_SRVC_CHNL (6) | ||
539 | |||
540 | #define ALM_FH_RCSR_RX_CONFIG_REG_POS_RBDC_SIZE (20) | ||
541 | #define ALM_FH_RCSR_RX_CONFIG_REG_POS_IRQ_RBTH (4) | ||
542 | |||
543 | #define ALM_FH_RCSR_RX_CONFIG_REG_BIT_WR_STTS_EN (0x08000000) | ||
544 | |||
545 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_DMA_CHNL_EN_ENABLE (0x80000000) | ||
546 | |||
547 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_RDRBD_EN_ENABLE (0x20000000) | ||
548 | |||
549 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_MAX_FRAG_SIZE_128 (0x01000000) | ||
550 | |||
551 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_IRQ_DEST_INT_HOST (0x00001000) | ||
552 | |||
553 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_MSG_MODE_FH (0x00000000) | ||
554 | |||
555 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_TXF (0x00000000) | ||
556 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_DRIVER (0x00000001) | ||
557 | |||
558 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE_VAL (0x00000000) | ||
559 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE_VAL (0x00000008) | ||
560 | |||
561 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_IFTFD (0x00200000) | ||
562 | |||
563 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_RTC_NOINT (0x00000000) | ||
564 | |||
565 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE (0x00000000) | ||
566 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE (0x80000000) | ||
567 | |||
568 | #define ALM_FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID (0x00004000) | ||
569 | |||
570 | #define ALM_FH_TCSR_CHNL_TX_BUF_STS_REG_BIT_TFDB_WPTR (0x00000001) | ||
571 | |||
572 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TXPD_ON (0xFF000000) | ||
573 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_TXPD_ON (0x00FF0000) | ||
574 | |||
575 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_MAX_FRAG_SIZE_128B (0x00000400) | ||
576 | |||
577 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TFD_ON (0x00000100) | ||
578 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_CBB_ON (0x00000080) | ||
579 | |||
580 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RSP_WAIT_TH (0x00000020) | ||
581 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_RSP_WAIT_TH (0x00000005) | ||
582 | |||
583 | #define ALM_TB_MAX_BYTES_COUNT (0xFFF0) | ||
584 | |||
585 | #define ALM_FH_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_channel) \ | ||
586 | ((1LU << _channel) << 24) | ||
587 | #define ALM_FH_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_channel) \ | ||
588 | ((1LU << _channel) << 16) | ||
589 | |||
590 | #define ALM_FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(_channel) \ | ||
591 | (ALM_FH_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_channel) | \ | ||
592 | ALM_FH_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_channel)) | ||
593 | #define PCI_CFG_REV_ID_BIT_BASIC_SKU (0x40) /* bit 6 */ | ||
594 | #define PCI_CFG_REV_ID_BIT_RTP (0x80) /* bit 7 */ | ||
595 | |||
596 | #define HBUS_TARG_MBX_C_REG_BIT_CMD_BLOCKED (0x00000004) | ||
597 | |||
598 | #define TFD_QUEUE_MIN 0 | ||
599 | #define TFD_QUEUE_MAX 6 | ||
600 | #define TFD_QUEUE_SIZE_MAX (256) | ||
601 | |||
602 | /* spectrum and channel data structures */ | ||
603 | #define IWL_NUM_SCAN_RATES (2) | ||
604 | |||
605 | #define IWL_SCAN_FLAG_24GHZ (1<<0) | ||
606 | #define IWL_SCAN_FLAG_52GHZ (1<<1) | ||
607 | #define IWL_SCAN_FLAG_ACTIVE (1<<2) | ||
608 | #define IWL_SCAN_FLAG_DIRECT (1<<3) | ||
609 | |||
610 | #define IWL_MAX_CMD_SIZE 1024 | ||
611 | |||
612 | #define IWL_DEFAULT_TX_RETRY 15 | ||
613 | #define IWL_MAX_TX_RETRY 16 | ||
614 | |||
615 | /*********************************************/ | ||
616 | |||
617 | #define RFD_SIZE 4 | ||
618 | #define NUM_TFD_CHUNKS 4 | ||
619 | |||
620 | #define RX_QUEUE_SIZE 256 | ||
621 | #define RX_QUEUE_MASK 255 | ||
622 | #define RX_QUEUE_SIZE_LOG 8 | ||
623 | |||
624 | /* QoS definitions */ | ||
625 | |||
626 | #define CW_MIN_OFDM 15 | ||
627 | #define CW_MAX_OFDM 1023 | ||
628 | #define CW_MIN_CCK 31 | ||
629 | #define CW_MAX_CCK 1023 | ||
630 | |||
631 | #define QOS_TX0_CW_MIN_OFDM CW_MIN_OFDM | ||
632 | #define QOS_TX1_CW_MIN_OFDM CW_MIN_OFDM | ||
633 | #define QOS_TX2_CW_MIN_OFDM ((CW_MIN_OFDM + 1) / 2 - 1) | ||
634 | #define QOS_TX3_CW_MIN_OFDM ((CW_MIN_OFDM + 1) / 4 - 1) | ||
635 | |||
636 | #define QOS_TX0_CW_MIN_CCK CW_MIN_CCK | ||
637 | #define QOS_TX1_CW_MIN_CCK CW_MIN_CCK | ||
638 | #define QOS_TX2_CW_MIN_CCK ((CW_MIN_CCK + 1) / 2 - 1) | ||
639 | #define QOS_TX3_CW_MIN_CCK ((CW_MIN_CCK + 1) / 4 - 1) | ||
640 | |||
641 | #define QOS_TX0_CW_MAX_OFDM CW_MAX_OFDM | ||
642 | #define QOS_TX1_CW_MAX_OFDM CW_MAX_OFDM | ||
643 | #define QOS_TX2_CW_MAX_OFDM CW_MIN_OFDM | ||
644 | #define QOS_TX3_CW_MAX_OFDM ((CW_MIN_OFDM + 1) / 2 - 1) | ||
645 | |||
646 | #define QOS_TX0_CW_MAX_CCK CW_MAX_CCK | ||
647 | #define QOS_TX1_CW_MAX_CCK CW_MAX_CCK | ||
648 | #define QOS_TX2_CW_MAX_CCK CW_MIN_CCK | ||
649 | #define QOS_TX3_CW_MAX_CCK ((CW_MIN_CCK + 1) / 2 - 1) | ||
650 | |||
651 | #define QOS_TX0_AIFS 3 | ||
652 | #define QOS_TX1_AIFS 7 | ||
653 | #define QOS_TX2_AIFS 2 | ||
654 | #define QOS_TX3_AIFS 2 | ||
655 | |||
656 | #define QOS_TX0_ACM 0 | ||
657 | #define QOS_TX1_ACM 0 | ||
658 | #define QOS_TX2_ACM 0 | ||
659 | #define QOS_TX3_ACM 0 | ||
660 | |||
661 | #define QOS_TX0_TXOP_LIMIT_CCK 0 | ||
662 | #define QOS_TX1_TXOP_LIMIT_CCK 0 | ||
663 | #define QOS_TX2_TXOP_LIMIT_CCK 6016 | ||
664 | #define QOS_TX3_TXOP_LIMIT_CCK 3264 | ||
665 | |||
666 | #define QOS_TX0_TXOP_LIMIT_OFDM 0 | ||
667 | #define QOS_TX1_TXOP_LIMIT_OFDM 0 | ||
668 | #define QOS_TX2_TXOP_LIMIT_OFDM 3008 | ||
669 | #define QOS_TX3_TXOP_LIMIT_OFDM 1504 | ||
670 | |||
671 | #define DEF_TX0_CW_MIN_OFDM CW_MIN_OFDM | ||
672 | #define DEF_TX1_CW_MIN_OFDM CW_MIN_OFDM | ||
673 | #define DEF_TX2_CW_MIN_OFDM CW_MIN_OFDM | ||
674 | #define DEF_TX3_CW_MIN_OFDM CW_MIN_OFDM | ||
675 | |||
676 | #define DEF_TX0_CW_MIN_CCK CW_MIN_CCK | ||
677 | #define DEF_TX1_CW_MIN_CCK CW_MIN_CCK | ||
678 | #define DEF_TX2_CW_MIN_CCK CW_MIN_CCK | ||
679 | #define DEF_TX3_CW_MIN_CCK CW_MIN_CCK | ||
680 | |||
681 | #define DEF_TX0_CW_MAX_OFDM CW_MAX_OFDM | ||
682 | #define DEF_TX1_CW_MAX_OFDM CW_MAX_OFDM | ||
683 | #define DEF_TX2_CW_MAX_OFDM CW_MAX_OFDM | ||
684 | #define DEF_TX3_CW_MAX_OFDM CW_MAX_OFDM | ||
685 | |||
686 | #define DEF_TX0_CW_MAX_CCK CW_MAX_CCK | ||
687 | #define DEF_TX1_CW_MAX_CCK CW_MAX_CCK | ||
688 | #define DEF_TX2_CW_MAX_CCK CW_MAX_CCK | ||
689 | #define DEF_TX3_CW_MAX_CCK CW_MAX_CCK | ||
690 | |||
691 | #define DEF_TX0_AIFS (2) | ||
692 | #define DEF_TX1_AIFS (2) | ||
693 | #define DEF_TX2_AIFS (2) | ||
694 | #define DEF_TX3_AIFS (2) | ||
695 | |||
696 | #define DEF_TX0_ACM 0 | ||
697 | #define DEF_TX1_ACM 0 | ||
698 | #define DEF_TX2_ACM 0 | ||
699 | #define DEF_TX3_ACM 0 | ||
700 | |||
701 | #define DEF_TX0_TXOP_LIMIT_CCK 0 | ||
702 | #define DEF_TX1_TXOP_LIMIT_CCK 0 | ||
703 | #define DEF_TX2_TXOP_LIMIT_CCK 0 | ||
704 | #define DEF_TX3_TXOP_LIMIT_CCK 0 | ||
705 | |||
706 | #define DEF_TX0_TXOP_LIMIT_OFDM 0 | ||
707 | #define DEF_TX1_TXOP_LIMIT_OFDM 0 | ||
708 | #define DEF_TX2_TXOP_LIMIT_OFDM 0 | ||
709 | #define DEF_TX3_TXOP_LIMIT_OFDM 0 | ||
710 | |||
711 | #define QOS_QOS_SETS 3 | ||
712 | #define QOS_PARAM_SET_ACTIVE 0 | ||
713 | #define QOS_PARAM_SET_DEF_CCK 1 | ||
714 | #define QOS_PARAM_SET_DEF_OFDM 2 | ||
715 | |||
716 | #define CTRL_QOS_NO_ACK (0x0020) | ||
717 | #define DCT_FLAG_EXT_QOS_ENABLED (0x10) | ||
718 | |||
719 | #define U32_PAD(n) ((4-(n))&0x3) | ||
720 | |||
721 | /* | ||
722 | * Generic queue structure | ||
723 | * | ||
724 | * Contains common data for Rx and Tx queues | ||
725 | */ | ||
726 | #define TFD_CTL_COUNT_SET(n) (n<<24) | ||
727 | #define TFD_CTL_COUNT_GET(ctl) ((ctl>>24) & 7) | ||
728 | #define TFD_CTL_PAD_SET(n) (n<<28) | ||
729 | #define TFD_CTL_PAD_GET(ctl) (ctl>>28) | ||
730 | |||
731 | #define TFD_TX_CMD_SLOTS 256 | ||
732 | #define TFD_CMD_SLOTS 32 | ||
733 | |||
734 | #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_cmd) - \ | ||
735 | sizeof(struct iwl_cmd_meta)) | ||
736 | |||
737 | /* | ||
738 | * RX related structures and functions | ||
739 | */ | ||
740 | #define RX_FREE_BUFFERS 64 | ||
741 | #define RX_LOW_WATERMARK 8 | ||
742 | |||
743 | |||
67 | #define IWL_RX_BUF_SIZE (4 * 1024) | 744 | #define IWL_RX_BUF_SIZE (4 * 1024) |
68 | #define IWL_MAX_BSM_SIZE BSM_SRAM_SIZE | 745 | #define IWL_MAX_BSM_SIZE BSM_SRAM_SIZE |
69 | #define KDR_RTC_INST_UPPER_BOUND (0x018000) | 746 | #define KDR_RTC_INST_UPPER_BOUND (0x018000) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-io.h b/drivers/net/wireless/iwlwifi/iwl-4965-io.h new file mode 100644 index 000000000000..1ffa8f1e17c4 --- /dev/null +++ b/drivers/net/wireless/iwlwifi/iwl-4965-io.h | |||
@@ -0,0 +1,431 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Copyright(c) 2003 - 2007 Intel Corporation. All rights reserved. | ||
4 | * | ||
5 | * Portions of this file are derived from the ipw3945 project. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of version 2 of the GNU General Public License as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
14 | * more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along with | ||
17 | * this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA | ||
19 | * | ||
20 | * The full GNU General Public License is included in this distribution in the | ||
21 | * file called LICENSE. | ||
22 | * | ||
23 | * Contact Information: | ||
24 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | ||
25 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
26 | * | ||
27 | *****************************************************************************/ | ||
28 | |||
29 | #ifndef __iwl_io_h__ | ||
30 | #define __iwl_io_h__ | ||
31 | |||
32 | #include <linux/io.h> | ||
33 | |||
34 | #include "iwl-4965-debug.h" | ||
35 | |||
36 | /* | ||
37 | * IO, register, and NIC memory access functions | ||
38 | * | ||
39 | * NOTE on naming convention and macro usage for these | ||
40 | * | ||
41 | * A single _ prefix before a an access function means that no state | ||
42 | * check or debug information is printed when that function is called. | ||
43 | * | ||
44 | * A double __ prefix before an access function means that state is checked | ||
45 | * and the current line number is printed in addition to any other debug output. | ||
46 | * | ||
47 | * The non-prefixed name is the #define that maps the caller into a | ||
48 | * #define that provides the caller's __LINE__ to the double prefix version. | ||
49 | * | ||
50 | * If you wish to call the function without any debug or state checking, | ||
51 | * you should use the single _ prefix version (as is used by dependent IO | ||
52 | * routines, for example _iwl_read_direct32 calls the non-check version of | ||
53 | * _iwl_read32.) | ||
54 | * | ||
55 | * These declarations are *extremely* useful in quickly isolating code deltas | ||
56 | * which result in misconfiguring of the hardware I/O. In combination with | ||
57 | * git-bisect and the IO debug level you can quickly determine the specific | ||
58 | * commit which breaks the IO sequence to the hardware. | ||
59 | * | ||
60 | */ | ||
61 | |||
62 | #define _iwl_write32(iwl, ofs, val) writel((val), (iwl)->hw_base + (ofs)) | ||
63 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
64 | static inline void __iwl_write32(const char *f, u32 l, struct iwl_priv *iwl, | ||
65 | u32 ofs, u32 val) | ||
66 | { | ||
67 | IWL_DEBUG_IO("write32(0x%08X, 0x%08X) - %s %d\n", ofs, val, f, l); | ||
68 | _iwl_write32(iwl, ofs, val); | ||
69 | } | ||
70 | #define iwl_write32(iwl, ofs, val) \ | ||
71 | __iwl_write32(__FILE__, __LINE__, iwl, ofs, val) | ||
72 | #else | ||
73 | #define iwl_write32(iwl, ofs, val) _iwl_write32(iwl, ofs, val) | ||
74 | #endif | ||
75 | |||
76 | #define _iwl_read32(iwl, ofs) readl((iwl)->hw_base + (ofs)) | ||
77 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
78 | static inline u32 __iwl_read32(char *f, u32 l, struct iwl_priv *iwl, u32 ofs) | ||
79 | { | ||
80 | IWL_DEBUG_IO("read_direct32(0x%08X) - %s %d\n", ofs, f, l); | ||
81 | return _iwl_read32(iwl, ofs); | ||
82 | } | ||
83 | #define iwl_read32(iwl, ofs) __iwl_read32(__FILE__, __LINE__, iwl, ofs) | ||
84 | #else | ||
85 | #define iwl_read32(p, o) _iwl_read32(p, o) | ||
86 | #endif | ||
87 | |||
88 | static inline int _iwl_poll_bit(struct iwl_priv *priv, u32 addr, | ||
89 | u32 bits, u32 mask, int timeout) | ||
90 | { | ||
91 | int i = 0; | ||
92 | |||
93 | do { | ||
94 | if ((_iwl_read32(priv, addr) & mask) == (bits & mask)) | ||
95 | return i; | ||
96 | mdelay(10); | ||
97 | i += 10; | ||
98 | } while (i < timeout); | ||
99 | |||
100 | return -ETIMEDOUT; | ||
101 | } | ||
102 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
103 | static inline int __iwl_poll_bit(const char *f, u32 l, | ||
104 | struct iwl_priv *priv, u32 addr, | ||
105 | u32 bits, u32 mask, int timeout) | ||
106 | { | ||
107 | int ret = _iwl_poll_bit(priv, addr, bits, mask, timeout); | ||
108 | if (unlikely(ret == -ETIMEDOUT)) | ||
109 | IWL_DEBUG_IO | ||
110 | ("poll_bit(0x%08X, 0x%08X, 0x%08X) - timedout - %s %d\n", | ||
111 | addr, bits, mask, f, l); | ||
112 | else | ||
113 | IWL_DEBUG_IO | ||
114 | ("poll_bit(0x%08X, 0x%08X, 0x%08X) = 0x%08X - %s %d\n", | ||
115 | addr, bits, mask, ret, f, l); | ||
116 | return ret; | ||
117 | } | ||
118 | #define iwl_poll_bit(iwl, addr, bits, mask, timeout) \ | ||
119 | __iwl_poll_bit(__FILE__, __LINE__, iwl, addr, bits, mask, timeout) | ||
120 | #else | ||
121 | #define iwl_poll_bit(p, a, b, m, t) _iwl_poll_bit(p, a, b, m, t) | ||
122 | #endif | ||
123 | |||
124 | static inline void _iwl_set_bit(struct iwl_priv *priv, u32 reg, u32 mask) | ||
125 | { | ||
126 | _iwl_write32(priv, reg, _iwl_read32(priv, reg) | mask); | ||
127 | } | ||
128 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
129 | static inline void __iwl_set_bit(const char *f, u32 l, | ||
130 | struct iwl_priv *priv, u32 reg, u32 mask) | ||
131 | { | ||
132 | u32 val = _iwl_read32(priv, reg) | mask; | ||
133 | IWL_DEBUG_IO("set_bit(0x%08X, 0x%08X) = 0x%08X\n", reg, mask, val); | ||
134 | _iwl_write32(priv, reg, val); | ||
135 | } | ||
136 | #define iwl_set_bit(p, r, m) __iwl_set_bit(__FILE__, __LINE__, p, r, m) | ||
137 | #else | ||
138 | #define iwl_set_bit(p, r, m) _iwl_set_bit(p, r, m) | ||
139 | #endif | ||
140 | |||
141 | static inline void _iwl_clear_bit(struct iwl_priv *priv, u32 reg, u32 mask) | ||
142 | { | ||
143 | _iwl_write32(priv, reg, _iwl_read32(priv, reg) & ~mask); | ||
144 | } | ||
145 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
146 | static inline void __iwl_clear_bit(const char *f, u32 l, | ||
147 | struct iwl_priv *priv, u32 reg, u32 mask) | ||
148 | { | ||
149 | u32 val = _iwl_read32(priv, reg) & ~mask; | ||
150 | IWL_DEBUG_IO("clear_bit(0x%08X, 0x%08X) = 0x%08X\n", reg, mask, val); | ||
151 | _iwl_write32(priv, reg, val); | ||
152 | } | ||
153 | #define iwl_clear_bit(p, r, m) __iwl_clear_bit(__FILE__, __LINE__, p, r, m) | ||
154 | #else | ||
155 | #define iwl_clear_bit(p, r, m) _iwl_clear_bit(p, r, m) | ||
156 | #endif | ||
157 | |||
158 | static inline int _iwl_grab_nic_access(struct iwl_priv *priv) | ||
159 | { | ||
160 | int ret; | ||
161 | u32 gp_ctl; | ||
162 | |||
163 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
164 | if (atomic_read(&priv->restrict_refcnt)) | ||
165 | return 0; | ||
166 | #endif | ||
167 | if (test_bit(STATUS_RF_KILL_HW, &priv->status) || | ||
168 | test_bit(STATUS_RF_KILL_SW, &priv->status)) { | ||
169 | IWL_WARNING("WARNING: Requesting MAC access during RFKILL " | ||
170 | "wakes up NIC\n"); | ||
171 | |||
172 | /* 10 msec allows time for NIC to complete its data save */ | ||
173 | gp_ctl = _iwl_read32(priv, CSR_GP_CNTRL); | ||
174 | if (gp_ctl & CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY) { | ||
175 | IWL_DEBUG_RF_KILL("Wait for complete power-down, " | ||
176 | "gpctl = 0x%08x\n", gp_ctl); | ||
177 | mdelay(10); | ||
178 | } else | ||
179 | IWL_DEBUG_RF_KILL("power-down complete, " | ||
180 | "gpctl = 0x%08x\n", gp_ctl); | ||
181 | } | ||
182 | |||
183 | /* this bit wakes up the NIC */ | ||
184 | _iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); | ||
185 | ret = _iwl_poll_bit(priv, CSR_GP_CNTRL, | ||
186 | CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN, | ||
187 | (CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY | | ||
188 | CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 50); | ||
189 | if (ret < 0) { | ||
190 | IWL_ERROR("MAC is in deep sleep!\n"); | ||
191 | return -EIO; | ||
192 | } | ||
193 | |||
194 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
195 | atomic_inc(&priv->restrict_refcnt); | ||
196 | #endif | ||
197 | return 0; | ||
198 | } | ||
199 | |||
200 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
201 | static inline int __iwl_grab_nic_access(const char *f, u32 l, | ||
202 | struct iwl_priv *priv) | ||
203 | { | ||
204 | if (atomic_read(&priv->restrict_refcnt)) | ||
205 | IWL_DEBUG_INFO("Grabbing access while already held at " | ||
206 | "line %d.\n", l); | ||
207 | |||
208 | IWL_DEBUG_IO("grabbing nic access - %s %d\n", f, l); | ||
209 | return _iwl_grab_nic_access(priv); | ||
210 | } | ||
211 | #define iwl_grab_nic_access(priv) \ | ||
212 | __iwl_grab_nic_access(__FILE__, __LINE__, priv) | ||
213 | #else | ||
214 | #define iwl_grab_nic_access(priv) \ | ||
215 | _iwl_grab_nic_access(priv) | ||
216 | #endif | ||
217 | |||
218 | static inline void _iwl_release_nic_access(struct iwl_priv *priv) | ||
219 | { | ||
220 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
221 | if (atomic_dec_and_test(&priv->restrict_refcnt)) | ||
222 | #endif | ||
223 | _iwl_clear_bit(priv, CSR_GP_CNTRL, | ||
224 | CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); | ||
225 | } | ||
226 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
227 | static inline void __iwl_release_nic_access(const char *f, u32 l, | ||
228 | struct iwl_priv *priv) | ||
229 | { | ||
230 | if (atomic_read(&priv->restrict_refcnt) <= 0) | ||
231 | IWL_ERROR("Release unheld nic access at line %d.\n", l); | ||
232 | |||
233 | IWL_DEBUG_IO("releasing nic access - %s %d\n", f, l); | ||
234 | _iwl_release_nic_access(priv); | ||
235 | } | ||
236 | #define iwl_release_nic_access(priv) \ | ||
237 | __iwl_release_nic_access(__FILE__, __LINE__, priv) | ||
238 | #else | ||
239 | #define iwl_release_nic_access(priv) \ | ||
240 | _iwl_release_nic_access(priv) | ||
241 | #endif | ||
242 | |||
243 | static inline u32 _iwl_read_direct32(struct iwl_priv *priv, u32 reg) | ||
244 | { | ||
245 | return _iwl_read32(priv, reg); | ||
246 | } | ||
247 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
248 | static inline u32 __iwl_read_direct32(const char *f, u32 l, | ||
249 | struct iwl_priv *priv, u32 reg) | ||
250 | { | ||
251 | u32 value = _iwl_read_direct32(priv, reg); | ||
252 | if (!atomic_read(&priv->restrict_refcnt)) | ||
253 | IWL_ERROR("Nic access not held from %s %d\n", f, l); | ||
254 | IWL_DEBUG_IO("read_direct32(0x%4X) = 0x%08x - %s %d \n", reg, value, | ||
255 | f, l); | ||
256 | return value; | ||
257 | } | ||
258 | #define iwl_read_direct32(priv, reg) \ | ||
259 | __iwl_read_direct32(__FILE__, __LINE__, priv, reg) | ||
260 | #else | ||
261 | #define iwl_read_direct32 _iwl_read_direct32 | ||
262 | #endif | ||
263 | |||
264 | static inline void _iwl_write_direct32(struct iwl_priv *priv, | ||
265 | u32 reg, u32 value) | ||
266 | { | ||
267 | _iwl_write32(priv, reg, value); | ||
268 | } | ||
269 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
270 | static void __iwl_write_direct32(u32 line, | ||
271 | struct iwl_priv *priv, u32 reg, u32 value) | ||
272 | { | ||
273 | if (!atomic_read(&priv->restrict_refcnt)) | ||
274 | IWL_ERROR("Nic access not held from line %d\n", line); | ||
275 | _iwl_write_direct32(priv, reg, value); | ||
276 | } | ||
277 | #define iwl_write_direct32(priv, reg, value) \ | ||
278 | __iwl_write_direct32(__LINE__, priv, reg, value) | ||
279 | #else | ||
280 | #define iwl_write_direct32 _iwl_write_direct32 | ||
281 | #endif | ||
282 | |||
283 | static inline void iwl_write_reg_buf(struct iwl_priv *priv, | ||
284 | u32 reg, u32 len, u32 *values) | ||
285 | { | ||
286 | u32 count = sizeof(u32); | ||
287 | |||
288 | if ((priv != NULL) && (values != NULL)) { | ||
289 | for (; 0 < len; len -= count, reg += count, values++) | ||
290 | _iwl_write_direct32(priv, reg, *values); | ||
291 | } | ||
292 | } | ||
293 | |||
294 | static inline int _iwl_poll_direct_bit(struct iwl_priv *priv, | ||
295 | u32 addr, u32 mask, int timeout) | ||
296 | { | ||
297 | int i = 0; | ||
298 | |||
299 | do { | ||
300 | if ((_iwl_read_direct32(priv, addr) & mask) == mask) | ||
301 | return i; | ||
302 | mdelay(10); | ||
303 | i += 10; | ||
304 | } while (i < timeout); | ||
305 | |||
306 | return -ETIMEDOUT; | ||
307 | } | ||
308 | |||
309 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
310 | static inline int __iwl_poll_direct_bit(const char *f, u32 l, | ||
311 | struct iwl_priv *priv, | ||
312 | u32 addr, u32 mask, int timeout) | ||
313 | { | ||
314 | int ret = _iwl_poll_direct_bit(priv, addr, mask, timeout); | ||
315 | |||
316 | if (unlikely(ret == -ETIMEDOUT)) | ||
317 | IWL_DEBUG_IO("poll_direct_bit(0x%08X, 0x%08X) - " | ||
318 | "timedout - %s %d\n", addr, mask, f, l); | ||
319 | else | ||
320 | IWL_DEBUG_IO("poll_direct_bit(0x%08X, 0x%08X) = 0x%08X " | ||
321 | "- %s %d\n", addr, mask, ret, f, l); | ||
322 | return ret; | ||
323 | } | ||
324 | #define iwl_poll_direct_bit(iwl, addr, mask, timeout) \ | ||
325 | __iwl_poll_direct_bit(__FILE__, __LINE__, iwl, addr, mask, timeout) | ||
326 | #else | ||
327 | #define iwl_poll_direct_bit _iwl_poll_direct_bit | ||
328 | #endif | ||
329 | |||
330 | static inline u32 _iwl_read_prph(struct iwl_priv *priv, u32 reg) | ||
331 | { | ||
332 | _iwl_write_direct32(priv, HBUS_TARG_PRPH_RADDR, reg | (3 << 24)); | ||
333 | return _iwl_read_direct32(priv, HBUS_TARG_PRPH_RDAT); | ||
334 | } | ||
335 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
336 | static inline u32 __iwl_read_prph(u32 line, struct iwl_priv *priv, u32 reg) | ||
337 | { | ||
338 | if (!atomic_read(&priv->restrict_refcnt)) | ||
339 | IWL_ERROR("Nic access not held from line %d\n", line); | ||
340 | return _iwl_read_prph(priv, reg); | ||
341 | } | ||
342 | |||
343 | #define iwl_read_prph(priv, reg) \ | ||
344 | __iwl_read_prph(__LINE__, priv, reg) | ||
345 | #else | ||
346 | #define iwl_read_prph _iwl_read_prph | ||
347 | #endif | ||
348 | |||
349 | static inline void _iwl_write_prph(struct iwl_priv *priv, | ||
350 | u32 addr, u32 val) | ||
351 | { | ||
352 | _iwl_write_direct32(priv, HBUS_TARG_PRPH_WADDR, | ||
353 | ((addr & 0x0000FFFF) | (3 << 24))); | ||
354 | _iwl_write_direct32(priv, HBUS_TARG_PRPH_WDAT, val); | ||
355 | } | ||
356 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
357 | static inline void __iwl_write_prph(u32 line, struct iwl_priv *priv, | ||
358 | u32 addr, u32 val) | ||
359 | { | ||
360 | if (!atomic_read(&priv->restrict_refcnt)) | ||
361 | IWL_ERROR("Nic access from line %d\n", line); | ||
362 | _iwl_write_prph(priv, addr, val); | ||
363 | } | ||
364 | |||
365 | #define iwl_write_prph(priv, addr, val) \ | ||
366 | __iwl_write_prph(__LINE__, priv, addr, val); | ||
367 | #else | ||
368 | #define iwl_write_prph _iwl_write_prph | ||
369 | #endif | ||
370 | |||
371 | #define _iwl_set_bits_prph(priv, reg, mask) \ | ||
372 | _iwl_write_prph(priv, reg, (_iwl_read_prph(priv, reg) | mask)) | ||
373 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
374 | static inline void __iwl_set_bits_prph(u32 line, struct iwl_priv *priv, | ||
375 | u32 reg, u32 mask) | ||
376 | { | ||
377 | if (!atomic_read(&priv->restrict_refcnt)) | ||
378 | IWL_ERROR("Nic access not held from line %d\n", line); | ||
379 | |||
380 | _iwl_set_bits_prph(priv, reg, mask); | ||
381 | } | ||
382 | #define iwl_set_bits_prph(priv, reg, mask) \ | ||
383 | __iwl_set_bits_prph(__LINE__, priv, reg, mask) | ||
384 | #else | ||
385 | #define iwl_set_bits_prph _iwl_set_bits_prph | ||
386 | #endif | ||
387 | |||
388 | #define _iwl_set_bits_mask_prph(priv, reg, bits, mask) \ | ||
389 | _iwl_write_prph(priv, reg, ((_iwl_read_prph(priv, reg) & mask) | bits)) | ||
390 | |||
391 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
392 | static inline void __iwl_set_bits_mask_prph(u32 line, | ||
393 | struct iwl_priv *priv, u32 reg, u32 bits, u32 mask) | ||
394 | { | ||
395 | if (!atomic_read(&priv->restrict_refcnt)) | ||
396 | IWL_ERROR("Nic access not held from line %d\n", line); | ||
397 | _iwl_set_bits_mask_prph(priv, reg, bits, mask); | ||
398 | } | ||
399 | #define iwl_set_bits_mask_prph(priv, reg, bits, mask) \ | ||
400 | __iwl_set_bits_mask_prph(__LINE__, priv, reg, bits, mask) | ||
401 | #else | ||
402 | #define iwl_set_bits_mask_prph _iwl_set_bits_mask_prph | ||
403 | #endif | ||
404 | |||
405 | static inline void iwl_clear_bits_prph(struct iwl_priv | ||
406 | *priv, u32 reg, u32 mask) | ||
407 | { | ||
408 | u32 val = _iwl_read_prph(priv, reg); | ||
409 | _iwl_write_prph(priv, reg, (val & ~mask)); | ||
410 | } | ||
411 | |||
412 | static inline u32 iwl_read_targ_mem(struct iwl_priv *priv, u32 addr) | ||
413 | { | ||
414 | iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR, addr); | ||
415 | return iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT); | ||
416 | } | ||
417 | |||
418 | static inline void iwl_write_targ_mem(struct iwl_priv *priv, u32 addr, u32 val) | ||
419 | { | ||
420 | iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); | ||
421 | iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, val); | ||
422 | } | ||
423 | |||
424 | static inline void iwl_write_targ_mem_buf(struct iwl_priv *priv, u32 addr, | ||
425 | u32 len, u32 *values) | ||
426 | { | ||
427 | iwl_write_direct32(priv, HBUS_TARG_MEM_WADDR, addr); | ||
428 | for (; 0 < len; len -= sizeof(u32), values++) | ||
429 | iwl_write_direct32(priv, HBUS_TARG_MEM_WDAT, *values); | ||
430 | } | ||
431 | #endif | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c index b557faa6ff08..0e384e60648e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c | |||
@@ -36,11 +36,9 @@ | |||
36 | 36 | ||
37 | #include <linux/workqueue.h> | 37 | #include <linux/workqueue.h> |
38 | 38 | ||
39 | #define IWL 4965 | ||
40 | |||
41 | #include "../net/mac80211/ieee80211_rate.h" | 39 | #include "../net/mac80211/ieee80211_rate.h" |
42 | 40 | ||
43 | #include "iwlwifi.h" | 41 | #include "iwl-4965.h" |
44 | #include "iwl-helpers.h" | 42 | #include "iwl-helpers.h" |
45 | 43 | ||
46 | #define RS_NAME "iwl-4965-rs" | 44 | #define RS_NAME "iwl-4965-rs" |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 28f7aa802fde..f8f77fe41283 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -37,9 +37,6 @@ | |||
37 | #include <net/mac80211.h> | 37 | #include <net/mac80211.h> |
38 | #include <linux/etherdevice.h> | 38 | #include <linux/etherdevice.h> |
39 | 39 | ||
40 | #define IWL 4965 | ||
41 | |||
42 | #include "iwlwifi.h" | ||
43 | #include "iwl-4965.h" | 40 | #include "iwl-4965.h" |
44 | #include "iwl-helpers.h" | 41 | #include "iwl-helpers.h" |
45 | 42 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.h b/drivers/net/wireless/iwlwifi/iwl-4965.h index b31a7e4b7d78..bf174d3b8fbf 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.h +++ b/drivers/net/wireless/iwlwifi/iwl-4965.h | |||
@@ -26,6 +26,707 @@ | |||
26 | #ifndef __iwl_4965_h__ | 26 | #ifndef __iwl_4965_h__ |
27 | #define __iwl_4965_h__ | 27 | #define __iwl_4965_h__ |
28 | 28 | ||
29 | #include <linux/pci.h> /* for struct pci_device_id */ | ||
30 | #include <linux/kernel.h> | ||
31 | #include <net/ieee80211_radiotap.h> | ||
32 | |||
33 | struct iwl_priv; | ||
34 | |||
35 | /* Hardware specific file defines the PCI IDs table for that hardware module */ | ||
36 | extern struct pci_device_id iwl_hw_card_ids[]; | ||
37 | |||
38 | #define DRV_NAME "iwl4965" | ||
39 | #include "iwl-4965-hw.h" | ||
40 | #include "iwl-prph.h" | ||
41 | #include "iwl-4965-debug.h" | ||
42 | |||
43 | /* Default noise level to report when noise measurement is not available. | ||
44 | * This may be because we're: | ||
45 | * 1) Not associated (4965, no beacon statistics being sent to driver) | ||
46 | * 2) Scanning (noise measurement does not apply to associated channel) | ||
47 | * 3) Receiving CCK (3945 delivers noise info only for OFDM frames) | ||
48 | * Use default noise value of -127 ... this is below the range of measurable | ||
49 | * Rx dBm for either 3945 or 4965, so it can indicate "unmeasurable" to user. | ||
50 | * Also, -127 works better than 0 when averaging frames with/without | ||
51 | * noise info (e.g. averaging might be done in app); measured dBm values are | ||
52 | * always negative ... using a negative value as the default keeps all | ||
53 | * averages within an s8's (used in some apps) range of negative values. */ | ||
54 | #define IWL_NOISE_MEAS_NOT_AVAILABLE (-127) | ||
55 | |||
56 | /* Module parameters accessible from iwl-*.c */ | ||
57 | extern int iwl_param_hwcrypto; | ||
58 | extern int iwl_param_queues_num; | ||
59 | |||
60 | enum iwl_antenna { | ||
61 | IWL_ANTENNA_DIVERSITY, | ||
62 | IWL_ANTENNA_MAIN, | ||
63 | IWL_ANTENNA_AUX | ||
64 | }; | ||
65 | |||
66 | /* | ||
67 | * RTS threshold here is total size [2347] minus 4 FCS bytes | ||
68 | * Per spec: | ||
69 | * a value of 0 means RTS on all data/management packets | ||
70 | * a value > max MSDU size means no RTS | ||
71 | * else RTS for data/management frames where MPDU is larger | ||
72 | * than RTS value. | ||
73 | */ | ||
74 | #define DEFAULT_RTS_THRESHOLD 2347U | ||
75 | #define MIN_RTS_THRESHOLD 0U | ||
76 | #define MAX_RTS_THRESHOLD 2347U | ||
77 | #define MAX_MSDU_SIZE 2304U | ||
78 | #define MAX_MPDU_SIZE 2346U | ||
79 | #define DEFAULT_BEACON_INTERVAL 100U | ||
80 | #define DEFAULT_SHORT_RETRY_LIMIT 7U | ||
81 | #define DEFAULT_LONG_RETRY_LIMIT 4U | ||
82 | |||
83 | struct iwl_rx_mem_buffer { | ||
84 | dma_addr_t dma_addr; | ||
85 | struct sk_buff *skb; | ||
86 | struct list_head list; | ||
87 | }; | ||
88 | |||
89 | struct iwl_rt_rx_hdr { | ||
90 | struct ieee80211_radiotap_header rt_hdr; | ||
91 | __le64 rt_tsf; /* TSF */ | ||
92 | u8 rt_flags; /* radiotap packet flags */ | ||
93 | u8 rt_rate; /* rate in 500kb/s */ | ||
94 | __le16 rt_channelMHz; /* channel in MHz */ | ||
95 | __le16 rt_chbitmask; /* channel bitfield */ | ||
96 | s8 rt_dbmsignal; /* signal in dBm, kluged to signed */ | ||
97 | s8 rt_dbmnoise; | ||
98 | u8 rt_antenna; /* antenna number */ | ||
99 | u8 payload[0]; /* payload... */ | ||
100 | } __attribute__ ((packed)); | ||
101 | |||
102 | struct iwl_rt_tx_hdr { | ||
103 | struct ieee80211_radiotap_header rt_hdr; | ||
104 | u8 rt_rate; /* rate in 500kb/s */ | ||
105 | __le16 rt_channel; /* channel in mHz */ | ||
106 | __le16 rt_chbitmask; /* channel bitfield */ | ||
107 | s8 rt_dbmsignal; /* signal in dBm, kluged to signed */ | ||
108 | u8 rt_antenna; /* antenna number */ | ||
109 | u8 payload[0]; /* payload... */ | ||
110 | } __attribute__ ((packed)); | ||
111 | |||
112 | /* | ||
113 | * Generic queue structure | ||
114 | * | ||
115 | * Contains common data for Rx and Tx queues | ||
116 | */ | ||
117 | struct iwl_queue { | ||
118 | int n_bd; /* number of BDs in this queue */ | ||
119 | int write_ptr; /* 1-st empty entry (index) host_w*/ | ||
120 | int read_ptr; /* last used entry (index) host_r*/ | ||
121 | dma_addr_t dma_addr; /* physical addr for BD's */ | ||
122 | int n_window; /* safe queue window */ | ||
123 | u32 id; | ||
124 | int low_mark; /* low watermark, resume queue if free | ||
125 | * space more than this */ | ||
126 | int high_mark; /* high watermark, stop queue if free | ||
127 | * space less than this */ | ||
128 | } __attribute__ ((packed)); | ||
129 | |||
130 | #define MAX_NUM_OF_TBS (20) | ||
131 | |||
132 | struct iwl_tx_info { | ||
133 | struct ieee80211_tx_status status; | ||
134 | struct sk_buff *skb[MAX_NUM_OF_TBS]; | ||
135 | }; | ||
136 | |||
137 | /** | ||
138 | * struct iwl_tx_queue - Tx Queue for DMA | ||
139 | * @need_update: need to update read/write index | ||
140 | * @shed_retry: queue is HT AGG enabled | ||
141 | * | ||
142 | * Queue consists of circular buffer of BD's and required locking structures. | ||
143 | */ | ||
144 | struct iwl_tx_queue { | ||
145 | struct iwl_queue q; | ||
146 | struct iwl_tfd_frame *bd; | ||
147 | struct iwl_cmd *cmd; | ||
148 | dma_addr_t dma_addr_cmd; | ||
149 | struct iwl_tx_info *txb; | ||
150 | int need_update; | ||
151 | int sched_retry; | ||
152 | int active; | ||
153 | }; | ||
154 | |||
155 | #define IWL_NUM_SCAN_RATES (2) | ||
156 | |||
157 | struct iwl_channel_tgd_info { | ||
158 | u8 type; | ||
159 | s8 max_power; | ||
160 | }; | ||
161 | |||
162 | struct iwl_channel_tgh_info { | ||
163 | s64 last_radar_time; | ||
164 | }; | ||
165 | |||
166 | /* current Tx power values to use, one for each rate for each channel. | ||
167 | * requested power is limited by: | ||
168 | * -- regulatory EEPROM limits for this channel | ||
169 | * -- hardware capabilities (clip-powers) | ||
170 | * -- spectrum management | ||
171 | * -- user preference (e.g. iwconfig) | ||
172 | * when requested power is set, base power index must also be set. */ | ||
173 | struct iwl_channel_power_info { | ||
174 | struct iwl_tx_power tpc; /* actual radio and DSP gain settings */ | ||
175 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
176 | s8 base_power_index; /* gain index for power at factory temp. */ | ||
177 | s8 requested_power; /* power (dBm) requested for this chnl/rate */ | ||
178 | }; | ||
179 | |||
180 | /* current scan Tx power values to use, one for each scan rate for each | ||
181 | * channel. */ | ||
182 | struct iwl_scan_power_info { | ||
183 | struct iwl_tx_power tpc; /* actual radio and DSP gain settings */ | ||
184 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
185 | s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */ | ||
186 | }; | ||
187 | |||
188 | /* Channel unlock period is 15 seconds. If no beacon or probe response | ||
189 | * has been received within 15 seconds on a locked channel then the channel | ||
190 | * remains locked. */ | ||
191 | #define TX_UNLOCK_PERIOD 15 | ||
192 | |||
193 | /* CSA lock period is 15 seconds. If a CSA has been received on a channel in | ||
194 | * the last 15 seconds, the channel is locked */ | ||
195 | #define CSA_LOCK_PERIOD 15 | ||
196 | /* | ||
197 | * One for each channel, holds all channel setup data | ||
198 | * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant | ||
199 | * with one another! | ||
200 | */ | ||
201 | #define IWL4965_MAX_RATE (33) | ||
202 | |||
203 | struct iwl_channel_info { | ||
204 | struct iwl_channel_tgd_info tgd; | ||
205 | struct iwl_channel_tgh_info tgh; | ||
206 | struct iwl_eeprom_channel eeprom; /* EEPROM regulatory limit */ | ||
207 | struct iwl_eeprom_channel fat_eeprom; /* EEPROM regulatory limit for | ||
208 | * FAT channel */ | ||
209 | |||
210 | u8 channel; /* channel number */ | ||
211 | u8 flags; /* flags copied from EEPROM */ | ||
212 | s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ | ||
213 | s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */ | ||
214 | s8 min_power; /* always 0 */ | ||
215 | s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */ | ||
216 | |||
217 | u8 group_index; /* 0-4, maps channel to group1/2/3/4/5 */ | ||
218 | u8 band_index; /* 0-4, maps channel to band1/2/3/4/5 */ | ||
219 | u8 phymode; /* MODE_IEEE80211{A,B,G} */ | ||
220 | |||
221 | /* Radio/DSP gain settings for each "normal" data Tx rate. | ||
222 | * These include, in addition to RF and DSP gain, a few fields for | ||
223 | * remembering/modifying gain settings (indexes). */ | ||
224 | struct iwl_channel_power_info power_info[IWL4965_MAX_RATE]; | ||
225 | |||
226 | /* FAT channel info */ | ||
227 | s8 fat_max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ | ||
228 | s8 fat_curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */ | ||
229 | s8 fat_min_power; /* always 0 */ | ||
230 | s8 fat_scan_power; /* (dBm) eeprom, direct scans, any rate */ | ||
231 | u8 fat_flags; /* flags copied from EEPROM */ | ||
232 | u8 fat_extension_channel; | ||
233 | |||
234 | /* Radio/DSP gain settings for each scan rate, for directed scans. */ | ||
235 | struct iwl_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES]; | ||
236 | }; | ||
237 | |||
238 | struct iwl_clip_group { | ||
239 | /* maximum power level to prevent clipping for each rate, derived by | ||
240 | * us from this band's saturation power in EEPROM */ | ||
241 | const s8 clip_powers[IWL_MAX_RATES]; | ||
242 | }; | ||
243 | |||
244 | #include "iwl-4965-rs.h" | ||
245 | |||
246 | #define IWL_TX_FIFO_AC0 0 | ||
247 | #define IWL_TX_FIFO_AC1 1 | ||
248 | #define IWL_TX_FIFO_AC2 2 | ||
249 | #define IWL_TX_FIFO_AC3 3 | ||
250 | #define IWL_TX_FIFO_HCCA_1 5 | ||
251 | #define IWL_TX_FIFO_HCCA_2 6 | ||
252 | #define IWL_TX_FIFO_NONE 7 | ||
253 | |||
254 | /* Minimum number of queues. MAX_NUM is defined in hw specific files */ | ||
255 | #define IWL_MIN_NUM_QUEUES 4 | ||
256 | |||
257 | /* Power management (not Tx power) structures */ | ||
258 | |||
259 | struct iwl_power_vec_entry { | ||
260 | struct iwl_powertable_cmd cmd; | ||
261 | u8 no_dtim; | ||
262 | }; | ||
263 | #define IWL_POWER_RANGE_0 (0) | ||
264 | #define IWL_POWER_RANGE_1 (1) | ||
265 | |||
266 | #define IWL_POWER_MODE_CAM 0x00 /* Continuously Aware Mode, always on */ | ||
267 | #define IWL_POWER_INDEX_3 0x03 | ||
268 | #define IWL_POWER_INDEX_5 0x05 | ||
269 | #define IWL_POWER_AC 0x06 | ||
270 | #define IWL_POWER_BATTERY 0x07 | ||
271 | #define IWL_POWER_LIMIT 0x07 | ||
272 | #define IWL_POWER_MASK 0x0F | ||
273 | #define IWL_POWER_ENABLED 0x10 | ||
274 | #define IWL_POWER_LEVEL(x) ((x) & IWL_POWER_MASK) | ||
275 | |||
276 | struct iwl_power_mgr { | ||
277 | spinlock_t lock; | ||
278 | struct iwl_power_vec_entry pwr_range_0[IWL_POWER_AC]; | ||
279 | struct iwl_power_vec_entry pwr_range_1[IWL_POWER_AC]; | ||
280 | u8 active_index; | ||
281 | u32 dtim_val; | ||
282 | }; | ||
283 | |||
284 | #define IEEE80211_DATA_LEN 2304 | ||
285 | #define IEEE80211_4ADDR_LEN 30 | ||
286 | #define IEEE80211_HLEN (IEEE80211_4ADDR_LEN) | ||
287 | #define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) | ||
288 | |||
289 | struct iwl_frame { | ||
290 | union { | ||
291 | struct ieee80211_hdr frame; | ||
292 | struct iwl_tx_beacon_cmd beacon; | ||
293 | u8 raw[IEEE80211_FRAME_LEN]; | ||
294 | u8 cmd[360]; | ||
295 | } u; | ||
296 | struct list_head list; | ||
297 | }; | ||
298 | |||
299 | #define SEQ_TO_QUEUE(x) ((x >> 8) & 0xbf) | ||
300 | #define QUEUE_TO_SEQ(x) ((x & 0xbf) << 8) | ||
301 | #define SEQ_TO_INDEX(x) (x & 0xff) | ||
302 | #define INDEX_TO_SEQ(x) (x & 0xff) | ||
303 | #define SEQ_HUGE_FRAME (0x4000) | ||
304 | #define SEQ_RX_FRAME __constant_cpu_to_le16(0x8000) | ||
305 | #define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4) | ||
306 | #define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ) | ||
307 | #define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4) | ||
308 | |||
309 | enum { | ||
310 | /* CMD_SIZE_NORMAL = 0, */ | ||
311 | CMD_SIZE_HUGE = (1 << 0), | ||
312 | /* CMD_SYNC = 0, */ | ||
313 | CMD_ASYNC = (1 << 1), | ||
314 | /* CMD_NO_SKB = 0, */ | ||
315 | CMD_WANT_SKB = (1 << 2), | ||
316 | }; | ||
317 | |||
318 | struct iwl_cmd; | ||
319 | struct iwl_priv; | ||
320 | |||
321 | struct iwl_cmd_meta { | ||
322 | struct iwl_cmd_meta *source; | ||
323 | union { | ||
324 | struct sk_buff *skb; | ||
325 | int (*callback)(struct iwl_priv *priv, | ||
326 | struct iwl_cmd *cmd, struct sk_buff *skb); | ||
327 | } __attribute__ ((packed)) u; | ||
328 | |||
329 | /* The CMD_SIZE_HUGE flag bit indicates that the command | ||
330 | * structure is stored at the end of the shared queue memory. */ | ||
331 | u32 flags; | ||
332 | |||
333 | } __attribute__ ((packed)); | ||
334 | |||
335 | struct iwl_cmd { | ||
336 | struct iwl_cmd_meta meta; | ||
337 | struct iwl_cmd_header hdr; | ||
338 | union { | ||
339 | struct iwl_addsta_cmd addsta; | ||
340 | struct iwl_led_cmd led; | ||
341 | u32 flags; | ||
342 | u8 val8; | ||
343 | u16 val16; | ||
344 | u32 val32; | ||
345 | struct iwl_bt_cmd bt; | ||
346 | struct iwl_rxon_time_cmd rxon_time; | ||
347 | struct iwl_powertable_cmd powertable; | ||
348 | struct iwl_qosparam_cmd qosparam; | ||
349 | struct iwl_tx_cmd tx; | ||
350 | struct iwl_tx_beacon_cmd tx_beacon; | ||
351 | struct iwl_rxon_assoc_cmd rxon_assoc; | ||
352 | u8 *indirect; | ||
353 | u8 payload[360]; | ||
354 | } __attribute__ ((packed)) cmd; | ||
355 | } __attribute__ ((packed)); | ||
356 | |||
357 | struct iwl_host_cmd { | ||
358 | u8 id; | ||
359 | u16 len; | ||
360 | struct iwl_cmd_meta meta; | ||
361 | const void *data; | ||
362 | }; | ||
363 | |||
364 | #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_cmd) - \ | ||
365 | sizeof(struct iwl_cmd_meta)) | ||
366 | |||
367 | /* | ||
368 | * RX related structures and functions | ||
369 | */ | ||
370 | #define RX_FREE_BUFFERS 64 | ||
371 | #define RX_LOW_WATERMARK 8 | ||
372 | |||
373 | #define SUP_RATE_11A_MAX_NUM_CHANNELS 8 | ||
374 | #define SUP_RATE_11B_MAX_NUM_CHANNELS 4 | ||
375 | #define SUP_RATE_11G_MAX_NUM_CHANNELS 12 | ||
376 | |||
377 | /** | ||
378 | * struct iwl_rx_queue - Rx queue | ||
379 | * @processed: Internal index to last handled Rx packet | ||
380 | * @read: Shared index to newest available Rx buffer | ||
381 | * @write: Shared index to oldest written Rx packet | ||
382 | * @free_count: Number of pre-allocated buffers in rx_free | ||
383 | * @rx_free: list of free SKBs for use | ||
384 | * @rx_used: List of Rx buffers with no SKB | ||
385 | * @need_update: flag to indicate we need to update read/write index | ||
386 | * | ||
387 | * NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers | ||
388 | */ | ||
389 | struct iwl_rx_queue { | ||
390 | __le32 *bd; | ||
391 | dma_addr_t dma_addr; | ||
392 | struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS]; | ||
393 | struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE]; | ||
394 | u32 processed; | ||
395 | u32 read; | ||
396 | u32 write; | ||
397 | u32 free_count; | ||
398 | struct list_head rx_free; | ||
399 | struct list_head rx_used; | ||
400 | int need_update; | ||
401 | spinlock_t lock; | ||
402 | }; | ||
403 | |||
404 | #define IWL_SUPPORTED_RATES_IE_LEN 8 | ||
405 | |||
406 | #define SCAN_INTERVAL 100 | ||
407 | |||
408 | #define MAX_A_CHANNELS 252 | ||
409 | #define MIN_A_CHANNELS 7 | ||
410 | |||
411 | #define MAX_B_CHANNELS 14 | ||
412 | #define MIN_B_CHANNELS 1 | ||
413 | |||
414 | #define STATUS_HCMD_ACTIVE 0 /* host command in progress */ | ||
415 | #define STATUS_INT_ENABLED 1 | ||
416 | #define STATUS_RF_KILL_HW 2 | ||
417 | #define STATUS_RF_KILL_SW 3 | ||
418 | #define STATUS_INIT 4 | ||
419 | #define STATUS_ALIVE 5 | ||
420 | #define STATUS_READY 6 | ||
421 | #define STATUS_TEMPERATURE 7 | ||
422 | #define STATUS_GEO_CONFIGURED 8 | ||
423 | #define STATUS_EXIT_PENDING 9 | ||
424 | #define STATUS_IN_SUSPEND 10 | ||
425 | #define STATUS_STATISTICS 11 | ||
426 | #define STATUS_SCANNING 12 | ||
427 | #define STATUS_SCAN_ABORTING 13 | ||
428 | #define STATUS_SCAN_HW 14 | ||
429 | #define STATUS_POWER_PMI 15 | ||
430 | #define STATUS_FW_ERROR 16 | ||
431 | |||
432 | #define MAX_TID_COUNT 9 | ||
433 | |||
434 | #define IWL_INVALID_RATE 0xFF | ||
435 | #define IWL_INVALID_VALUE -1 | ||
436 | |||
437 | #ifdef CONFIG_IWLWIFI_HT | ||
438 | #ifdef CONFIG_IWLWIFI_HT_AGG | ||
439 | struct iwl_ht_agg { | ||
440 | u16 txq_id; | ||
441 | u16 frame_count; | ||
442 | u16 wait_for_ba; | ||
443 | u16 start_idx; | ||
444 | u32 bitmap0; | ||
445 | u32 bitmap1; | ||
446 | u32 rate_n_flags; | ||
447 | }; | ||
448 | #endif /* CONFIG_IWLWIFI_HT_AGG */ | ||
449 | #endif /* CONFIG_IWLWIFI_HT */ | ||
450 | |||
451 | struct iwl_tid_data { | ||
452 | u16 seq_number; | ||
453 | #ifdef CONFIG_IWLWIFI_HT | ||
454 | #ifdef CONFIG_IWLWIFI_HT_AGG | ||
455 | struct iwl_ht_agg agg; | ||
456 | #endif /* CONFIG_IWLWIFI_HT_AGG */ | ||
457 | #endif /* CONFIG_IWLWIFI_HT */ | ||
458 | }; | ||
459 | |||
460 | struct iwl_hw_key { | ||
461 | enum ieee80211_key_alg alg; | ||
462 | int keylen; | ||
463 | u8 key[32]; | ||
464 | }; | ||
465 | |||
466 | union iwl_ht_rate_supp { | ||
467 | u16 rates; | ||
468 | struct { | ||
469 | u8 siso_rate; | ||
470 | u8 mimo_rate; | ||
471 | }; | ||
472 | }; | ||
473 | |||
474 | #ifdef CONFIG_IWLWIFI_HT | ||
475 | #define CFG_HT_RX_AMPDU_FACTOR_DEF (0x3) | ||
476 | #define HT_IE_MAX_AMSDU_SIZE_4K (0) | ||
477 | #define CFG_HT_MPDU_DENSITY_2USEC (0x5) | ||
478 | #define CFG_HT_MPDU_DENSITY_DEF CFG_HT_MPDU_DENSITY_2USEC | ||
479 | |||
480 | struct sta_ht_info { | ||
481 | u8 is_ht; | ||
482 | u16 rx_mimo_ps_mode; | ||
483 | u16 tx_mimo_ps_mode; | ||
484 | u16 control_channel; | ||
485 | u8 max_amsdu_size; | ||
486 | u8 ampdu_factor; | ||
487 | u8 mpdu_density; | ||
488 | u8 operating_mode; | ||
489 | u8 supported_chan_width; | ||
490 | u8 extension_chan_offset; | ||
491 | u8 is_green_field; | ||
492 | u8 sgf; | ||
493 | u8 supp_rates[16]; | ||
494 | u8 tx_chan_width; | ||
495 | u8 chan_width_cap; | ||
496 | }; | ||
497 | #endif /*CONFIG_IWLWIFI_HT */ | ||
498 | |||
499 | #ifdef CONFIG_IWLWIFI_QOS | ||
500 | |||
501 | union iwl_qos_capabity { | ||
502 | struct { | ||
503 | u8 edca_count:4; /* bit 0-3 */ | ||
504 | u8 q_ack:1; /* bit 4 */ | ||
505 | u8 queue_request:1; /* bit 5 */ | ||
506 | u8 txop_request:1; /* bit 6 */ | ||
507 | u8 reserved:1; /* bit 7 */ | ||
508 | } q_AP; | ||
509 | struct { | ||
510 | u8 acvo_APSD:1; /* bit 0 */ | ||
511 | u8 acvi_APSD:1; /* bit 1 */ | ||
512 | u8 ac_bk_APSD:1; /* bit 2 */ | ||
513 | u8 ac_be_APSD:1; /* bit 3 */ | ||
514 | u8 q_ack:1; /* bit 4 */ | ||
515 | u8 max_len:2; /* bit 5-6 */ | ||
516 | u8 more_data_ack:1; /* bit 7 */ | ||
517 | } q_STA; | ||
518 | u8 val; | ||
519 | }; | ||
520 | |||
521 | /* QoS structures */ | ||
522 | struct iwl_qos_info { | ||
523 | int qos_enable; | ||
524 | int qos_active; | ||
525 | union iwl_qos_capabity qos_cap; | ||
526 | struct iwl_qosparam_cmd def_qos_parm; | ||
527 | }; | ||
528 | #endif /*CONFIG_IWLWIFI_QOS */ | ||
529 | |||
530 | #define STA_PS_STATUS_WAKE 0 | ||
531 | #define STA_PS_STATUS_SLEEP 1 | ||
532 | |||
533 | struct iwl_station_entry { | ||
534 | struct iwl_addsta_cmd sta; | ||
535 | struct iwl_tid_data tid[MAX_TID_COUNT]; | ||
536 | u8 used; | ||
537 | u8 ps_status; | ||
538 | struct iwl_hw_key keyinfo; | ||
539 | }; | ||
540 | |||
541 | /* one for each uCode image (inst/data, boot/init/runtime) */ | ||
542 | struct fw_desc { | ||
543 | void *v_addr; /* access by driver */ | ||
544 | dma_addr_t p_addr; /* access by card's busmaster DMA */ | ||
545 | u32 len; /* bytes */ | ||
546 | }; | ||
547 | |||
548 | /* uCode file layout */ | ||
549 | struct iwl_ucode { | ||
550 | __le32 ver; /* major/minor/subminor */ | ||
551 | __le32 inst_size; /* bytes of runtime instructions */ | ||
552 | __le32 data_size; /* bytes of runtime data */ | ||
553 | __le32 init_size; /* bytes of initialization instructions */ | ||
554 | __le32 init_data_size; /* bytes of initialization data */ | ||
555 | __le32 boot_size; /* bytes of bootstrap instructions */ | ||
556 | u8 data[0]; /* data in same order as "size" elements */ | ||
557 | }; | ||
558 | |||
559 | #define IWL_IBSS_MAC_HASH_SIZE 32 | ||
560 | |||
561 | struct iwl_ibss_seq { | ||
562 | u8 mac[ETH_ALEN]; | ||
563 | u16 seq_num; | ||
564 | u16 frag_num; | ||
565 | unsigned long packet_time; | ||
566 | struct list_head list; | ||
567 | }; | ||
568 | |||
569 | struct iwl_driver_hw_info { | ||
570 | u16 max_txq_num; | ||
571 | u16 ac_queue_count; | ||
572 | u16 tx_cmd_len; | ||
573 | u16 max_rxq_size; | ||
574 | u32 rx_buffer_size; | ||
575 | u16 max_rxq_log; | ||
576 | u8 max_stations; | ||
577 | u8 bcast_sta_id; | ||
578 | void *shared_virt; | ||
579 | dma_addr_t shared_phys; | ||
580 | }; | ||
581 | |||
582 | |||
583 | #define STA_FLG_RTS_MIMO_PROT_MSK __constant_cpu_to_le32(1 << 17) | ||
584 | #define STA_FLG_AGG_MPDU_8US_MSK __constant_cpu_to_le32(1 << 18) | ||
585 | #define STA_FLG_MAX_AGG_SIZE_POS (19) | ||
586 | #define STA_FLG_MAX_AGG_SIZE_MSK __constant_cpu_to_le32(3 << 19) | ||
587 | #define STA_FLG_FAT_EN_MSK __constant_cpu_to_le32(1 << 21) | ||
588 | #define STA_FLG_MIMO_DIS_MSK __constant_cpu_to_le32(1 << 22) | ||
589 | #define STA_FLG_AGG_MPDU_DENSITY_POS (23) | ||
590 | #define STA_FLG_AGG_MPDU_DENSITY_MSK __constant_cpu_to_le32(7 << 23) | ||
591 | #define HT_SHORT_GI_20MHZ_ONLY (1 << 0) | ||
592 | #define HT_SHORT_GI_40MHZ_ONLY (1 << 1) | ||
593 | |||
594 | |||
595 | #define IWL_RX_HDR(x) ((struct iwl_rx_frame_hdr *)(\ | ||
596 | x->u.rx_frame.stats.payload + \ | ||
597 | x->u.rx_frame.stats.phy_count)) | ||
598 | #define IWL_RX_END(x) ((struct iwl_rx_frame_end *)(\ | ||
599 | IWL_RX_HDR(x)->payload + \ | ||
600 | le16_to_cpu(IWL_RX_HDR(x)->len))) | ||
601 | #define IWL_RX_STATS(x) (&x->u.rx_frame.stats) | ||
602 | #define IWL_RX_DATA(x) (IWL_RX_HDR(x)->payload) | ||
603 | |||
604 | |||
605 | /****************************************************************************** | ||
606 | * | ||
607 | * Functions implemented in iwl-base.c which are forward declared here | ||
608 | * for use by iwl-*.c | ||
609 | * | ||
610 | *****************************************************************************/ | ||
611 | struct iwl_addsta_cmd; | ||
612 | extern int iwl_send_add_station(struct iwl_priv *priv, | ||
613 | struct iwl_addsta_cmd *sta, u8 flags); | ||
614 | extern u8 iwl_add_station(struct iwl_priv *priv, const u8 *bssid, | ||
615 | int is_ap, u8 flags); | ||
616 | extern int iwl_is_network_packet(struct iwl_priv *priv, | ||
617 | struct ieee80211_hdr *header); | ||
618 | extern int iwl_power_init_handle(struct iwl_priv *priv); | ||
619 | extern int iwl_eeprom_init(struct iwl_priv *priv); | ||
620 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
621 | extern void iwl_report_frame(struct iwl_priv *priv, | ||
622 | struct iwl_rx_packet *pkt, | ||
623 | struct ieee80211_hdr *header, int group100); | ||
624 | #else | ||
625 | static inline void iwl_report_frame(struct iwl_priv *priv, | ||
626 | struct iwl_rx_packet *pkt, | ||
627 | struct ieee80211_hdr *header, | ||
628 | int group100) {} | ||
629 | #endif | ||
630 | extern void iwl_handle_data_packet_monitor(struct iwl_priv *priv, | ||
631 | struct iwl_rx_mem_buffer *rxb, | ||
632 | void *data, short len, | ||
633 | struct ieee80211_rx_status *stats, | ||
634 | u16 phy_flags); | ||
635 | extern int is_duplicate_packet(struct iwl_priv *priv, struct ieee80211_hdr | ||
636 | *header); | ||
637 | extern int iwl_rx_queue_alloc(struct iwl_priv *priv); | ||
638 | extern void iwl_rx_queue_reset(struct iwl_priv *priv, | ||
639 | struct iwl_rx_queue *rxq); | ||
640 | extern int iwl_calc_db_from_ratio(int sig_ratio); | ||
641 | extern int iwl_calc_sig_qual(int rssi_dbm, int noise_dbm); | ||
642 | extern int iwl_tx_queue_init(struct iwl_priv *priv, | ||
643 | struct iwl_tx_queue *txq, int count, u32 id); | ||
644 | extern void iwl_rx_replenish(void *data); | ||
645 | extern void iwl_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq); | ||
646 | extern int iwl_send_cmd_pdu(struct iwl_priv *priv, u8 id, u16 len, | ||
647 | const void *data); | ||
648 | extern int __must_check iwl_send_cmd(struct iwl_priv *priv, | ||
649 | struct iwl_host_cmd *cmd); | ||
650 | extern unsigned int iwl_fill_beacon_frame(struct iwl_priv *priv, | ||
651 | struct ieee80211_hdr *hdr, | ||
652 | const u8 *dest, int left); | ||
653 | extern int iwl_rx_queue_update_write_ptr(struct iwl_priv *priv, | ||
654 | struct iwl_rx_queue *q); | ||
655 | extern int iwl_send_statistics_request(struct iwl_priv *priv); | ||
656 | extern void iwl_set_decrypted_flag(struct iwl_priv *priv, struct sk_buff *skb, | ||
657 | u32 decrypt_res, | ||
658 | struct ieee80211_rx_status *stats); | ||
659 | extern __le16 *ieee80211_get_qos_ctrl(struct ieee80211_hdr *hdr); | ||
660 | |||
661 | extern const u8 BROADCAST_ADDR[ETH_ALEN]; | ||
662 | |||
663 | /* | ||
664 | * Currently used by iwl-3945-rs... look at restructuring so that it doesn't | ||
665 | * call this... todo... fix that. | ||
666 | */ | ||
667 | extern u8 iwl_sync_station(struct iwl_priv *priv, int sta_id, | ||
668 | u16 tx_rate, u8 flags); | ||
669 | |||
670 | /****************************************************************************** | ||
671 | * | ||
672 | * Functions implemented in iwl-[34]*.c which are forward declared here | ||
673 | * for use by iwl-base.c | ||
674 | * | ||
675 | * NOTE: The implementation of these functions are hardware specific | ||
676 | * which is why they are in the hardware specific files (vs. iwl-base.c) | ||
677 | * | ||
678 | * Naming convention -- | ||
679 | * iwl_ <-- Its part of iwlwifi (should be changed to iwl_) | ||
680 | * iwl_hw_ <-- Hardware specific (implemented in iwl-XXXX.c by all HW) | ||
681 | * iwlXXXX_ <-- Hardware specific (implemented in iwl-XXXX.c for XXXX) | ||
682 | * iwl_bg_ <-- Called from work queue context | ||
683 | * iwl_mac_ <-- mac80211 callback | ||
684 | * | ||
685 | ****************************************************************************/ | ||
686 | extern void iwl_hw_rx_handler_setup(struct iwl_priv *priv); | ||
687 | extern void iwl_hw_setup_deferred_work(struct iwl_priv *priv); | ||
688 | extern void iwl_hw_cancel_deferred_work(struct iwl_priv *priv); | ||
689 | extern int iwl_hw_rxq_stop(struct iwl_priv *priv); | ||
690 | extern int iwl_hw_set_hw_setting(struct iwl_priv *priv); | ||
691 | extern int iwl_hw_nic_init(struct iwl_priv *priv); | ||
692 | extern int iwl_hw_nic_stop_master(struct iwl_priv *priv); | ||
693 | extern void iwl_hw_txq_ctx_free(struct iwl_priv *priv); | ||
694 | extern void iwl_hw_txq_ctx_stop(struct iwl_priv *priv); | ||
695 | extern int iwl_hw_nic_reset(struct iwl_priv *priv); | ||
696 | extern int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *tfd, | ||
697 | dma_addr_t addr, u16 len); | ||
698 | extern int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq); | ||
699 | extern int iwl_hw_get_temperature(struct iwl_priv *priv); | ||
700 | extern int iwl_hw_tx_queue_init(struct iwl_priv *priv, | ||
701 | struct iwl_tx_queue *txq); | ||
702 | extern unsigned int iwl_hw_get_beacon_cmd(struct iwl_priv *priv, | ||
703 | struct iwl_frame *frame, u8 rate); | ||
704 | extern int iwl_hw_get_rx_read(struct iwl_priv *priv); | ||
705 | extern void iwl_hw_build_tx_cmd_rate(struct iwl_priv *priv, | ||
706 | struct iwl_cmd *cmd, | ||
707 | struct ieee80211_tx_control *ctrl, | ||
708 | struct ieee80211_hdr *hdr, | ||
709 | int sta_id, int tx_id); | ||
710 | extern int iwl_hw_reg_send_txpower(struct iwl_priv *priv); | ||
711 | extern int iwl_hw_reg_set_txpower(struct iwl_priv *priv, s8 power); | ||
712 | extern void iwl_hw_rx_statistics(struct iwl_priv *priv, | ||
713 | struct iwl_rx_mem_buffer *rxb); | ||
714 | extern void iwl_disable_events(struct iwl_priv *priv); | ||
715 | extern int iwl4965_get_temperature(const struct iwl_priv *priv); | ||
716 | |||
717 | /** | ||
718 | * iwl_hw_find_station - Find station id for a given BSSID | ||
719 | * @bssid: MAC address of station ID to find | ||
720 | * | ||
721 | * NOTE: This should not be hardware specific but the code has | ||
722 | * not yet been merged into a single common layer for managing the | ||
723 | * station tables. | ||
724 | */ | ||
725 | extern u8 iwl_hw_find_station(struct iwl_priv *priv, const u8 *bssid); | ||
726 | |||
727 | extern int iwl_hw_channel_switch(struct iwl_priv *priv, u16 channel); | ||
728 | extern int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index); | ||
729 | |||
29 | struct iwl_priv; | 730 | struct iwl_priv; |
30 | struct sta_ht_info; | 731 | struct sta_ht_info; |
31 | 732 | ||
@@ -338,4 +1039,322 @@ struct iwl_chain_noise_data { | |||
338 | #define EEPROM_SEM_TIMEOUT 10 | 1039 | #define EEPROM_SEM_TIMEOUT 10 |
339 | #define EEPROM_SEM_RETRY_LIMIT 1000 | 1040 | #define EEPROM_SEM_RETRY_LIMIT 1000 |
340 | 1041 | ||
1042 | |||
1043 | #ifdef CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT | ||
1044 | |||
1045 | enum { | ||
1046 | MEASUREMENT_READY = (1 << 0), | ||
1047 | MEASUREMENT_ACTIVE = (1 << 1), | ||
1048 | }; | ||
1049 | |||
1050 | #endif | ||
1051 | |||
1052 | struct iwl_priv { | ||
1053 | |||
1054 | /* ieee device used by generic ieee processing code */ | ||
1055 | struct ieee80211_hw *hw; | ||
1056 | struct ieee80211_channel *ieee_channels; | ||
1057 | struct ieee80211_rate *ieee_rates; | ||
1058 | |||
1059 | /* temporary frame storage list */ | ||
1060 | struct list_head free_frames; | ||
1061 | int frames_count; | ||
1062 | |||
1063 | u8 phymode; | ||
1064 | int alloc_rxb_skb; | ||
1065 | |||
1066 | void (*rx_handlers[REPLY_MAX])(struct iwl_priv *priv, | ||
1067 | struct iwl_rx_mem_buffer *rxb); | ||
1068 | |||
1069 | const struct ieee80211_hw_mode *modes; | ||
1070 | |||
1071 | #ifdef CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT | ||
1072 | /* spectrum measurement report caching */ | ||
1073 | struct iwl_spectrum_notification measure_report; | ||
1074 | u8 measurement_status; | ||
1075 | #endif | ||
1076 | /* ucode beacon time */ | ||
1077 | u32 ucode_beacon_time; | ||
1078 | |||
1079 | /* we allocate array of iwl_channel_info for NIC's valid channels. | ||
1080 | * Access via channel # using indirect index array */ | ||
1081 | struct iwl_channel_info *channel_info; /* channel info array */ | ||
1082 | u8 channel_count; /* # of channels */ | ||
1083 | |||
1084 | /* each calibration channel group in the EEPROM has a derived | ||
1085 | * clip setting for each rate. */ | ||
1086 | const struct iwl_clip_group clip_groups[5]; | ||
1087 | |||
1088 | /* thermal calibration */ | ||
1089 | s32 temperature; /* degrees Kelvin */ | ||
1090 | s32 last_temperature; | ||
1091 | |||
1092 | /* Scan related variables */ | ||
1093 | unsigned long last_scan_jiffies; | ||
1094 | unsigned long scan_start; | ||
1095 | unsigned long scan_pass_start; | ||
1096 | unsigned long scan_start_tsf; | ||
1097 | int scan_bands; | ||
1098 | int one_direct_scan; | ||
1099 | u8 direct_ssid_len; | ||
1100 | u8 direct_ssid[IW_ESSID_MAX_SIZE]; | ||
1101 | struct iwl_scan_cmd *scan; | ||
1102 | u8 only_active_channel; | ||
1103 | |||
1104 | /* spinlock */ | ||
1105 | spinlock_t lock; /* protect general shared data */ | ||
1106 | spinlock_t hcmd_lock; /* protect hcmd */ | ||
1107 | struct mutex mutex; | ||
1108 | |||
1109 | /* basic pci-network driver stuff */ | ||
1110 | struct pci_dev *pci_dev; | ||
1111 | |||
1112 | /* pci hardware address support */ | ||
1113 | void __iomem *hw_base; | ||
1114 | |||
1115 | /* uCode images, save to reload in case of failure */ | ||
1116 | struct fw_desc ucode_code; /* runtime inst */ | ||
1117 | struct fw_desc ucode_data; /* runtime data original */ | ||
1118 | struct fw_desc ucode_data_backup; /* runtime data save/restore */ | ||
1119 | struct fw_desc ucode_init; /* initialization inst */ | ||
1120 | struct fw_desc ucode_init_data; /* initialization data */ | ||
1121 | struct fw_desc ucode_boot; /* bootstrap inst */ | ||
1122 | |||
1123 | |||
1124 | struct iwl_rxon_time_cmd rxon_timing; | ||
1125 | |||
1126 | /* We declare this const so it can only be | ||
1127 | * changed via explicit cast within the | ||
1128 | * routines that actually update the physical | ||
1129 | * hardware */ | ||
1130 | const struct iwl_rxon_cmd active_rxon; | ||
1131 | struct iwl_rxon_cmd staging_rxon; | ||
1132 | |||
1133 | int error_recovering; | ||
1134 | struct iwl_rxon_cmd recovery_rxon; | ||
1135 | |||
1136 | /* 1st responses from initialize and runtime uCode images. | ||
1137 | * 4965's initialize alive response contains some calibration data. */ | ||
1138 | struct iwl_init_alive_resp card_alive_init; | ||
1139 | struct iwl_alive_resp card_alive; | ||
1140 | |||
1141 | #ifdef LED | ||
1142 | /* LED related variables */ | ||
1143 | struct iwl_activity_blink activity; | ||
1144 | unsigned long led_packets; | ||
1145 | int led_state; | ||
1146 | #endif | ||
1147 | |||
1148 | u16 active_rate; | ||
1149 | u16 active_rate_basic; | ||
1150 | |||
1151 | u8 call_post_assoc_from_beacon; | ||
1152 | u8 assoc_station_added; | ||
1153 | u8 use_ant_b_for_management_frame; /* Tx antenna selection */ | ||
1154 | /* HT variables */ | ||
1155 | u8 is_dup; | ||
1156 | u8 is_ht_enabled; | ||
1157 | u8 channel_width; /* 0=20MHZ, 1=40MHZ */ | ||
1158 | u8 current_channel_width; | ||
1159 | u8 valid_antenna; /* Bit mask of antennas actually connected */ | ||
1160 | #ifdef CONFIG_IWLWIFI_SENSITIVITY | ||
1161 | struct iwl_sensitivity_data sensitivity_data; | ||
1162 | struct iwl_chain_noise_data chain_noise_data; | ||
1163 | u8 start_calib; | ||
1164 | __le16 sensitivity_tbl[HD_TABLE_SIZE]; | ||
1165 | #endif /*CONFIG_IWLWIFI_SENSITIVITY*/ | ||
1166 | |||
1167 | #ifdef CONFIG_IWLWIFI_HT | ||
1168 | struct sta_ht_info current_assoc_ht; | ||
1169 | #endif | ||
1170 | u8 active_rate_ht[2]; | ||
1171 | u8 last_phy_res[100]; | ||
1172 | |||
1173 | /* Rate scaling data */ | ||
1174 | struct iwl_lq_mngr lq_mngr; | ||
1175 | |||
1176 | /* Rate scaling data */ | ||
1177 | s8 data_retry_limit; | ||
1178 | u8 retry_rate; | ||
1179 | |||
1180 | wait_queue_head_t wait_command_queue; | ||
1181 | |||
1182 | int activity_timer_active; | ||
1183 | |||
1184 | /* Rx and Tx DMA processing queues */ | ||
1185 | struct iwl_rx_queue rxq; | ||
1186 | struct iwl_tx_queue txq[IWL_MAX_NUM_QUEUES]; | ||
1187 | unsigned long txq_ctx_active_msk; | ||
1188 | struct iwl_kw kw; /* keep warm address */ | ||
1189 | u32 scd_base_addr; /* scheduler sram base address */ | ||
1190 | |||
1191 | unsigned long status; | ||
1192 | u32 config; | ||
1193 | |||
1194 | int last_rx_rssi; /* From Rx packet statisitics */ | ||
1195 | int last_rx_noise; /* From beacon statistics */ | ||
1196 | |||
1197 | struct iwl_power_mgr power_data; | ||
1198 | |||
1199 | struct iwl_notif_statistics statistics; | ||
1200 | unsigned long last_statistics_time; | ||
1201 | |||
1202 | /* context information */ | ||
1203 | u8 essid[IW_ESSID_MAX_SIZE]; | ||
1204 | u8 essid_len; | ||
1205 | u16 rates_mask; | ||
1206 | |||
1207 | u32 power_mode; | ||
1208 | u32 antenna; | ||
1209 | u8 bssid[ETH_ALEN]; | ||
1210 | u16 rts_threshold; | ||
1211 | u8 mac_addr[ETH_ALEN]; | ||
1212 | |||
1213 | /*station table variables */ | ||
1214 | spinlock_t sta_lock; | ||
1215 | int num_stations; | ||
1216 | struct iwl_station_entry stations[IWL_STATION_COUNT]; | ||
1217 | |||
1218 | /* Indication if ieee80211_ops->open has been called */ | ||
1219 | int is_open; | ||
1220 | |||
1221 | u8 mac80211_registered; | ||
1222 | int is_abg; | ||
1223 | |||
1224 | u32 notif_missed_beacons; | ||
1225 | |||
1226 | /* Rx'd packet timing information */ | ||
1227 | u32 last_beacon_time; | ||
1228 | u64 last_tsf; | ||
1229 | |||
1230 | /* Duplicate packet detection */ | ||
1231 | u16 last_seq_num; | ||
1232 | u16 last_frag_num; | ||
1233 | unsigned long last_packet_time; | ||
1234 | struct list_head ibss_mac_hash[IWL_IBSS_MAC_HASH_SIZE]; | ||
1235 | |||
1236 | /* eeprom */ | ||
1237 | struct iwl_eeprom eeprom; | ||
1238 | |||
1239 | int iw_mode; | ||
1240 | |||
1241 | struct sk_buff *ibss_beacon; | ||
1242 | |||
1243 | /* Last Rx'd beacon timestamp */ | ||
1244 | u32 timestamp0; | ||
1245 | u32 timestamp1; | ||
1246 | u16 beacon_int; | ||
1247 | struct iwl_driver_hw_info hw_setting; | ||
1248 | int interface_id; | ||
1249 | |||
1250 | /* Current association information needed to configure the | ||
1251 | * hardware */ | ||
1252 | u16 assoc_id; | ||
1253 | u16 assoc_capability; | ||
1254 | u8 ps_mode; | ||
1255 | |||
1256 | #ifdef CONFIG_IWLWIFI_QOS | ||
1257 | struct iwl_qos_info qos_data; | ||
1258 | #endif /*CONFIG_IWLWIFI_QOS */ | ||
1259 | |||
1260 | struct workqueue_struct *workqueue; | ||
1261 | |||
1262 | struct work_struct up; | ||
1263 | struct work_struct restart; | ||
1264 | struct work_struct calibrated_work; | ||
1265 | struct work_struct scan_completed; | ||
1266 | struct work_struct rx_replenish; | ||
1267 | struct work_struct rf_kill; | ||
1268 | struct work_struct abort_scan; | ||
1269 | struct work_struct update_link_led; | ||
1270 | struct work_struct auth_work; | ||
1271 | struct work_struct report_work; | ||
1272 | struct work_struct request_scan; | ||
1273 | struct work_struct beacon_update; | ||
1274 | |||
1275 | struct tasklet_struct irq_tasklet; | ||
1276 | |||
1277 | struct delayed_work init_alive_start; | ||
1278 | struct delayed_work alive_start; | ||
1279 | struct delayed_work activity_timer; | ||
1280 | struct delayed_work thermal_periodic; | ||
1281 | struct delayed_work gather_stats; | ||
1282 | struct delayed_work scan_check; | ||
1283 | struct delayed_work post_associate; | ||
1284 | |||
1285 | #define IWL_DEFAULT_TX_POWER 0x0F | ||
1286 | s8 user_txpower_limit; | ||
1287 | s8 max_channel_txpower_limit; | ||
1288 | |||
1289 | #ifdef CONFIG_PM | ||
1290 | u32 pm_state[16]; | ||
1291 | #endif | ||
1292 | |||
1293 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
1294 | /* debugging info */ | ||
1295 | u32 framecnt_to_us; | ||
1296 | atomic_t restrict_refcnt; | ||
1297 | #endif | ||
1298 | |||
1299 | struct work_struct txpower_work; | ||
1300 | #ifdef CONFIG_IWLWIFI_SENSITIVITY | ||
1301 | struct work_struct sensitivity_work; | ||
1302 | #endif | ||
1303 | struct work_struct statistics_work; | ||
1304 | struct timer_list statistics_periodic; | ||
1305 | |||
1306 | #ifdef CONFIG_IWLWIFI_HT_AGG | ||
1307 | struct work_struct agg_work; | ||
1308 | #endif | ||
1309 | }; /*iwl_priv */ | ||
1310 | |||
1311 | static inline int iwl_is_associated(struct iwl_priv *priv) | ||
1312 | { | ||
1313 | return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; | ||
1314 | } | ||
1315 | |||
1316 | static inline int is_channel_valid(const struct iwl_channel_info *ch_info) | ||
1317 | { | ||
1318 | if (ch_info == NULL) | ||
1319 | return 0; | ||
1320 | return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0; | ||
1321 | } | ||
1322 | |||
1323 | static inline int is_channel_narrow(const struct iwl_channel_info *ch_info) | ||
1324 | { | ||
1325 | return (ch_info->flags & EEPROM_CHANNEL_NARROW) ? 1 : 0; | ||
1326 | } | ||
1327 | |||
1328 | static inline int is_channel_radar(const struct iwl_channel_info *ch_info) | ||
1329 | { | ||
1330 | return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0; | ||
1331 | } | ||
1332 | |||
1333 | static inline u8 is_channel_a_band(const struct iwl_channel_info *ch_info) | ||
1334 | { | ||
1335 | return ch_info->phymode == MODE_IEEE80211A; | ||
1336 | } | ||
1337 | |||
1338 | static inline u8 is_channel_bg_band(const struct iwl_channel_info *ch_info) | ||
1339 | { | ||
1340 | return ((ch_info->phymode == MODE_IEEE80211B) || | ||
1341 | (ch_info->phymode == MODE_IEEE80211G)); | ||
1342 | } | ||
1343 | |||
1344 | static inline int is_channel_passive(const struct iwl_channel_info *ch) | ||
1345 | { | ||
1346 | return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0; | ||
1347 | } | ||
1348 | |||
1349 | static inline int is_channel_ibss(const struct iwl_channel_info *ch) | ||
1350 | { | ||
1351 | return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0; | ||
1352 | } | ||
1353 | |||
1354 | extern const struct iwl_channel_info *iwl_get_channel_info( | ||
1355 | const struct iwl_priv *priv, int phymode, u16 channel); | ||
1356 | |||
1357 | /* Requires full declaration of iwl_priv before including */ | ||
1358 | #include "iwl-4965-io.h" | ||
1359 | |||
341 | #endif /* __iwl_4965_h__ */ | 1360 | #endif /* __iwl_4965_h__ */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-channel.h b/drivers/net/wireless/iwlwifi/iwl-channel.h deleted file mode 100644 index 023c3f240cea..000000000000 --- a/drivers/net/wireless/iwlwifi/iwl-channel.h +++ /dev/null | |||
@@ -1,161 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of version 2 of the GNU General Public License as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA | ||
17 | * | ||
18 | * The full GNU General Public License is included in this distribution in the | ||
19 | * file called LICENSE. | ||
20 | * | ||
21 | * Contact Information: | ||
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | ||
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
24 | * | ||
25 | *****************************************************************************/ | ||
26 | #ifndef __iwl_channel_h__ | ||
27 | #define __iwl_channel_h__ | ||
28 | |||
29 | #define IWL_NUM_SCAN_RATES (2) | ||
30 | |||
31 | struct iwl_channel_tgd_info { | ||
32 | u8 type; | ||
33 | s8 max_power; | ||
34 | }; | ||
35 | |||
36 | struct iwl_channel_tgh_info { | ||
37 | s64 last_radar_time; | ||
38 | }; | ||
39 | |||
40 | /* current Tx power values to use, one for each rate for each channel. | ||
41 | * requested power is limited by: | ||
42 | * -- regulatory EEPROM limits for this channel | ||
43 | * -- hardware capabilities (clip-powers) | ||
44 | * -- spectrum management | ||
45 | * -- user preference (e.g. iwconfig) | ||
46 | * when requested power is set, base power index must also be set. */ | ||
47 | struct iwl_channel_power_info { | ||
48 | struct iwl_tx_power tpc; /* actual radio and DSP gain settings */ | ||
49 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
50 | s8 base_power_index; /* gain index for power at factory temp. */ | ||
51 | s8 requested_power; /* power (dBm) requested for this chnl/rate */ | ||
52 | }; | ||
53 | |||
54 | /* current scan Tx power values to use, one for each scan rate for each | ||
55 | * channel. */ | ||
56 | struct iwl_scan_power_info { | ||
57 | struct iwl_tx_power tpc; /* actual radio and DSP gain settings */ | ||
58 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
59 | s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */ | ||
60 | }; | ||
61 | |||
62 | /* Channel unlock period is 15 seconds. If no beacon or probe response | ||
63 | * has been received within 15 seconds on a locked channel then the channel | ||
64 | * remains locked. */ | ||
65 | #define TX_UNLOCK_PERIOD 15 | ||
66 | |||
67 | /* CSA lock period is 15 seconds. If a CSA has been received on a channel in | ||
68 | * the last 15 seconds, the channel is locked */ | ||
69 | #define CSA_LOCK_PERIOD 15 | ||
70 | /* | ||
71 | * One for each channel, holds all channel setup data | ||
72 | * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant | ||
73 | * with one another! | ||
74 | */ | ||
75 | #define IWL4965_MAX_RATE (33) | ||
76 | |||
77 | struct iwl_channel_info { | ||
78 | struct iwl_channel_tgd_info tgd; | ||
79 | struct iwl_channel_tgh_info tgh; | ||
80 | struct iwl_eeprom_channel eeprom; /* EEPROM regulatory limit */ | ||
81 | struct iwl_eeprom_channel fat_eeprom; /* EEPROM regulatory limit for | ||
82 | * FAT channel */ | ||
83 | |||
84 | u8 channel; /* channel number */ | ||
85 | u8 flags; /* flags copied from EEPROM */ | ||
86 | s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ | ||
87 | s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */ | ||
88 | s8 min_power; /* always 0 */ | ||
89 | s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */ | ||
90 | |||
91 | u8 group_index; /* 0-4, maps channel to group1/2/3/4/5 */ | ||
92 | u8 band_index; /* 0-4, maps channel to band1/2/3/4/5 */ | ||
93 | u8 phymode; /* MODE_IEEE80211{A,B,G} */ | ||
94 | |||
95 | /* Radio/DSP gain settings for each "normal" data Tx rate. | ||
96 | * These include, in addition to RF and DSP gain, a few fields for | ||
97 | * remembering/modifying gain settings (indexes). */ | ||
98 | struct iwl_channel_power_info power_info[IWL4965_MAX_RATE]; | ||
99 | |||
100 | #if IWL == 4965 | ||
101 | /* FAT channel info */ | ||
102 | s8 fat_max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ | ||
103 | s8 fat_curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */ | ||
104 | s8 fat_min_power; /* always 0 */ | ||
105 | s8 fat_scan_power; /* (dBm) eeprom, direct scans, any rate */ | ||
106 | u8 fat_flags; /* flags copied from EEPROM */ | ||
107 | u8 fat_extension_channel; | ||
108 | #endif | ||
109 | |||
110 | /* Radio/DSP gain settings for each scan rate, for directed scans. */ | ||
111 | struct iwl_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES]; | ||
112 | }; | ||
113 | |||
114 | struct iwl_clip_group { | ||
115 | /* maximum power level to prevent clipping for each rate, derived by | ||
116 | * us from this band's saturation power in EEPROM */ | ||
117 | const s8 clip_powers[IWL_MAX_RATES]; | ||
118 | }; | ||
119 | |||
120 | static inline int is_channel_valid(const struct iwl_channel_info *ch_info) | ||
121 | { | ||
122 | if (ch_info == NULL) | ||
123 | return 0; | ||
124 | return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0; | ||
125 | } | ||
126 | |||
127 | static inline int is_channel_narrow(const struct iwl_channel_info *ch_info) | ||
128 | { | ||
129 | return (ch_info->flags & EEPROM_CHANNEL_NARROW) ? 1 : 0; | ||
130 | } | ||
131 | |||
132 | static inline int is_channel_radar(const struct iwl_channel_info *ch_info) | ||
133 | { | ||
134 | return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0; | ||
135 | } | ||
136 | |||
137 | static inline u8 is_channel_a_band(const struct iwl_channel_info *ch_info) | ||
138 | { | ||
139 | return ch_info->phymode == MODE_IEEE80211A; | ||
140 | } | ||
141 | |||
142 | static inline u8 is_channel_bg_band(const struct iwl_channel_info *ch_info) | ||
143 | { | ||
144 | return ((ch_info->phymode == MODE_IEEE80211B) || | ||
145 | (ch_info->phymode == MODE_IEEE80211G)); | ||
146 | } | ||
147 | |||
148 | static inline int is_channel_passive(const struct iwl_channel_info *ch) | ||
149 | { | ||
150 | return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0; | ||
151 | } | ||
152 | |||
153 | static inline int is_channel_ibss(const struct iwl_channel_info *ch) | ||
154 | { | ||
155 | return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0; | ||
156 | } | ||
157 | |||
158 | extern const struct iwl_channel_info *iwl_get_channel_info( | ||
159 | const struct iwl_priv *priv, int phymode, u16 channel); | ||
160 | |||
161 | #endif | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h deleted file mode 100644 index 22cbe278add1..000000000000 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h +++ /dev/null | |||
@@ -1,336 +0,0 @@ | |||
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) 2005 - 2007 Intel Corporation. All rights reserved. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of version 2 of the GNU General Public License as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, but | ||
15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, | ||
22 | * USA | ||
23 | * | ||
24 | * The full GNU General Public License is included in this distribution | ||
25 | * in the file called LICENSE.GPL. | ||
26 | * | ||
27 | * Contact Information: | ||
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | ||
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
30 | * | ||
31 | * BSD LICENSE | ||
32 | * | ||
33 | * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved. | ||
34 | * All rights reserved. | ||
35 | * | ||
36 | * Redistribution and use in source and binary forms, with or without | ||
37 | * modification, are permitted provided that the following conditions | ||
38 | * are met: | ||
39 | * | ||
40 | * * Redistributions of source code must retain the above copyright | ||
41 | * notice, this list of conditions and the following disclaimer. | ||
42 | * * Redistributions in binary form must reproduce the above copyright | ||
43 | * notice, this list of conditions and the following disclaimer in | ||
44 | * the documentation and/or other materials provided with the | ||
45 | * distribution. | ||
46 | * * Neither the name Intel Corporation nor the names of its | ||
47 | * contributors may be used to endorse or promote products derived | ||
48 | * from this software without specific prior written permission. | ||
49 | * | ||
50 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
51 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
52 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
53 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
54 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
55 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
56 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
57 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
58 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
59 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
60 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
61 | * | ||
62 | *****************************************************************************/ | ||
63 | |||
64 | #ifndef __iwl_eeprom_h__ | ||
65 | #define __iwl_eeprom_h__ | ||
66 | |||
67 | /* | ||
68 | * This file defines EEPROM related constants, enums, and inline functions. | ||
69 | * | ||
70 | */ | ||
71 | |||
72 | #define IWL_EEPROM_ACCESS_TIMEOUT 5000 /* uSec */ | ||
73 | #define IWL_EEPROM_ACCESS_DELAY 10 /* uSec */ | ||
74 | /* EEPROM field values */ | ||
75 | #define ANTENNA_SWITCH_NORMAL 0 | ||
76 | #define ANTENNA_SWITCH_INVERSE 1 | ||
77 | |||
78 | enum { | ||
79 | EEPROM_CHANNEL_VALID = (1 << 0), /* usable for this SKU/geo */ | ||
80 | EEPROM_CHANNEL_IBSS = (1 << 1), /* usable as an IBSS channel */ | ||
81 | /* Bit 2 Reserved */ | ||
82 | EEPROM_CHANNEL_ACTIVE = (1 << 3), /* active scanning allowed */ | ||
83 | EEPROM_CHANNEL_RADAR = (1 << 4), /* radar detection required */ | ||
84 | EEPROM_CHANNEL_WIDE = (1 << 5), | ||
85 | EEPROM_CHANNEL_NARROW = (1 << 6), | ||
86 | EEPROM_CHANNEL_DFS = (1 << 7), /* dynamic freq selection candidate */ | ||
87 | }; | ||
88 | |||
89 | /* EEPROM field lengths */ | ||
90 | #define EEPROM_BOARD_PBA_NUMBER_LENGTH 11 | ||
91 | |||
92 | /* EEPROM field lengths */ | ||
93 | #define EEPROM_BOARD_PBA_NUMBER_LENGTH 11 | ||
94 | #define EEPROM_REGULATORY_SKU_ID_LENGTH 4 | ||
95 | #define EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH 14 | ||
96 | #define EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH 13 | ||
97 | #define EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH 12 | ||
98 | #define EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH 11 | ||
99 | #define EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH 6 | ||
100 | |||
101 | #if IWL == 3945 | ||
102 | #define EEPROM_REGULATORY_CHANNELS_LENGTH ( \ | ||
103 | EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH + \ | ||
104 | EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH + \ | ||
105 | EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH + \ | ||
106 | EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH + \ | ||
107 | EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH) | ||
108 | #elif IWL == 4965 | ||
109 | #define EEPROM_REGULATORY_BAND_24_FAT_CHANNELS_LENGTH 7 | ||
110 | #define EEPROM_REGULATORY_BAND_52_FAT_CHANNELS_LENGTH 11 | ||
111 | #define EEPROM_REGULATORY_CHANNELS_LENGTH ( \ | ||
112 | EEPROM_REGULATORY_BAND1_CHANNELS_LENGTH + \ | ||
113 | EEPROM_REGULATORY_BAND2_CHANNELS_LENGTH + \ | ||
114 | EEPROM_REGULATORY_BAND3_CHANNELS_LENGTH + \ | ||
115 | EEPROM_REGULATORY_BAND4_CHANNELS_LENGTH + \ | ||
116 | EEPROM_REGULATORY_BAND5_CHANNELS_LENGTH + \ | ||
117 | EEPROM_REGULATORY_BAND_24_FAT_CHANNELS_LENGTH + \ | ||
118 | EEPROM_REGULATORY_BAND_52_FAT_CHANNELS_LENGTH) | ||
119 | #endif | ||
120 | |||
121 | #define EEPROM_REGULATORY_NUMBER_OF_BANDS 5 | ||
122 | |||
123 | /* SKU Capabilities */ | ||
124 | #define EEPROM_SKU_CAP_SW_RF_KILL_ENABLE (1 << 0) | ||
125 | #define EEPROM_SKU_CAP_HW_RF_KILL_ENABLE (1 << 1) | ||
126 | #define EEPROM_SKU_CAP_OP_MODE_MRC (1 << 7) | ||
127 | |||
128 | /* *regulatory* channel data from eeprom, one for each channel */ | ||
129 | struct iwl_eeprom_channel { | ||
130 | u8 flags; /* flags copied from EEPROM */ | ||
131 | s8 max_power_avg; /* max power (dBm) on this chnl, limit 31 */ | ||
132 | } __attribute__ ((packed)); | ||
133 | |||
134 | /* | ||
135 | * Mapping of a Tx power level, at factory calibration temperature, | ||
136 | * to a radio/DSP gain table index. | ||
137 | * One for each of 5 "sample" power levels in each band. | ||
138 | * v_det is measured at the factory, using the 3945's built-in power amplifier | ||
139 | * (PA) output voltage detector. This same detector is used during Tx of | ||
140 | * long packets in normal operation to provide feedback as to proper output | ||
141 | * level. | ||
142 | * Data copied from EEPROM. | ||
143 | */ | ||
144 | struct iwl_eeprom_txpower_sample { | ||
145 | u8 gain_index; /* index into power (gain) setup table ... */ | ||
146 | s8 power; /* ... for this pwr level for this chnl group */ | ||
147 | u16 v_det; /* PA output voltage */ | ||
148 | } __attribute__ ((packed)); | ||
149 | |||
150 | /* | ||
151 | * Mappings of Tx power levels -> nominal radio/DSP gain table indexes. | ||
152 | * One for each channel group (a.k.a. "band") (1 for BG, 4 for A). | ||
153 | * Tx power setup code interpolates between the 5 "sample" power levels | ||
154 | * to determine the nominal setup for a requested power level. | ||
155 | * Data copied from EEPROM. | ||
156 | * DO NOT ALTER THIS STRUCTURE!!! | ||
157 | */ | ||
158 | struct iwl_eeprom_txpower_group { | ||
159 | struct iwl_eeprom_txpower_sample samples[5]; /* 5 power levels */ | ||
160 | s32 a, b, c, d, e; /* coefficients for voltage->power | ||
161 | * formula (signed) */ | ||
162 | s32 Fa, Fb, Fc, Fd, Fe; /* these modify coeffs based on | ||
163 | * frequency (signed) */ | ||
164 | s8 saturation_power; /* highest power possible by h/w in this | ||
165 | * band */ | ||
166 | u8 group_channel; /* "representative" channel # in this band */ | ||
167 | s16 temperature; /* h/w temperature at factory calib this band | ||
168 | * (signed) */ | ||
169 | } __attribute__ ((packed)); | ||
170 | |||
171 | /* | ||
172 | * Temperature-based Tx-power compensation data, not band-specific. | ||
173 | * These coefficients are use to modify a/b/c/d/e coeffs based on | ||
174 | * difference between current temperature and factory calib temperature. | ||
175 | * Data copied from EEPROM. | ||
176 | */ | ||
177 | struct iwl_eeprom_temperature_corr { | ||
178 | u32 Ta; | ||
179 | u32 Tb; | ||
180 | u32 Tc; | ||
181 | u32 Td; | ||
182 | u32 Te; | ||
183 | } __attribute__ ((packed)); | ||
184 | |||
185 | #if IWL == 4965 | ||
186 | #define EEPROM_TX_POWER_TX_CHAINS (2) | ||
187 | #define EEPROM_TX_POWER_BANDS (8) | ||
188 | #define EEPROM_TX_POWER_MEASUREMENTS (3) | ||
189 | #define EEPROM_TX_POWER_VERSION (2) | ||
190 | #define EEPROM_TX_POWER_VERSION_NEW (5) | ||
191 | |||
192 | struct iwl_eeprom_calib_measure { | ||
193 | u8 temperature; | ||
194 | u8 gain_idx; | ||
195 | u8 actual_pow; | ||
196 | s8 pa_det; | ||
197 | } __attribute__ ((packed)); | ||
198 | |||
199 | struct iwl_eeprom_calib_ch_info { | ||
200 | u8 ch_num; | ||
201 | struct iwl_eeprom_calib_measure measurements[EEPROM_TX_POWER_TX_CHAINS] | ||
202 | [EEPROM_TX_POWER_MEASUREMENTS]; | ||
203 | } __attribute__ ((packed)); | ||
204 | |||
205 | struct iwl_eeprom_calib_subband_info { | ||
206 | u8 ch_from; | ||
207 | u8 ch_to; | ||
208 | struct iwl_eeprom_calib_ch_info ch1; | ||
209 | struct iwl_eeprom_calib_ch_info ch2; | ||
210 | } __attribute__ ((packed)); | ||
211 | |||
212 | struct iwl_eeprom_calib_info { | ||
213 | u8 saturation_power24; | ||
214 | u8 saturation_power52; | ||
215 | s16 voltage; /* signed */ | ||
216 | struct iwl_eeprom_calib_subband_info band_info[EEPROM_TX_POWER_BANDS]; | ||
217 | } __attribute__ ((packed)); | ||
218 | |||
219 | #endif | ||
220 | |||
221 | struct iwl_eeprom { | ||
222 | u8 reserved0[16]; | ||
223 | #define EEPROM_DEVICE_ID (2*0x08) /* 2 bytes */ | ||
224 | u16 device_id; /* abs.ofs: 16 */ | ||
225 | u8 reserved1[2]; | ||
226 | #define EEPROM_PMC (2*0x0A) /* 2 bytes */ | ||
227 | u16 pmc; /* abs.ofs: 20 */ | ||
228 | u8 reserved2[20]; | ||
229 | #define EEPROM_MAC_ADDRESS (2*0x15) /* 6 bytes */ | ||
230 | u8 mac_address[6]; /* abs.ofs: 42 */ | ||
231 | u8 reserved3[58]; | ||
232 | #define EEPROM_BOARD_REVISION (2*0x35) /* 2 bytes */ | ||
233 | u16 board_revision; /* abs.ofs: 106 */ | ||
234 | u8 reserved4[11]; | ||
235 | #define EEPROM_BOARD_PBA_NUMBER (2*0x3B+1) /* 9 bytes */ | ||
236 | u8 board_pba_number[9]; /* abs.ofs: 119 */ | ||
237 | u8 reserved5[8]; | ||
238 | #define EEPROM_VERSION (2*0x44) /* 2 bytes */ | ||
239 | u16 version; /* abs.ofs: 136 */ | ||
240 | #define EEPROM_SKU_CAP (2*0x45) /* 1 bytes */ | ||
241 | u8 sku_cap; /* abs.ofs: 138 */ | ||
242 | #define EEPROM_LEDS_MODE (2*0x45+1) /* 1 bytes */ | ||
243 | u8 leds_mode; /* abs.ofs: 139 */ | ||
244 | #define EEPROM_OEM_MODE (2*0x46) /* 2 bytes */ | ||
245 | u16 oem_mode; | ||
246 | #define EEPROM_WOWLAN_MODE (2*0x47) /* 2 bytes */ | ||
247 | u16 wowlan_mode; /* abs.ofs: 142 */ | ||
248 | #define EEPROM_LEDS_TIME_INTERVAL (2*0x48) /* 2 bytes */ | ||
249 | u16 leds_time_interval; /* abs.ofs: 144 */ | ||
250 | #define EEPROM_LEDS_OFF_TIME (2*0x49) /* 1 bytes */ | ||
251 | u8 leds_off_time; /* abs.ofs: 146 */ | ||
252 | #define EEPROM_LEDS_ON_TIME (2*0x49+1) /* 1 bytes */ | ||
253 | u8 leds_on_time; /* abs.ofs: 147 */ | ||
254 | #define EEPROM_ALMGOR_M_VERSION (2*0x4A) /* 1 bytes */ | ||
255 | u8 almgor_m_version; /* abs.ofs: 148 */ | ||
256 | #define EEPROM_ANTENNA_SWITCH_TYPE (2*0x4A+1) /* 1 bytes */ | ||
257 | u8 antenna_switch_type; /* abs.ofs: 149 */ | ||
258 | #if IWL == 3945 | ||
259 | u8 reserved6[42]; | ||
260 | #else | ||
261 | u8 reserved6[8]; | ||
262 | #define EEPROM_4965_BOARD_REVISION (2*0x4F) /* 2 bytes */ | ||
263 | u16 board_revision_4965; /* abs.ofs: 158 */ | ||
264 | u8 reserved7[13]; | ||
265 | #define EEPROM_4965_BOARD_PBA (2*0x56+1) /* 9 bytes */ | ||
266 | u8 board_pba_number_4965[9]; /* abs.ofs: 173 */ | ||
267 | u8 reserved8[10]; | ||
268 | #endif | ||
269 | #define EEPROM_REGULATORY_SKU_ID (2*0x60) /* 4 bytes */ | ||
270 | u8 sku_id[4]; /* abs.ofs: 192 */ | ||
271 | #define EEPROM_REGULATORY_BAND_1 (2*0x62) /* 2 bytes */ | ||
272 | u16 band_1_count; /* abs.ofs: 196 */ | ||
273 | #define EEPROM_REGULATORY_BAND_1_CHANNELS (2*0x63) /* 28 bytes */ | ||
274 | struct iwl_eeprom_channel band_1_channels[14]; /* abs.ofs: 196 */ | ||
275 | #define EEPROM_REGULATORY_BAND_2 (2*0x71) /* 2 bytes */ | ||
276 | u16 band_2_count; /* abs.ofs: 226 */ | ||
277 | #define EEPROM_REGULATORY_BAND_2_CHANNELS (2*0x72) /* 26 bytes */ | ||
278 | struct iwl_eeprom_channel band_2_channels[13]; /* abs.ofs: 228 */ | ||
279 | #define EEPROM_REGULATORY_BAND_3 (2*0x7F) /* 2 bytes */ | ||
280 | u16 band_3_count; /* abs.ofs: 254 */ | ||
281 | #define EEPROM_REGULATORY_BAND_3_CHANNELS (2*0x80) /* 24 bytes */ | ||
282 | struct iwl_eeprom_channel band_3_channels[12]; /* abs.ofs: 256 */ | ||
283 | #define EEPROM_REGULATORY_BAND_4 (2*0x8C) /* 2 bytes */ | ||
284 | u16 band_4_count; /* abs.ofs: 280 */ | ||
285 | #define EEPROM_REGULATORY_BAND_4_CHANNELS (2*0x8D) /* 22 bytes */ | ||
286 | struct iwl_eeprom_channel band_4_channels[11]; /* abs.ofs: 282 */ | ||
287 | #define EEPROM_REGULATORY_BAND_5 (2*0x98) /* 2 bytes */ | ||
288 | u16 band_5_count; /* abs.ofs: 304 */ | ||
289 | #define EEPROM_REGULATORY_BAND_5_CHANNELS (2*0x99) /* 12 bytes */ | ||
290 | struct iwl_eeprom_channel band_5_channels[6]; /* abs.ofs: 306 */ | ||
291 | |||
292 | /* From here on out the EEPROM diverges between the 4965 and the 3945 */ | ||
293 | #if IWL == 3945 | ||
294 | |||
295 | u8 reserved9[194]; | ||
296 | |||
297 | #define EEPROM_TXPOWER_CALIB_GROUP0 0x200 | ||
298 | #define EEPROM_TXPOWER_CALIB_GROUP1 0x240 | ||
299 | #define EEPROM_TXPOWER_CALIB_GROUP2 0x280 | ||
300 | #define EEPROM_TXPOWER_CALIB_GROUP3 0x2c0 | ||
301 | #define EEPROM_TXPOWER_CALIB_GROUP4 0x300 | ||
302 | #define IWL_NUM_TX_CALIB_GROUPS 5 | ||
303 | struct iwl_eeprom_txpower_group groups[IWL_NUM_TX_CALIB_GROUPS]; | ||
304 | /* abs.ofs: 512 */ | ||
305 | #define EEPROM_CALIB_TEMPERATURE_CORRECT 0x340 | ||
306 | struct iwl_eeprom_temperature_corr corrections; /* abs.ofs: 832 */ | ||
307 | u8 reserved16[172]; /* fill out to full 1024 byte block */ | ||
308 | |||
309 | /* 4965AGN adds fat channel support */ | ||
310 | #elif IWL == 4965 | ||
311 | |||
312 | u8 reserved10[2]; | ||
313 | #define EEPROM_REGULATORY_BAND_24_FAT_CHANNELS (2*0xA0) /* 14 bytes */ | ||
314 | struct iwl_eeprom_channel band_24_channels[7]; /* abs.ofs: 320 */ | ||
315 | u8 reserved11[2]; | ||
316 | #define EEPROM_REGULATORY_BAND_52_FAT_CHANNELS (2*0xA8) /* 22 bytes */ | ||
317 | struct iwl_eeprom_channel band_52_channels[11]; /* abs.ofs: 336 */ | ||
318 | u8 reserved12[6]; | ||
319 | #define EEPROM_CALIB_VERSION_OFFSET (2*0xB6) /* 2 bytes */ | ||
320 | u16 calib_version; /* abs.ofs: 364 */ | ||
321 | u8 reserved13[2]; | ||
322 | #define EEPROM_SATURATION_POWER_OFFSET (2*0xB8) /* 2 bytes */ | ||
323 | u16 satruation_power; /* abs.ofs: 368 */ | ||
324 | u8 reserved14[94]; | ||
325 | #define EEPROM_IWL_CALIB_TXPOWER_OFFSET (2*0xE8) /* 48 bytes */ | ||
326 | struct iwl_eeprom_calib_info calib_info; /* abs.ofs: 464 */ | ||
327 | |||
328 | u8 reserved16[140]; /* fill out to full 1024 byte block */ | ||
329 | |||
330 | #endif | ||
331 | |||
332 | } __attribute__ ((packed)); | ||
333 | |||
334 | #define IWL_EEPROM_IMAGE_SIZE 1024 | ||
335 | |||
336 | #endif | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-hw.h b/drivers/net/wireless/iwlwifi/iwl-hw.h deleted file mode 100644 index 8968a95352d9..000000000000 --- a/drivers/net/wireless/iwlwifi/iwl-hw.h +++ /dev/null | |||
@@ -1,537 +0,0 @@ | |||
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) 2005 - 2007 Intel Corporation. All rights reserved. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of version 2 of the GNU General Public License as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, but | ||
15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
17 | * General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, | ||
22 | * USA | ||
23 | * | ||
24 | * The full GNU General Public License is included in this distribution | ||
25 | * in the file called LICENSE.GPL. | ||
26 | * | ||
27 | * Contact Information: | ||
28 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | ||
29 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
30 | * | ||
31 | * BSD LICENSE | ||
32 | * | ||
33 | * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved. | ||
34 | * All rights reserved. | ||
35 | * | ||
36 | * Redistribution and use in source and binary forms, with or without | ||
37 | * modification, are permitted provided that the following conditions | ||
38 | * are met: | ||
39 | * | ||
40 | * * Redistributions of source code must retain the above copyright | ||
41 | * notice, this list of conditions and the following disclaimer. | ||
42 | * * Redistributions in binary form must reproduce the above copyright | ||
43 | * notice, this list of conditions and the following disclaimer in | ||
44 | * the documentation and/or other materials provided with the | ||
45 | * distribution. | ||
46 | * * Neither the name Intel Corporation nor the names of its | ||
47 | * contributors may be used to endorse or promote products derived | ||
48 | * from this software without specific prior written permission. | ||
49 | * | ||
50 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
51 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
52 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
53 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
54 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
55 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
56 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
57 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
58 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
59 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
60 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
61 | *****************************************************************************/ | ||
62 | |||
63 | #ifndef __iwlwifi_hw_h__ | ||
64 | #define __iwlwifi_hw_h__ | ||
65 | |||
66 | /* | ||
67 | * This file defines hardware constants common to 3945 and 4965. | ||
68 | * | ||
69 | * Device-specific constants are defined in iwl-3945-hw.h and iwl-4965-hw.h, | ||
70 | * although this file contains a few definitions for which the .c | ||
71 | * implementation is the same for 3945 and 4965, except for the value of | ||
72 | * a constant. | ||
73 | * | ||
74 | * uCode API constants are defined in iwl-commands.h. | ||
75 | * | ||
76 | * NOTE: DO NOT PUT OS IMPLEMENTATION-SPECIFIC DECLARATIONS HERE | ||
77 | * | ||
78 | * The iwl-*hw.h (and files they include) files should remain OS/driver | ||
79 | * implementation independent, declaring only the hardware interface. | ||
80 | */ | ||
81 | |||
82 | /* uCode queue management definitions */ | ||
83 | #define IWL_CMD_QUEUE_NUM 4 | ||
84 | #define IWL_CMD_FIFO_NUM 4 | ||
85 | #define IWL_BACK_QUEUE_FIRST_ID 7 | ||
86 | |||
87 | /* Tx rates */ | ||
88 | #define IWL_CCK_RATES 4 | ||
89 | #define IWL_OFDM_RATES 8 | ||
90 | |||
91 | #if IWL == 3945 | ||
92 | #define IWL_HT_RATES 0 | ||
93 | #elif IWL == 4965 | ||
94 | #define IWL_HT_RATES 16 | ||
95 | #endif | ||
96 | |||
97 | #define IWL_MAX_RATES (IWL_CCK_RATES+IWL_OFDM_RATES+IWL_HT_RATES) | ||
98 | |||
99 | /* Time constants */ | ||
100 | #define SHORT_SLOT_TIME 9 | ||
101 | #define LONG_SLOT_TIME 20 | ||
102 | |||
103 | /* RSSI to dBm */ | ||
104 | #if IWL == 3945 | ||
105 | #define IWL_RSSI_OFFSET 95 | ||
106 | #elif IWL == 4965 | ||
107 | #define IWL_RSSI_OFFSET 44 | ||
108 | #endif | ||
109 | |||
110 | #include "iwl-eeprom.h" | ||
111 | #include "iwl-commands.h" | ||
112 | |||
113 | #define PCI_LINK_CTRL 0x0F0 | ||
114 | #define PCI_POWER_SOURCE 0x0C8 | ||
115 | #define PCI_REG_WUM8 0x0E8 | ||
116 | #define PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT (0x80000000) | ||
117 | |||
118 | /*=== CSR (control and status registers) ===*/ | ||
119 | #define CSR_BASE (0x000) | ||
120 | |||
121 | #define CSR_SW_VER (CSR_BASE+0x000) | ||
122 | #define CSR_HW_IF_CONFIG_REG (CSR_BASE+0x000) /* hardware interface config */ | ||
123 | #define CSR_INT_COALESCING (CSR_BASE+0x004) /* accum ints, 32-usec units */ | ||
124 | #define CSR_INT (CSR_BASE+0x008) /* host interrupt status/ack */ | ||
125 | #define CSR_INT_MASK (CSR_BASE+0x00c) /* host interrupt enable */ | ||
126 | #define CSR_FH_INT_STATUS (CSR_BASE+0x010) /* busmaster int status/ack*/ | ||
127 | #define CSR_GPIO_IN (CSR_BASE+0x018) /* read external chip pins */ | ||
128 | #define CSR_RESET (CSR_BASE+0x020) /* busmaster enable, NMI, etc*/ | ||
129 | #define CSR_GP_CNTRL (CSR_BASE+0x024) | ||
130 | #define CSR_HW_REV (CSR_BASE+0x028) | ||
131 | #define CSR_EEPROM_REG (CSR_BASE+0x02c) | ||
132 | #define CSR_EEPROM_GP (CSR_BASE+0x030) | ||
133 | #define CSR_GP_UCODE (CSR_BASE+0x044) | ||
134 | #define CSR_UCODE_DRV_GP1 (CSR_BASE+0x054) | ||
135 | #define CSR_UCODE_DRV_GP1_SET (CSR_BASE+0x058) | ||
136 | #define CSR_UCODE_DRV_GP1_CLR (CSR_BASE+0x05c) | ||
137 | #define CSR_UCODE_DRV_GP2 (CSR_BASE+0x060) | ||
138 | #define CSR_LED_REG (CSR_BASE+0x094) | ||
139 | #define CSR_DRAM_INT_TBL_CTL (CSR_BASE+0x0A0) | ||
140 | #define CSR_GIO_CHICKEN_BITS (CSR_BASE+0x100) | ||
141 | #define CSR_ANA_PLL_CFG (CSR_BASE+0x20c) | ||
142 | #define CSR_HW_REV_WA_REG (CSR_BASE+0x22C) | ||
143 | |||
144 | /* HW I/F configuration */ | ||
145 | #define CSR_HW_IF_CONFIG_REG_BIT_ALMAGOR_MB (0x00000100) | ||
146 | #define CSR_HW_IF_CONFIG_REG_BIT_ALMAGOR_MM (0x00000200) | ||
147 | #define CSR_HW_IF_CONFIG_REG_BIT_SKU_MRC (0x00000400) | ||
148 | #define CSR_HW_IF_CONFIG_REG_BIT_BOARD_TYPE (0x00000800) | ||
149 | #define CSR_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_A (0x00000000) | ||
150 | #define CSR_HW_IF_CONFIG_REG_BITS_SILICON_TYPE_B (0x00001000) | ||
151 | #define CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM (0x00200000) | ||
152 | |||
153 | /* interrupt flags in INTA, set by uCode or hardware (e.g. dma), | ||
154 | * acknowledged (reset) by host writing "1" to flagged bits. */ | ||
155 | #define CSR_INT_BIT_FH_RX (1<<31) /* Rx DMA, cmd responses, FH_INT[17:16] */ | ||
156 | #define CSR_INT_BIT_HW_ERR (1<<29) /* DMA hardware error FH_INT[31] */ | ||
157 | #define CSR_INT_BIT_DNLD (1<<28) /* uCode Download */ | ||
158 | #define CSR_INT_BIT_FH_TX (1<<27) /* Tx DMA FH_INT[1:0] */ | ||
159 | #define CSR_INT_BIT_MAC_CLK_ACTV (1<<26) /* NIC controller's clock toggled on/off */ | ||
160 | #define CSR_INT_BIT_SW_ERR (1<<25) /* uCode error */ | ||
161 | #define CSR_INT_BIT_RF_KILL (1<<7) /* HW RFKILL switch GP_CNTRL[27] toggled */ | ||
162 | #define CSR_INT_BIT_CT_KILL (1<<6) /* Critical temp (chip too hot) rfkill */ | ||
163 | #define CSR_INT_BIT_SW_RX (1<<3) /* Rx, command responses, 3945 */ | ||
164 | #define CSR_INT_BIT_WAKEUP (1<<1) /* NIC controller waking up (pwr mgmt) */ | ||
165 | #define CSR_INT_BIT_ALIVE (1<<0) /* uCode interrupts once it initializes */ | ||
166 | |||
167 | #define CSR_INI_SET_MASK (CSR_INT_BIT_FH_RX | \ | ||
168 | CSR_INT_BIT_HW_ERR | \ | ||
169 | CSR_INT_BIT_FH_TX | \ | ||
170 | CSR_INT_BIT_SW_ERR | \ | ||
171 | CSR_INT_BIT_RF_KILL | \ | ||
172 | CSR_INT_BIT_SW_RX | \ | ||
173 | CSR_INT_BIT_WAKEUP | \ | ||
174 | CSR_INT_BIT_ALIVE) | ||
175 | |||
176 | /* interrupt flags in FH (flow handler) (PCI busmaster DMA) */ | ||
177 | #define CSR_FH_INT_BIT_ERR (1<<31) /* Error */ | ||
178 | #define CSR_FH_INT_BIT_HI_PRIOR (1<<30) /* High priority Rx, bypass coalescing */ | ||
179 | #define CSR_FH_INT_BIT_RX_CHNL2 (1<<18) /* Rx channel 2 (3945 only) */ | ||
180 | #define CSR_FH_INT_BIT_RX_CHNL1 (1<<17) /* Rx channel 1 */ | ||
181 | #define CSR_FH_INT_BIT_RX_CHNL0 (1<<16) /* Rx channel 0 */ | ||
182 | #define CSR_FH_INT_BIT_TX_CHNL6 (1<<6) /* Tx channel 6 (3945 only) */ | ||
183 | #define CSR_FH_INT_BIT_TX_CHNL1 (1<<1) /* Tx channel 1 */ | ||
184 | #define CSR_FH_INT_BIT_TX_CHNL0 (1<<0) /* Tx channel 0 */ | ||
185 | |||
186 | #define CSR_FH_INT_RX_MASK (CSR_FH_INT_BIT_HI_PRIOR | \ | ||
187 | CSR_FH_INT_BIT_RX_CHNL2 | \ | ||
188 | CSR_FH_INT_BIT_RX_CHNL1 | \ | ||
189 | CSR_FH_INT_BIT_RX_CHNL0) | ||
190 | |||
191 | #define CSR_FH_INT_TX_MASK (CSR_FH_INT_BIT_TX_CHNL6 | \ | ||
192 | CSR_FH_INT_BIT_TX_CHNL1 | \ | ||
193 | CSR_FH_INT_BIT_TX_CHNL0 ) | ||
194 | |||
195 | |||
196 | /* RESET */ | ||
197 | #define CSR_RESET_REG_FLAG_NEVO_RESET (0x00000001) | ||
198 | #define CSR_RESET_REG_FLAG_FORCE_NMI (0x00000002) | ||
199 | #define CSR_RESET_REG_FLAG_SW_RESET (0x00000080) | ||
200 | #define CSR_RESET_REG_FLAG_MASTER_DISABLED (0x00000100) | ||
201 | #define CSR_RESET_REG_FLAG_STOP_MASTER (0x00000200) | ||
202 | |||
203 | /* GP (general purpose) CONTROL */ | ||
204 | #define CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY (0x00000001) | ||
205 | #define CSR_GP_CNTRL_REG_FLAG_INIT_DONE (0x00000004) | ||
206 | #define CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ (0x00000008) | ||
207 | #define CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP (0x00000010) | ||
208 | |||
209 | #define CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN (0x00000001) | ||
210 | |||
211 | #define CSR_GP_CNTRL_REG_MSK_POWER_SAVE_TYPE (0x07000000) | ||
212 | #define CSR_GP_CNTRL_REG_FLAG_MAC_POWER_SAVE (0x04000000) | ||
213 | #define CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW (0x08000000) | ||
214 | |||
215 | |||
216 | /* EEPROM REG */ | ||
217 | #define CSR_EEPROM_REG_READ_VALID_MSK (0x00000001) | ||
218 | #define CSR_EEPROM_REG_BIT_CMD (0x00000002) | ||
219 | |||
220 | /* EEPROM GP */ | ||
221 | #define CSR_EEPROM_GP_VALID_MSK (0x00000006) | ||
222 | #define CSR_EEPROM_GP_BAD_SIGNATURE (0x00000000) | ||
223 | #define CSR_EEPROM_GP_IF_OWNER_MSK (0x00000180) | ||
224 | |||
225 | /* UCODE DRV GP */ | ||
226 | #define CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP (0x00000001) | ||
227 | #define CSR_UCODE_SW_BIT_RFKILL (0x00000002) | ||
228 | #define CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED (0x00000004) | ||
229 | #define CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT (0x00000008) | ||
230 | |||
231 | /* GPIO */ | ||
232 | #define CSR_GPIO_IN_BIT_AUX_POWER (0x00000200) | ||
233 | #define CSR_GPIO_IN_VAL_VAUX_PWR_SRC (0x00000000) | ||
234 | #define CSR_GPIO_IN_VAL_VMAIN_PWR_SRC CSR_GPIO_IN_BIT_AUX_POWER | ||
235 | |||
236 | /* GI Chicken Bits */ | ||
237 | #define CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX (0x00800000) | ||
238 | #define CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER (0x20000000) | ||
239 | |||
240 | /* CSR_ANA_PLL_CFG */ | ||
241 | #define CSR_ANA_PLL_CFG_SH (0x00880300) | ||
242 | |||
243 | #define CSR_LED_REG_TRUN_ON (0x00000078) | ||
244 | #define CSR_LED_REG_TRUN_OFF (0x00000038) | ||
245 | #define CSR_LED_BSM_CTRL_MSK (0xFFFFFFDF) | ||
246 | |||
247 | /* DRAM_INT_TBL_CTRL */ | ||
248 | #define CSR_DRAM_INT_TBL_CTRL_EN (1<<31) | ||
249 | #define CSR_DRAM_INT_TBL_CTRL_WRAP_CHK (1<<27) | ||
250 | |||
251 | /*=== HBUS (Host-side Bus) ===*/ | ||
252 | #define HBUS_BASE (0x400) | ||
253 | |||
254 | #define HBUS_TARG_MEM_RADDR (HBUS_BASE+0x00c) | ||
255 | #define HBUS_TARG_MEM_WADDR (HBUS_BASE+0x010) | ||
256 | #define HBUS_TARG_MEM_WDAT (HBUS_BASE+0x018) | ||
257 | #define HBUS_TARG_MEM_RDAT (HBUS_BASE+0x01c) | ||
258 | #define HBUS_TARG_PRPH_WADDR (HBUS_BASE+0x044) | ||
259 | #define HBUS_TARG_PRPH_RADDR (HBUS_BASE+0x048) | ||
260 | #define HBUS_TARG_PRPH_WDAT (HBUS_BASE+0x04c) | ||
261 | #define HBUS_TARG_PRPH_RDAT (HBUS_BASE+0x050) | ||
262 | #define HBUS_TARG_WRPTR (HBUS_BASE+0x060) | ||
263 | |||
264 | #define HBUS_TARG_MBX_C (HBUS_BASE+0x030) | ||
265 | |||
266 | |||
267 | /* SCD (Scheduler) */ | ||
268 | #define SCD_BASE (CSR_BASE + 0x2E00) | ||
269 | |||
270 | #define SCD_MODE_REG (SCD_BASE + 0x000) | ||
271 | #define SCD_ARASTAT_REG (SCD_BASE + 0x004) | ||
272 | #define SCD_TXFACT_REG (SCD_BASE + 0x010) | ||
273 | #define SCD_TXF4MF_REG (SCD_BASE + 0x014) | ||
274 | #define SCD_TXF5MF_REG (SCD_BASE + 0x020) | ||
275 | #define SCD_SBYP_MODE_1_REG (SCD_BASE + 0x02C) | ||
276 | #define SCD_SBYP_MODE_2_REG (SCD_BASE + 0x030) | ||
277 | |||
278 | /*=== FH (data Flow Handler) ===*/ | ||
279 | #define FH_BASE (0x800) | ||
280 | |||
281 | #define FH_CBCC_TABLE (FH_BASE+0x140) | ||
282 | #define FH_TFDB_TABLE (FH_BASE+0x180) | ||
283 | #define FH_RCSR_TABLE (FH_BASE+0x400) | ||
284 | #define FH_RSSR_TABLE (FH_BASE+0x4c0) | ||
285 | #define FH_TCSR_TABLE (FH_BASE+0x500) | ||
286 | #define FH_TSSR_TABLE (FH_BASE+0x680) | ||
287 | |||
288 | /* TFDB (Transmit Frame Buffer Descriptor) */ | ||
289 | #define FH_TFDB(_channel, buf) \ | ||
290 | (FH_TFDB_TABLE+((_channel)*2+(buf))*0x28) | ||
291 | #define ALM_FH_TFDB_CHNL_BUF_CTRL_REG(_channel) \ | ||
292 | (FH_TFDB_TABLE + 0x50 * _channel) | ||
293 | /* CBCC _channel is [0,2] */ | ||
294 | #define FH_CBCC(_channel) (FH_CBCC_TABLE+(_channel)*0x8) | ||
295 | #define FH_CBCC_CTRL(_channel) (FH_CBCC(_channel)+0x00) | ||
296 | #define FH_CBCC_BASE(_channel) (FH_CBCC(_channel)+0x04) | ||
297 | |||
298 | /* RCSR _channel is [0,2] */ | ||
299 | #define FH_RCSR(_channel) (FH_RCSR_TABLE+(_channel)*0x40) | ||
300 | #define FH_RCSR_CONFIG(_channel) (FH_RCSR(_channel)+0x00) | ||
301 | #define FH_RCSR_RBD_BASE(_channel) (FH_RCSR(_channel)+0x04) | ||
302 | #define FH_RCSR_WPTR(_channel) (FH_RCSR(_channel)+0x20) | ||
303 | #define FH_RCSR_RPTR_ADDR(_channel) (FH_RCSR(_channel)+0x24) | ||
304 | |||
305 | #if IWL == 3945 | ||
306 | #define FH_RSCSR_CHNL0_WPTR (FH_RCSR_WPTR(0)) | ||
307 | #elif IWL == 4965 | ||
308 | #define FH_RSCSR_CHNL0_WPTR (FH_RSCSR_CHNL0_RBDCB_WPTR_REG) | ||
309 | #endif | ||
310 | |||
311 | /* RSSR */ | ||
312 | #define FH_RSSR_CTRL (FH_RSSR_TABLE+0x000) | ||
313 | #define FH_RSSR_STATUS (FH_RSSR_TABLE+0x004) | ||
314 | /* TCSR */ | ||
315 | #define FH_TCSR(_channel) (FH_TCSR_TABLE+(_channel)*0x20) | ||
316 | #define FH_TCSR_CONFIG(_channel) (FH_TCSR(_channel)+0x00) | ||
317 | #define FH_TCSR_CREDIT(_channel) (FH_TCSR(_channel)+0x04) | ||
318 | #define FH_TCSR_BUFF_STTS(_channel) (FH_TCSR(_channel)+0x08) | ||
319 | /* TSSR */ | ||
320 | #define FH_TSSR_CBB_BASE (FH_TSSR_TABLE+0x000) | ||
321 | #define FH_TSSR_MSG_CONFIG (FH_TSSR_TABLE+0x008) | ||
322 | #define FH_TSSR_TX_STATUS (FH_TSSR_TABLE+0x010) | ||
323 | /* 18 - reserved */ | ||
324 | |||
325 | /* card static random access memory (SRAM) for processor data and instructs */ | ||
326 | #define RTC_INST_LOWER_BOUND (0x000000) | ||
327 | #define RTC_DATA_LOWER_BOUND (0x800000) | ||
328 | |||
329 | |||
330 | /* DBM */ | ||
331 | |||
332 | #define ALM_FH_SRVC_CHNL (6) | ||
333 | |||
334 | #define ALM_FH_RCSR_RX_CONFIG_REG_POS_RBDC_SIZE (20) | ||
335 | #define ALM_FH_RCSR_RX_CONFIG_REG_POS_IRQ_RBTH (4) | ||
336 | |||
337 | #define ALM_FH_RCSR_RX_CONFIG_REG_BIT_WR_STTS_EN (0x08000000) | ||
338 | |||
339 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_DMA_CHNL_EN_ENABLE (0x80000000) | ||
340 | |||
341 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_RDRBD_EN_ENABLE (0x20000000) | ||
342 | |||
343 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_MAX_FRAG_SIZE_128 (0x01000000) | ||
344 | |||
345 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_IRQ_DEST_INT_HOST (0x00001000) | ||
346 | |||
347 | #define ALM_FH_RCSR_RX_CONFIG_REG_VAL_MSG_MODE_FH (0x00000000) | ||
348 | |||
349 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_TXF (0x00000000) | ||
350 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_MSG_MODE_DRIVER (0x00000001) | ||
351 | |||
352 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_DISABLE_VAL (0x00000000) | ||
353 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE_VAL (0x00000008) | ||
354 | |||
355 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_HOST_IFTFD (0x00200000) | ||
356 | |||
357 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_CIRQ_RTC_NOINT (0x00000000) | ||
358 | |||
359 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_PAUSE (0x00000000) | ||
360 | #define ALM_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE (0x80000000) | ||
361 | |||
362 | #define ALM_FH_TCSR_CHNL_TX_BUF_STS_REG_VAL_TFDB_VALID (0x00004000) | ||
363 | |||
364 | #define ALM_FH_TCSR_CHNL_TX_BUF_STS_REG_BIT_TFDB_WPTR (0x00000001) | ||
365 | |||
366 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TXPD_ON (0xFF000000) | ||
367 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_TXPD_ON (0x00FF0000) | ||
368 | |||
369 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_MAX_FRAG_SIZE_128B (0x00000400) | ||
370 | |||
371 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_SNOOP_RD_TFD_ON (0x00000100) | ||
372 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RD_CBB_ON (0x00000080) | ||
373 | |||
374 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_ORDER_RSP_WAIT_TH (0x00000020) | ||
375 | #define ALM_FH_TSSR_TX_MSG_CONFIG_REG_VAL_RSP_WAIT_TH (0x00000005) | ||
376 | |||
377 | #define ALM_TB_MAX_BYTES_COUNT (0xFFF0) | ||
378 | |||
379 | #define ALM_FH_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_channel) \ | ||
380 | ((1LU << _channel) << 24) | ||
381 | #define ALM_FH_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_channel) \ | ||
382 | ((1LU << _channel) << 16) | ||
383 | |||
384 | #define ALM_FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(_channel) \ | ||
385 | (ALM_FH_TSSR_TX_STATUS_REG_BIT_BUFS_EMPTY(_channel) | \ | ||
386 | ALM_FH_TSSR_TX_STATUS_REG_BIT_NO_PEND_REQ(_channel)) | ||
387 | #define PCI_CFG_REV_ID_BIT_BASIC_SKU (0x40) /* bit 6 */ | ||
388 | #define PCI_CFG_REV_ID_BIT_RTP (0x80) /* bit 7 */ | ||
389 | |||
390 | #define HBUS_TARG_MBX_C_REG_BIT_CMD_BLOCKED (0x00000004) | ||
391 | |||
392 | #define TFD_QUEUE_MIN 0 | ||
393 | #define TFD_QUEUE_MAX 6 | ||
394 | #define TFD_QUEUE_SIZE_MAX (256) | ||
395 | |||
396 | /* spectrum and channel data structures */ | ||
397 | #define IWL_NUM_SCAN_RATES (2) | ||
398 | |||
399 | #define IWL_SCAN_FLAG_24GHZ (1<<0) | ||
400 | #define IWL_SCAN_FLAG_52GHZ (1<<1) | ||
401 | #define IWL_SCAN_FLAG_ACTIVE (1<<2) | ||
402 | #define IWL_SCAN_FLAG_DIRECT (1<<3) | ||
403 | |||
404 | #define IWL_MAX_CMD_SIZE 1024 | ||
405 | |||
406 | #define IWL_DEFAULT_TX_RETRY 15 | ||
407 | #define IWL_MAX_TX_RETRY 16 | ||
408 | |||
409 | /*********************************************/ | ||
410 | |||
411 | #define RFD_SIZE 4 | ||
412 | #define NUM_TFD_CHUNKS 4 | ||
413 | |||
414 | #define RX_QUEUE_SIZE 256 | ||
415 | #define RX_QUEUE_MASK 255 | ||
416 | #define RX_QUEUE_SIZE_LOG 8 | ||
417 | |||
418 | /* QoS definitions */ | ||
419 | |||
420 | #define CW_MIN_OFDM 15 | ||
421 | #define CW_MAX_OFDM 1023 | ||
422 | #define CW_MIN_CCK 31 | ||
423 | #define CW_MAX_CCK 1023 | ||
424 | |||
425 | #define QOS_TX0_CW_MIN_OFDM CW_MIN_OFDM | ||
426 | #define QOS_TX1_CW_MIN_OFDM CW_MIN_OFDM | ||
427 | #define QOS_TX2_CW_MIN_OFDM ((CW_MIN_OFDM + 1) / 2 - 1) | ||
428 | #define QOS_TX3_CW_MIN_OFDM ((CW_MIN_OFDM + 1) / 4 - 1) | ||
429 | |||
430 | #define QOS_TX0_CW_MIN_CCK CW_MIN_CCK | ||
431 | #define QOS_TX1_CW_MIN_CCK CW_MIN_CCK | ||
432 | #define QOS_TX2_CW_MIN_CCK ((CW_MIN_CCK + 1) / 2 - 1) | ||
433 | #define QOS_TX3_CW_MIN_CCK ((CW_MIN_CCK + 1) / 4 - 1) | ||
434 | |||
435 | #define QOS_TX0_CW_MAX_OFDM CW_MAX_OFDM | ||
436 | #define QOS_TX1_CW_MAX_OFDM CW_MAX_OFDM | ||
437 | #define QOS_TX2_CW_MAX_OFDM CW_MIN_OFDM | ||
438 | #define QOS_TX3_CW_MAX_OFDM ((CW_MIN_OFDM + 1) / 2 - 1) | ||
439 | |||
440 | #define QOS_TX0_CW_MAX_CCK CW_MAX_CCK | ||
441 | #define QOS_TX1_CW_MAX_CCK CW_MAX_CCK | ||
442 | #define QOS_TX2_CW_MAX_CCK CW_MIN_CCK | ||
443 | #define QOS_TX3_CW_MAX_CCK ((CW_MIN_CCK + 1) / 2 - 1) | ||
444 | |||
445 | #define QOS_TX0_AIFS 3 | ||
446 | #define QOS_TX1_AIFS 7 | ||
447 | #define QOS_TX2_AIFS 2 | ||
448 | #define QOS_TX3_AIFS 2 | ||
449 | |||
450 | #define QOS_TX0_ACM 0 | ||
451 | #define QOS_TX1_ACM 0 | ||
452 | #define QOS_TX2_ACM 0 | ||
453 | #define QOS_TX3_ACM 0 | ||
454 | |||
455 | #define QOS_TX0_TXOP_LIMIT_CCK 0 | ||
456 | #define QOS_TX1_TXOP_LIMIT_CCK 0 | ||
457 | #define QOS_TX2_TXOP_LIMIT_CCK 6016 | ||
458 | #define QOS_TX3_TXOP_LIMIT_CCK 3264 | ||
459 | |||
460 | #define QOS_TX0_TXOP_LIMIT_OFDM 0 | ||
461 | #define QOS_TX1_TXOP_LIMIT_OFDM 0 | ||
462 | #define QOS_TX2_TXOP_LIMIT_OFDM 3008 | ||
463 | #define QOS_TX3_TXOP_LIMIT_OFDM 1504 | ||
464 | |||
465 | #define DEF_TX0_CW_MIN_OFDM CW_MIN_OFDM | ||
466 | #define DEF_TX1_CW_MIN_OFDM CW_MIN_OFDM | ||
467 | #define DEF_TX2_CW_MIN_OFDM CW_MIN_OFDM | ||
468 | #define DEF_TX3_CW_MIN_OFDM CW_MIN_OFDM | ||
469 | |||
470 | #define DEF_TX0_CW_MIN_CCK CW_MIN_CCK | ||
471 | #define DEF_TX1_CW_MIN_CCK CW_MIN_CCK | ||
472 | #define DEF_TX2_CW_MIN_CCK CW_MIN_CCK | ||
473 | #define DEF_TX3_CW_MIN_CCK CW_MIN_CCK | ||
474 | |||
475 | #define DEF_TX0_CW_MAX_OFDM CW_MAX_OFDM | ||
476 | #define DEF_TX1_CW_MAX_OFDM CW_MAX_OFDM | ||
477 | #define DEF_TX2_CW_MAX_OFDM CW_MAX_OFDM | ||
478 | #define DEF_TX3_CW_MAX_OFDM CW_MAX_OFDM | ||
479 | |||
480 | #define DEF_TX0_CW_MAX_CCK CW_MAX_CCK | ||
481 | #define DEF_TX1_CW_MAX_CCK CW_MAX_CCK | ||
482 | #define DEF_TX2_CW_MAX_CCK CW_MAX_CCK | ||
483 | #define DEF_TX3_CW_MAX_CCK CW_MAX_CCK | ||
484 | |||
485 | #define DEF_TX0_AIFS (2) | ||
486 | #define DEF_TX1_AIFS (2) | ||
487 | #define DEF_TX2_AIFS (2) | ||
488 | #define DEF_TX3_AIFS (2) | ||
489 | |||
490 | #define DEF_TX0_ACM 0 | ||
491 | #define DEF_TX1_ACM 0 | ||
492 | #define DEF_TX2_ACM 0 | ||
493 | #define DEF_TX3_ACM 0 | ||
494 | |||
495 | #define DEF_TX0_TXOP_LIMIT_CCK 0 | ||
496 | #define DEF_TX1_TXOP_LIMIT_CCK 0 | ||
497 | #define DEF_TX2_TXOP_LIMIT_CCK 0 | ||
498 | #define DEF_TX3_TXOP_LIMIT_CCK 0 | ||
499 | |||
500 | #define DEF_TX0_TXOP_LIMIT_OFDM 0 | ||
501 | #define DEF_TX1_TXOP_LIMIT_OFDM 0 | ||
502 | #define DEF_TX2_TXOP_LIMIT_OFDM 0 | ||
503 | #define DEF_TX3_TXOP_LIMIT_OFDM 0 | ||
504 | |||
505 | #define QOS_QOS_SETS 3 | ||
506 | #define QOS_PARAM_SET_ACTIVE 0 | ||
507 | #define QOS_PARAM_SET_DEF_CCK 1 | ||
508 | #define QOS_PARAM_SET_DEF_OFDM 2 | ||
509 | |||
510 | #define CTRL_QOS_NO_ACK (0x0020) | ||
511 | #define DCT_FLAG_EXT_QOS_ENABLED (0x10) | ||
512 | |||
513 | #define U32_PAD(n) ((4-(n))&0x3) | ||
514 | |||
515 | /* | ||
516 | * Generic queue structure | ||
517 | * | ||
518 | * Contains common data for Rx and Tx queues | ||
519 | */ | ||
520 | #define TFD_CTL_COUNT_SET(n) (n<<24) | ||
521 | #define TFD_CTL_COUNT_GET(ctl) ((ctl>>24) & 7) | ||
522 | #define TFD_CTL_PAD_SET(n) (n<<28) | ||
523 | #define TFD_CTL_PAD_GET(ctl) (ctl>>28) | ||
524 | |||
525 | #define TFD_TX_CMD_SLOTS 256 | ||
526 | #define TFD_CMD_SLOTS 32 | ||
527 | |||
528 | #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_cmd) - \ | ||
529 | sizeof(struct iwl_cmd_meta)) | ||
530 | |||
531 | /* | ||
532 | * RX related structures and functions | ||
533 | */ | ||
534 | #define RX_FREE_BUFFERS 64 | ||
535 | #define RX_LOW_WATERMARK 8 | ||
536 | |||
537 | #endif /* __iwlwifi_hw_h__ */ | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-priv.h b/drivers/net/wireless/iwlwifi/iwl-priv.h deleted file mode 100644 index c25f2ffccfff..000000000000 --- a/drivers/net/wireless/iwlwifi/iwl-priv.h +++ /dev/null | |||
@@ -1,307 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Copyright(c) 2003 - 2007 Intel Corporation. All rights reserved. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of version 2 of the GNU General Public License as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
12 | * more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License along with | ||
15 | * this program; if not, write to the Free Software Foundation, Inc., | ||
16 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA | ||
17 | * | ||
18 | * The full GNU General Public License is included in this distribution in the | ||
19 | * file called LICENSE. | ||
20 | * | ||
21 | * Contact Information: | ||
22 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | ||
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
24 | * | ||
25 | *****************************************************************************/ | ||
26 | |||
27 | #ifndef __iwl_priv_h__ | ||
28 | #define __iwl_priv_h__ | ||
29 | |||
30 | #include <linux/workqueue.h> | ||
31 | |||
32 | #ifdef CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT | ||
33 | |||
34 | enum { | ||
35 | MEASUREMENT_READY = (1 << 0), | ||
36 | MEASUREMENT_ACTIVE = (1 << 1), | ||
37 | }; | ||
38 | |||
39 | #endif | ||
40 | |||
41 | struct iwl_priv { | ||
42 | |||
43 | /* ieee device used by generic ieee processing code */ | ||
44 | struct ieee80211_hw *hw; | ||
45 | struct ieee80211_channel *ieee_channels; | ||
46 | struct ieee80211_rate *ieee_rates; | ||
47 | |||
48 | /* temporary frame storage list */ | ||
49 | struct list_head free_frames; | ||
50 | int frames_count; | ||
51 | |||
52 | u8 phymode; | ||
53 | int alloc_rxb_skb; | ||
54 | |||
55 | void (*rx_handlers[REPLY_MAX])(struct iwl_priv *priv, | ||
56 | struct iwl_rx_mem_buffer *rxb); | ||
57 | |||
58 | const struct ieee80211_hw_mode *modes; | ||
59 | |||
60 | #ifdef CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT | ||
61 | /* spectrum measurement report caching */ | ||
62 | struct iwl_spectrum_notification measure_report; | ||
63 | u8 measurement_status; | ||
64 | #endif | ||
65 | /* ucode beacon time */ | ||
66 | u32 ucode_beacon_time; | ||
67 | |||
68 | /* we allocate array of iwl_channel_info for NIC's valid channels. | ||
69 | * Access via channel # using indirect index array */ | ||
70 | struct iwl_channel_info *channel_info; /* channel info array */ | ||
71 | u8 channel_count; /* # of channels */ | ||
72 | |||
73 | /* each calibration channel group in the EEPROM has a derived | ||
74 | * clip setting for each rate. */ | ||
75 | const struct iwl_clip_group clip_groups[5]; | ||
76 | |||
77 | /* thermal calibration */ | ||
78 | s32 temperature; /* degrees Kelvin */ | ||
79 | s32 last_temperature; | ||
80 | |||
81 | /* Scan related variables */ | ||
82 | unsigned long last_scan_jiffies; | ||
83 | unsigned long scan_start; | ||
84 | unsigned long scan_pass_start; | ||
85 | unsigned long scan_start_tsf; | ||
86 | int scan_bands; | ||
87 | int one_direct_scan; | ||
88 | u8 direct_ssid_len; | ||
89 | u8 direct_ssid[IW_ESSID_MAX_SIZE]; | ||
90 | struct iwl_scan_cmd *scan; | ||
91 | u8 only_active_channel; | ||
92 | |||
93 | /* spinlock */ | ||
94 | spinlock_t lock; /* protect general shared data */ | ||
95 | spinlock_t hcmd_lock; /* protect hcmd */ | ||
96 | struct mutex mutex; | ||
97 | |||
98 | /* basic pci-network driver stuff */ | ||
99 | struct pci_dev *pci_dev; | ||
100 | |||
101 | /* pci hardware address support */ | ||
102 | void __iomem *hw_base; | ||
103 | |||
104 | /* uCode images, save to reload in case of failure */ | ||
105 | struct fw_desc ucode_code; /* runtime inst */ | ||
106 | struct fw_desc ucode_data; /* runtime data original */ | ||
107 | struct fw_desc ucode_data_backup; /* runtime data save/restore */ | ||
108 | struct fw_desc ucode_init; /* initialization inst */ | ||
109 | struct fw_desc ucode_init_data; /* initialization data */ | ||
110 | struct fw_desc ucode_boot; /* bootstrap inst */ | ||
111 | |||
112 | |||
113 | struct iwl_rxon_time_cmd rxon_timing; | ||
114 | |||
115 | /* We declare this const so it can only be | ||
116 | * changed via explicit cast within the | ||
117 | * routines that actually update the physical | ||
118 | * hardware */ | ||
119 | const struct iwl_rxon_cmd active_rxon; | ||
120 | struct iwl_rxon_cmd staging_rxon; | ||
121 | |||
122 | int error_recovering; | ||
123 | struct iwl_rxon_cmd recovery_rxon; | ||
124 | |||
125 | /* 1st responses from initialize and runtime uCode images. | ||
126 | * 4965's initialize alive response contains some calibration data. */ | ||
127 | struct iwl_init_alive_resp card_alive_init; | ||
128 | struct iwl_alive_resp card_alive; | ||
129 | |||
130 | #ifdef LED | ||
131 | /* LED related variables */ | ||
132 | struct iwl_activity_blink activity; | ||
133 | unsigned long led_packets; | ||
134 | int led_state; | ||
135 | #endif | ||
136 | |||
137 | u16 active_rate; | ||
138 | u16 active_rate_basic; | ||
139 | |||
140 | u8 call_post_assoc_from_beacon; | ||
141 | u8 assoc_station_added; | ||
142 | #if IWL == 4965 | ||
143 | u8 use_ant_b_for_management_frame; /* Tx antenna selection */ | ||
144 | /* HT variables */ | ||
145 | u8 is_dup; | ||
146 | u8 is_ht_enabled; | ||
147 | u8 channel_width; /* 0=20MHZ, 1=40MHZ */ | ||
148 | u8 current_channel_width; | ||
149 | u8 valid_antenna; /* Bit mask of antennas actually connected */ | ||
150 | #ifdef CONFIG_IWLWIFI_SENSITIVITY | ||
151 | struct iwl_sensitivity_data sensitivity_data; | ||
152 | struct iwl_chain_noise_data chain_noise_data; | ||
153 | u8 start_calib; | ||
154 | __le16 sensitivity_tbl[HD_TABLE_SIZE]; | ||
155 | #endif /*CONFIG_IWLWIFI_SENSITIVITY*/ | ||
156 | |||
157 | #ifdef CONFIG_IWLWIFI_HT | ||
158 | struct sta_ht_info current_assoc_ht; | ||
159 | #endif | ||
160 | u8 active_rate_ht[2]; | ||
161 | u8 last_phy_res[100]; | ||
162 | |||
163 | /* Rate scaling data */ | ||
164 | struct iwl_lq_mngr lq_mngr; | ||
165 | #endif | ||
166 | |||
167 | /* Rate scaling data */ | ||
168 | s8 data_retry_limit; | ||
169 | u8 retry_rate; | ||
170 | |||
171 | wait_queue_head_t wait_command_queue; | ||
172 | |||
173 | int activity_timer_active; | ||
174 | |||
175 | /* Rx and Tx DMA processing queues */ | ||
176 | struct iwl_rx_queue rxq; | ||
177 | struct iwl_tx_queue txq[IWL_MAX_NUM_QUEUES]; | ||
178 | #if IWL == 4965 | ||
179 | unsigned long txq_ctx_active_msk; | ||
180 | struct iwl_kw kw; /* keep warm address */ | ||
181 | u32 scd_base_addr; /* scheduler sram base address */ | ||
182 | #endif | ||
183 | |||
184 | unsigned long status; | ||
185 | u32 config; | ||
186 | |||
187 | int last_rx_rssi; /* From Rx packet statisitics */ | ||
188 | int last_rx_noise; /* From beacon statistics */ | ||
189 | |||
190 | struct iwl_power_mgr power_data; | ||
191 | |||
192 | struct iwl_notif_statistics statistics; | ||
193 | unsigned long last_statistics_time; | ||
194 | |||
195 | /* context information */ | ||
196 | u8 essid[IW_ESSID_MAX_SIZE]; | ||
197 | u8 essid_len; | ||
198 | u16 rates_mask; | ||
199 | |||
200 | u32 power_mode; | ||
201 | u32 antenna; | ||
202 | u8 bssid[ETH_ALEN]; | ||
203 | u16 rts_threshold; | ||
204 | u8 mac_addr[ETH_ALEN]; | ||
205 | |||
206 | /*station table variables */ | ||
207 | spinlock_t sta_lock; | ||
208 | int num_stations; | ||
209 | struct iwl_station_entry stations[IWL_STATION_COUNT]; | ||
210 | |||
211 | /* Indication if ieee80211_ops->open has been called */ | ||
212 | int is_open; | ||
213 | |||
214 | u8 mac80211_registered; | ||
215 | int is_abg; | ||
216 | |||
217 | u32 notif_missed_beacons; | ||
218 | |||
219 | /* Rx'd packet timing information */ | ||
220 | u32 last_beacon_time; | ||
221 | u64 last_tsf; | ||
222 | |||
223 | /* Duplicate packet detection */ | ||
224 | u16 last_seq_num; | ||
225 | u16 last_frag_num; | ||
226 | unsigned long last_packet_time; | ||
227 | struct list_head ibss_mac_hash[IWL_IBSS_MAC_HASH_SIZE]; | ||
228 | |||
229 | /* eeprom */ | ||
230 | struct iwl_eeprom eeprom; | ||
231 | |||
232 | int iw_mode; | ||
233 | |||
234 | struct sk_buff *ibss_beacon; | ||
235 | |||
236 | /* Last Rx'd beacon timestamp */ | ||
237 | u32 timestamp0; | ||
238 | u32 timestamp1; | ||
239 | u16 beacon_int; | ||
240 | struct iwl_driver_hw_info hw_setting; | ||
241 | int interface_id; | ||
242 | |||
243 | /* Current association information needed to configure the | ||
244 | * hardware */ | ||
245 | u16 assoc_id; | ||
246 | u16 assoc_capability; | ||
247 | u8 ps_mode; | ||
248 | |||
249 | #ifdef CONFIG_IWLWIFI_QOS | ||
250 | struct iwl_qos_info qos_data; | ||
251 | #endif /*CONFIG_IWLWIFI_QOS */ | ||
252 | |||
253 | struct workqueue_struct *workqueue; | ||
254 | |||
255 | struct work_struct up; | ||
256 | struct work_struct restart; | ||
257 | struct work_struct calibrated_work; | ||
258 | struct work_struct scan_completed; | ||
259 | struct work_struct rx_replenish; | ||
260 | struct work_struct rf_kill; | ||
261 | struct work_struct abort_scan; | ||
262 | struct work_struct update_link_led; | ||
263 | struct work_struct auth_work; | ||
264 | struct work_struct report_work; | ||
265 | struct work_struct request_scan; | ||
266 | struct work_struct beacon_update; | ||
267 | |||
268 | struct tasklet_struct irq_tasklet; | ||
269 | |||
270 | struct delayed_work init_alive_start; | ||
271 | struct delayed_work alive_start; | ||
272 | struct delayed_work activity_timer; | ||
273 | struct delayed_work thermal_periodic; | ||
274 | struct delayed_work gather_stats; | ||
275 | struct delayed_work scan_check; | ||
276 | struct delayed_work post_associate; | ||
277 | |||
278 | #define IWL_DEFAULT_TX_POWER 0x0F | ||
279 | s8 user_txpower_limit; | ||
280 | s8 max_channel_txpower_limit; | ||
281 | |||
282 | #ifdef CONFIG_PM | ||
283 | u32 pm_state[16]; | ||
284 | #endif | ||
285 | |||
286 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
287 | /* debugging info */ | ||
288 | u32 framecnt_to_us; | ||
289 | atomic_t restrict_refcnt; | ||
290 | #endif | ||
291 | |||
292 | #if IWL == 4965 | ||
293 | struct work_struct txpower_work; | ||
294 | #ifdef CONFIG_IWLWIFI_SENSITIVITY | ||
295 | struct work_struct sensitivity_work; | ||
296 | #endif | ||
297 | struct work_struct statistics_work; | ||
298 | struct timer_list statistics_periodic; | ||
299 | |||
300 | #ifdef CONFIG_IWLWIFI_HT_AGG | ||
301 | struct work_struct agg_work; | ||
302 | #endif | ||
303 | |||
304 | #endif /* 4965 */ | ||
305 | }; /*iwl_priv */ | ||
306 | |||
307 | #endif /* __iwl_priv_h__ */ | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 3cccb3db6ff7..b9b67e617fff 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -56,9 +56,6 @@ | |||
56 | 56 | ||
57 | #include <asm/div64.h> | 57 | #include <asm/div64.h> |
58 | 58 | ||
59 | #define IWL 3945 | ||
60 | |||
61 | #include "iwlwifi.h" | ||
62 | #include "iwl-3945.h" | 59 | #include "iwl-3945.h" |
63 | #include "iwl-helpers.h" | 60 | #include "iwl-helpers.h" |
64 | 61 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index 0e46ffde22a7..1e7b589ac865 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
@@ -56,9 +56,6 @@ | |||
56 | 56 | ||
57 | #include <asm/div64.h> | 57 | #include <asm/div64.h> |
58 | 58 | ||
59 | #define IWL 4965 | ||
60 | |||
61 | #include "iwlwifi.h" | ||
62 | #include "iwl-4965.h" | 59 | #include "iwl-4965.h" |
63 | #include "iwl-helpers.h" | 60 | #include "iwl-helpers.h" |
64 | 61 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwlwifi.h b/drivers/net/wireless/iwlwifi/iwlwifi.h deleted file mode 100644 index 96558cc60ae6..000000000000 --- a/drivers/net/wireless/iwlwifi/iwlwifi.h +++ /dev/null | |||
@@ -1,695 +0,0 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Copyright(c) 2003 - 2007 Intel Corporation. All rights reserved. | ||
4 | * | ||
5 | * Portions of this file are derived from the ipw3945 project, as well | ||
6 | * as portions of the ieee80211 subsystem header files. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of version 2 of the GNU General Public License as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
13 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
14 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
15 | * more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License along with | ||
18 | * this program; if not, write to the Free Software Foundation, Inc., | ||
19 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA | ||
20 | * | ||
21 | * The full GNU General Public License is included in this distribution in the | ||
22 | * file called LICENSE. | ||
23 | * | ||
24 | * Contact Information: | ||
25 | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | ||
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
27 | * | ||
28 | *****************************************************************************/ | ||
29 | |||
30 | #ifndef __iwlwifi_h__ | ||
31 | #define __iwlwifi_h__ | ||
32 | |||
33 | #include <linux/pci.h> /* for struct pci_device_id */ | ||
34 | #include <linux/kernel.h> | ||
35 | #include <net/ieee80211_radiotap.h> | ||
36 | |||
37 | struct iwl_priv; | ||
38 | |||
39 | /* Hardware specific file defines the PCI IDs table for that hardware module */ | ||
40 | extern struct pci_device_id iwl_hw_card_ids[]; | ||
41 | |||
42 | #include "iwl-hw.h" | ||
43 | #if IWL == 3945 | ||
44 | #define DRV_NAME "iwl3945" | ||
45 | #include "iwl-3945-hw.h" | ||
46 | #elif IWL == 4965 | ||
47 | #define DRV_NAME "iwl4965" | ||
48 | #include "iwl-4965-hw.h" | ||
49 | #endif | ||
50 | |||
51 | #include "iwl-prph.h" | ||
52 | |||
53 | /* | ||
54 | * Driver implementation data structures, constants, inline | ||
55 | * functions | ||
56 | * | ||
57 | * NOTE: DO NOT PUT HARDWARE/UCODE SPECIFIC DECLARATIONS HERE | ||
58 | * | ||
59 | * Hardware specific declarations go into iwl-*hw.h | ||
60 | * | ||
61 | */ | ||
62 | |||
63 | #include "iwl-debug.h" | ||
64 | |||
65 | /* Default noise level to report when noise measurement is not available. | ||
66 | * This may be because we're: | ||
67 | * 1) Not associated (4965, no beacon statistics being sent to driver) | ||
68 | * 2) Scanning (noise measurement does not apply to associated channel) | ||
69 | * 3) Receiving CCK (3945 delivers noise info only for OFDM frames) | ||
70 | * Use default noise value of -127 ... this is below the range of measurable | ||
71 | * Rx dBm for either 3945 or 4965, so it can indicate "unmeasurable" to user. | ||
72 | * Also, -127 works better than 0 when averaging frames with/without | ||
73 | * noise info (e.g. averaging might be done in app); measured dBm values are | ||
74 | * always negative ... using a negative value as the default keeps all | ||
75 | * averages within an s8's (used in some apps) range of negative values. */ | ||
76 | #define IWL_NOISE_MEAS_NOT_AVAILABLE (-127) | ||
77 | |||
78 | /* Module parameters accessible from iwl-*.c */ | ||
79 | extern int iwl_param_hwcrypto; | ||
80 | extern int iwl_param_queues_num; | ||
81 | |||
82 | enum iwl_antenna { | ||
83 | IWL_ANTENNA_DIVERSITY, | ||
84 | IWL_ANTENNA_MAIN, | ||
85 | IWL_ANTENNA_AUX | ||
86 | }; | ||
87 | |||
88 | /* | ||
89 | * RTS threshold here is total size [2347] minus 4 FCS bytes | ||
90 | * Per spec: | ||
91 | * a value of 0 means RTS on all data/management packets | ||
92 | * a value > max MSDU size means no RTS | ||
93 | * else RTS for data/management frames where MPDU is larger | ||
94 | * than RTS value. | ||
95 | */ | ||
96 | #define DEFAULT_RTS_THRESHOLD 2347U | ||
97 | #define MIN_RTS_THRESHOLD 0U | ||
98 | #define MAX_RTS_THRESHOLD 2347U | ||
99 | #define MAX_MSDU_SIZE 2304U | ||
100 | #define MAX_MPDU_SIZE 2346U | ||
101 | #define DEFAULT_BEACON_INTERVAL 100U | ||
102 | #define DEFAULT_SHORT_RETRY_LIMIT 7U | ||
103 | #define DEFAULT_LONG_RETRY_LIMIT 4U | ||
104 | |||
105 | struct iwl_rx_mem_buffer { | ||
106 | dma_addr_t dma_addr; | ||
107 | struct sk_buff *skb; | ||
108 | struct list_head list; | ||
109 | }; | ||
110 | |||
111 | struct iwl_rt_rx_hdr { | ||
112 | struct ieee80211_radiotap_header rt_hdr; | ||
113 | __le64 rt_tsf; /* TSF */ | ||
114 | u8 rt_flags; /* radiotap packet flags */ | ||
115 | u8 rt_rate; /* rate in 500kb/s */ | ||
116 | __le16 rt_channelMHz; /* channel in MHz */ | ||
117 | __le16 rt_chbitmask; /* channel bitfield */ | ||
118 | s8 rt_dbmsignal; /* signal in dBm, kluged to signed */ | ||
119 | s8 rt_dbmnoise; | ||
120 | u8 rt_antenna; /* antenna number */ | ||
121 | u8 payload[0]; /* payload... */ | ||
122 | } __attribute__ ((packed)); | ||
123 | |||
124 | struct iwl_rt_tx_hdr { | ||
125 | struct ieee80211_radiotap_header rt_hdr; | ||
126 | u8 rt_rate; /* rate in 500kb/s */ | ||
127 | __le16 rt_channel; /* channel in mHz */ | ||
128 | __le16 rt_chbitmask; /* channel bitfield */ | ||
129 | s8 rt_dbmsignal; /* signal in dBm, kluged to signed */ | ||
130 | u8 rt_antenna; /* antenna number */ | ||
131 | u8 payload[0]; /* payload... */ | ||
132 | } __attribute__ ((packed)); | ||
133 | |||
134 | /* | ||
135 | * Generic queue structure | ||
136 | * | ||
137 | * Contains common data for Rx and Tx queues | ||
138 | */ | ||
139 | struct iwl_queue { | ||
140 | int n_bd; /* number of BDs in this queue */ | ||
141 | int write_ptr; /* 1-st empty entry (index) host_w*/ | ||
142 | int read_ptr; /* last used entry (index) host_r*/ | ||
143 | dma_addr_t dma_addr; /* physical addr for BD's */ | ||
144 | int n_window; /* safe queue window */ | ||
145 | u32 id; | ||
146 | int low_mark; /* low watermark, resume queue if free | ||
147 | * space more than this */ | ||
148 | int high_mark; /* high watermark, stop queue if free | ||
149 | * space less than this */ | ||
150 | } __attribute__ ((packed)); | ||
151 | |||
152 | #define MAX_NUM_OF_TBS (20) | ||
153 | |||
154 | struct iwl_tx_info { | ||
155 | struct ieee80211_tx_status status; | ||
156 | struct sk_buff *skb[MAX_NUM_OF_TBS]; | ||
157 | }; | ||
158 | |||
159 | /** | ||
160 | * struct iwl_tx_queue - Tx Queue for DMA | ||
161 | * @need_update: need to update read/write index | ||
162 | * @shed_retry: queue is HT AGG enabled | ||
163 | * | ||
164 | * Queue consists of circular buffer of BD's and required locking structures. | ||
165 | */ | ||
166 | struct iwl_tx_queue { | ||
167 | struct iwl_queue q; | ||
168 | struct iwl_tfd_frame *bd; | ||
169 | struct iwl_cmd *cmd; | ||
170 | dma_addr_t dma_addr_cmd; | ||
171 | struct iwl_tx_info *txb; | ||
172 | int need_update; | ||
173 | int sched_retry; | ||
174 | int active; | ||
175 | }; | ||
176 | |||
177 | #include "iwl-channel.h" | ||
178 | |||
179 | #if IWL == 3945 | ||
180 | #include "iwl-3945-rs.h" | ||
181 | #else | ||
182 | #include "iwl-4965-rs.h" | ||
183 | #endif | ||
184 | |||
185 | #define IWL_TX_FIFO_AC0 0 | ||
186 | #define IWL_TX_FIFO_AC1 1 | ||
187 | #define IWL_TX_FIFO_AC2 2 | ||
188 | #define IWL_TX_FIFO_AC3 3 | ||
189 | #define IWL_TX_FIFO_HCCA_1 5 | ||
190 | #define IWL_TX_FIFO_HCCA_2 6 | ||
191 | #define IWL_TX_FIFO_NONE 7 | ||
192 | |||
193 | /* Minimum number of queues. MAX_NUM is defined in hw specific files */ | ||
194 | #define IWL_MIN_NUM_QUEUES 4 | ||
195 | |||
196 | /* Power management (not Tx power) structures */ | ||
197 | |||
198 | struct iwl_power_vec_entry { | ||
199 | struct iwl_powertable_cmd cmd; | ||
200 | u8 no_dtim; | ||
201 | }; | ||
202 | #define IWL_POWER_RANGE_0 (0) | ||
203 | #define IWL_POWER_RANGE_1 (1) | ||
204 | |||
205 | #define IWL_POWER_MODE_CAM 0x00 /* Continuously Aware Mode, always on */ | ||
206 | #define IWL_POWER_INDEX_3 0x03 | ||
207 | #define IWL_POWER_INDEX_5 0x05 | ||
208 | #define IWL_POWER_AC 0x06 | ||
209 | #define IWL_POWER_BATTERY 0x07 | ||
210 | #define IWL_POWER_LIMIT 0x07 | ||
211 | #define IWL_POWER_MASK 0x0F | ||
212 | #define IWL_POWER_ENABLED 0x10 | ||
213 | #define IWL_POWER_LEVEL(x) ((x) & IWL_POWER_MASK) | ||
214 | |||
215 | struct iwl_power_mgr { | ||
216 | spinlock_t lock; | ||
217 | struct iwl_power_vec_entry pwr_range_0[IWL_POWER_AC]; | ||
218 | struct iwl_power_vec_entry pwr_range_1[IWL_POWER_AC]; | ||
219 | u8 active_index; | ||
220 | u32 dtim_val; | ||
221 | }; | ||
222 | |||
223 | #define IEEE80211_DATA_LEN 2304 | ||
224 | #define IEEE80211_4ADDR_LEN 30 | ||
225 | #define IEEE80211_HLEN (IEEE80211_4ADDR_LEN) | ||
226 | #define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) | ||
227 | |||
228 | struct iwl_frame { | ||
229 | union { | ||
230 | struct ieee80211_hdr frame; | ||
231 | struct iwl_tx_beacon_cmd beacon; | ||
232 | u8 raw[IEEE80211_FRAME_LEN]; | ||
233 | u8 cmd[360]; | ||
234 | } u; | ||
235 | struct list_head list; | ||
236 | }; | ||
237 | |||
238 | #define SEQ_TO_QUEUE(x) ((x >> 8) & 0xbf) | ||
239 | #define QUEUE_TO_SEQ(x) ((x & 0xbf) << 8) | ||
240 | #define SEQ_TO_INDEX(x) (x & 0xff) | ||
241 | #define INDEX_TO_SEQ(x) (x & 0xff) | ||
242 | #define SEQ_HUGE_FRAME (0x4000) | ||
243 | #define SEQ_RX_FRAME __constant_cpu_to_le16(0x8000) | ||
244 | #define SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4) | ||
245 | #define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ) | ||
246 | #define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4) | ||
247 | |||
248 | enum { | ||
249 | /* CMD_SIZE_NORMAL = 0, */ | ||
250 | CMD_SIZE_HUGE = (1 << 0), | ||
251 | /* CMD_SYNC = 0, */ | ||
252 | CMD_ASYNC = (1 << 1), | ||
253 | /* CMD_NO_SKB = 0, */ | ||
254 | CMD_WANT_SKB = (1 << 2), | ||
255 | }; | ||
256 | |||
257 | struct iwl_cmd; | ||
258 | struct iwl_priv; | ||
259 | |||
260 | struct iwl_cmd_meta { | ||
261 | struct iwl_cmd_meta *source; | ||
262 | union { | ||
263 | struct sk_buff *skb; | ||
264 | int (*callback)(struct iwl_priv *priv, | ||
265 | struct iwl_cmd *cmd, struct sk_buff *skb); | ||
266 | } __attribute__ ((packed)) u; | ||
267 | |||
268 | /* The CMD_SIZE_HUGE flag bit indicates that the command | ||
269 | * structure is stored at the end of the shared queue memory. */ | ||
270 | u32 flags; | ||
271 | |||
272 | } __attribute__ ((packed)); | ||
273 | |||
274 | struct iwl_cmd { | ||
275 | struct iwl_cmd_meta meta; | ||
276 | struct iwl_cmd_header hdr; | ||
277 | union { | ||
278 | struct iwl_addsta_cmd addsta; | ||
279 | struct iwl_led_cmd led; | ||
280 | u32 flags; | ||
281 | u8 val8; | ||
282 | u16 val16; | ||
283 | u32 val32; | ||
284 | struct iwl_bt_cmd bt; | ||
285 | struct iwl_rxon_time_cmd rxon_time; | ||
286 | struct iwl_powertable_cmd powertable; | ||
287 | struct iwl_qosparam_cmd qosparam; | ||
288 | struct iwl_tx_cmd tx; | ||
289 | struct iwl_tx_beacon_cmd tx_beacon; | ||
290 | struct iwl_rxon_assoc_cmd rxon_assoc; | ||
291 | u8 *indirect; | ||
292 | u8 payload[360]; | ||
293 | } __attribute__ ((packed)) cmd; | ||
294 | } __attribute__ ((packed)); | ||
295 | |||
296 | struct iwl_host_cmd { | ||
297 | u8 id; | ||
298 | u16 len; | ||
299 | struct iwl_cmd_meta meta; | ||
300 | const void *data; | ||
301 | }; | ||
302 | |||
303 | #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_cmd) - \ | ||
304 | sizeof(struct iwl_cmd_meta)) | ||
305 | |||
306 | /* | ||
307 | * RX related structures and functions | ||
308 | */ | ||
309 | #define RX_FREE_BUFFERS 64 | ||
310 | #define RX_LOW_WATERMARK 8 | ||
311 | |||
312 | #define SUP_RATE_11A_MAX_NUM_CHANNELS 8 | ||
313 | #define SUP_RATE_11B_MAX_NUM_CHANNELS 4 | ||
314 | #define SUP_RATE_11G_MAX_NUM_CHANNELS 12 | ||
315 | |||
316 | /** | ||
317 | * struct iwl_rx_queue - Rx queue | ||
318 | * @processed: Internal index to last handled Rx packet | ||
319 | * @read: Shared index to newest available Rx buffer | ||
320 | * @write: Shared index to oldest written Rx packet | ||
321 | * @free_count: Number of pre-allocated buffers in rx_free | ||
322 | * @rx_free: list of free SKBs for use | ||
323 | * @rx_used: List of Rx buffers with no SKB | ||
324 | * @need_update: flag to indicate we need to update read/write index | ||
325 | * | ||
326 | * NOTE: rx_free and rx_used are used as a FIFO for iwl_rx_mem_buffers | ||
327 | */ | ||
328 | struct iwl_rx_queue { | ||
329 | __le32 *bd; | ||
330 | dma_addr_t dma_addr; | ||
331 | struct iwl_rx_mem_buffer pool[RX_QUEUE_SIZE + RX_FREE_BUFFERS]; | ||
332 | struct iwl_rx_mem_buffer *queue[RX_QUEUE_SIZE]; | ||
333 | u32 processed; | ||
334 | u32 read; | ||
335 | u32 write; | ||
336 | u32 free_count; | ||
337 | struct list_head rx_free; | ||
338 | struct list_head rx_used; | ||
339 | int need_update; | ||
340 | spinlock_t lock; | ||
341 | }; | ||
342 | |||
343 | #define IWL_SUPPORTED_RATES_IE_LEN 8 | ||
344 | |||
345 | #define SCAN_INTERVAL 100 | ||
346 | |||
347 | #define MAX_A_CHANNELS 252 | ||
348 | #define MIN_A_CHANNELS 7 | ||
349 | |||
350 | #define MAX_B_CHANNELS 14 | ||
351 | #define MIN_B_CHANNELS 1 | ||
352 | |||
353 | #define STATUS_HCMD_ACTIVE 0 /* host command in progress */ | ||
354 | #define STATUS_INT_ENABLED 1 | ||
355 | #define STATUS_RF_KILL_HW 2 | ||
356 | #define STATUS_RF_KILL_SW 3 | ||
357 | #define STATUS_INIT 4 | ||
358 | #define STATUS_ALIVE 5 | ||
359 | #define STATUS_READY 6 | ||
360 | #define STATUS_TEMPERATURE 7 | ||
361 | #define STATUS_GEO_CONFIGURED 8 | ||
362 | #define STATUS_EXIT_PENDING 9 | ||
363 | #define STATUS_IN_SUSPEND 10 | ||
364 | #define STATUS_STATISTICS 11 | ||
365 | #define STATUS_SCANNING 12 | ||
366 | #define STATUS_SCAN_ABORTING 13 | ||
367 | #define STATUS_SCAN_HW 14 | ||
368 | #define STATUS_POWER_PMI 15 | ||
369 | #define STATUS_FW_ERROR 16 | ||
370 | |||
371 | #define MAX_TID_COUNT 9 | ||
372 | |||
373 | #define IWL_INVALID_RATE 0xFF | ||
374 | #define IWL_INVALID_VALUE -1 | ||
375 | |||
376 | #if IWL == 4965 | ||
377 | #ifdef CONFIG_IWLWIFI_HT | ||
378 | #ifdef CONFIG_IWLWIFI_HT_AGG | ||
379 | struct iwl_ht_agg { | ||
380 | u16 txq_id; | ||
381 | u16 frame_count; | ||
382 | u16 wait_for_ba; | ||
383 | u16 start_idx; | ||
384 | u32 bitmap0; | ||
385 | u32 bitmap1; | ||
386 | u32 rate_n_flags; | ||
387 | }; | ||
388 | #endif /* CONFIG_IWLWIFI_HT_AGG */ | ||
389 | #endif /* CONFIG_IWLWIFI_HT */ | ||
390 | #endif | ||
391 | |||
392 | struct iwl_tid_data { | ||
393 | u16 seq_number; | ||
394 | #if IWL == 4965 | ||
395 | #ifdef CONFIG_IWLWIFI_HT | ||
396 | #ifdef CONFIG_IWLWIFI_HT_AGG | ||
397 | struct iwl_ht_agg agg; | ||
398 | #endif /* CONFIG_IWLWIFI_HT_AGG */ | ||
399 | #endif /* CONFIG_IWLWIFI_HT */ | ||
400 | #endif | ||
401 | }; | ||
402 | |||
403 | struct iwl_hw_key { | ||
404 | enum ieee80211_key_alg alg; | ||
405 | int keylen; | ||
406 | u8 key[32]; | ||
407 | }; | ||
408 | |||
409 | union iwl_ht_rate_supp { | ||
410 | u16 rates; | ||
411 | struct { | ||
412 | u8 siso_rate; | ||
413 | u8 mimo_rate; | ||
414 | }; | ||
415 | }; | ||
416 | |||
417 | #ifdef CONFIG_IWLWIFI_HT | ||
418 | #define CFG_HT_RX_AMPDU_FACTOR_DEF (0x3) | ||
419 | #define HT_IE_MAX_AMSDU_SIZE_4K (0) | ||
420 | #define CFG_HT_MPDU_DENSITY_2USEC (0x5) | ||
421 | #define CFG_HT_MPDU_DENSITY_DEF CFG_HT_MPDU_DENSITY_2USEC | ||
422 | |||
423 | struct sta_ht_info { | ||
424 | u8 is_ht; | ||
425 | u16 rx_mimo_ps_mode; | ||
426 | u16 tx_mimo_ps_mode; | ||
427 | u16 control_channel; | ||
428 | u8 max_amsdu_size; | ||
429 | u8 ampdu_factor; | ||
430 | u8 mpdu_density; | ||
431 | u8 operating_mode; | ||
432 | u8 supported_chan_width; | ||
433 | u8 extension_chan_offset; | ||
434 | u8 is_green_field; | ||
435 | u8 sgf; | ||
436 | u8 supp_rates[16]; | ||
437 | u8 tx_chan_width; | ||
438 | u8 chan_width_cap; | ||
439 | }; | ||
440 | #endif /*CONFIG_IWLWIFI_HT */ | ||
441 | |||
442 | #ifdef CONFIG_IWLWIFI_QOS | ||
443 | |||
444 | union iwl_qos_capabity { | ||
445 | struct { | ||
446 | u8 edca_count:4; /* bit 0-3 */ | ||
447 | u8 q_ack:1; /* bit 4 */ | ||
448 | u8 queue_request:1; /* bit 5 */ | ||
449 | u8 txop_request:1; /* bit 6 */ | ||
450 | u8 reserved:1; /* bit 7 */ | ||
451 | } q_AP; | ||
452 | struct { | ||
453 | u8 acvo_APSD:1; /* bit 0 */ | ||
454 | u8 acvi_APSD:1; /* bit 1 */ | ||
455 | u8 ac_bk_APSD:1; /* bit 2 */ | ||
456 | u8 ac_be_APSD:1; /* bit 3 */ | ||
457 | u8 q_ack:1; /* bit 4 */ | ||
458 | u8 max_len:2; /* bit 5-6 */ | ||
459 | u8 more_data_ack:1; /* bit 7 */ | ||
460 | } q_STA; | ||
461 | u8 val; | ||
462 | }; | ||
463 | |||
464 | /* QoS structures */ | ||
465 | struct iwl_qos_info { | ||
466 | int qos_enable; | ||
467 | int qos_active; | ||
468 | union iwl_qos_capabity qos_cap; | ||
469 | struct iwl_qosparam_cmd def_qos_parm; | ||
470 | }; | ||
471 | #endif /*CONFIG_IWLWIFI_QOS */ | ||
472 | |||
473 | #define STA_PS_STATUS_WAKE 0 | ||
474 | #define STA_PS_STATUS_SLEEP 1 | ||
475 | |||
476 | struct iwl_station_entry { | ||
477 | struct iwl_addsta_cmd sta; | ||
478 | struct iwl_tid_data tid[MAX_TID_COUNT]; | ||
479 | #if IWL == 3945 | ||
480 | union { | ||
481 | struct { | ||
482 | u8 rate; | ||
483 | u8 flags; | ||
484 | } s; | ||
485 | u16 rate_n_flags; | ||
486 | } current_rate; | ||
487 | #endif | ||
488 | u8 used; | ||
489 | u8 ps_status; | ||
490 | struct iwl_hw_key keyinfo; | ||
491 | }; | ||
492 | |||
493 | /* one for each uCode image (inst/data, boot/init/runtime) */ | ||
494 | struct fw_desc { | ||
495 | void *v_addr; /* access by driver */ | ||
496 | dma_addr_t p_addr; /* access by card's busmaster DMA */ | ||
497 | u32 len; /* bytes */ | ||
498 | }; | ||
499 | |||
500 | /* uCode file layout */ | ||
501 | struct iwl_ucode { | ||
502 | __le32 ver; /* major/minor/subminor */ | ||
503 | __le32 inst_size; /* bytes of runtime instructions */ | ||
504 | __le32 data_size; /* bytes of runtime data */ | ||
505 | __le32 init_size; /* bytes of initialization instructions */ | ||
506 | __le32 init_data_size; /* bytes of initialization data */ | ||
507 | __le32 boot_size; /* bytes of bootstrap instructions */ | ||
508 | u8 data[0]; /* data in same order as "size" elements */ | ||
509 | }; | ||
510 | |||
511 | #define IWL_IBSS_MAC_HASH_SIZE 32 | ||
512 | |||
513 | struct iwl_ibss_seq { | ||
514 | u8 mac[ETH_ALEN]; | ||
515 | u16 seq_num; | ||
516 | u16 frag_num; | ||
517 | unsigned long packet_time; | ||
518 | struct list_head list; | ||
519 | }; | ||
520 | |||
521 | struct iwl_driver_hw_info { | ||
522 | u16 max_txq_num; | ||
523 | u16 ac_queue_count; | ||
524 | u16 tx_cmd_len; | ||
525 | u16 max_rxq_size; | ||
526 | u32 rx_buffer_size; | ||
527 | u16 max_rxq_log; | ||
528 | u8 max_stations; | ||
529 | u8 bcast_sta_id; | ||
530 | void *shared_virt; | ||
531 | dma_addr_t shared_phys; | ||
532 | }; | ||
533 | |||
534 | |||
535 | #define STA_FLG_RTS_MIMO_PROT_MSK __constant_cpu_to_le32(1 << 17) | ||
536 | #define STA_FLG_AGG_MPDU_8US_MSK __constant_cpu_to_le32(1 << 18) | ||
537 | #define STA_FLG_MAX_AGG_SIZE_POS (19) | ||
538 | #define STA_FLG_MAX_AGG_SIZE_MSK __constant_cpu_to_le32(3 << 19) | ||
539 | #define STA_FLG_FAT_EN_MSK __constant_cpu_to_le32(1 << 21) | ||
540 | #define STA_FLG_MIMO_DIS_MSK __constant_cpu_to_le32(1 << 22) | ||
541 | #define STA_FLG_AGG_MPDU_DENSITY_POS (23) | ||
542 | #define STA_FLG_AGG_MPDU_DENSITY_MSK __constant_cpu_to_le32(7 << 23) | ||
543 | #define HT_SHORT_GI_20MHZ_ONLY (1 << 0) | ||
544 | #define HT_SHORT_GI_40MHZ_ONLY (1 << 1) | ||
545 | |||
546 | |||
547 | #include "iwl-priv.h" | ||
548 | |||
549 | /* Requires full declaration of iwl_priv before including */ | ||
550 | #include "iwl-io.h" | ||
551 | |||
552 | #define IWL_RX_HDR(x) ((struct iwl_rx_frame_hdr *)(\ | ||
553 | x->u.rx_frame.stats.payload + \ | ||
554 | x->u.rx_frame.stats.phy_count)) | ||
555 | #define IWL_RX_END(x) ((struct iwl_rx_frame_end *)(\ | ||
556 | IWL_RX_HDR(x)->payload + \ | ||
557 | le16_to_cpu(IWL_RX_HDR(x)->len))) | ||
558 | #define IWL_RX_STATS(x) (&x->u.rx_frame.stats) | ||
559 | #define IWL_RX_DATA(x) (IWL_RX_HDR(x)->payload) | ||
560 | |||
561 | |||
562 | /****************************************************************************** | ||
563 | * | ||
564 | * Functions implemented in iwl-base.c which are forward declared here | ||
565 | * for use by iwl-*.c | ||
566 | * | ||
567 | *****************************************************************************/ | ||
568 | struct iwl_addsta_cmd; | ||
569 | extern int iwl_send_add_station(struct iwl_priv *priv, | ||
570 | struct iwl_addsta_cmd *sta, u8 flags); | ||
571 | extern u8 iwl_add_station(struct iwl_priv *priv, const u8 *bssid, | ||
572 | int is_ap, u8 flags); | ||
573 | extern int iwl_is_network_packet(struct iwl_priv *priv, | ||
574 | struct ieee80211_hdr *header); | ||
575 | extern int iwl_power_init_handle(struct iwl_priv *priv); | ||
576 | extern int iwl_eeprom_init(struct iwl_priv *priv); | ||
577 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
578 | extern void iwl_report_frame(struct iwl_priv *priv, | ||
579 | struct iwl_rx_packet *pkt, | ||
580 | struct ieee80211_hdr *header, int group100); | ||
581 | #else | ||
582 | static inline void iwl_report_frame(struct iwl_priv *priv, | ||
583 | struct iwl_rx_packet *pkt, | ||
584 | struct ieee80211_hdr *header, | ||
585 | int group100) {} | ||
586 | #endif | ||
587 | extern void iwl_handle_data_packet_monitor(struct iwl_priv *priv, | ||
588 | struct iwl_rx_mem_buffer *rxb, | ||
589 | void *data, short len, | ||
590 | struct ieee80211_rx_status *stats, | ||
591 | u16 phy_flags); | ||
592 | extern int is_duplicate_packet(struct iwl_priv *priv, struct ieee80211_hdr | ||
593 | *header); | ||
594 | extern int iwl_rx_queue_alloc(struct iwl_priv *priv); | ||
595 | extern void iwl_rx_queue_reset(struct iwl_priv *priv, | ||
596 | struct iwl_rx_queue *rxq); | ||
597 | extern int iwl_calc_db_from_ratio(int sig_ratio); | ||
598 | extern int iwl_calc_sig_qual(int rssi_dbm, int noise_dbm); | ||
599 | extern int iwl_tx_queue_init(struct iwl_priv *priv, | ||
600 | struct iwl_tx_queue *txq, int count, u32 id); | ||
601 | extern void iwl_rx_replenish(void *data); | ||
602 | extern void iwl_tx_queue_free(struct iwl_priv *priv, struct iwl_tx_queue *txq); | ||
603 | extern int iwl_send_cmd_pdu(struct iwl_priv *priv, u8 id, u16 len, | ||
604 | const void *data); | ||
605 | extern int __must_check iwl_send_cmd(struct iwl_priv *priv, | ||
606 | struct iwl_host_cmd *cmd); | ||
607 | extern unsigned int iwl_fill_beacon_frame(struct iwl_priv *priv, | ||
608 | struct ieee80211_hdr *hdr, | ||
609 | const u8 *dest, int left); | ||
610 | extern int iwl_rx_queue_update_write_ptr(struct iwl_priv *priv, | ||
611 | struct iwl_rx_queue *q); | ||
612 | extern int iwl_send_statistics_request(struct iwl_priv *priv); | ||
613 | extern void iwl_set_decrypted_flag(struct iwl_priv *priv, struct sk_buff *skb, | ||
614 | u32 decrypt_res, | ||
615 | struct ieee80211_rx_status *stats); | ||
616 | #if IWL == 4965 | ||
617 | extern __le16 *ieee80211_get_qos_ctrl(struct ieee80211_hdr *hdr); | ||
618 | #endif | ||
619 | |||
620 | extern const u8 BROADCAST_ADDR[ETH_ALEN]; | ||
621 | |||
622 | /* | ||
623 | * Currently used by iwl-3945-rs... look at restructuring so that it doesn't | ||
624 | * call this... todo... fix that. | ||
625 | */ | ||
626 | extern u8 iwl_sync_station(struct iwl_priv *priv, int sta_id, | ||
627 | u16 tx_rate, u8 flags); | ||
628 | |||
629 | static inline int iwl_is_associated(struct iwl_priv *priv) | ||
630 | { | ||
631 | return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; | ||
632 | } | ||
633 | |||
634 | /****************************************************************************** | ||
635 | * | ||
636 | * Functions implemented in iwl-[34]*.c which are forward declared here | ||
637 | * for use by iwl-base.c | ||
638 | * | ||
639 | * NOTE: The implementation of these functions are hardware specific | ||
640 | * which is why they are in the hardware specific files (vs. iwl-base.c) | ||
641 | * | ||
642 | * Naming convention -- | ||
643 | * iwl_ <-- Its part of iwlwifi (should be changed to iwl_) | ||
644 | * iwl_hw_ <-- Hardware specific (implemented in iwl-XXXX.c by all HW) | ||
645 | * iwlXXXX_ <-- Hardware specific (implemented in iwl-XXXX.c for XXXX) | ||
646 | * iwl_bg_ <-- Called from work queue context | ||
647 | * iwl_mac_ <-- mac80211 callback | ||
648 | * | ||
649 | ****************************************************************************/ | ||
650 | extern void iwl_hw_rx_handler_setup(struct iwl_priv *priv); | ||
651 | extern void iwl_hw_setup_deferred_work(struct iwl_priv *priv); | ||
652 | extern void iwl_hw_cancel_deferred_work(struct iwl_priv *priv); | ||
653 | extern int iwl_hw_rxq_stop(struct iwl_priv *priv); | ||
654 | extern int iwl_hw_set_hw_setting(struct iwl_priv *priv); | ||
655 | extern int iwl_hw_nic_init(struct iwl_priv *priv); | ||
656 | extern int iwl_hw_nic_stop_master(struct iwl_priv *priv); | ||
657 | extern void iwl_hw_txq_ctx_free(struct iwl_priv *priv); | ||
658 | extern void iwl_hw_txq_ctx_stop(struct iwl_priv *priv); | ||
659 | extern int iwl_hw_nic_reset(struct iwl_priv *priv); | ||
660 | extern int iwl_hw_txq_attach_buf_to_tfd(struct iwl_priv *priv, void *tfd, | ||
661 | dma_addr_t addr, u16 len); | ||
662 | extern int iwl_hw_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq); | ||
663 | extern int iwl_hw_get_temperature(struct iwl_priv *priv); | ||
664 | extern int iwl_hw_tx_queue_init(struct iwl_priv *priv, | ||
665 | struct iwl_tx_queue *txq); | ||
666 | extern unsigned int iwl_hw_get_beacon_cmd(struct iwl_priv *priv, | ||
667 | struct iwl_frame *frame, u8 rate); | ||
668 | extern int iwl_hw_get_rx_read(struct iwl_priv *priv); | ||
669 | extern void iwl_hw_build_tx_cmd_rate(struct iwl_priv *priv, | ||
670 | struct iwl_cmd *cmd, | ||
671 | struct ieee80211_tx_control *ctrl, | ||
672 | struct ieee80211_hdr *hdr, | ||
673 | int sta_id, int tx_id); | ||
674 | extern int iwl_hw_reg_send_txpower(struct iwl_priv *priv); | ||
675 | extern int iwl_hw_reg_set_txpower(struct iwl_priv *priv, s8 power); | ||
676 | extern void iwl_hw_rx_statistics(struct iwl_priv *priv, | ||
677 | struct iwl_rx_mem_buffer *rxb); | ||
678 | extern void iwl_disable_events(struct iwl_priv *priv); | ||
679 | extern int iwl4965_get_temperature(const struct iwl_priv *priv); | ||
680 | |||
681 | /** | ||
682 | * iwl_hw_find_station - Find station id for a given BSSID | ||
683 | * @bssid: MAC address of station ID to find | ||
684 | * | ||
685 | * NOTE: This should not be hardware specific but the code has | ||
686 | * not yet been merged into a single common layer for managing the | ||
687 | * station tables. | ||
688 | */ | ||
689 | extern u8 iwl_hw_find_station(struct iwl_priv *priv, const u8 *bssid); | ||
690 | |||
691 | extern int iwl_hw_channel_switch(struct iwl_priv *priv, u16 channel); | ||
692 | #if IWL == 4965 | ||
693 | extern int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index); | ||
694 | #endif | ||
695 | #endif | ||