1 /******************************************************************************
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.
8 * Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
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.
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.
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,
24 * The full GNU General Public License is included in this distribution
25 * in the file called LICENSE.GPL.
27 * Contact Information:
28 * Intel Linux Wireless <ilw@linux.intel.com>
29 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
33 * Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved.
34 * All rights reserved.
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
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
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.
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.
62 *****************************************************************************/
64 * Please use this file (iwl-3945-commands.h) only for uCode API definitions.
65 * Please use iwl-3945-hw.h for hardware-related definitions.
66 * Please use iwl-3945.h for driver implementation definitions.
69 #ifndef __iwl_3945_commands_h__
70 #define __iwl_3945_commands_h__
72 /******************************************************************************
74 * Commonly used structures and definitions:
75 * Command header, txpower
77 *****************************************************************************/
79 * struct iwl3945_tx_power
81 * Used in REPLY_TX_PWR_TABLE_CMD, REPLY_SCAN_CMD, REPLY_CHANNEL_SWITCH
83 * Each entry contains two values:
84 * 1) DSP gain (or sometimes called DSP attenuation). This is a fine-grained
85 * linear value that multiplies the output of the digital signal processor,
86 * before being sent to the analog radio.
87 * 2) Radio gain. This sets the analog gain of the radio Tx path.
88 * It is a coarser setting, and behaves in a logarithmic (dB) fashion.
90 * Driver obtains values from struct iwl3945_tx_power power_gain_table[][].
92 struct iwl3945_tx_power {
93 u8 tx_gain; /* gain for analog radio */
94 u8 dsp_atten; /* gain for DSP */
95 } __attribute__ ((packed));
98 * struct iwl3945_power_per_rate
100 * Used in REPLY_TX_PWR_TABLE_CMD, REPLY_CHANNEL_SWITCH
102 struct iwl3945_power_per_rate {
104 struct iwl3945_tx_power tpc;
106 } __attribute__ ((packed));
108 /******************************************************************************
110 * Alive and Error Commands & Responses:
112 *****************************************************************************/
116 * ("Initialize") REPLY_ALIVE = 0x1 (response only, not a command)
118 * uCode issues this "initialize alive" notification once the initialization
119 * uCode image has completed its work, and is ready to load the runtime image.
120 * This is the *first* "alive" notification that the driver will receive after
121 * rebooting uCode; the "initialize" alive is indicated by subtype field == 9.
123 * See comments documenting "BSM" (bootstrap state machine).
125 struct iwl3945_init_alive_resp {
131 u8 ver_subtype; /* "9" for initialize alive */
133 __le32 log_event_table_ptr;
134 __le32 error_event_table_ptr;
137 } __attribute__ ((packed));
141 * REPLY_ALIVE = 0x1 (response only, not a command)
143 * uCode issues this "alive" notification once the runtime image is ready
144 * to receive commands from the driver. This is the *second* "alive"
145 * notification that the driver will receive after rebooting uCode;
146 * this "alive" is indicated by subtype field != 9.
148 * See comments documenting "BSM" (bootstrap state machine).
150 * This response includes two pointers to structures within the device's
151 * data SRAM (access via HBUS_TARG_MEM_* regs) that are useful for debugging:
153 * 1) log_event_table_ptr indicates base of the event log. This traces
154 * a 256-entry history of uCode execution within a circular buffer.
156 * 2) error_event_table_ptr indicates base of the error log. This contains
157 * information about any uCode error that occurs.
159 * The Linux driver can print both logs to the system log when a uCode error
162 struct iwl3945_alive_resp {
168 u8 ver_subtype; /* not "9" for runtime alive */
170 __le32 log_event_table_ptr; /* SRAM address for event log */
171 __le32 error_event_table_ptr; /* SRAM address for error log */
174 } __attribute__ ((packed));
176 /******************************************************************************
178 * RXON Commands & Responses:
180 *****************************************************************************/
183 * REPLY_RXON = 0x10 (command, has simple generic response)
185 * RXON tunes the radio tuner to a service channel, and sets up a number
186 * of parameters that are used primarily for Rx, but also for Tx operations.
188 * NOTE: When tuning to a new channel, driver must set the
189 * RXON_FILTER_ASSOC_MSK to 0. This will clear station-dependent
190 * info within the device, including the station tables, tx retry
191 * rate tables, and txpower tables. Driver must build a new station
192 * table and txpower table before transmitting anything on the RXON
195 * NOTE: All RXONs wipe clean the internal txpower table. Driver must
196 * issue a new REPLY_TX_PWR_TABLE_CMD after each REPLY_RXON (0x10),
197 * regardless of whether RXON_FILTER_ASSOC_MSK is set.
199 struct iwl3945_rxon_cmd {
204 u8 wlap_bssid_addr[6];
216 } __attribute__ ((packed));
219 * REPLY_RXON_ASSOC = 0x11 (command, has simple generic response)
221 struct iwl3945_rxon_assoc_cmd {
227 } __attribute__ ((packed));
230 * REPLY_CHANNEL_SWITCH = 0x72 (command, has simple generic response)
232 struct iwl3945_channel_switch_cmd {
237 __le32 rxon_filter_flags;
239 struct iwl3945_power_per_rate power[IWL_MAX_RATES];
240 } __attribute__ ((packed));
242 /******************************************************************************
244 * Add/Modify Stations Commands & Responses:
246 *****************************************************************************/
248 * REPLY_ADD_STA = 0x18 (command)
250 * The device contains an internal table of per-station information,
251 * with info on security keys, aggregation parameters, and Tx rates for
252 * initial Tx attempt and any retries (4965 uses REPLY_TX_LINK_QUALITY_CMD,
253 * 3945 uses REPLY_RATE_SCALE to set up rate tables).
255 * REPLY_ADD_STA sets up the table entry for one station, either creating
256 * a new entry, or modifying a pre-existing one.
258 * NOTE: RXON command (without "associated" bit set) wipes the station table
259 * clean. Moving into RF_KILL state does this also. Driver must set up
260 * new station table before transmitting anything on the RXON channel
261 * (except active scans or active measurements; those commands carry
262 * their own txpower/rate setup data).
264 * When getting started on a new channel, driver must set up the
265 * IWL_BROADCAST_ID entry (last entry in the table). For a client
266 * station in a BSS, once an AP is selected, driver sets up the AP STA
267 * in the IWL_AP_ID entry (1st entry in the table). BROADCAST and AP
268 * are all that are needed for a BSS client station. If the device is
269 * used as AP, or in an IBSS network, driver must set up station table
270 * entries for all STAs in network, starting with index IWL_STA_ID.
272 struct iwl3945_addsta_cmd {
273 u8 mode; /* 1: modify existing, 0: add new station */
275 struct sta_id_modify sta;
276 struct iwl4965_keyinfo key;
277 __le32 station_flags; /* STA_FLG_* */
278 __le32 station_flags_msk; /* STA_FLG_* */
280 /* bit field to disable (1) or enable (0) Tx for Traffic ID (TID)
281 * corresponding to bit (e.g. bit 5 controls TID 5).
282 * Set modify_mask bit STA_MODIFY_TID_DISABLE_TX to use this field. */
283 __le16 tid_disable_tx;
287 /* TID for which to add block-ack support.
288 * Set modify_mask bit STA_MODIFY_ADDBA_TID_MSK to use this field. */
289 u8 add_immediate_ba_tid;
291 /* TID for which to remove block-ack support.
292 * Set modify_mask bit STA_MODIFY_DELBA_TID_MSK to use this field. */
293 u8 remove_immediate_ba_tid;
295 /* Starting Sequence Number for added block-ack support.
296 * Set modify_mask bit STA_MODIFY_ADDBA_TID_MSK to use this field. */
297 __le16 add_immediate_ba_ssn;
298 } __attribute__ ((packed));
301 /******************************************************************************
305 *****************************************************************************/
307 struct iwl3945_rx_frame_stats {
315 } __attribute__ ((packed));
317 struct iwl3945_rx_frame_hdr {
324 } __attribute__ ((packed));
328 struct iwl3945_rx_frame_end {
331 __le32 beacon_timestamp;
332 } __attribute__ ((packed));
335 * REPLY_3945_RX = 0x1b (response only, not a command)
337 * NOTE: DO NOT dereference from casts to this structure
338 * It is provided only for calculating minimum data set size.
339 * The actual offsets of the hdr and end are dynamic based on
342 struct iwl3945_rx_frame {
343 struct iwl3945_rx_frame_stats stats;
344 struct iwl3945_rx_frame_hdr hdr;
345 struct iwl3945_rx_frame_end end;
346 } __attribute__ ((packed));
348 /******************************************************************************
350 * Tx Commands & Responses:
352 * Driver must place each REPLY_TX command into one of the prioritized Tx
353 * queues in host DRAM, shared between driver and device. When the device's
354 * Tx scheduler and uCode are preparing to transmit, the device pulls the
355 * Tx command over the PCI bus via one of the device's Tx DMA channels,
356 * to fill an internal FIFO from which data will be transmitted.
358 * uCode handles all timing and protocol related to control frames
359 * (RTS/CTS/ACK), based on flags in the Tx command.
361 * uCode handles retrying Tx when an ACK is expected but not received.
362 * This includes trying lower data rates than the one requested in the Tx
363 * command, as set up by the REPLY_RATE_SCALE (for 3945) or
364 * REPLY_TX_LINK_QUALITY_CMD (4965).
366 * Driver sets up transmit power for various rates via REPLY_TX_PWR_TABLE_CMD.
367 * This command must be executed after every RXON command, before Tx can occur.
368 *****************************************************************************/
371 * REPLY_TX = 0x1c (command)
373 struct iwl3945_tx_cmd {
376 * MAC header (24/26/30/32 bytes) + 2 bytes pad if 26/30 header size,
377 * + 8 byte IV for CCM or TKIP (not used for WEP)
379 * + 8-byte MIC (not used for CCM/WEP)
380 * NOTE: Does not include Tx command bytes, post-MAC pad bytes,
381 * MIC (CCM) 8 bytes, ICV (WEP/TKIP/CKIP) 4 bytes, CRC 4 bytes.i
382 * Range: 14-2342 bytes.
387 * MPDU or MSDU byte count for next frame.
388 * Used for fragmentation and bursting, but not 11n aggregation.
389 * Same as "len", but for next frame. Set to 0 if not applicable.
391 __le16 next_frame_len;
393 __le32 tx_flags; /* TX_CMD_FLG_* */
397 /* Index of recipient station in uCode's station table */
407 __le32 next_frame_info;
413 u8 rts_retry_limit; /*byte 50 */
414 u8 data_retry_limit; /*byte 51 */
416 __le16 pm_frame_timeout;
417 __le16 attempt_duration;
421 * Duration of EDCA burst Tx Opportunity, in 32-usec units.
422 * Set this if txop time is not specified by HCCA protocol (e.g. by AP).
427 * MAC header goes here, followed by 2 bytes padding if MAC header
428 * length is 26 or 30 bytes, followed by payload data
431 struct ieee80211_hdr hdr[0];
432 } __attribute__ ((packed));
435 * REPLY_TX = 0x1c (response)
437 struct iwl3945_tx_resp {
442 __le32 wireless_media_time;
443 __le32 status; /* TX status */
444 } __attribute__ ((packed));
447 * REPLY_TX_PWR_TABLE_CMD = 0x97 (command, has simple generic response)
449 struct iwl3945_txpowertable_cmd {
450 u8 band; /* 0: 5 GHz, 1: 2.4 GHz */
453 struct iwl3945_power_per_rate power[IWL_MAX_RATES];
454 } __attribute__ ((packed));
456 struct iwl3945_rate_scaling_info {
460 } __attribute__ ((packed));
463 * struct iwl3945_rate_scaling_cmd - Rate Scaling Command & Response
465 * REPLY_RATE_SCALE = 0x47 (command, has simple generic response)
467 * NOTE: The table of rates passed to the uCode via the
468 * RATE_SCALE command sets up the corresponding order of
469 * rates used for all related commands, including rate
472 * For example, if you set 9MB (PLCP 0x0f) as the first
473 * rate in the rate table, the bit mask for that rate
474 * when passed through ofdm_basic_rates on the REPLY_RXON
475 * command would be bit 0 (1 << 0)
477 struct iwl3945_rate_scaling_cmd {
480 struct iwl3945_rate_scaling_info table[IWL_MAX_RATES];
481 } __attribute__ ((packed));
483 /******************************************************************************
485 * Scan Commands, Responses, Notifications:
487 *****************************************************************************/
490 * struct iwl3945_scan_channel - entry in REPLY_SCAN_CMD channel table
492 * One for each channel in the scan list.
493 * Each channel can independently select:
494 * 1) SSID for directed active scans
495 * 2) Txpower setting (for rate specified within Tx command)
496 * 3) How long to stay on-channel (behavior may be modified by quiet_time,
497 * quiet_plcp_th, good_CRC_th)
499 * To avoid uCode errors, make sure the following are true (see comments
500 * under struct iwl3945_scan_cmd about max_out_time and quiet_time):
501 * 1) If using passive_dwell (i.e. passive_dwell != 0):
502 * active_dwell <= passive_dwell (< max_out_time if max_out_time != 0)
503 * 2) quiet_time <= active_dwell
504 * 3) If restricting off-channel time (i.e. max_out_time !=0):
505 * passive_dwell < max_out_time
506 * active_dwell < max_out_time
508 struct iwl3945_scan_channel {
510 * type is defined as:
511 * 0:0 1 = active, 0 = passive
512 * 1:4 SSID direct bit map; if a bit is set, then corresponding
513 * SSID IE is transmitted in probe request.
517 u8 channel; /* band is selected by iwl3945_scan_cmd "flags" field */
518 struct iwl3945_tx_power tpc;
519 __le16 active_dwell; /* in 1024-uSec TU (time units), typ 5-50 */
520 __le16 passive_dwell; /* in 1024-uSec TU (time units), typ 20-500 */
521 } __attribute__ ((packed));
525 * REPLY_SCAN_CMD = 0x80 (command)
527 * The hardware scan command is very powerful; the driver can set it up to
528 * maintain (relatively) normal network traffic while doing a scan in the
529 * background. The max_out_time and suspend_time control the ratio of how
530 * long the device stays on an associated network channel ("service channel")
531 * vs. how long it's away from the service channel, tuned to other channels
534 * max_out_time is the max time off-channel (in usec), and suspend_time
535 * is how long (in "extended beacon" format) that the scan is "suspended"
536 * after returning to the service channel. That is, suspend_time is the
537 * time that we stay on the service channel, doing normal work, between
538 * scan segments. The driver may set these parameters differently to support
539 * scanning when associated vs. not associated, and light vs. heavy traffic
540 * loads when associated.
542 * After receiving this command, the device's scan engine does the following;
544 * 1) Sends SCAN_START notification to driver
545 * 2) Checks to see if it has time to do scan for one channel
546 * 3) Sends NULL packet, with power-save (PS) bit set to 1,
547 * to tell AP that we're going off-channel
548 * 4) Tunes to first channel in scan list, does active or passive scan
549 * 5) Sends SCAN_RESULT notification to driver
550 * 6) Checks to see if it has time to do scan on *next* channel in list
551 * 7) Repeats 4-6 until it no longer has time to scan the next channel
552 * before max_out_time expires
553 * 8) Returns to service channel
554 * 9) Sends NULL packet with PS=0 to tell AP that we're back
555 * 10) Stays on service channel until suspend_time expires
556 * 11) Repeats entire process 2-10 until list is complete
557 * 12) Sends SCAN_COMPLETE notification
559 * For fast, efficient scans, the scan command also has support for staying on
560 * a channel for just a short time, if doing active scanning and getting no
561 * responses to the transmitted probe request. This time is controlled by
562 * quiet_time, and the number of received packets below which a channel is
563 * considered "quiet" is controlled by quiet_plcp_threshold.
565 * For active scanning on channels that have regulatory restrictions against
566 * blindly transmitting, the scan can listen before transmitting, to make sure
567 * that there is already legitimate activity on the channel. If enough
568 * packets are cleanly received on the channel (controlled by good_CRC_th,
569 * typical value 1), the scan engine starts transmitting probe requests.
571 * Driver must use separate scan commands for 2.4 vs. 5 GHz bands.
573 * To avoid uCode errors, see timing restrictions described under
574 * struct iwl3945_scan_channel.
576 struct iwl3945_scan_cmd {
579 u8 channel_count; /* # channels in channel list */
580 __le16 quiet_time; /* dwell only this # millisecs on quiet channel
581 * (only for active scan) */
582 __le16 quiet_plcp_th; /* quiet chnl is < this # pkts (typ. 1) */
583 __le16 good_CRC_th; /* passive -> active promotion threshold */
585 __le32 max_out_time; /* max usec to be away from associated (service)
587 __le32 suspend_time; /* pause scan this long (in "extended beacon
588 * format") when returning to service channel:
589 * 3945; 31:24 # beacons, 19:0 additional usec,
590 * 4965; 31:22 # beacons, 21:0 additional usec.
592 __le32 flags; /* RXON_FLG_* */
593 __le32 filter_flags; /* RXON_FILTER_* */
595 /* For active scans (set to all-0s for passive scans).
596 * Does not include payload. Must specify Tx rate; no rate scaling. */
597 struct iwl3945_tx_cmd tx_cmd;
599 /* For directed active scans (set to all-0s otherwise) */
600 struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX_API1];
603 * Probe request frame, followed by channel list.
605 * Size of probe request frame is specified by byte count in tx_cmd.
606 * Channel list follows immediately after probe request frame.
607 * Number of channels in list is specified by channel_count.
608 * Each channel in list is of type:
610 * struct iwl3945_scan_channel channels[0];
612 * NOTE: Only one band of channels can be scanned per pass. You
613 * must not mix 2.4GHz channels and 5.2GHz channels, and you must wait
614 * for one scan to complete (i.e. receive SCAN_COMPLETE_NOTIFICATION)
615 * before requesting another scan.
618 } __attribute__ ((packed));
620 /******************************************************************************
622 * IBSS/AP Commands and Notifications:
624 *****************************************************************************/
627 * BEACON_NOTIFICATION = 0x90 (notification only, not a command)
629 struct iwl3945_beacon_notif {
630 struct iwl3945_tx_resp beacon_notify_hdr;
633 __le32 ibss_mgr_status;
634 } __attribute__ ((packed));
637 * REPLY_TX_BEACON = 0x91 (command, has simple generic response)
639 struct iwl3945_tx_beacon_cmd {
640 struct iwl3945_tx_cmd tx;
644 struct ieee80211_hdr frame[0]; /* beacon frame */
645 } __attribute__ ((packed));
647 /******************************************************************************
649 * Statistics Commands and Notifications:
651 *****************************************************************************/
653 struct iwl39_statistics_rx_phy {
659 __le32 early_overrun_err;
661 __le32 false_alarm_cnt;
662 __le32 fina_sync_err_cnt;
665 __le32 unresponded_rts;
666 __le32 rxe_frame_limit_overrun;
669 } __attribute__ ((packed));
671 struct iwl39_statistics_rx_non_phy {
672 __le32 bogus_cts; /* CTS received when not expecting CTS */
673 __le32 bogus_ack; /* ACK received when not expecting ACK */
674 __le32 non_bssid_frames; /* number of frames with BSSID that
675 * doesn't belong to the STA BSSID */
676 __le32 filtered_frames; /* count frames that were dumped in the
677 * filtering process */
678 __le32 non_channel_beacons; /* beacons with our bss id but not on
679 * our serving channel */
680 } __attribute__ ((packed));
682 struct iwl39_statistics_rx {
683 struct iwl39_statistics_rx_phy ofdm;
684 struct iwl39_statistics_rx_phy cck;
685 struct iwl39_statistics_rx_non_phy general;
686 } __attribute__ ((packed));
688 struct iwl39_statistics_tx {
690 __le32 rx_detected_cnt;
691 __le32 bt_prio_defer_cnt;
692 __le32 bt_prio_kill_cnt;
693 __le32 few_bytes_cnt;
696 __le32 expected_ack_cnt;
697 __le32 actual_ack_cnt;
698 } __attribute__ ((packed));
700 struct iwl39_statistics_div {
705 } __attribute__ ((packed));
707 struct iwl39_statistics_general {
709 struct statistics_dbg dbg;
713 __le32 ttl_timestamp;
714 struct iwl39_statistics_div div;
715 } __attribute__ ((packed));
718 * STATISTICS_NOTIFICATION = 0x9d (notification only, not a command)
720 * By default, uCode issues this notification after receiving a beacon
721 * while associated. To disable this behavior, set DISABLE_NOTIF flag in the
722 * REPLY_STATISTICS_CMD 0x9c, above.
724 * Statistics counters continue to increment beacon after beacon, but are
725 * cleared when changing channels or when driver issues REPLY_STATISTICS_CMD
726 * 0x9c with CLEAR_STATS bit set (see above).
728 * uCode also issues this notification during scans. uCode clears statistics
729 * appropriately so that each notification contains statistics for only the
730 * one channel that has just been scanned.
732 struct iwl3945_notif_statistics {
734 struct statistics_rx rx;
735 struct statistics_tx tx;
736 struct statistics_general general;
737 } __attribute__ ((packed));
740 /******************************************************************************
742 * Union of all expected notifications/responses:
744 *****************************************************************************/
746 struct iwl3945_rx_packet {
748 struct iwl_cmd_header hdr;
750 struct iwl3945_alive_resp alive_frame;
751 struct iwl3945_rx_frame rx_frame;
752 struct iwl3945_tx_resp tx_resp;
753 struct iwl_spectrum_notification spectrum_notif;
754 struct iwl_csa_notification csa_notif;
755 struct iwl_error_resp err_resp;
756 struct iwl_card_state_notif card_state_notif;
757 struct iwl3945_beacon_notif beacon_status;
758 struct iwl_add_sta_resp add_sta;
759 struct iwl_sleep_notification sleep_notif;
760 struct iwl_spectrum_resp spectrum;
761 struct iwl3945_notif_statistics stats;
765 } __attribute__ ((packed));
767 #define IWL_RX_FRAME_SIZE (4 + sizeof(struct iwl3945_rx_frame))
769 #endif /* __iwl3945_3945_commands_h__ */