ibmasr: remove unnecessary spin_unlock()
[safe/jmp/linux-2.6] / drivers / net / wireless / ipw2200.h
index 1c98db0..d4ab28b 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
 
-  Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.
+  Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
 
   This program is free software; you can redistribute it and/or modify it
   under the terms of version 2 of the GNU General Public License as
@@ -31,8 +31,8 @@
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/config.h>
 #include <linux/init.h>
+#include <linux/mutex.h>
 
 #include <linux/pci.h>
 #include <linux/netdevice.h>
@@ -45,7 +45,7 @@
 
 #include <linux/firmware.h>
 #include <linux/wireless.h>
-#include <linux/dma-mapping.h>
+#include <linux/jiffies.h>
 #include <asm/io.h>
 
 #include <net/ieee80211.h>
@@ -244,8 +244,10 @@ enum connection_manager_assoc_states {
 #define HOST_NOTIFICATION_S36_MEASUREMENT_REFUSED       31
 
 #define HOST_NOTIFICATION_STATUS_BEACON_MISSING         1
-#define IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT           24
+#define IPW_MB_ROAMING_THRESHOLD_MIN                    1
 #define IPW_MB_ROAMING_THRESHOLD_DEFAULT                8
+#define IPW_MB_ROAMING_THRESHOLD_MAX                    30
+#define IPW_MB_DISASSOCIATE_THRESHOLD_DEFAULT           3*IPW_MB_ROAMING_THRESHOLD_DEFAULT
 #define IPW_REAL_RATE_RX_PACKET_THRESHOLD               300
 
 #define MACADRR_BYTE_LEN                     6
@@ -265,25 +267,25 @@ enum connection_manager_assoc_states {
 #define CW_MIN_CCK           31
 #define CW_MAX_CCK           1023
 
-#define QOS_TX0_CW_MIN_OFDM      CW_MIN_OFDM
-#define QOS_TX1_CW_MIN_OFDM      CW_MIN_OFDM
-#define QOS_TX2_CW_MIN_OFDM      ( (CW_MIN_OFDM + 1) / 2 - 1 )
-#define QOS_TX3_CW_MIN_OFDM      ( (CW_MIN_OFDM + 1) / 4 - 1 )
+#define QOS_TX0_CW_MIN_OFDM      cpu_to_le16(CW_MIN_OFDM)
+#define QOS_TX1_CW_MIN_OFDM      cpu_to_le16(CW_MIN_OFDM)
+#define QOS_TX2_CW_MIN_OFDM      cpu_to_le16((CW_MIN_OFDM + 1)/2 - 1)
+#define QOS_TX3_CW_MIN_OFDM      cpu_to_le16((CW_MIN_OFDM + 1)/4 - 1)
 
-#define QOS_TX0_CW_MIN_CCK       CW_MIN_CCK
-#define QOS_TX1_CW_MIN_CCK       CW_MIN_CCK
-#define QOS_TX2_CW_MIN_CCK       ( (CW_MIN_CCK + 1) / 2 - 1 )
-#define QOS_TX3_CW_MIN_CCK       ( (CW_MIN_CCK + 1) / 4 - 1 )
+#define QOS_TX0_CW_MIN_CCK       cpu_to_le16(CW_MIN_CCK)
+#define QOS_TX1_CW_MIN_CCK       cpu_to_le16(CW_MIN_CCK)
+#define QOS_TX2_CW_MIN_CCK       cpu_to_le16((CW_MIN_CCK + 1)/2 - 1)
+#define QOS_TX3_CW_MIN_CCK       cpu_to_le16((CW_MIN_CCK + 1)/4 - 1)
 
-#define QOS_TX0_CW_MAX_OFDM      CW_MAX_OFDM
-#define QOS_TX1_CW_MAX_OFDM      CW_MAX_OFDM
-#define QOS_TX2_CW_MAX_OFDM      CW_MIN_OFDM
-#define QOS_TX3_CW_MAX_OFDM      ( (CW_MIN_OFDM + 1) / 2 - 1 )
+#define QOS_TX0_CW_MAX_OFDM      cpu_to_le16(CW_MAX_OFDM)
+#define QOS_TX1_CW_MAX_OFDM      cpu_to_le16(CW_MAX_OFDM)
+#define QOS_TX2_CW_MAX_OFDM      cpu_to_le16(CW_MIN_OFDM)
+#define QOS_TX3_CW_MAX_OFDM      cpu_to_le16((CW_MIN_OFDM + 1)/2 - 1)
 
-#define QOS_TX0_CW_MAX_CCK       CW_MAX_CCK
-#define QOS_TX1_CW_MAX_CCK       CW_MAX_CCK
-#define QOS_TX2_CW_MAX_CCK       CW_MIN_CCK
-#define QOS_TX3_CW_MAX_CCK       ( (CW_MIN_CCK + 1) / 2 - 1 )
+#define QOS_TX0_CW_MAX_CCK       cpu_to_le16(CW_MAX_CCK)
+#define QOS_TX1_CW_MAX_CCK       cpu_to_le16(CW_MAX_CCK)
+#define QOS_TX2_CW_MAX_CCK       cpu_to_le16(CW_MIN_CCK)
+#define QOS_TX3_CW_MAX_CCK       cpu_to_le16((CW_MIN_CCK + 1)/2 - 1)
 
 #define QOS_TX0_AIFS            (3 - QOS_AIFSN_MIN_VALUE)
 #define QOS_TX1_AIFS            (7 - QOS_AIFSN_MIN_VALUE)
@@ -297,33 +299,33 @@ enum connection_manager_assoc_states {
 
 #define QOS_TX0_TXOP_LIMIT_CCK          0
 #define QOS_TX1_TXOP_LIMIT_CCK          0
-#define QOS_TX2_TXOP_LIMIT_CCK          6016
-#define QOS_TX3_TXOP_LIMIT_CCK          3264
+#define QOS_TX2_TXOP_LIMIT_CCK          cpu_to_le16(6016)
+#define QOS_TX3_TXOP_LIMIT_CCK          cpu_to_le16(3264)
 
 #define QOS_TX0_TXOP_LIMIT_OFDM      0
 #define QOS_TX1_TXOP_LIMIT_OFDM      0
-#define QOS_TX2_TXOP_LIMIT_OFDM      3008
-#define QOS_TX3_TXOP_LIMIT_OFDM      1504
+#define QOS_TX2_TXOP_LIMIT_OFDM      cpu_to_le16(3008)
+#define QOS_TX3_TXOP_LIMIT_OFDM      cpu_to_le16(1504)
 
-#define DEF_TX0_CW_MIN_OFDM      CW_MIN_OFDM
-#define DEF_TX1_CW_MIN_OFDM      CW_MIN_OFDM
-#define DEF_TX2_CW_MIN_OFDM      CW_MIN_OFDM
-#define DEF_TX3_CW_MIN_OFDM      CW_MIN_OFDM
+#define DEF_TX0_CW_MIN_OFDM      cpu_to_le16(CW_MIN_OFDM)
+#define DEF_TX1_CW_MIN_OFDM      cpu_to_le16(CW_MIN_OFDM)
+#define DEF_TX2_CW_MIN_OFDM      cpu_to_le16(CW_MIN_OFDM)
+#define DEF_TX3_CW_MIN_OFDM      cpu_to_le16(CW_MIN_OFDM)
 
-#define DEF_TX0_CW_MIN_CCK       CW_MIN_CCK
-#define DEF_TX1_CW_MIN_CCK       CW_MIN_CCK
-#define DEF_TX2_CW_MIN_CCK       CW_MIN_CCK
-#define DEF_TX3_CW_MIN_CCK       CW_MIN_CCK
+#define DEF_TX0_CW_MIN_CCK       cpu_to_le16(CW_MIN_CCK)
+#define DEF_TX1_CW_MIN_CCK       cpu_to_le16(CW_MIN_CCK)
+#define DEF_TX2_CW_MIN_CCK       cpu_to_le16(CW_MIN_CCK)
+#define DEF_TX3_CW_MIN_CCK       cpu_to_le16(CW_MIN_CCK)
 
-#define DEF_TX0_CW_MAX_OFDM      CW_MAX_OFDM
-#define DEF_TX1_CW_MAX_OFDM      CW_MAX_OFDM
-#define DEF_TX2_CW_MAX_OFDM      CW_MAX_OFDM
-#define DEF_TX3_CW_MAX_OFDM      CW_MAX_OFDM
+#define DEF_TX0_CW_MAX_OFDM      cpu_to_le16(CW_MAX_OFDM)
+#define DEF_TX1_CW_MAX_OFDM      cpu_to_le16(CW_MAX_OFDM)
+#define DEF_TX2_CW_MAX_OFDM      cpu_to_le16(CW_MAX_OFDM)
+#define DEF_TX3_CW_MAX_OFDM      cpu_to_le16(CW_MAX_OFDM)
 
-#define DEF_TX0_CW_MAX_CCK       CW_MAX_CCK
-#define DEF_TX1_CW_MAX_CCK       CW_MAX_CCK
-#define DEF_TX2_CW_MAX_CCK       CW_MAX_CCK
-#define DEF_TX3_CW_MAX_CCK       CW_MAX_CCK
+#define DEF_TX0_CW_MAX_CCK       cpu_to_le16(CW_MAX_CCK)
+#define DEF_TX1_CW_MAX_CCK       cpu_to_le16(CW_MAX_CCK)
+#define DEF_TX2_CW_MAX_CCK       cpu_to_le16(CW_MAX_CCK)
+#define DEF_TX3_CW_MAX_CCK       cpu_to_le16(CW_MAX_CCK)
 
 #define DEF_TX0_AIFS            0
 #define DEF_TX1_AIFS            0
@@ -383,73 +385,73 @@ struct clx2_queue {
        dma_addr_t dma_addr;            /**< physical addr for BD's */
        int low_mark;                  /**< low watermark, resume queue if free space more than this */
        int high_mark;                 /**< high watermark, stop queue if free space less than this */
-} __attribute__ ((packed));
+} __attribute__ ((packed)); /* XXX */
 
 struct machdr32 {
-       u16 frame_ctl;
-       u16 duration;           // watch out for endians!
+       __le16 frame_ctl;
+       __le16 duration;                // watch out for endians!
        u8 addr1[MACADRR_BYTE_LEN];
        u8 addr2[MACADRR_BYTE_LEN];
        u8 addr3[MACADRR_BYTE_LEN];
-       u16 seq_ctrl;           // more endians!
+       __le16 seq_ctrl;                // more endians!
        u8 addr4[MACADRR_BYTE_LEN];
-       u16 qos_ctrl;
+       __le16 qos_ctrl;
 } __attribute__ ((packed));
 
 struct machdr30 {
-       u16 frame_ctl;
-       u16 duration;           // watch out for endians!
+       __le16 frame_ctl;
+       __le16 duration;                // watch out for endians!
        u8 addr1[MACADRR_BYTE_LEN];
        u8 addr2[MACADRR_BYTE_LEN];
        u8 addr3[MACADRR_BYTE_LEN];
-       u16 seq_ctrl;           // more endians!
+       __le16 seq_ctrl;                // more endians!
        u8 addr4[MACADRR_BYTE_LEN];
 } __attribute__ ((packed));
 
 struct machdr26 {
-       u16 frame_ctl;
-       u16 duration;           // watch out for endians!
+       __le16 frame_ctl;
+       __le16 duration;                // watch out for endians!
        u8 addr1[MACADRR_BYTE_LEN];
        u8 addr2[MACADRR_BYTE_LEN];
        u8 addr3[MACADRR_BYTE_LEN];
-       u16 seq_ctrl;           // more endians!
-       u16 qos_ctrl;
+       __le16 seq_ctrl;                // more endians!
+       __le16 qos_ctrl;
 } __attribute__ ((packed));
 
 struct machdr24 {
-       u16 frame_ctl;
-       u16 duration;           // watch out for endians!
+       __le16 frame_ctl;
+       __le16 duration;                // watch out for endians!
        u8 addr1[MACADRR_BYTE_LEN];
        u8 addr2[MACADRR_BYTE_LEN];
        u8 addr3[MACADRR_BYTE_LEN];
-       u16 seq_ctrl;           // more endians!
+       __le16 seq_ctrl;                // more endians!
 } __attribute__ ((packed));
 
 // TX TFD with 32 byte MAC Header
 struct tx_tfd_32 {
        struct machdr32 mchdr;  // 32
-       u32 uivplaceholder[2];  // 8
+       __le32 uivplaceholder[2];       // 8
 } __attribute__ ((packed));
 
 // TX TFD with 30 byte MAC Header
 struct tx_tfd_30 {
        struct machdr30 mchdr;  // 30
        u8 reserved[2];         // 2
-       u32 uivplaceholder[2];  // 8
+       __le32 uivplaceholder[2];       // 8
 } __attribute__ ((packed));
 
 // tx tfd with 26 byte mac header
 struct tx_tfd_26 {
        struct machdr26 mchdr;  // 26
        u8 reserved1[2];        // 2
-       u32 uivplaceholder[2];  // 8
+       __le32 uivplaceholder[2];       // 8
        u8 reserved2[4];        // 4
 } __attribute__ ((packed));
 
 // tx tfd with 24 byte mac header
 struct tx_tfd_24 {
        struct machdr24 mchdr;  // 24
-       u32 uivplaceholder[2];  // 8
+       __le32 uivplaceholder[2];       // 8
        u8 reserved[8];         // 8
 } __attribute__ ((packed));
 
@@ -458,21 +460,21 @@ struct tx_tfd_24 {
 struct tfd_command {
        u8 index;
        u8 length;
-       u16 reserved;
+       __le16 reserved;
        u8 payload[0];
 } __attribute__ ((packed));
 
 struct tfd_data {
        /* Header */
-       u32 work_area_ptr;
+       __le32 work_area_ptr;
        u8 station_number;      /* 0 for BSS */
        u8 reserved1;
-       u16 reserved2;
+       __le16 reserved2;
 
        /* Tx Parameters */
        u8 cmd_id;
        u8 seq_num;
-       u16 len;
+       __le16 len;
        u8 priority;
        u8 tx_flags;
        u8 tx_flags_ext;
@@ -480,11 +482,11 @@ struct tfd_data {
        u8 wepkey[DCT_WEP_KEY_FIELD_LENGTH];
        u8 rate;
        u8 antenna;
-       u16 next_packet_duration;
-       u16 next_frag_len;
-       u16 back_off_counter;   //////txop;
+       __le16 next_packet_duration;
+       __le16 next_frag_len;
+       __le16 back_off_counter;        //////txop;
        u8 retrylimit;
-       u16 cwcurrent;
+       __le16 cwcurrent;
        u8 reserved3;
 
        /* 802.11 MAC Header */
@@ -496,9 +498,9 @@ struct tfd_data {
        } tfd;
 
        /* Payload DMA info */
-       u32 num_chunks;
-       u32 chunk_ptr[NUM_TFD_CHUNKS];
-       u16 chunk_len[NUM_TFD_CHUNKS];
+       __le32 num_chunks;
+       __le32 chunk_ptr[NUM_TFD_CHUNKS];
+       __le16 chunk_len[NUM_TFD_CHUNKS];
 } __attribute__ ((packed));
 
 struct txrx_control_flags {
@@ -545,14 +547,14 @@ struct clx2_tx_queue {
 // Used for passing to driver number of successes and failures per rate
 struct rate_histogram {
        union {
-               u32 a[SUP_RATE_11A_MAX_NUM_CHANNELS];
-               u32 b[SUP_RATE_11B_MAX_NUM_CHANNELS];
-               u32 g[SUP_RATE_11G_MAX_NUM_CHANNELS];
+               __le32 a[SUP_RATE_11A_MAX_NUM_CHANNELS];
+               __le32 b[SUP_RATE_11B_MAX_NUM_CHANNELS];
+               __le32 g[SUP_RATE_11G_MAX_NUM_CHANNELS];
        } success;
        union {
-               u32 a[SUP_RATE_11A_MAX_NUM_CHANNELS];
-               u32 b[SUP_RATE_11B_MAX_NUM_CHANNELS];
-               u32 g[SUP_RATE_11G_MAX_NUM_CHANNELS];
+               __le32 a[SUP_RATE_11A_MAX_NUM_CHANNELS];
+               __le32 b[SUP_RATE_11B_MAX_NUM_CHANNELS];
+               __le32 g[SUP_RATE_11G_MAX_NUM_CHANNELS];
        } failed;
 } __attribute__ ((packed));
 
@@ -560,27 +562,27 @@ struct rate_histogram {
 struct ipw_cmd_stats {
        u8 cmd_id;
        u8 seq_num;
-       u16 good_sfd;
-       u16 bad_plcp;
-       u16 wrong_bssid;
-       u16 valid_mpdu;
-       u16 bad_mac_header;
-       u16 reserved_frame_types;
-       u16 rx_ina;
-       u16 bad_crc32;
-       u16 invalid_cts;
-       u16 invalid_acks;
-       u16 long_distance_ina_fina;
-       u16 dsp_silence_unreachable;
-       u16 accumulated_rssi;
-       u16 rx_ovfl_frame_tossed;
-       u16 rssi_silence_threshold;
-       u16 rx_ovfl_frame_supplied;
-       u16 last_rx_frame_signal;
-       u16 last_rx_frame_noise;
-       u16 rx_autodetec_no_ofdm;
-       u16 rx_autodetec_no_barker;
-       u16 reserved;
+       __le16 good_sfd;
+       __le16 bad_plcp;
+       __le16 wrong_bssid;
+       __le16 valid_mpdu;
+       __le16 bad_mac_header;
+       __le16 reserved_frame_types;
+       __le16 rx_ina;
+       __le16 bad_crc32;
+       __le16 invalid_cts;
+       __le16 invalid_acks;
+       __le16 long_distance_ina_fina;
+       __le16 dsp_silence_unreachable;
+       __le16 accumulated_rssi;
+       __le16 rx_ovfl_frame_tossed;
+       __le16 rssi_silence_threshold;
+       __le16 rx_ovfl_frame_supplied;
+       __le16 last_rx_frame_signal;
+       __le16 last_rx_frame_noise;
+       __le16 rx_autodetec_no_ofdm;
+       __le16 rx_autodetec_no_barker;
+       __le16 reserved;
 } __attribute__ ((packed));
 
 struct notif_channel_result {
@@ -600,13 +602,13 @@ struct notif_scan_complete {
 } __attribute__ ((packed));
 
 struct notif_frag_length {
-       u16 frag_length;
-       u16 reserved;
+       __le16 frag_length;
+       __le16 reserved;
 } __attribute__ ((packed));
 
 struct notif_beacon_state {
-       u32 state;
-       u32 number;
+       __le32 state;
+       __le32 number;
 } __attribute__ ((packed));
 
 struct notif_tgi_tx_key {
@@ -616,13 +618,16 @@ struct notif_tgi_tx_key {
        u8 reserved;
 } __attribute__ ((packed));
 
+#define SILENCE_OVER_THRESH (1)
+#define SILENCE_UNDER_THRESH (2)
+
 struct notif_link_deterioration {
        struct ipw_cmd_stats stats;
        u8 rate;
        u8 modulation;
        struct rate_histogram histogram;
-       u8 reserved1;
-       u16 reserved2;
+       u8 silence_notification_type;   /* SILENCE_OVER/UNDER_THRESH */
+       __le16 silence_count;
 } __attribute__ ((packed));
 
 struct notif_association {
@@ -632,7 +637,7 @@ struct notif_association {
 struct notif_authenticate {
        u8 state;
        struct machdr24 addr;
-       u16 status;
+       __le16 status;
 } __attribute__ ((packed));
 
 struct notif_calibration {
@@ -640,14 +645,14 @@ struct notif_calibration {
 } __attribute__ ((packed));
 
 struct notif_noise {
-       u32 value;
+       __le32 value;
 } __attribute__ ((packed));
 
 struct ipw_rx_notification {
        u8 reserved[8];
        u8 subtype;
        u8 flags;
-       u16 size;
+       __le16 size;
        union {
                struct notif_association assoc;
                struct notif_authenticate auth;
@@ -664,7 +669,7 @@ struct ipw_rx_notification {
 } __attribute__ ((packed));
 
 struct ipw_rx_frame {
-       u32 reserved1;
+       __le32 reserved1;
        u8 parent_tsf[4];       // fw_use[0] is boolean for OUR_TSF_IS_GREATER
        u8 received_channel;    // The channel that this frame was received on.
        // Note that for .11b this does not have to be
@@ -675,14 +680,14 @@ struct ipw_rx_frame {
        u8 rssi;
        u8 agc;
        u8 rssi_dbm;
-       u16 signal;
-       u16 noise;
+       __le16 signal;
+       __le16 noise;
        u8 antennaAndPhy;
        u8 control;             // control bit should be on in bg
        u8 rtscts_rate;         // rate of rts or cts (in rts cts sequence rate
        // is identical)
        u8 rtscts_seen;         // 0x1 RTS seen ; 0x2 CTS seen
-       u16 length;
+       __le16 length;
        u8 data[0];
 } __attribute__ ((packed));
 
@@ -707,7 +712,6 @@ struct ipw_rx_packet {
 
 struct ipw_rx_mem_buffer {
        dma_addr_t dma_addr;
-       struct ipw_rx_buffer *rxb;
        struct sk_buff *skb;
        struct list_head list;
 };                             /* Not transferred over network, so not  __attribute__ ((packed)) */
@@ -728,14 +732,14 @@ struct ipw_rx_queue {
 struct alive_command_responce {
        u8 alive_command;
        u8 sequence_number;
-       u16 software_revision;
+       __le16 software_revision;
        u8 device_identifier;
        u8 reserved1[5];
-       u16 reserved2;
-       u16 reserved3;
-       u16 clock_settle_time;
-       u16 powerup_settle_time;
-       u16 reserved4;
+       __le16 reserved2;
+       __le16 reserved3;
+       __le16 clock_settle_time;
+       __le16 powerup_settle_time;
+       __le16 reserved4;
        u8 time_stamp[5];       /* month, day, year, hours, minutes */
        u8 ucode_valid;
 } __attribute__ ((packed));
@@ -780,9 +784,9 @@ struct ipw_sys_config {
        u8 enable_cts_to_self;
        u8 enable_multicast_filtering;
        u8 bt_coexist_collision_thr;
-       u8 reserved2;
+       u8 silence_threshold;
        u8 accept_all_mgmt_bcpr;
-       u8 accept_all_mgtm_frames;
+       u8 accept_all_mgmt_frames;
        u8 pass_noise_stats_to_host;
        u8 reserved3;
 } __attribute__ ((packed));
@@ -823,14 +827,14 @@ struct ipw_tgi_tx_key {
        u8 station_index;
        u8 flags;
        u8 key[16];
-       u32 tx_counter[2];
+       __le32 tx_counter[2];
 } __attribute__ ((packed));
 
 #define IPW_SCAN_CHANNELS 54
 
 struct ipw_scan_request {
        u8 scan_type;
-       u16 dwell_time;
+       __le16 dwell_time;
        u8 channels_list[IPW_SCAN_CHANNELS];
        u8 channels_reserved[3];
 } __attribute__ ((packed));
@@ -845,14 +849,14 @@ enum {
 };
 
 struct ipw_scan_request_ext {
-       u32 full_scan_index;
+       __le32 full_scan_index;
        u8 channels_list[IPW_SCAN_CHANNELS];
        u8 scan_type[IPW_SCAN_CHANNELS / 2];
        u8 reserved;
-       u16 dwell_time[IPW_SCAN_TYPES];
+       __le16 dwell_time[IPW_SCAN_TYPES];
 } __attribute__ ((packed));
 
-extern inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index)
+static inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index)
 {
        if (index % 2)
                return scan->scan_type[index / 2] & 0x0F;
@@ -860,7 +864,7 @@ extern inline u8 ipw_get_scan_type(struct ipw_scan_request_ext *scan, u8 index)
                return (scan->scan_type[index / 2] & 0xF0) >> 4;
 }
 
-extern inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan,
+static inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan,
                                     u8 index, u8 scan_type)
 {
        if (index % 2)
@@ -874,23 +878,27 @@ extern inline void ipw_set_scan_type(struct ipw_scan_request_ext *scan,
 
 struct ipw_associate {
        u8 channel;
+#ifdef __LITTLE_ENDIAN_BITFIELD
        u8 auth_type:4, auth_key:4;
+#else
+       u8 auth_key:4, auth_type:4;
+#endif
        u8 assoc_type;
        u8 reserved;
-       u16 policy_support;
+       __le16 policy_support;
        u8 preamble_length;
        u8 ieee_mode;
        u8 bssid[ETH_ALEN];
-       u32 assoc_tsf_msw;
-       u32 assoc_tsf_lsw;
-       u16 capability;
-       u16 listen_interval;
-       u16 beacon_interval;
+       __le32 assoc_tsf_msw;
+       __le32 assoc_tsf_lsw;
+       __le16 capability;
+       __le16 listen_interval;
+       __le16 beacon_interval;
        u8 dest[ETH_ALEN];
-       u16 atim_window;
+       __le16 atim_window;
        u8 smr;
        u8 reserved1;
-       u16 reserved2;
+       __le16 reserved2;
 } __attribute__ ((packed));
 
 struct ipw_supported_rates {
@@ -902,24 +910,24 @@ struct ipw_supported_rates {
 } __attribute__ ((packed));
 
 struct ipw_rts_threshold {
-       u16 rts_threshold;
-       u16 reserved;
+       __le16 rts_threshold;
+       __le16 reserved;
 } __attribute__ ((packed));
 
 struct ipw_frag_threshold {
-       u16 frag_threshold;
-       u16 reserved;
+       __le16 frag_threshold;
+       __le16 reserved;
 } __attribute__ ((packed));
 
 struct ipw_retry_limit {
        u8 short_retry_limit;
        u8 long_retry_limit;
-       u16 reserved;
+       __le16 reserved;
 } __attribute__ ((packed));
 
 struct ipw_dino_config {
-       u32 dino_config_addr;
-       u16 dino_config_size;
+       __le32 dino_config_addr;
+       __le16 dino_config_size;
        u8 dino_response;
        u8 reserved;
 } __attribute__ ((packed));
@@ -927,7 +935,7 @@ struct ipw_dino_config {
 struct ipw_aironet_info {
        u8 id;
        u8 length;
-       u16 reserved;
+       __le16 reserved;
 } __attribute__ ((packed));
 
 struct ipw_rx_key {
@@ -973,12 +981,12 @@ struct ipw_tx_power {
 struct ipw_rsn_capabilities {
        u8 id;
        u8 length;
-       u16 version;
+       __le16 version;
 } __attribute__ ((packed));
 
 struct ipw_sensitivity_calib {
-       u16 beacon_rssi_raw;
-       u16 reserved;
+       __le16 beacon_rssi_raw;
+       __le16 reserved;
 } __attribute__ ((packed));
 
 /**
@@ -994,7 +1002,7 @@ struct ipw_sensitivity_calib {
  * - \a status contains status;
  * - \a param filled with status parameters.
  */
-struct ipw_cmd {
+struct ipw_cmd {        /* XXX */
        u32 cmd;   /**< Host command */
        u32 status;/**< Status */
        u32 status_len;
@@ -1029,6 +1037,7 @@ struct ipw_cmd {
 #define STATUS_DISASSOC_PENDING (1<<12)
 #define STATUS_STATE_PENDING    (1<<13)
 
+#define STATUS_DIRECT_SCAN_PENDING (1<<19)
 #define STATUS_SCAN_PENDING     (1<<20)
 #define STATUS_SCANNING         (1<<21)
 #define STATUS_SCAN_ABORTING    (1<<22)
@@ -1088,7 +1097,7 @@ struct ipw_ibss_seq {
        struct list_head list;
 };
 
-struct ipw_error_elem {
+struct ipw_error_elem {         /* XXX */
        u32 desc;
        u32 time;
        u32 blink1;
@@ -1098,13 +1107,13 @@ struct ipw_error_elem {
        u32 data;
 };
 
-struct ipw_event {
+struct ipw_event {      /* XXX */
        u32 event;
        u32 time;
        u32 data;
 } __attribute__ ((packed));
 
-struct ipw_fw_error {
+struct ipw_fw_error {   /* XXX */
        unsigned long jiffies;
        u32 status;
        u32 config;
@@ -1115,17 +1124,70 @@ struct ipw_fw_error {
        u8 payload[0];
 } __attribute__ ((packed));
 
+#ifdef CONFIG_IPW2200_PROMISCUOUS
+
+enum ipw_prom_filter {
+       IPW_PROM_CTL_HEADER_ONLY = (1 << 0),
+       IPW_PROM_MGMT_HEADER_ONLY = (1 << 1),
+       IPW_PROM_DATA_HEADER_ONLY = (1 << 2),
+       IPW_PROM_ALL_HEADER_ONLY = 0xf, /* bits 0..3 */
+       IPW_PROM_NO_TX = (1 << 4),
+       IPW_PROM_NO_RX = (1 << 5),
+       IPW_PROM_NO_CTL = (1 << 6),
+       IPW_PROM_NO_MGMT = (1 << 7),
+       IPW_PROM_NO_DATA = (1 << 8),
+};
+
+struct ipw_priv;
+struct ipw_prom_priv {
+       struct ipw_priv *priv;
+       struct ieee80211_device *ieee;
+       enum ipw_prom_filter filter;
+       int tx_packets;
+       int rx_packets;
+};
+#endif
+
+#if defined(CONFIG_IPW2200_RADIOTAP) || defined(CONFIG_IPW2200_PROMISCUOUS)
+/* Magic struct that slots into the radiotap header -- no reason
+ * to build this manually element by element, we can write it much
+ * more efficiently than we can parse it. ORDER MATTERS HERE
+ *
+ * When sent to us via the simulated Rx interface in sysfs, the entire
+ * structure is provided regardless of any bits unset.
+ */
+struct ipw_rt_hdr {
+       struct ieee80211_radiotap_header rt_hdr;
+       u64 rt_tsf;      /* TSF */      /* XXX */
+       u8 rt_flags;    /* radiotap packet flags */
+       u8 rt_rate;     /* rate in 500kb/s */
+       __le16 rt_channel;      /* channel in mhz */
+       __le16 rt_chbitmask;    /* channel bitfield */
+       s8 rt_dbmsignal;        /* signal in dbM, kluged to signed */
+       s8 rt_dbmnoise;
+       u8 rt_antenna;  /* antenna number */
+       u8 payload[0];  /* payload... */
+} __attribute__ ((packed));
+#endif
+
 struct ipw_priv {
        /* ieee device used by generic ieee processing code */
        struct ieee80211_device *ieee;
 
        spinlock_t lock;
-       struct semaphore sem;
+       spinlock_t irq_lock;
+       struct mutex mutex;
 
        /* basic pci-network driver stuff */
        struct pci_dev *pci_dev;
        struct net_device *net_dev;
 
+#ifdef CONFIG_IPW2200_PROMISCUOUS
+       /* Promiscuous mode */
+       struct ipw_prom_priv *prom_priv;
+       struct net_device *prom_net_dev;
+#endif
+
        /* pci hardware address support */
        void __iomem *hw_base;
        unsigned long hw_len;
@@ -1146,11 +1208,9 @@ struct ipw_priv {
        u32 config;
        u32 capability;
 
-       u8 last_rx_rssi;
-       u8 last_noise;
        struct average average_missed_beacons;
-       struct average average_rssi;
-       struct average average_noise;
+       s16 exp_avg_rssi;
+       s16 exp_avg_noise;
        u32 port_type;
        int rx_bufs_min;          /**< minimum number of bufs in Rx queue */
        int rx_pend_max;          /**< maximum pending buffers for one IRQ */
@@ -1232,22 +1292,29 @@ struct ipw_priv {
 
        struct iw_public_data wireless_data;
 
+       int user_requested_scan;
+       u8 direct_scan_ssid[IW_ESSID_MAX_SIZE];
+       u8 direct_scan_ssid_len;
+
        struct workqueue_struct *workqueue;
 
-       struct work_struct adhoc_check;
+       struct delayed_work adhoc_check;
        struct work_struct associate;
        struct work_struct disassociate;
        struct work_struct system_config;
        struct work_struct rx_replenish;
-       struct work_struct request_scan;
+       struct delayed_work request_scan;
+       struct delayed_work request_direct_scan;
+       struct delayed_work request_passive_scan;
+       struct delayed_work scan_event;
        struct work_struct adapter_restart;
-       struct work_struct rf_kill;
+       struct delayed_work rf_kill;
        struct work_struct up;
        struct work_struct down;
-       struct work_struct gather_stats;
+       struct delayed_work gather_stats;
        struct work_struct abort_scan;
        struct work_struct roam;
-       struct work_struct scan_check;
+       struct delayed_work scan_check;
        struct work_struct link_up;
        struct work_struct link_down;
 
@@ -1262,9 +1329,9 @@ struct ipw_priv {
        u32 led_ofdm_on;
        u32 led_ofdm_off;
 
-       struct work_struct led_link_on;
-       struct work_struct led_link_off;
-       struct work_struct led_act_off;
+       struct delayed_work led_link_on;
+       struct delayed_work led_link_off;
+       struct delayed_work led_act_off;
        struct work_struct merge_networks;
 
        struct ipw_cmd_log *cmdlog;
@@ -1301,14 +1368,42 @@ struct ipw_priv {
 
 /* debug macros */
 
-#ifdef CONFIG_IPW_DEBUG
+/* Debug and printf string expansion helpers for printing bitfields */
+#define BIT_FMT8 "%c%c%c%c-%c%c%c%c"
+#define BIT_FMT16 BIT_FMT8 ":" BIT_FMT8
+#define BIT_FMT32 BIT_FMT16 " " BIT_FMT16
+
+#define BITC(x,y) (((x>>y)&1)?'1':'0')
+#define BIT_ARG8(x) \
+BITC(x,7),BITC(x,6),BITC(x,5),BITC(x,4),\
+BITC(x,3),BITC(x,2),BITC(x,1),BITC(x,0)
+
+#define BIT_ARG16(x) \
+BITC(x,15),BITC(x,14),BITC(x,13),BITC(x,12),\
+BITC(x,11),BITC(x,10),BITC(x,9),BITC(x,8),\
+BIT_ARG8(x)
+
+#define BIT_ARG32(x) \
+BITC(x,31),BITC(x,30),BITC(x,29),BITC(x,28),\
+BITC(x,27),BITC(x,26),BITC(x,25),BITC(x,24),\
+BITC(x,23),BITC(x,22),BITC(x,21),BITC(x,20),\
+BITC(x,19),BITC(x,18),BITC(x,17),BITC(x,16),\
+BIT_ARG16(x)
+
+
 #define IPW_DEBUG(level, fmt, args...) \
 do { if (ipw_debug_level & (level)) \
   printk(KERN_DEBUG DRV_NAME": %c %s " fmt, \
          in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
+
+#ifdef CONFIG_IPW2200_DEBUG
+#define IPW_LL_DEBUG(level, fmt, args...) \
+do { if (ipw_debug_level & (level)) \
+  printk(KERN_DEBUG DRV_NAME": %c %s " fmt, \
+         in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
 #else
-#define IPW_DEBUG(level, fmt, args...) do {} while (0)
-#endif                         /* CONFIG_IPW_DEBUG */
+#define IPW_LL_DEBUG(level, fmt, args...) do {} while (0)
+#endif                         /* CONFIG_IPW2200_DEBUG */
 
 /*
  * To use the debug system;
@@ -1332,7 +1427,7 @@ do { if (ipw_debug_level & (level)) \
  * you simply need to add your entry to the ipw_debug_levels array.
  *
  * If you do not see debug_level in /proc/net/ipw then you do not have
- * CONFIG_IPW_DEBUG defined in your kernel configuration
+ * CONFIG_IPW2200_DEBUG defined in your kernel configuration
  *
  */
 
@@ -1377,28 +1472,27 @@ do { if (ipw_debug_level & (level)) \
 
 #define IPW_DEBUG_WX(f, a...)     IPW_DEBUG(IPW_DL_WX, f, ## a)
 #define IPW_DEBUG_SCAN(f, a...)   IPW_DEBUG(IPW_DL_SCAN, f, ## a)
-#define IPW_DEBUG_STATUS(f, a...) IPW_DEBUG(IPW_DL_STATUS, f, ## a)
-#define IPW_DEBUG_TRACE(f, a...)  IPW_DEBUG(IPW_DL_TRACE, f, ## a)
-#define IPW_DEBUG_RX(f, a...)     IPW_DEBUG(IPW_DL_RX, f, ## a)
-#define IPW_DEBUG_TX(f, a...)     IPW_DEBUG(IPW_DL_TX, f, ## a)
-#define IPW_DEBUG_ISR(f, a...)    IPW_DEBUG(IPW_DL_ISR, f, ## a)
+#define IPW_DEBUG_TRACE(f, a...)  IPW_LL_DEBUG(IPW_DL_TRACE, f, ## a)
+#define IPW_DEBUG_RX(f, a...)     IPW_LL_DEBUG(IPW_DL_RX, f, ## a)
+#define IPW_DEBUG_TX(f, a...)     IPW_LL_DEBUG(IPW_DL_TX, f, ## a)
+#define IPW_DEBUG_ISR(f, a...)    IPW_LL_DEBUG(IPW_DL_ISR, f, ## a)
 #define IPW_DEBUG_MANAGEMENT(f, a...) IPW_DEBUG(IPW_DL_MANAGE, f, ## a)
-#define IPW_DEBUG_LED(f, a...) IPW_DEBUG(IPW_DL_LED, f, ## a)
-#define IPW_DEBUG_WEP(f, a...)    IPW_DEBUG(IPW_DL_WEP, f, ## a)
-#define IPW_DEBUG_HC(f, a...) IPW_DEBUG(IPW_DL_HOST_COMMAND, f, ## a)
-#define IPW_DEBUG_FRAG(f, a...) IPW_DEBUG(IPW_DL_FRAG, f, ## a)
-#define IPW_DEBUG_FW(f, a...) IPW_DEBUG(IPW_DL_FW, f, ## a)
+#define IPW_DEBUG_LED(f, a...) IPW_LL_DEBUG(IPW_DL_LED, f, ## a)
+#define IPW_DEBUG_WEP(f, a...)    IPW_LL_DEBUG(IPW_DL_WEP, f, ## a)
+#define IPW_DEBUG_HC(f, a...) IPW_LL_DEBUG(IPW_DL_HOST_COMMAND, f, ## a)
+#define IPW_DEBUG_FRAG(f, a...) IPW_LL_DEBUG(IPW_DL_FRAG, f, ## a)
+#define IPW_DEBUG_FW(f, a...) IPW_LL_DEBUG(IPW_DL_FW, f, ## a)
 #define IPW_DEBUG_RF_KILL(f, a...) IPW_DEBUG(IPW_DL_RF_KILL, f, ## a)
 #define IPW_DEBUG_DROP(f, a...) IPW_DEBUG(IPW_DL_DROP, f, ## a)
-#define IPW_DEBUG_IO(f, a...) IPW_DEBUG(IPW_DL_IO, f, ## a)
-#define IPW_DEBUG_ORD(f, a...) IPW_DEBUG(IPW_DL_ORD, f, ## a)
-#define IPW_DEBUG_FW_INFO(f, a...) IPW_DEBUG(IPW_DL_FW_INFO, f, ## a)
+#define IPW_DEBUG_IO(f, a...) IPW_LL_DEBUG(IPW_DL_IO, f, ## a)
+#define IPW_DEBUG_ORD(f, a...) IPW_LL_DEBUG(IPW_DL_ORD, f, ## a)
+#define IPW_DEBUG_FW_INFO(f, a...) IPW_LL_DEBUG(IPW_DL_FW_INFO, f, ## a)
 #define IPW_DEBUG_NOTIF(f, a...) IPW_DEBUG(IPW_DL_NOTIF, f, ## a)
 #define IPW_DEBUG_STATE(f, a...) IPW_DEBUG(IPW_DL_STATE | IPW_DL_ASSOC | IPW_DL_INFO, f, ## a)
 #define IPW_DEBUG_ASSOC(f, a...) IPW_DEBUG(IPW_DL_ASSOC | IPW_DL_INFO, f, ## a)
-#define IPW_DEBUG_STATS(f, a...) IPW_DEBUG(IPW_DL_STATS, f, ## a)
-#define IPW_DEBUG_MERGE(f, a...) IPW_DEBUG(IPW_DL_MERGE, f, ## a)
-#define IPW_DEBUG_QOS(f, a...)   IPW_DEBUG(IPW_DL_QOS, f, ## a)
+#define IPW_DEBUG_STATS(f, a...) IPW_LL_DEBUG(IPW_DL_STATS, f, ## a)
+#define IPW_DEBUG_MERGE(f, a...) IPW_LL_DEBUG(IPW_DL_MERGE, f, ## a)
+#define IPW_DEBUG_QOS(f, a...)   IPW_LL_DEBUG(IPW_DL_QOS, f, ## a)
 
 #include <linux/ctype.h>
 
@@ -1406,13 +1500,6 @@ do { if (ipw_debug_level & (level)) \
 * Register bit definitions
 */
 
-/* Dino control registers bits */
-
-#define DINO_ENABLE_SYSTEM 0x80
-#define DINO_ENABLE_CS     0x40
-#define DINO_RXFIFO_DATA   0x01
-#define DINO_CONTROL_REG   0x00200000
-
 #define IPW_INTA_RW       0x00000008
 #define IPW_INTA_MASK_R   0x0000000C
 #define IPW_INDIRECT_ADDR 0x00000010
@@ -1459,6 +1546,11 @@ do { if (ipw_debug_level & (level)) \
 #define IPW_DOMAIN_0_END 0x1000
 #define CLX_MEM_BAR_SIZE 0x1000
 
+/* Dino/baseband control registers bits */
+
+#define DINO_ENABLE_SYSTEM 0x80        /* 1 = baseband processor on, 0 = reset */
+#define DINO_ENABLE_CS     0x40        /* 1 = enable ucode load */
+#define DINO_RXFIFO_DATA   0x01        /* 1 = data available */
 #define IPW_BASEBAND_CONTROL_STATUS    0X00200000
 #define IPW_BASEBAND_TX_FIFO_WRITE     0X00200004
 #define IPW_BASEBAND_RX_FIFO_READ      0X00200004
@@ -1567,13 +1659,18 @@ do { if (ipw_debug_level & (level)) \
 #define EEPROM_BSS_CHANNELS_BG  (GET_EEPROM_ADDR(0x2c,LSB))    /* 2 bytes  */
 #define EEPROM_HW_VERSION       (GET_EEPROM_ADDR(0x72,LSB))    /* 2 bytes  */
 
-/* NIC type as found in the one byte EEPROM_NIC_TYPE  offset*/
+/* NIC type as found in the one byte EEPROM_NIC_TYPE offset */
 #define EEPROM_NIC_TYPE_0 0
 #define EEPROM_NIC_TYPE_1 1
 #define EEPROM_NIC_TYPE_2 2
 #define EEPROM_NIC_TYPE_3 3
 #define EEPROM_NIC_TYPE_4 4
 
+/* Bluetooth Coexistence capabilities as found in EEPROM_SKU_CAPABILITY */
+#define EEPROM_SKU_CAP_BT_CHANNEL_SIG  0x01    /* we can tell BT our channel # */
+#define EEPROM_SKU_CAP_BT_PRIORITY     0x02    /* BT can take priority over us */
+#define EEPROM_SKU_CAP_BT_OOB          0x04    /* we can signal BT out-of-band */
+
 #define FW_MEM_REG_LOWER_BOUND          0x00300000
 #define FW_MEM_REG_EEPROM_ACCESS        (FW_MEM_REG_LOWER_BOUND + 0x40)
 #define IPW_EVENT_REG                   (FW_MEM_REG_LOWER_BOUND + 0x04)
@@ -1658,9 +1755,10 @@ enum {
        IPW_FW_ERROR_FATAL_ERROR
 };
 
-#define AUTH_OPEN       0
-#define AUTH_SHARED_KEY 1
-#define AUTH_IGNORE     3
+#define AUTH_OPEN      0
+#define AUTH_SHARED_KEY        1
+#define AUTH_LEAP      2
+#define AUTH_IGNORE    3
 
 #define HC_ASSOCIATE      0
 #define HC_REASSOCIATE    1
@@ -1669,7 +1767,7 @@ enum {
 #define HC_IBSS_RECONF    4
 #define HC_DISASSOC_QUIET 5
 
-#define HC_QOS_SUPPORT_ASSOC  0x01
+#define HC_QOS_SUPPORT_ASSOC  cpu_to_le16(0x01)
 
 #define IPW_RATE_CAPABILITIES 1
 #define IPW_RATE_CONNECT      0
@@ -1850,8 +1948,8 @@ enum {
 #define IPW_MEM_FIXED_OVERRIDE          (IPW_SHARED_LOWER_BOUND + 0x41C)
 
 struct ipw_fixed_rate {
-       u16 tx_rates;
-       u16 reserved;
+       __le16 tx_rates;
+       __le16 reserved;
 } __attribute__ ((packed));
 
 #define IPW_INDIRECT_ADDR_MASK (~0x3ul)
@@ -1860,30 +1958,40 @@ struct host_cmd {
        u8 cmd;
        u8 len;
        u16 reserved;
-       u32 param[TFD_CMD_IMMEDIATE_PAYLOAD_LENGTH];
+       u32 *param;
+} __attribute__ ((packed));    /* XXX */
+
+struct cmdlog_host_cmd {
+       u8 cmd;
+       u8 len;
+       __le16 reserved;
+       char param[124];
 } __attribute__ ((packed));
 
 struct ipw_cmd_log {
        unsigned long jiffies;
        int retcode;
-       struct host_cmd cmd;
+       struct cmdlog_host_cmd cmd;
 };
 
-#define CFG_BT_COEXISTENCE_MIN                  0x00
-#define CFG_BT_COEXISTENCE_DEFER                0x02
-#define CFG_BT_COEXISTENCE_KILL                 0x04
-#define CFG_BT_COEXISTENCE_WME_OVER_BT          0x08
-#define CFG_BT_COEXISTENCE_OOB                  0x10
-#define CFG_BT_COEXISTENCE_MAX                  0xFF
-#define CFG_BT_COEXISTENCE_DEF                  0x80   /* read Bt from EEPROM */
-
-#define CFG_CTS_TO_ITSELF_ENABLED_MIN  0x0
-#define CFG_CTS_TO_ITSELF_ENABLED_MAX  0x1
+/* SysConfig command parameters ... */
+/* bt_coexistence param */
+#define CFG_BT_COEXISTENCE_SIGNAL_CHNL  0x01   /* tell BT our chnl # */
+#define CFG_BT_COEXISTENCE_DEFER        0x02   /* defer our Tx if BT traffic */
+#define CFG_BT_COEXISTENCE_KILL         0x04   /* kill our Tx if BT traffic */
+#define CFG_BT_COEXISTENCE_WME_OVER_BT  0x08   /* multimedia extensions */
+#define CFG_BT_COEXISTENCE_OOB          0x10   /* signal BT via out-of-band */
+
+/* clear-to-send to self param */
+#define CFG_CTS_TO_ITSELF_ENABLED_MIN  0x00
+#define CFG_CTS_TO_ITSELF_ENABLED_MAX  0x01
 #define CFG_CTS_TO_ITSELF_ENABLED_DEF  CFG_CTS_TO_ITSELF_ENABLED_MIN
 
-#define CFG_SYS_ANTENNA_BOTH                      0x000
-#define CFG_SYS_ANTENNA_A                         0x001
-#define CFG_SYS_ANTENNA_B                         0x003
+/* Antenna diversity param (h/w can select best antenna, based on signal) */
+#define CFG_SYS_ANTENNA_BOTH            0x00   /* NIC selects best antenna */
+#define CFG_SYS_ANTENNA_A               0x01   /* force antenna A */
+#define CFG_SYS_ANTENNA_B               0x03   /* force antenna B */
+#define CFG_SYS_ANTENNA_SLOW_DIV        0x02   /* consider background noise */
 
 /*
  * The definitions below were lifted off the ipw2100 driver, which only
@@ -1899,27 +2007,4 @@ struct ipw_cmd_log {
 
 #define IPW_MAX_CONFIG_RETRIES 10
 
-static inline u32 frame_hdr_len(struct ieee80211_hdr_4addr *hdr)
-{
-       u32 retval;
-       u16 fc;
-
-       retval = sizeof(struct ieee80211_hdr_3addr);
-       fc = le16_to_cpu(hdr->frame_ctl);
-
-       /*
-        * Function     ToDS    FromDS
-        * IBSS         0       0
-        * To AP        1       0
-        * From AP      0       1
-        * WDS (bridge) 1       1
-        *
-        * Only WDS frames use Address4 among them. --YZ
-        */
-       if (!(fc & IEEE80211_FCTL_TODS) || !(fc & IEEE80211_FCTL_FROMDS))
-               retval -= ETH_ALEN;
-
-       return retval;
-}
-
 #endif                         /* __ipw2200_h__ */