linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / net / wireless / ipw2100.c
1 /******************************************************************************
2
3   Copyright(c) 2003 - 2005 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., 59
16   Temple Place - Suite 330, Boston, MA  02111-1307, 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   Portions of this file are based on the sample_* files provided by Wireless
26   Extensions 0.26 package and copyright (c) 1997-2003 Jean Tourrilhes
27   <jt@hpl.hp.com>
28
29   Portions of this file are based on the Host AP project,
30   Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
31     <jkmaline@cc.hut.fi>
32   Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
33
34   Portions of ipw2100_mod_firmware_load, ipw2100_do_mod_firmware_load, and
35   ipw2100_fw_load are loosely based on drivers/sound/sound_firmware.c
36   available in the 2.4.25 kernel sources, and are copyright (c) Alan Cox
37
38 ******************************************************************************/
39 /*
40
41  Initial driver on which this is based was developed by Janusz Gorycki,
42  Maciej Urbaniak, and Maciej Sosnowski.
43
44  Promiscuous mode support added by Jacek Wysoczynski and Maciej Urbaniak.
45
46 Theory of Operation
47
48 Tx - Commands and Data
49
50 Firmware and host share a circular queue of Transmit Buffer Descriptors (TBDs)
51 Each TBD contains a pointer to the physical (dma_addr_t) address of data being
52 sent to the firmware as well as the length of the data.
53
54 The host writes to the TBD queue at the WRITE index.  The WRITE index points
55 to the _next_ packet to be written and is advanced when after the TBD has been
56 filled.
57
58 The firmware pulls from the TBD queue at the READ index.  The READ index points
59 to the currently being read entry, and is advanced once the firmware is
60 done with a packet.
61
62 When data is sent to the firmware, the first TBD is used to indicate to the
63 firmware if a Command or Data is being sent.  If it is Command, all of the
64 command information is contained within the physical address referred to by the
65 TBD.  If it is Data, the first TBD indicates the type of data packet, number
66 of fragments, etc.  The next TBD then referrs to the actual packet location.
67
68 The Tx flow cycle is as follows:
69
70 1) ipw2100_tx() is called by kernel with SKB to transmit
71 2) Packet is move from the tx_free_list and appended to the transmit pending
72    list (tx_pend_list)
73 3) work is scheduled to move pending packets into the shared circular queue.
74 4) when placing packet in the circular queue, the incoming SKB is DMA mapped
75    to a physical address.  That address is entered into a TBD.  Two TBDs are
76    filled out.  The first indicating a data packet, the second referring to the
77    actual payload data.
78 5) the packet is removed from tx_pend_list and placed on the end of the
79    firmware pending list (fw_pend_list)
80 6) firmware is notified that the WRITE index has
81 7) Once the firmware has processed the TBD, INTA is triggered.
82 8) For each Tx interrupt received from the firmware, the READ index is checked
83    to see which TBDs are done being processed.
84 9) For each TBD that has been processed, the ISR pulls the oldest packet
85    from the fw_pend_list.
86 10)The packet structure contained in the fw_pend_list is then used
87    to unmap the DMA address and to free the SKB originally passed to the driver
88    from the kernel.
89 11)The packet structure is placed onto the tx_free_list
90
91 The above steps are the same for commands, only the msg_free_list/msg_pend_list
92 are used instead of tx_free_list/tx_pend_list
93
94 ...
95
96 Critical Sections / Locking :
97
98 There are two locks utilized.  The first is the low level lock (priv->low_lock)
99 that protects the following:
100
101 - Access to the Tx/Rx queue lists via priv->low_lock. The lists are as follows:
102
103   tx_free_list : Holds pre-allocated Tx buffers.
104     TAIL modified in __ipw2100_tx_process()
105     HEAD modified in ipw2100_tx()
106
107   tx_pend_list : Holds used Tx buffers waiting to go into the TBD ring
108     TAIL modified ipw2100_tx()
109     HEAD modified by ipw2100_tx_send_data()
110
111   msg_free_list : Holds pre-allocated Msg (Command) buffers
112     TAIL modified in __ipw2100_tx_process()
113     HEAD modified in ipw2100_hw_send_command()
114
115   msg_pend_list : Holds used Msg buffers waiting to go into the TBD ring
116     TAIL modified in ipw2100_hw_send_command()
117     HEAD modified in ipw2100_tx_send_commands()
118
119   The flow of data on the TX side is as follows:
120
121   MSG_FREE_LIST + COMMAND => MSG_PEND_LIST => TBD => MSG_FREE_LIST
122   TX_FREE_LIST + DATA => TX_PEND_LIST => TBD => TX_FREE_LIST
123
124   The methods that work on the TBD ring are protected via priv->low_lock.
125
126 - The internal data state of the device itself
127 - Access to the firmware read/write indexes for the BD queues
128   and associated logic
129
130 All external entry functions are locked with the priv->action_lock to ensure
131 that only one external action is invoked at a time.
132
133
134 */
135
136 #include <linux/compiler.h>
137 #include <linux/config.h>
138 #include <linux/errno.h>
139 #include <linux/if_arp.h>
140 #include <linux/in6.h>
141 #include <linux/in.h>
142 #include <linux/ip.h>
143 #include <linux/kernel.h>
144 #include <linux/kmod.h>
145 #include <linux/module.h>
146 #include <linux/netdevice.h>
147 #include <linux/ethtool.h>
148 #include <linux/pci.h>
149 #include <linux/dma-mapping.h>
150 #include <linux/proc_fs.h>
151 #include <linux/skbuff.h>
152 #include <asm/uaccess.h>
153 #include <asm/io.h>
154 #define __KERNEL_SYSCALLS__
155 #include <linux/fs.h>
156 #include <linux/mm.h>
157 #include <linux/slab.h>
158 #include <linux/unistd.h>
159 #include <linux/stringify.h>
160 #include <linux/tcp.h>
161 #include <linux/types.h>
162 #include <linux/version.h>
163 #include <linux/time.h>
164 #include <linux/firmware.h>
165 #include <linux/acpi.h>
166 #include <linux/ctype.h>
167
168 #include "ipw2100.h"
169
170 #define IPW2100_VERSION "1.1.3"
171
172 #define DRV_NAME        "ipw2100"
173 #define DRV_VERSION     IPW2100_VERSION
174 #define DRV_DESCRIPTION "Intel(R) PRO/Wireless 2100 Network Driver"
175 #define DRV_COPYRIGHT   "Copyright(c) 2003-2005 Intel Corporation"
176
177 /* Debugging stuff */
178 #ifdef CONFIG_IPW2100_DEBUG
179 #define CONFIG_IPW2100_RX_DEBUG /* Reception debugging */
180 #endif
181
182 MODULE_DESCRIPTION(DRV_DESCRIPTION);
183 MODULE_VERSION(DRV_VERSION);
184 MODULE_AUTHOR(DRV_COPYRIGHT);
185 MODULE_LICENSE("GPL");
186
187 static int debug = 0;
188 static int mode = 0;
189 static int channel = 0;
190 static int associate = 1;
191 static int disable = 0;
192 #ifdef CONFIG_PM
193 static struct ipw2100_fw ipw2100_firmware;
194 #endif
195
196 #include <linux/moduleparam.h>
197 module_param(debug, int, 0444);
198 module_param(mode, int, 0444);
199 module_param(channel, int, 0444);
200 module_param(associate, int, 0444);
201 module_param(disable, int, 0444);
202
203 MODULE_PARM_DESC(debug, "debug level");
204 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)");
205 MODULE_PARM_DESC(channel, "channel");
206 MODULE_PARM_DESC(associate, "auto associate when scanning (default on)");
207 MODULE_PARM_DESC(disable, "manually disable the radio (default 0 [radio on])");
208
209 static u32 ipw2100_debug_level = IPW_DL_NONE;
210
211 #ifdef CONFIG_IPW2100_DEBUG
212 #define IPW_DEBUG(level, message...) \
213 do { \
214         if (ipw2100_debug_level & (level)) { \
215                 printk(KERN_DEBUG "ipw2100: %c %s ", \
216                        in_interrupt() ? 'I' : 'U',  __FUNCTION__); \
217                 printk(message); \
218         } \
219 } while (0)
220 #else
221 #define IPW_DEBUG(level, message...) do {} while (0)
222 #endif                          /* CONFIG_IPW2100_DEBUG */
223
224 #ifdef CONFIG_IPW2100_DEBUG
225 static const char *command_types[] = {
226         "undefined",
227         "unused",               /* HOST_ATTENTION */
228         "HOST_COMPLETE",
229         "unused",               /* SLEEP */
230         "unused",               /* HOST_POWER_DOWN */
231         "unused",
232         "SYSTEM_CONFIG",
233         "unused",               /* SET_IMR */
234         "SSID",
235         "MANDATORY_BSSID",
236         "AUTHENTICATION_TYPE",
237         "ADAPTER_ADDRESS",
238         "PORT_TYPE",
239         "INTERNATIONAL_MODE",
240         "CHANNEL",
241         "RTS_THRESHOLD",
242         "FRAG_THRESHOLD",
243         "POWER_MODE",
244         "TX_RATES",
245         "BASIC_TX_RATES",
246         "WEP_KEY_INFO",
247         "unused",
248         "unused",
249         "unused",
250         "unused",
251         "WEP_KEY_INDEX",
252         "WEP_FLAGS",
253         "ADD_MULTICAST",
254         "CLEAR_ALL_MULTICAST",
255         "BEACON_INTERVAL",
256         "ATIM_WINDOW",
257         "CLEAR_STATISTICS",
258         "undefined",
259         "undefined",
260         "undefined",
261         "undefined",
262         "TX_POWER_INDEX",
263         "undefined",
264         "undefined",
265         "undefined",
266         "undefined",
267         "undefined",
268         "undefined",
269         "BROADCAST_SCAN",
270         "CARD_DISABLE",
271         "PREFERRED_BSSID",
272         "SET_SCAN_OPTIONS",
273         "SCAN_DWELL_TIME",
274         "SWEEP_TABLE",
275         "AP_OR_STATION_TABLE",
276         "GROUP_ORDINALS",
277         "SHORT_RETRY_LIMIT",
278         "LONG_RETRY_LIMIT",
279         "unused",               /* SAVE_CALIBRATION */
280         "unused",               /* RESTORE_CALIBRATION */
281         "undefined",
282         "undefined",
283         "undefined",
284         "HOST_PRE_POWER_DOWN",
285         "unused",               /* HOST_INTERRUPT_COALESCING */
286         "undefined",
287         "CARD_DISABLE_PHY_OFF",
288         "MSDU_TX_RATES" "undefined",
289         "undefined",
290         "SET_STATION_STAT_BITS",
291         "CLEAR_STATIONS_STAT_BITS",
292         "LEAP_ROGUE_MODE",
293         "SET_SECURITY_INFORMATION",
294         "DISASSOCIATION_BSSID",
295         "SET_WPA_ASS_IE"
296 };
297 #endif
298
299 /* Pre-decl until we get the code solid and then we can clean it up */
300 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv);
301 static void ipw2100_tx_send_data(struct ipw2100_priv *priv);
302 static int ipw2100_adapter_setup(struct ipw2100_priv *priv);
303
304 static void ipw2100_queues_initialize(struct ipw2100_priv *priv);
305 static void ipw2100_queues_free(struct ipw2100_priv *priv);
306 static int ipw2100_queues_allocate(struct ipw2100_priv *priv);
307
308 static int ipw2100_fw_download(struct ipw2100_priv *priv,
309                                struct ipw2100_fw *fw);
310 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
311                                 struct ipw2100_fw *fw);
312 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
313                                  size_t max);
314 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
315                                     size_t max);
316 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
317                                      struct ipw2100_fw *fw);
318 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
319                                   struct ipw2100_fw *fw);
320 static void ipw2100_wx_event_work(struct ipw2100_priv *priv);
321 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev);
322 static struct iw_handler_def ipw2100_wx_handler_def;
323
324 static inline void read_register(struct net_device *dev, u32 reg, u32 * val)
325 {
326         *val = readl((void __iomem *)(dev->base_addr + reg));
327         IPW_DEBUG_IO("r: 0x%08X => 0x%08X\n", reg, *val);
328 }
329
330 static inline void write_register(struct net_device *dev, u32 reg, u32 val)
331 {
332         writel(val, (void __iomem *)(dev->base_addr + reg));
333         IPW_DEBUG_IO("w: 0x%08X <= 0x%08X\n", reg, val);
334 }
335
336 static inline void read_register_word(struct net_device *dev, u32 reg,
337                                       u16 * val)
338 {
339         *val = readw((void __iomem *)(dev->base_addr + reg));
340         IPW_DEBUG_IO("r: 0x%08X => %04X\n", reg, *val);
341 }
342
343 static inline void read_register_byte(struct net_device *dev, u32 reg, u8 * val)
344 {
345         *val = readb((void __iomem *)(dev->base_addr + reg));
346         IPW_DEBUG_IO("r: 0x%08X => %02X\n", reg, *val);
347 }
348
349 static inline void write_register_word(struct net_device *dev, u32 reg, u16 val)
350 {
351         writew(val, (void __iomem *)(dev->base_addr + reg));
352         IPW_DEBUG_IO("w: 0x%08X <= %04X\n", reg, val);
353 }
354
355 static inline void write_register_byte(struct net_device *dev, u32 reg, u8 val)
356 {
357         writeb(val, (void __iomem *)(dev->base_addr + reg));
358         IPW_DEBUG_IO("w: 0x%08X =< %02X\n", reg, val);
359 }
360
361 static inline void read_nic_dword(struct net_device *dev, u32 addr, u32 * val)
362 {
363         write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
364                        addr & IPW_REG_INDIRECT_ADDR_MASK);
365         read_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
366 }
367
368 static inline void write_nic_dword(struct net_device *dev, u32 addr, u32 val)
369 {
370         write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
371                        addr & IPW_REG_INDIRECT_ADDR_MASK);
372         write_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
373 }
374
375 static inline void read_nic_word(struct net_device *dev, u32 addr, u16 * val)
376 {
377         write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
378                        addr & IPW_REG_INDIRECT_ADDR_MASK);
379         read_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
380 }
381
382 static inline void write_nic_word(struct net_device *dev, u32 addr, u16 val)
383 {
384         write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
385                        addr & IPW_REG_INDIRECT_ADDR_MASK);
386         write_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
387 }
388
389 static inline void read_nic_byte(struct net_device *dev, u32 addr, u8 * val)
390 {
391         write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
392                        addr & IPW_REG_INDIRECT_ADDR_MASK);
393         read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
394 }
395
396 static inline void write_nic_byte(struct net_device *dev, u32 addr, u8 val)
397 {
398         write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
399                        addr & IPW_REG_INDIRECT_ADDR_MASK);
400         write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
401 }
402
403 static inline void write_nic_auto_inc_address(struct net_device *dev, u32 addr)
404 {
405         write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS,
406                        addr & IPW_REG_INDIRECT_ADDR_MASK);
407 }
408
409 static inline void write_nic_dword_auto_inc(struct net_device *dev, u32 val)
410 {
411         write_register(dev, IPW_REG_AUTOINCREMENT_DATA, val);
412 }
413
414 static void write_nic_memory(struct net_device *dev, u32 addr, u32 len,
415                                     const u8 * buf)
416 {
417         u32 aligned_addr;
418         u32 aligned_len;
419         u32 dif_len;
420         u32 i;
421
422         /* read first nibble byte by byte */
423         aligned_addr = addr & (~0x3);
424         dif_len = addr - aligned_addr;
425         if (dif_len) {
426                 /* Start reading at aligned_addr + dif_len */
427                 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
428                                aligned_addr);
429                 for (i = dif_len; i < 4; i++, buf++)
430                         write_register_byte(dev,
431                                             IPW_REG_INDIRECT_ACCESS_DATA + i,
432                                             *buf);
433
434                 len -= dif_len;
435                 aligned_addr += 4;
436         }
437
438         /* read DWs through autoincrement registers */
439         write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
440         aligned_len = len & (~0x3);
441         for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
442                 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, *(u32 *) buf);
443
444         /* copy the last nibble */
445         dif_len = len - aligned_len;
446         write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
447         for (i = 0; i < dif_len; i++, buf++)
448                 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i,
449                                     *buf);
450 }
451
452 static void read_nic_memory(struct net_device *dev, u32 addr, u32 len,
453                                    u8 * buf)
454 {
455         u32 aligned_addr;
456         u32 aligned_len;
457         u32 dif_len;
458         u32 i;
459
460         /* read first nibble byte by byte */
461         aligned_addr = addr & (~0x3);
462         dif_len = addr - aligned_addr;
463         if (dif_len) {
464                 /* Start reading at aligned_addr + dif_len */
465                 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
466                                aligned_addr);
467                 for (i = dif_len; i < 4; i++, buf++)
468                         read_register_byte(dev,
469                                            IPW_REG_INDIRECT_ACCESS_DATA + i,
470                                            buf);
471
472                 len -= dif_len;
473                 aligned_addr += 4;
474         }
475
476         /* read DWs through autoincrement registers */
477         write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
478         aligned_len = len & (~0x3);
479         for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
480                 read_register(dev, IPW_REG_AUTOINCREMENT_DATA, (u32 *) buf);
481
482         /* copy the last nibble */
483         dif_len = len - aligned_len;
484         write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
485         for (i = 0; i < dif_len; i++, buf++)
486                 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i, buf);
487 }
488
489 static inline int ipw2100_hw_is_adapter_in_system(struct net_device *dev)
490 {
491         return (dev->base_addr &&
492                 (readl
493                  ((void __iomem *)(dev->base_addr +
494                                    IPW_REG_DOA_DEBUG_AREA_START))
495                  == IPW_DATA_DOA_DEBUG_VALUE));
496 }
497
498 static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
499                                void *val, u32 * len)
500 {
501         struct ipw2100_ordinals *ordinals = &priv->ordinals;
502         u32 addr;
503         u32 field_info;
504         u16 field_len;
505         u16 field_count;
506         u32 total_length;
507
508         if (ordinals->table1_addr == 0) {
509                 printk(KERN_WARNING DRV_NAME ": attempt to use fw ordinals "
510                        "before they have been loaded.\n");
511                 return -EINVAL;
512         }
513
514         if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
515                 if (*len < IPW_ORD_TAB_1_ENTRY_SIZE) {
516                         *len = IPW_ORD_TAB_1_ENTRY_SIZE;
517
518                         printk(KERN_WARNING DRV_NAME
519                                ": ordinal buffer length too small, need %zd\n",
520                                IPW_ORD_TAB_1_ENTRY_SIZE);
521
522                         return -EINVAL;
523                 }
524
525                 read_nic_dword(priv->net_dev,
526                                ordinals->table1_addr + (ord << 2), &addr);
527                 read_nic_dword(priv->net_dev, addr, val);
528
529                 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
530
531                 return 0;
532         }
533
534         if (IS_ORDINAL_TABLE_TWO(ordinals, ord)) {
535
536                 ord -= IPW_START_ORD_TAB_2;
537
538                 /* get the address of statistic */
539                 read_nic_dword(priv->net_dev,
540                                ordinals->table2_addr + (ord << 3), &addr);
541
542                 /* get the second DW of statistics ;
543                  * two 16-bit words - first is length, second is count */
544                 read_nic_dword(priv->net_dev,
545                                ordinals->table2_addr + (ord << 3) + sizeof(u32),
546                                &field_info);
547
548                 /* get each entry length */
549                 field_len = *((u16 *) & field_info);
550
551                 /* get number of entries */
552                 field_count = *(((u16 *) & field_info) + 1);
553
554                 /* abort if no enought memory */
555                 total_length = field_len * field_count;
556                 if (total_length > *len) {
557                         *len = total_length;
558                         return -EINVAL;
559                 }
560
561                 *len = total_length;
562                 if (!total_length)
563                         return 0;
564
565                 /* read the ordinal data from the SRAM */
566                 read_nic_memory(priv->net_dev, addr, total_length, val);
567
568                 return 0;
569         }
570
571         printk(KERN_WARNING DRV_NAME ": ordinal %d neither in table 1 nor "
572                "in table 2\n", ord);
573
574         return -EINVAL;
575 }
576
577 static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 * val,
578                                u32 * len)
579 {
580         struct ipw2100_ordinals *ordinals = &priv->ordinals;
581         u32 addr;
582
583         if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
584                 if (*len != IPW_ORD_TAB_1_ENTRY_SIZE) {
585                         *len = IPW_ORD_TAB_1_ENTRY_SIZE;
586                         IPW_DEBUG_INFO("wrong size\n");
587                         return -EINVAL;
588                 }
589
590                 read_nic_dword(priv->net_dev,
591                                ordinals->table1_addr + (ord << 2), &addr);
592
593                 write_nic_dword(priv->net_dev, addr, *val);
594
595                 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
596
597                 return 0;
598         }
599
600         IPW_DEBUG_INFO("wrong table\n");
601         if (IS_ORDINAL_TABLE_TWO(ordinals, ord))
602                 return -EINVAL;
603
604         return -EINVAL;
605 }
606
607 static char *snprint_line(char *buf, size_t count,
608                           const u8 * data, u32 len, u32 ofs)
609 {
610         int out, i, j, l;
611         char c;
612
613         out = snprintf(buf, count, "%08X", ofs);
614
615         for (l = 0, i = 0; i < 2; i++) {
616                 out += snprintf(buf + out, count - out, " ");
617                 for (j = 0; j < 8 && l < len; j++, l++)
618                         out += snprintf(buf + out, count - out, "%02X ",
619                                         data[(i * 8 + j)]);
620                 for (; j < 8; j++)
621                         out += snprintf(buf + out, count - out, "   ");
622         }
623
624         out += snprintf(buf + out, count - out, " ");
625         for (l = 0, i = 0; i < 2; i++) {
626                 out += snprintf(buf + out, count - out, " ");
627                 for (j = 0; j < 8 && l < len; j++, l++) {
628                         c = data[(i * 8 + j)];
629                         if (!isascii(c) || !isprint(c))
630                                 c = '.';
631
632                         out += snprintf(buf + out, count - out, "%c", c);
633                 }
634
635                 for (; j < 8; j++)
636                         out += snprintf(buf + out, count - out, " ");
637         }
638
639         return buf;
640 }
641
642 static void printk_buf(int level, const u8 * data, u32 len)
643 {
644         char line[81];
645         u32 ofs = 0;
646         if (!(ipw2100_debug_level & level))
647                 return;
648
649         while (len) {
650                 printk(KERN_DEBUG "%s\n",
651                        snprint_line(line, sizeof(line), &data[ofs],
652                                     min(len, 16U), ofs));
653                 ofs += 16;
654                 len -= min(len, 16U);
655         }
656 }
657
658 #define MAX_RESET_BACKOFF 10
659
660 static void schedule_reset(struct ipw2100_priv *priv)
661 {
662         unsigned long now = get_seconds();
663
664         /* If we haven't received a reset request within the backoff period,
665          * then we can reset the backoff interval so this reset occurs
666          * immediately */
667         if (priv->reset_backoff &&
668             (now - priv->last_reset > priv->reset_backoff))
669                 priv->reset_backoff = 0;
670
671         priv->last_reset = get_seconds();
672
673         if (!(priv->status & STATUS_RESET_PENDING)) {
674                 IPW_DEBUG_INFO("%s: Scheduling firmware restart (%ds).\n",
675                                priv->net_dev->name, priv->reset_backoff);
676                 netif_carrier_off(priv->net_dev);
677                 netif_stop_queue(priv->net_dev);
678                 priv->status |= STATUS_RESET_PENDING;
679                 if (priv->reset_backoff)
680                         queue_delayed_work(priv->workqueue, &priv->reset_work,
681                                            priv->reset_backoff * HZ);
682                 else
683                         queue_work(priv->workqueue, &priv->reset_work);
684
685                 if (priv->reset_backoff < MAX_RESET_BACKOFF)
686                         priv->reset_backoff++;
687
688                 wake_up_interruptible(&priv->wait_command_queue);
689         } else
690                 IPW_DEBUG_INFO("%s: Firmware restart already in progress.\n",
691                                priv->net_dev->name);
692
693 }
694
695 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
696 static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
697                                    struct host_command *cmd)
698 {
699         struct list_head *element;
700         struct ipw2100_tx_packet *packet;
701         unsigned long flags;
702         int err = 0;
703
704         IPW_DEBUG_HC("Sending %s command (#%d), %d bytes\n",
705                      command_types[cmd->host_command], cmd->host_command,
706                      cmd->host_command_length);
707         printk_buf(IPW_DL_HC, (u8 *) cmd->host_command_parameters,
708                    cmd->host_command_length);
709
710         spin_lock_irqsave(&priv->low_lock, flags);
711
712         if (priv->fatal_error) {
713                 IPW_DEBUG_INFO
714                     ("Attempt to send command while hardware in fatal error condition.\n");
715                 err = -EIO;
716                 goto fail_unlock;
717         }
718
719         if (!(priv->status & STATUS_RUNNING)) {
720                 IPW_DEBUG_INFO
721                     ("Attempt to send command while hardware is not running.\n");
722                 err = -EIO;
723                 goto fail_unlock;
724         }
725
726         if (priv->status & STATUS_CMD_ACTIVE) {
727                 IPW_DEBUG_INFO
728                     ("Attempt to send command while another command is pending.\n");
729                 err = -EBUSY;
730                 goto fail_unlock;
731         }
732
733         if (list_empty(&priv->msg_free_list)) {
734                 IPW_DEBUG_INFO("no available msg buffers\n");
735                 goto fail_unlock;
736         }
737
738         priv->status |= STATUS_CMD_ACTIVE;
739         priv->messages_sent++;
740
741         element = priv->msg_free_list.next;
742
743         packet = list_entry(element, struct ipw2100_tx_packet, list);
744         packet->jiffy_start = jiffies;
745
746         /* initialize the firmware command packet */
747         packet->info.c_struct.cmd->host_command_reg = cmd->host_command;
748         packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1;
749         packet->info.c_struct.cmd->host_command_len_reg =
750             cmd->host_command_length;
751         packet->info.c_struct.cmd->sequence = cmd->host_command_sequence;
752
753         memcpy(packet->info.c_struct.cmd->host_command_params_reg,
754                cmd->host_command_parameters,
755                sizeof(packet->info.c_struct.cmd->host_command_params_reg));
756
757         list_del(element);
758         DEC_STAT(&priv->msg_free_stat);
759
760         list_add_tail(element, &priv->msg_pend_list);
761         INC_STAT(&priv->msg_pend_stat);
762
763         ipw2100_tx_send_commands(priv);
764         ipw2100_tx_send_data(priv);
765
766         spin_unlock_irqrestore(&priv->low_lock, flags);
767
768         /*
769          * We must wait for this command to complete before another
770          * command can be sent...  but if we wait more than 3 seconds
771          * then there is a problem.
772          */
773
774         err =
775             wait_event_interruptible_timeout(priv->wait_command_queue,
776                                              !(priv->
777                                                status & STATUS_CMD_ACTIVE),
778                                              HOST_COMPLETE_TIMEOUT);
779
780         if (err == 0) {
781                 IPW_DEBUG_INFO("Command completion failed out after %dms.\n",
782                                1000 * (HOST_COMPLETE_TIMEOUT / HZ));
783                 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT;
784                 priv->status &= ~STATUS_CMD_ACTIVE;
785                 schedule_reset(priv);
786                 return -EIO;
787         }
788
789         if (priv->fatal_error) {
790                 printk(KERN_WARNING DRV_NAME ": %s: firmware fatal error\n",
791                        priv->net_dev->name);
792                 return -EIO;
793         }
794
795         /* !!!!! HACK TEST !!!!!
796          * When lots of debug trace statements are enabled, the driver
797          * doesn't seem to have as many firmware restart cycles...
798          *
799          * As a test, we're sticking in a 1/100s delay here */
800         schedule_timeout_uninterruptible(msecs_to_jiffies(10));
801
802         return 0;
803
804       fail_unlock:
805         spin_unlock_irqrestore(&priv->low_lock, flags);
806
807         return err;
808 }
809
810 /*
811  * Verify the values and data access of the hardware
812  * No locks needed or used.  No functions called.
813  */
814 static int ipw2100_verify(struct ipw2100_priv *priv)
815 {
816         u32 data1, data2;
817         u32 address;
818
819         u32 val1 = 0x76543210;
820         u32 val2 = 0xFEDCBA98;
821
822         /* Domain 0 check - all values should be DOA_DEBUG */
823         for (address = IPW_REG_DOA_DEBUG_AREA_START;
824              address < IPW_REG_DOA_DEBUG_AREA_END; address += sizeof(u32)) {
825                 read_register(priv->net_dev, address, &data1);
826                 if (data1 != IPW_DATA_DOA_DEBUG_VALUE)
827                         return -EIO;
828         }
829
830         /* Domain 1 check - use arbitrary read/write compare  */
831         for (address = 0; address < 5; address++) {
832                 /* The memory area is not used now */
833                 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
834                                val1);
835                 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
836                                val2);
837                 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
838                               &data1);
839                 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
840                               &data2);
841                 if (val1 == data1 && val2 == data2)
842                         return 0;
843         }
844
845         return -EIO;
846 }
847
848 /*
849  *
850  * Loop until the CARD_DISABLED bit is the same value as the
851  * supplied parameter
852  *
853  * TODO: See if it would be more efficient to do a wait/wake
854  *       cycle and have the completion event trigger the wakeup
855  *
856  */
857 #define IPW_CARD_DISABLE_COMPLETE_WAIT              100 // 100 milli
858 static int ipw2100_wait_for_card_state(struct ipw2100_priv *priv, int state)
859 {
860         int i;
861         u32 card_state;
862         u32 len = sizeof(card_state);
863         int err;
864
865         for (i = 0; i <= IPW_CARD_DISABLE_COMPLETE_WAIT * 1000; i += 50) {
866                 err = ipw2100_get_ordinal(priv, IPW_ORD_CARD_DISABLED,
867                                           &card_state, &len);
868                 if (err) {
869                         IPW_DEBUG_INFO("Query of CARD_DISABLED ordinal "
870                                        "failed.\n");
871                         return 0;
872                 }
873
874                 /* We'll break out if either the HW state says it is
875                  * in the state we want, or if HOST_COMPLETE command
876                  * finishes */
877                 if ((card_state == state) ||
878                     ((priv->status & STATUS_ENABLED) ?
879                      IPW_HW_STATE_ENABLED : IPW_HW_STATE_DISABLED) == state) {
880                         if (state == IPW_HW_STATE_ENABLED)
881                                 priv->status |= STATUS_ENABLED;
882                         else
883                                 priv->status &= ~STATUS_ENABLED;
884
885                         return 0;
886                 }
887
888                 udelay(50);
889         }
890
891         IPW_DEBUG_INFO("ipw2100_wait_for_card_state to %s state timed out\n",
892                        state ? "DISABLED" : "ENABLED");
893         return -EIO;
894 }
895
896 /*********************************************************************
897     Procedure   :   sw_reset_and_clock
898     Purpose     :   Asserts s/w reset, asserts clock initialization
899                     and waits for clock stabilization
900  ********************************************************************/
901 static int sw_reset_and_clock(struct ipw2100_priv *priv)
902 {
903         int i;
904         u32 r;
905
906         // assert s/w reset
907         write_register(priv->net_dev, IPW_REG_RESET_REG,
908                        IPW_AUX_HOST_RESET_REG_SW_RESET);
909
910         // wait for clock stabilization
911         for (i = 0; i < 1000; i++) {
912                 udelay(IPW_WAIT_RESET_ARC_COMPLETE_DELAY);
913
914                 // check clock ready bit
915                 read_register(priv->net_dev, IPW_REG_RESET_REG, &r);
916                 if (r & IPW_AUX_HOST_RESET_REG_PRINCETON_RESET)
917                         break;
918         }
919
920         if (i == 1000)
921                 return -EIO;    // TODO: better error value
922
923         /* set "initialization complete" bit to move adapter to
924          * D0 state */
925         write_register(priv->net_dev, IPW_REG_GP_CNTRL,
926                        IPW_AUX_HOST_GP_CNTRL_BIT_INIT_DONE);
927
928         /* wait for clock stabilization */
929         for (i = 0; i < 10000; i++) {
930                 udelay(IPW_WAIT_CLOCK_STABILIZATION_DELAY * 4);
931
932                 /* check clock ready bit */
933                 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
934                 if (r & IPW_AUX_HOST_GP_CNTRL_BIT_CLOCK_READY)
935                         break;
936         }
937
938         if (i == 10000)
939                 return -EIO;    /* TODO: better error value */
940
941         /* set D0 standby bit */
942         read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
943         write_register(priv->net_dev, IPW_REG_GP_CNTRL,
944                        r | IPW_AUX_HOST_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY);
945
946         return 0;
947 }
948
949 /*********************************************************************
950     Procedure   :   ipw2100_download_firmware
951     Purpose     :   Initiaze adapter after power on.
952                     The sequence is:
953                     1. assert s/w reset first!
954                     2. awake clocks & wait for clock stabilization
955                     3. hold ARC (don't ask me why...)
956                     4. load Dino ucode and reset/clock init again
957                     5. zero-out shared mem
958                     6. download f/w
959  *******************************************************************/
960 static int ipw2100_download_firmware(struct ipw2100_priv *priv)
961 {
962         u32 address;
963         int err;
964
965 #ifndef CONFIG_PM
966         /* Fetch the firmware and microcode */
967         struct ipw2100_fw ipw2100_firmware;
968 #endif
969
970         if (priv->fatal_error) {
971                 IPW_DEBUG_ERROR("%s: ipw2100_download_firmware called after "
972                                 "fatal error %d.  Interface must be brought down.\n",
973                                 priv->net_dev->name, priv->fatal_error);
974                 return -EINVAL;
975         }
976 #ifdef CONFIG_PM
977         if (!ipw2100_firmware.version) {
978                 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
979                 if (err) {
980                         IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
981                                         priv->net_dev->name, err);
982                         priv->fatal_error = IPW2100_ERR_FW_LOAD;
983                         goto fail;
984                 }
985         }
986 #else
987         err = ipw2100_get_firmware(priv, &ipw2100_firmware);
988         if (err) {
989                 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
990                                 priv->net_dev->name, err);
991                 priv->fatal_error = IPW2100_ERR_FW_LOAD;
992                 goto fail;
993         }
994 #endif
995         priv->firmware_version = ipw2100_firmware.version;
996
997         /* s/w reset and clock stabilization */
998         err = sw_reset_and_clock(priv);
999         if (err) {
1000                 IPW_DEBUG_ERROR("%s: sw_reset_and_clock failed: %d\n",
1001                                 priv->net_dev->name, err);
1002                 goto fail;
1003         }
1004
1005         err = ipw2100_verify(priv);
1006         if (err) {
1007                 IPW_DEBUG_ERROR("%s: ipw2100_verify failed: %d\n",
1008                                 priv->net_dev->name, err);
1009                 goto fail;
1010         }
1011
1012         /* Hold ARC */
1013         write_nic_dword(priv->net_dev,
1014                         IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x80000000);
1015
1016         /* allow ARC to run */
1017         write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1018
1019         /* load microcode */
1020         err = ipw2100_ucode_download(priv, &ipw2100_firmware);
1021         if (err) {
1022                 printk(KERN_ERR DRV_NAME ": %s: Error loading microcode: %d\n",
1023                        priv->net_dev->name, err);
1024                 goto fail;
1025         }
1026
1027         /* release ARC */
1028         write_nic_dword(priv->net_dev,
1029                         IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x00000000);
1030
1031         /* s/w reset and clock stabilization (again!!!) */
1032         err = sw_reset_and_clock(priv);
1033         if (err) {
1034                 printk(KERN_ERR DRV_NAME
1035                        ": %s: sw_reset_and_clock failed: %d\n",
1036                        priv->net_dev->name, err);
1037                 goto fail;
1038         }
1039
1040         /* load f/w */
1041         err = ipw2100_fw_download(priv, &ipw2100_firmware);
1042         if (err) {
1043                 IPW_DEBUG_ERROR("%s: Error loading firmware: %d\n",
1044                                 priv->net_dev->name, err);
1045                 goto fail;
1046         }
1047 #ifndef CONFIG_PM
1048         /*
1049          * When the .resume method of the driver is called, the other
1050          * part of the system, i.e. the ide driver could still stay in
1051          * the suspend stage. This prevents us from loading the firmware
1052          * from the disk.  --YZ
1053          */
1054
1055         /* free any storage allocated for firmware image */
1056         ipw2100_release_firmware(priv, &ipw2100_firmware);
1057 #endif
1058
1059         /* zero out Domain 1 area indirectly (Si requirement) */
1060         for (address = IPW_HOST_FW_SHARED_AREA0;
1061              address < IPW_HOST_FW_SHARED_AREA0_END; address += 4)
1062                 write_nic_dword(priv->net_dev, address, 0);
1063         for (address = IPW_HOST_FW_SHARED_AREA1;
1064              address < IPW_HOST_FW_SHARED_AREA1_END; address += 4)
1065                 write_nic_dword(priv->net_dev, address, 0);
1066         for (address = IPW_HOST_FW_SHARED_AREA2;
1067              address < IPW_HOST_FW_SHARED_AREA2_END; address += 4)
1068                 write_nic_dword(priv->net_dev, address, 0);
1069         for (address = IPW_HOST_FW_SHARED_AREA3;
1070              address < IPW_HOST_FW_SHARED_AREA3_END; address += 4)
1071                 write_nic_dword(priv->net_dev, address, 0);
1072         for (address = IPW_HOST_FW_INTERRUPT_AREA;
1073              address < IPW_HOST_FW_INTERRUPT_AREA_END; address += 4)
1074                 write_nic_dword(priv->net_dev, address, 0);
1075
1076         return 0;
1077
1078       fail:
1079         ipw2100_release_firmware(priv, &ipw2100_firmware);
1080         return err;
1081 }
1082
1083 static inline void ipw2100_enable_interrupts(struct ipw2100_priv *priv)
1084 {
1085         if (priv->status & STATUS_INT_ENABLED)
1086                 return;
1087         priv->status |= STATUS_INT_ENABLED;
1088         write_register(priv->net_dev, IPW_REG_INTA_MASK, IPW_INTERRUPT_MASK);
1089 }
1090
1091 static inline void ipw2100_disable_interrupts(struct ipw2100_priv *priv)
1092 {
1093         if (!(priv->status & STATUS_INT_ENABLED))
1094                 return;
1095         priv->status &= ~STATUS_INT_ENABLED;
1096         write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0);
1097 }
1098
1099 static void ipw2100_initialize_ordinals(struct ipw2100_priv *priv)
1100 {
1101         struct ipw2100_ordinals *ord = &priv->ordinals;
1102
1103         IPW_DEBUG_INFO("enter\n");
1104
1105         read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_1,
1106                       &ord->table1_addr);
1107
1108         read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_2,
1109                       &ord->table2_addr);
1110
1111         read_nic_dword(priv->net_dev, ord->table1_addr, &ord->table1_size);
1112         read_nic_dword(priv->net_dev, ord->table2_addr, &ord->table2_size);
1113
1114         ord->table2_size &= 0x0000FFFF;
1115
1116         IPW_DEBUG_INFO("table 1 size: %d\n", ord->table1_size);
1117         IPW_DEBUG_INFO("table 2 size: %d\n", ord->table2_size);
1118         IPW_DEBUG_INFO("exit\n");
1119 }
1120
1121 static inline void ipw2100_hw_set_gpio(struct ipw2100_priv *priv)
1122 {
1123         u32 reg = 0;
1124         /*
1125          * Set GPIO 3 writable by FW; GPIO 1 writable
1126          * by driver and enable clock
1127          */
1128         reg = (IPW_BIT_GPIO_GPIO3_MASK | IPW_BIT_GPIO_GPIO1_ENABLE |
1129                IPW_BIT_GPIO_LED_OFF);
1130         write_register(priv->net_dev, IPW_REG_GPIO, reg);
1131 }
1132
1133 static int rf_kill_active(struct ipw2100_priv *priv)
1134 {
1135 #define MAX_RF_KILL_CHECKS 5
1136 #define RF_KILL_CHECK_DELAY 40
1137
1138         unsigned short value = 0;
1139         u32 reg = 0;
1140         int i;
1141
1142         if (!(priv->hw_features & HW_FEATURE_RFKILL)) {
1143                 priv->status &= ~STATUS_RF_KILL_HW;
1144                 return 0;
1145         }
1146
1147         for (i = 0; i < MAX_RF_KILL_CHECKS; i++) {
1148                 udelay(RF_KILL_CHECK_DELAY);
1149                 read_register(priv->net_dev, IPW_REG_GPIO, &reg);
1150                 value = (value << 1) | ((reg & IPW_BIT_GPIO_RF_KILL) ? 0 : 1);
1151         }
1152
1153         if (value == 0)
1154                 priv->status |= STATUS_RF_KILL_HW;
1155         else
1156                 priv->status &= ~STATUS_RF_KILL_HW;
1157
1158         return (value == 0);
1159 }
1160
1161 static int ipw2100_get_hw_features(struct ipw2100_priv *priv)
1162 {
1163         u32 addr, len;
1164         u32 val;
1165
1166         /*
1167          * EEPROM_SRAM_DB_START_ADDRESS using ordinal in ordinal table 1
1168          */
1169         len = sizeof(addr);
1170         if (ipw2100_get_ordinal
1171             (priv, IPW_ORD_EEPROM_SRAM_DB_BLOCK_START_ADDRESS, &addr, &len)) {
1172                 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1173                                __LINE__);
1174                 return -EIO;
1175         }
1176
1177         IPW_DEBUG_INFO("EEPROM address: %08X\n", addr);
1178
1179         /*
1180          * EEPROM version is the byte at offset 0xfd in firmware
1181          * We read 4 bytes, then shift out the byte we actually want */
1182         read_nic_dword(priv->net_dev, addr + 0xFC, &val);
1183         priv->eeprom_version = (val >> 24) & 0xFF;
1184         IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version);
1185
1186         /*
1187          *  HW RF Kill enable is bit 0 in byte at offset 0x21 in firmware
1188          *
1189          *  notice that the EEPROM bit is reverse polarity, i.e.
1190          *     bit = 0  signifies HW RF kill switch is supported
1191          *     bit = 1  signifies HW RF kill switch is NOT supported
1192          */
1193         read_nic_dword(priv->net_dev, addr + 0x20, &val);
1194         if (!((val >> 24) & 0x01))
1195                 priv->hw_features |= HW_FEATURE_RFKILL;
1196
1197         IPW_DEBUG_INFO("HW RF Kill: %ssupported.\n",
1198                        (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not ");
1199
1200         return 0;
1201 }
1202
1203 /*
1204  * Start firmware execution after power on and intialization
1205  * The sequence is:
1206  *  1. Release ARC
1207  *  2. Wait for f/w initialization completes;
1208  */
1209 static int ipw2100_start_adapter(struct ipw2100_priv *priv)
1210 {
1211         int i;
1212         u32 inta, inta_mask, gpio;
1213
1214         IPW_DEBUG_INFO("enter\n");
1215
1216         if (priv->status & STATUS_RUNNING)
1217                 return 0;
1218
1219         /*
1220          * Initialize the hw - drive adapter to DO state by setting
1221          * init_done bit. Wait for clk_ready bit and Download
1222          * fw & dino ucode
1223          */
1224         if (ipw2100_download_firmware(priv)) {
1225                 printk(KERN_ERR DRV_NAME
1226                        ": %s: Failed to power on the adapter.\n",
1227                        priv->net_dev->name);
1228                 return -EIO;
1229         }
1230
1231         /* Clear the Tx, Rx and Msg queues and the r/w indexes
1232          * in the firmware RBD and TBD ring queue */
1233         ipw2100_queues_initialize(priv);
1234
1235         ipw2100_hw_set_gpio(priv);
1236
1237         /* TODO -- Look at disabling interrupts here to make sure none
1238          * get fired during FW initialization */
1239
1240         /* Release ARC - clear reset bit */
1241         write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1242
1243         /* wait for f/w intialization complete */
1244         IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n");
1245         i = 5000;
1246         do {
1247                 schedule_timeout_uninterruptible(msecs_to_jiffies(40));
1248                 /* Todo... wait for sync command ... */
1249
1250                 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1251
1252                 /* check "init done" bit */
1253                 if (inta & IPW2100_INTA_FW_INIT_DONE) {
1254                         /* reset "init done" bit */
1255                         write_register(priv->net_dev, IPW_REG_INTA,
1256                                        IPW2100_INTA_FW_INIT_DONE);
1257                         break;
1258                 }
1259
1260                 /* check error conditions : we check these after the firmware
1261                  * check so that if there is an error, the interrupt handler
1262                  * will see it and the adapter will be reset */
1263                 if (inta &
1264                     (IPW2100_INTA_FATAL_ERROR | IPW2100_INTA_PARITY_ERROR)) {
1265                         /* clear error conditions */
1266                         write_register(priv->net_dev, IPW_REG_INTA,
1267                                        IPW2100_INTA_FATAL_ERROR |
1268                                        IPW2100_INTA_PARITY_ERROR);
1269                 }
1270         } while (i--);
1271
1272         /* Clear out any pending INTAs since we aren't supposed to have
1273          * interrupts enabled at this point... */
1274         read_register(priv->net_dev, IPW_REG_INTA, &inta);
1275         read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
1276         inta &= IPW_INTERRUPT_MASK;
1277         /* Clear out any pending interrupts */
1278         if (inta & inta_mask)
1279                 write_register(priv->net_dev, IPW_REG_INTA, inta);
1280
1281         IPW_DEBUG_FW("f/w initialization complete: %s\n",
1282                      i ? "SUCCESS" : "FAILED");
1283
1284         if (!i) {
1285                 printk(KERN_WARNING DRV_NAME
1286                        ": %s: Firmware did not initialize.\n",
1287                        priv->net_dev->name);
1288                 return -EIO;
1289         }
1290
1291         /* allow firmware to write to GPIO1 & GPIO3 */
1292         read_register(priv->net_dev, IPW_REG_GPIO, &gpio);
1293
1294         gpio |= (IPW_BIT_GPIO_GPIO1_MASK | IPW_BIT_GPIO_GPIO3_MASK);
1295
1296         write_register(priv->net_dev, IPW_REG_GPIO, gpio);
1297
1298         /* Ready to receive commands */
1299         priv->status |= STATUS_RUNNING;
1300
1301         /* The adapter has been reset; we are not associated */
1302         priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
1303
1304         IPW_DEBUG_INFO("exit\n");
1305
1306         return 0;
1307 }
1308
1309 static inline void ipw2100_reset_fatalerror(struct ipw2100_priv *priv)
1310 {
1311         if (!priv->fatal_error)
1312                 return;
1313
1314         priv->fatal_errors[priv->fatal_index++] = priv->fatal_error;
1315         priv->fatal_index %= IPW2100_ERROR_QUEUE;
1316         priv->fatal_error = 0;
1317 }
1318
1319 /* NOTE: Our interrupt is disabled when this method is called */
1320 static int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv)
1321 {
1322         u32 reg;
1323         int i;
1324
1325         IPW_DEBUG_INFO("Power cycling the hardware.\n");
1326
1327         ipw2100_hw_set_gpio(priv);
1328
1329         /* Step 1. Stop Master Assert */
1330         write_register(priv->net_dev, IPW_REG_RESET_REG,
1331                        IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1332
1333         /* Step 2. Wait for stop Master Assert
1334          *         (not more then 50us, otherwise ret error */
1335         i = 5;
1336         do {
1337                 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
1338                 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg);
1339
1340                 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1341                         break;
1342         } while (i--);
1343
1344         priv->status &= ~STATUS_RESET_PENDING;
1345
1346         if (!i) {
1347                 IPW_DEBUG_INFO
1348                     ("exit - waited too long for master assert stop\n");
1349                 return -EIO;
1350         }
1351
1352         write_register(priv->net_dev, IPW_REG_RESET_REG,
1353                        IPW_AUX_HOST_RESET_REG_SW_RESET);
1354
1355         /* Reset any fatal_error conditions */
1356         ipw2100_reset_fatalerror(priv);
1357
1358         /* At this point, the adapter is now stopped and disabled */
1359         priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING |
1360                           STATUS_ASSOCIATED | STATUS_ENABLED);
1361
1362         return 0;
1363 }
1364
1365 /*
1366  * Send the CARD_DISABLE_PHY_OFF comamnd to the card to disable it
1367  *
1368  * After disabling, if the card was associated, a STATUS_ASSN_LOST will be sent.
1369  *
1370  * STATUS_CARD_DISABLE_NOTIFICATION will be sent regardless of
1371  * if STATUS_ASSN_LOST is sent.
1372  */
1373 static int ipw2100_hw_phy_off(struct ipw2100_priv *priv)
1374 {
1375
1376 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
1377
1378         struct host_command cmd = {
1379                 .host_command = CARD_DISABLE_PHY_OFF,
1380                 .host_command_sequence = 0,
1381                 .host_command_length = 0,
1382         };
1383         int err, i;
1384         u32 val1, val2;
1385
1386         IPW_DEBUG_HC("CARD_DISABLE_PHY_OFF\n");
1387
1388         /* Turn off the radio */
1389         err = ipw2100_hw_send_command(priv, &cmd);
1390         if (err)
1391                 return err;
1392
1393         for (i = 0; i < 2500; i++) {
1394                 read_nic_dword(priv->net_dev, IPW2100_CONTROL_REG, &val1);
1395                 read_nic_dword(priv->net_dev, IPW2100_COMMAND, &val2);
1396
1397                 if ((val1 & IPW2100_CONTROL_PHY_OFF) &&
1398                     (val2 & IPW2100_COMMAND_PHY_OFF))
1399                         return 0;
1400
1401                 schedule_timeout_uninterruptible(HW_PHY_OFF_LOOP_DELAY);
1402         }
1403
1404         return -EIO;
1405 }
1406
1407 static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1408 {
1409         struct host_command cmd = {
1410                 .host_command = HOST_COMPLETE,
1411                 .host_command_sequence = 0,
1412                 .host_command_length = 0
1413         };
1414         int err = 0;
1415
1416         IPW_DEBUG_HC("HOST_COMPLETE\n");
1417
1418         if (priv->status & STATUS_ENABLED)
1419                 return 0;
1420
1421         down(&priv->adapter_sem);
1422
1423         if (rf_kill_active(priv)) {
1424                 IPW_DEBUG_HC("Command aborted due to RF kill active.\n");
1425                 goto fail_up;
1426         }
1427
1428         err = ipw2100_hw_send_command(priv, &cmd);
1429         if (err) {
1430                 IPW_DEBUG_INFO("Failed to send HOST_COMPLETE command\n");
1431                 goto fail_up;
1432         }
1433
1434         err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_ENABLED);
1435         if (err) {
1436                 IPW_DEBUG_INFO("%s: card not responding to init command.\n",
1437                                priv->net_dev->name);
1438                 goto fail_up;
1439         }
1440
1441         if (priv->stop_hang_check) {
1442                 priv->stop_hang_check = 0;
1443                 queue_delayed_work(priv->workqueue, &priv->hang_check, HZ / 2);
1444         }
1445
1446       fail_up:
1447         up(&priv->adapter_sem);
1448         return err;
1449 }
1450
1451 static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv)
1452 {
1453 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
1454
1455         struct host_command cmd = {
1456                 .host_command = HOST_PRE_POWER_DOWN,
1457                 .host_command_sequence = 0,
1458                 .host_command_length = 0,
1459         };
1460         int err, i;
1461         u32 reg;
1462
1463         if (!(priv->status & STATUS_RUNNING))
1464                 return 0;
1465
1466         priv->status |= STATUS_STOPPING;
1467
1468         /* We can only shut down the card if the firmware is operational.  So,
1469          * if we haven't reset since a fatal_error, then we can not send the
1470          * shutdown commands. */
1471         if (!priv->fatal_error) {
1472                 /* First, make sure the adapter is enabled so that the PHY_OFF
1473                  * command can shut it down */
1474                 ipw2100_enable_adapter(priv);
1475
1476                 err = ipw2100_hw_phy_off(priv);
1477                 if (err)
1478                         printk(KERN_WARNING DRV_NAME
1479                                ": Error disabling radio %d\n", err);
1480
1481                 /*
1482                  * If in D0-standby mode going directly to D3 may cause a
1483                  * PCI bus violation.  Therefore we must change out of the D0
1484                  * state.
1485                  *
1486                  * Sending the PREPARE_FOR_POWER_DOWN will restrict the
1487                  * hardware from going into standby mode and will transition
1488                  * out of D0-standy if it is already in that state.
1489                  *
1490                  * STATUS_PREPARE_POWER_DOWN_COMPLETE will be sent by the
1491                  * driver upon completion.  Once received, the driver can
1492                  * proceed to the D3 state.
1493                  *
1494                  * Prepare for power down command to fw.  This command would
1495                  * take HW out of D0-standby and prepare it for D3 state.
1496                  *
1497                  * Currently FW does not support event notification for this
1498                  * event. Therefore, skip waiting for it.  Just wait a fixed
1499                  * 100ms
1500                  */
1501                 IPW_DEBUG_HC("HOST_PRE_POWER_DOWN\n");
1502
1503                 err = ipw2100_hw_send_command(priv, &cmd);
1504                 if (err)
1505                         printk(KERN_WARNING DRV_NAME ": "
1506                                "%s: Power down command failed: Error %d\n",
1507                                priv->net_dev->name, err);
1508                 else
1509                         schedule_timeout_uninterruptible(HW_POWER_DOWN_DELAY);
1510         }
1511
1512         priv->status &= ~STATUS_ENABLED;
1513
1514         /*
1515          * Set GPIO 3 writable by FW; GPIO 1 writable
1516          * by driver and enable clock
1517          */
1518         ipw2100_hw_set_gpio(priv);
1519
1520         /*
1521          * Power down adapter.  Sequence:
1522          * 1. Stop master assert (RESET_REG[9]=1)
1523          * 2. Wait for stop master (RESET_REG[8]==1)
1524          * 3. S/w reset assert (RESET_REG[7] = 1)
1525          */
1526
1527         /* Stop master assert */
1528         write_register(priv->net_dev, IPW_REG_RESET_REG,
1529                        IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1530
1531         /* wait stop master not more than 50 usec.
1532          * Otherwise return error. */
1533         for (i = 5; i > 0; i--) {
1534                 udelay(10);
1535
1536                 /* Check master stop bit */
1537                 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg);
1538
1539                 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1540                         break;
1541         }
1542
1543         if (i == 0)
1544                 printk(KERN_WARNING DRV_NAME
1545                        ": %s: Could now power down adapter.\n",
1546                        priv->net_dev->name);
1547
1548         /* assert s/w reset */
1549         write_register(priv->net_dev, IPW_REG_RESET_REG,
1550                        IPW_AUX_HOST_RESET_REG_SW_RESET);
1551
1552         priv->status &= ~(STATUS_RUNNING | STATUS_STOPPING);
1553
1554         return 0;
1555 }
1556
1557 static int ipw2100_disable_adapter(struct ipw2100_priv *priv)
1558 {
1559         struct host_command cmd = {
1560                 .host_command = CARD_DISABLE,
1561                 .host_command_sequence = 0,
1562                 .host_command_length = 0
1563         };
1564         int err = 0;
1565
1566         IPW_DEBUG_HC("CARD_DISABLE\n");
1567
1568         if (!(priv->status & STATUS_ENABLED))
1569                 return 0;
1570
1571         /* Make sure we clear the associated state */
1572         priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1573
1574         if (!priv->stop_hang_check) {
1575                 priv->stop_hang_check = 1;
1576                 cancel_delayed_work(&priv->hang_check);
1577         }
1578
1579         down(&priv->adapter_sem);
1580
1581         err = ipw2100_hw_send_command(priv, &cmd);
1582         if (err) {
1583                 printk(KERN_WARNING DRV_NAME
1584                        ": exit - failed to send CARD_DISABLE command\n");
1585                 goto fail_up;
1586         }
1587
1588         err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_DISABLED);
1589         if (err) {
1590                 printk(KERN_WARNING DRV_NAME
1591                        ": exit - card failed to change to DISABLED\n");
1592                 goto fail_up;
1593         }
1594
1595         IPW_DEBUG_INFO("TODO: implement scan state machine\n");
1596
1597       fail_up:
1598         up(&priv->adapter_sem);
1599         return err;
1600 }
1601
1602 static int ipw2100_set_scan_options(struct ipw2100_priv *priv)
1603 {
1604         struct host_command cmd = {
1605                 .host_command = SET_SCAN_OPTIONS,
1606                 .host_command_sequence = 0,
1607                 .host_command_length = 8
1608         };
1609         int err;
1610
1611         IPW_DEBUG_INFO("enter\n");
1612
1613         IPW_DEBUG_SCAN("setting scan options\n");
1614
1615         cmd.host_command_parameters[0] = 0;
1616
1617         if (!(priv->config & CFG_ASSOCIATE))
1618                 cmd.host_command_parameters[0] |= IPW_SCAN_NOASSOCIATE;
1619         if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled)
1620                 cmd.host_command_parameters[0] |= IPW_SCAN_MIXED_CELL;
1621         if (priv->config & CFG_PASSIVE_SCAN)
1622                 cmd.host_command_parameters[0] |= IPW_SCAN_PASSIVE;
1623
1624         cmd.host_command_parameters[1] = priv->channel_mask;
1625
1626         err = ipw2100_hw_send_command(priv, &cmd);
1627
1628         IPW_DEBUG_HC("SET_SCAN_OPTIONS 0x%04X\n",
1629                      cmd.host_command_parameters[0]);
1630
1631         return err;
1632 }
1633
1634 static int ipw2100_start_scan(struct ipw2100_priv *priv)
1635 {
1636         struct host_command cmd = {
1637                 .host_command = BROADCAST_SCAN,
1638                 .host_command_sequence = 0,
1639                 .host_command_length = 4
1640         };
1641         int err;
1642
1643         IPW_DEBUG_HC("START_SCAN\n");
1644
1645         cmd.host_command_parameters[0] = 0;
1646
1647         /* No scanning if in monitor mode */
1648         if (priv->ieee->iw_mode == IW_MODE_MONITOR)
1649                 return 1;
1650
1651         if (priv->status & STATUS_SCANNING) {
1652                 IPW_DEBUG_SCAN("Scan requested while already in scan...\n");
1653                 return 0;
1654         }
1655
1656         IPW_DEBUG_INFO("enter\n");
1657
1658         /* Not clearing here; doing so makes iwlist always return nothing...
1659          *
1660          * We should modify the table logic to use aging tables vs. clearing
1661          * the table on each scan start.
1662          */
1663         IPW_DEBUG_SCAN("starting scan\n");
1664
1665         priv->status |= STATUS_SCANNING;
1666         err = ipw2100_hw_send_command(priv, &cmd);
1667         if (err)
1668                 priv->status &= ~STATUS_SCANNING;
1669
1670         IPW_DEBUG_INFO("exit\n");
1671
1672         return err;
1673 }
1674
1675 static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1676 {
1677         unsigned long flags;
1678         int rc = 0;
1679         u32 lock;
1680         u32 ord_len = sizeof(lock);
1681
1682         /* Quite if manually disabled. */
1683         if (priv->status & STATUS_RF_KILL_SW) {
1684                 IPW_DEBUG_INFO("%s: Radio is disabled by Manual Disable "
1685                                "switch\n", priv->net_dev->name);
1686                 return 0;
1687         }
1688
1689         /* If the interrupt is enabled, turn it off... */
1690         spin_lock_irqsave(&priv->low_lock, flags);
1691         ipw2100_disable_interrupts(priv);
1692
1693         /* Reset any fatal_error conditions */
1694         ipw2100_reset_fatalerror(priv);
1695         spin_unlock_irqrestore(&priv->low_lock, flags);
1696
1697         if (priv->status & STATUS_POWERED ||
1698             (priv->status & STATUS_RESET_PENDING)) {
1699                 /* Power cycle the card ... */
1700                 if (ipw2100_power_cycle_adapter(priv)) {
1701                         printk(KERN_WARNING DRV_NAME
1702                                ": %s: Could not cycle adapter.\n",
1703                                priv->net_dev->name);
1704                         rc = 1;
1705                         goto exit;
1706                 }
1707         } else
1708                 priv->status |= STATUS_POWERED;
1709
1710         /* Load the firmware, start the clocks, etc. */
1711         if (ipw2100_start_adapter(priv)) {
1712                 printk(KERN_ERR DRV_NAME
1713                        ": %s: Failed to start the firmware.\n",
1714                        priv->net_dev->name);
1715                 rc = 1;
1716                 goto exit;
1717         }
1718
1719         ipw2100_initialize_ordinals(priv);
1720
1721         /* Determine capabilities of this particular HW configuration */
1722         if (ipw2100_get_hw_features(priv)) {
1723                 printk(KERN_ERR DRV_NAME
1724                        ": %s: Failed to determine HW features.\n",
1725                        priv->net_dev->name);
1726                 rc = 1;
1727                 goto exit;
1728         }
1729
1730         lock = LOCK_NONE;
1731         if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
1732                 printk(KERN_ERR DRV_NAME
1733                        ": %s: Failed to clear ordinal lock.\n",
1734                        priv->net_dev->name);
1735                 rc = 1;
1736                 goto exit;
1737         }
1738
1739         priv->status &= ~STATUS_SCANNING;
1740
1741         if (rf_kill_active(priv)) {
1742                 printk(KERN_INFO "%s: Radio is disabled by RF switch.\n",
1743                        priv->net_dev->name);
1744
1745                 if (priv->stop_rf_kill) {
1746                         priv->stop_rf_kill = 0;
1747                         queue_delayed_work(priv->workqueue, &priv->rf_kill, HZ);
1748                 }
1749
1750                 deferred = 1;
1751         }
1752
1753         /* Turn on the interrupt so that commands can be processed */
1754         ipw2100_enable_interrupts(priv);
1755
1756         /* Send all of the commands that must be sent prior to
1757          * HOST_COMPLETE */
1758         if (ipw2100_adapter_setup(priv)) {
1759                 printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n",
1760                        priv->net_dev->name);
1761                 rc = 1;
1762                 goto exit;
1763         }
1764
1765         if (!deferred) {
1766                 /* Enable the adapter - sends HOST_COMPLETE */
1767                 if (ipw2100_enable_adapter(priv)) {
1768                         printk(KERN_ERR DRV_NAME ": "
1769                                "%s: failed in call to enable adapter.\n",
1770                                priv->net_dev->name);
1771                         ipw2100_hw_stop_adapter(priv);
1772                         rc = 1;
1773                         goto exit;
1774                 }
1775
1776                 /* Start a scan . . . */
1777                 ipw2100_set_scan_options(priv);
1778                 ipw2100_start_scan(priv);
1779         }
1780
1781       exit:
1782         return rc;
1783 }
1784
1785 /* Called by register_netdev() */
1786 static int ipw2100_net_init(struct net_device *dev)
1787 {
1788         struct ipw2100_priv *priv = ieee80211_priv(dev);
1789         return ipw2100_up(priv, 1);
1790 }
1791
1792 static void ipw2100_down(struct ipw2100_priv *priv)
1793 {
1794         unsigned long flags;
1795         union iwreq_data wrqu = {
1796                 .ap_addr = {
1797                             .sa_family = ARPHRD_ETHER}
1798         };
1799         int associated = priv->status & STATUS_ASSOCIATED;
1800
1801         /* Kill the RF switch timer */
1802         if (!priv->stop_rf_kill) {
1803                 priv->stop_rf_kill = 1;
1804                 cancel_delayed_work(&priv->rf_kill);
1805         }
1806
1807         /* Kill the firmare hang check timer */
1808         if (!priv->stop_hang_check) {
1809                 priv->stop_hang_check = 1;
1810                 cancel_delayed_work(&priv->hang_check);
1811         }
1812
1813         /* Kill any pending resets */
1814         if (priv->status & STATUS_RESET_PENDING)
1815                 cancel_delayed_work(&priv->reset_work);
1816
1817         /* Make sure the interrupt is on so that FW commands will be
1818          * processed correctly */
1819         spin_lock_irqsave(&priv->low_lock, flags);
1820         ipw2100_enable_interrupts(priv);
1821         spin_unlock_irqrestore(&priv->low_lock, flags);
1822
1823         if (ipw2100_hw_stop_adapter(priv))
1824                 printk(KERN_ERR DRV_NAME ": %s: Error stopping adapter.\n",
1825                        priv->net_dev->name);
1826
1827         /* Do not disable the interrupt until _after_ we disable
1828          * the adaptor.  Otherwise the CARD_DISABLE command will never
1829          * be ack'd by the firmware */
1830         spin_lock_irqsave(&priv->low_lock, flags);
1831         ipw2100_disable_interrupts(priv);
1832         spin_unlock_irqrestore(&priv->low_lock, flags);
1833
1834 #ifdef ACPI_CSTATE_LIMIT_DEFINED
1835         if (priv->config & CFG_C3_DISABLED) {
1836                 IPW_DEBUG_INFO(": Resetting C3 transitions.\n");
1837                 acpi_set_cstate_limit(priv->cstate_limit);
1838                 priv->config &= ~CFG_C3_DISABLED;
1839         }
1840 #endif
1841
1842         /* We have to signal any supplicant if we are disassociating */
1843         if (associated)
1844                 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1845
1846         priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1847         netif_carrier_off(priv->net_dev);
1848         netif_stop_queue(priv->net_dev);
1849 }
1850
1851 static void ipw2100_reset_adapter(struct ipw2100_priv *priv)
1852 {
1853         unsigned long flags;
1854         union iwreq_data wrqu = {
1855                 .ap_addr = {
1856                             .sa_family = ARPHRD_ETHER}
1857         };
1858         int associated = priv->status & STATUS_ASSOCIATED;
1859
1860         spin_lock_irqsave(&priv->low_lock, flags);
1861         IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name);
1862         priv->resets++;
1863         priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1864         priv->status |= STATUS_SECURITY_UPDATED;
1865
1866         /* Force a power cycle even if interface hasn't been opened
1867          * yet */
1868         cancel_delayed_work(&priv->reset_work);
1869         priv->status |= STATUS_RESET_PENDING;
1870         spin_unlock_irqrestore(&priv->low_lock, flags);
1871
1872         down(&priv->action_sem);
1873         /* stop timed checks so that they don't interfere with reset */
1874         priv->stop_hang_check = 1;
1875         cancel_delayed_work(&priv->hang_check);
1876
1877         /* We have to signal any supplicant if we are disassociating */
1878         if (associated)
1879                 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1880
1881         ipw2100_up(priv, 0);
1882         up(&priv->action_sem);
1883
1884 }
1885
1886 static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1887 {
1888
1889 #define MAC_ASSOCIATION_READ_DELAY (HZ)
1890         int ret, len, essid_len;
1891         char essid[IW_ESSID_MAX_SIZE];
1892         u32 txrate;
1893         u32 chan;
1894         char *txratename;
1895         u8 bssid[ETH_ALEN];
1896
1897         /*
1898          * TBD: BSSID is usually 00:00:00:00:00:00 here and not
1899          *      an actual MAC of the AP. Seems like FW sets this
1900          *      address too late. Read it later and expose through
1901          *      /proc or schedule a later task to query and update
1902          */
1903
1904         essid_len = IW_ESSID_MAX_SIZE;
1905         ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID,
1906                                   essid, &essid_len);
1907         if (ret) {
1908                 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1909                                __LINE__);
1910                 return;
1911         }
1912
1913         len = sizeof(u32);
1914         ret = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &txrate, &len);
1915         if (ret) {
1916                 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1917                                __LINE__);
1918                 return;
1919         }
1920
1921         len = sizeof(u32);
1922         ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &len);
1923         if (ret) {
1924                 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1925                                __LINE__);
1926                 return;
1927         }
1928         len = ETH_ALEN;
1929         ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, &bssid, &len);
1930         if (ret) {
1931                 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1932                                __LINE__);
1933                 return;
1934         }
1935         memcpy(priv->ieee->bssid, bssid, ETH_ALEN);
1936
1937         switch (txrate) {
1938         case TX_RATE_1_MBIT:
1939                 txratename = "1Mbps";
1940                 break;
1941         case TX_RATE_2_MBIT:
1942                 txratename = "2Mbsp";
1943                 break;
1944         case TX_RATE_5_5_MBIT:
1945                 txratename = "5.5Mbps";
1946                 break;
1947         case TX_RATE_11_MBIT:
1948                 txratename = "11Mbps";
1949                 break;
1950         default:
1951                 IPW_DEBUG_INFO("Unknown rate: %d\n", txrate);
1952                 txratename = "unknown rate";
1953                 break;
1954         }
1955
1956         IPW_DEBUG_INFO("%s: Associated with '%s' at %s, channel %d (BSSID="
1957                        MAC_FMT ")\n",
1958                        priv->net_dev->name, escape_essid(essid, essid_len),
1959                        txratename, chan, MAC_ARG(bssid));
1960
1961         /* now we copy read ssid into dev */
1962         if (!(priv->config & CFG_STATIC_ESSID)) {
1963                 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE);
1964                 memcpy(priv->essid, essid, priv->essid_len);
1965         }
1966         priv->channel = chan;
1967         memcpy(priv->bssid, bssid, ETH_ALEN);
1968
1969         priv->status |= STATUS_ASSOCIATING;
1970         priv->connect_start = get_seconds();
1971
1972         queue_delayed_work(priv->workqueue, &priv->wx_event_work, HZ / 10);
1973 }
1974
1975 static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
1976                              int length, int batch_mode)
1977 {
1978         int ssid_len = min(length, IW_ESSID_MAX_SIZE);
1979         struct host_command cmd = {
1980                 .host_command = SSID,
1981                 .host_command_sequence = 0,
1982                 .host_command_length = ssid_len
1983         };
1984         int err;
1985
1986         IPW_DEBUG_HC("SSID: '%s'\n", escape_essid(essid, ssid_len));
1987
1988         if (ssid_len)
1989                 memcpy(cmd.host_command_parameters, essid, ssid_len);
1990
1991         if (!batch_mode) {
1992                 err = ipw2100_disable_adapter(priv);
1993                 if (err)
1994                         return err;
1995         }
1996
1997         /* Bug in FW currently doesn't honor bit 0 in SET_SCAN_OPTIONS to
1998          * disable auto association -- so we cheat by setting a bogus SSID */
1999         if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) {
2000                 int i;
2001                 u8 *bogus = (u8 *) cmd.host_command_parameters;
2002                 for (i = 0; i < IW_ESSID_MAX_SIZE; i++)
2003                         bogus[i] = 0x18 + i;
2004                 cmd.host_command_length = IW_ESSID_MAX_SIZE;
2005         }
2006
2007         /* NOTE:  We always send the SSID command even if the provided ESSID is
2008          * the same as what we currently think is set. */
2009
2010         err = ipw2100_hw_send_command(priv, &cmd);
2011         if (!err) {
2012                 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len);
2013                 memcpy(priv->essid, essid, ssid_len);
2014                 priv->essid_len = ssid_len;
2015         }
2016
2017         if (!batch_mode) {
2018                 if (ipw2100_enable_adapter(priv))
2019                         err = -EIO;
2020         }
2021
2022         return err;
2023 }
2024
2025 static void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status)
2026 {
2027         IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | IPW_DL_ASSOC,
2028                   "disassociated: '%s' " MAC_FMT " \n",
2029                   escape_essid(priv->essid, priv->essid_len),
2030                   MAC_ARG(priv->bssid));
2031
2032         priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
2033
2034         if (priv->status & STATUS_STOPPING) {
2035                 IPW_DEBUG_INFO("Card is stopping itself, discard ASSN_LOST.\n");
2036                 return;
2037         }
2038
2039         memset(priv->bssid, 0, ETH_ALEN);
2040         memset(priv->ieee->bssid, 0, ETH_ALEN);
2041
2042         netif_carrier_off(priv->net_dev);
2043         netif_stop_queue(priv->net_dev);
2044
2045         if (!(priv->status & STATUS_RUNNING))
2046                 return;
2047
2048         if (priv->status & STATUS_SECURITY_UPDATED)
2049                 queue_work(priv->workqueue, &priv->security_work);
2050
2051         queue_work(priv->workqueue, &priv->wx_event_work);
2052 }
2053
2054 static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
2055 {
2056         IPW_DEBUG_INFO("%s: RF Kill state changed to radio OFF.\n",
2057                        priv->net_dev->name);
2058
2059         /* RF_KILL is now enabled (else we wouldn't be here) */
2060         priv->status |= STATUS_RF_KILL_HW;
2061
2062 #ifdef ACPI_CSTATE_LIMIT_DEFINED
2063         if (priv->config & CFG_C3_DISABLED) {
2064                 IPW_DEBUG_INFO(": Resetting C3 transitions.\n");
2065                 acpi_set_cstate_limit(priv->cstate_limit);
2066                 priv->config &= ~CFG_C3_DISABLED;
2067         }
2068 #endif
2069
2070         /* Make sure the RF Kill check timer is running */
2071         priv->stop_rf_kill = 0;
2072         cancel_delayed_work(&priv->rf_kill);
2073         queue_delayed_work(priv->workqueue, &priv->rf_kill, HZ);
2074 }
2075
2076 static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
2077 {
2078         IPW_DEBUG_SCAN("scan complete\n");
2079         /* Age the scan results... */
2080         priv->ieee->scans++;
2081         priv->status &= ~STATUS_SCANNING;
2082 }
2083
2084 #ifdef CONFIG_IPW2100_DEBUG
2085 #define IPW2100_HANDLER(v, f) { v, f, # v }
2086 struct ipw2100_status_indicator {
2087         int status;
2088         void (*cb) (struct ipw2100_priv * priv, u32 status);
2089         char *name;
2090 };
2091 #else
2092 #define IPW2100_HANDLER(v, f) { v, f }
2093 struct ipw2100_status_indicator {
2094         int status;
2095         void (*cb) (struct ipw2100_priv * priv, u32 status);
2096 };
2097 #endif                          /* CONFIG_IPW2100_DEBUG */
2098
2099 static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status)
2100 {
2101         IPW_DEBUG_SCAN("Scanning...\n");
2102         priv->status |= STATUS_SCANNING;
2103 }
2104
2105 static const struct ipw2100_status_indicator status_handlers[] = {
2106         IPW2100_HANDLER(IPW_STATE_INITIALIZED, NULL),
2107         IPW2100_HANDLER(IPW_STATE_COUNTRY_FOUND, NULL),
2108         IPW2100_HANDLER(IPW_STATE_ASSOCIATED, isr_indicate_associated),
2109         IPW2100_HANDLER(IPW_STATE_ASSN_LOST, isr_indicate_association_lost),
2110         IPW2100_HANDLER(IPW_STATE_ASSN_CHANGED, NULL),
2111         IPW2100_HANDLER(IPW_STATE_SCAN_COMPLETE, isr_scan_complete),
2112         IPW2100_HANDLER(IPW_STATE_ENTERED_PSP, NULL),
2113         IPW2100_HANDLER(IPW_STATE_LEFT_PSP, NULL),
2114         IPW2100_HANDLER(IPW_STATE_RF_KILL, isr_indicate_rf_kill),
2115         IPW2100_HANDLER(IPW_STATE_DISABLED, NULL),
2116         IPW2100_HANDLER(IPW_STATE_POWER_DOWN, NULL),
2117         IPW2100_HANDLER(IPW_STATE_SCANNING, isr_indicate_scanning),
2118         IPW2100_HANDLER(-1, NULL)
2119 };
2120
2121 static void isr_status_change(struct ipw2100_priv *priv, int status)
2122 {
2123         int i;
2124
2125         if (status == IPW_STATE_SCANNING &&
2126             priv->status & STATUS_ASSOCIATED &&
2127             !(priv->status & STATUS_SCANNING)) {
2128                 IPW_DEBUG_INFO("Scan detected while associated, with "
2129                                "no scan request.  Restarting firmware.\n");
2130
2131                 /* Wake up any sleeping jobs */
2132                 schedule_reset(priv);
2133         }
2134
2135         for (i = 0; status_handlers[i].status != -1; i++) {
2136                 if (status == status_handlers[i].status) {
2137                         IPW_DEBUG_NOTIF("Status change: %s\n",
2138                                         status_handlers[i].name);
2139                         if (status_handlers[i].cb)
2140                                 status_handlers[i].cb(priv, status);
2141                         priv->wstats.status = status;
2142                         return;
2143                 }
2144         }
2145
2146         IPW_DEBUG_NOTIF("unknown status received: %04x\n", status);
2147 }
2148
2149 static void isr_rx_complete_command(struct ipw2100_priv *priv,
2150                                     struct ipw2100_cmd_header *cmd)
2151 {
2152 #ifdef CONFIG_IPW2100_DEBUG
2153         if (cmd->host_command_reg < ARRAY_SIZE(command_types)) {
2154                 IPW_DEBUG_HC("Command completed '%s (%d)'\n",
2155                              command_types[cmd->host_command_reg],
2156                              cmd->host_command_reg);
2157         }
2158 #endif
2159         if (cmd->host_command_reg == HOST_COMPLETE)
2160                 priv->status |= STATUS_ENABLED;
2161
2162         if (cmd->host_command_reg == CARD_DISABLE)
2163                 priv->status &= ~STATUS_ENABLED;
2164
2165         priv->status &= ~STATUS_CMD_ACTIVE;
2166
2167         wake_up_interruptible(&priv->wait_command_queue);
2168 }
2169
2170 #ifdef CONFIG_IPW2100_DEBUG
2171 static const char *frame_types[] = {
2172         "COMMAND_STATUS_VAL",
2173         "STATUS_CHANGE_VAL",
2174         "P80211_DATA_VAL",
2175         "P8023_DATA_VAL",
2176         "HOST_NOTIFICATION_VAL"
2177 };
2178 #endif
2179
2180 static int ipw2100_alloc_skb(struct ipw2100_priv *priv,
2181                                     struct ipw2100_rx_packet *packet)
2182 {
2183         packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx));
2184         if (!packet->skb)
2185                 return -ENOMEM;
2186
2187         packet->rxp = (struct ipw2100_rx *)packet->skb->data;
2188         packet->dma_addr = pci_map_single(priv->pci_dev, packet->skb->data,
2189                                           sizeof(struct ipw2100_rx),
2190                                           PCI_DMA_FROMDEVICE);
2191         /* NOTE: pci_map_single does not return an error code, and 0 is a valid
2192          *       dma_addr */
2193
2194         return 0;
2195 }
2196
2197 #define SEARCH_ERROR   0xffffffff
2198 #define SEARCH_FAIL    0xfffffffe
2199 #define SEARCH_SUCCESS 0xfffffff0
2200 #define SEARCH_DISCARD 0
2201 #define SEARCH_SNAPSHOT 1
2202
2203 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2204 static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
2205 {
2206         int i;
2207         if (!priv->snapshot[0])
2208                 return;
2209         for (i = 0; i < 0x30; i++)
2210                 kfree(priv->snapshot[i]);
2211         priv->snapshot[0] = NULL;
2212 }
2213
2214 #ifdef CONFIG_IPW2100_DEBUG_C3
2215 static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
2216 {
2217         int i;
2218         if (priv->snapshot[0])
2219                 return 1;
2220         for (i = 0; i < 0x30; i++) {
2221                 priv->snapshot[i] = (u8 *) kmalloc(0x1000, GFP_ATOMIC);
2222                 if (!priv->snapshot[i]) {
2223                         IPW_DEBUG_INFO("%s: Error allocating snapshot "
2224                                        "buffer %d\n", priv->net_dev->name, i);
2225                         while (i > 0)
2226                                 kfree(priv->snapshot[--i]);
2227                         priv->snapshot[0] = NULL;
2228                         return 0;
2229                 }
2230         }
2231
2232         return 1;
2233 }
2234
2235 static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
2236                                     size_t len, int mode)
2237 {
2238         u32 i, j;
2239         u32 tmp;
2240         u8 *s, *d;
2241         u32 ret;
2242
2243         s = in_buf;
2244         if (mode == SEARCH_SNAPSHOT) {
2245                 if (!ipw2100_snapshot_alloc(priv))
2246                         mode = SEARCH_DISCARD;
2247         }
2248
2249         for (ret = SEARCH_FAIL, i = 0; i < 0x30000; i += 4) {
2250                 read_nic_dword(priv->net_dev, i, &tmp);
2251                 if (mode == SEARCH_SNAPSHOT)
2252                         *(u32 *) SNAPSHOT_ADDR(i) = tmp;
2253                 if (ret == SEARCH_FAIL) {
2254                         d = (u8 *) & tmp;
2255                         for (j = 0; j < 4; j++) {
2256                                 if (*s != *d) {
2257                                         s = in_buf;
2258                                         continue;
2259                                 }
2260
2261                                 s++;
2262                                 d++;
2263
2264                                 if ((s - in_buf) == len)
2265                                         ret = (i + j) - len + 1;
2266                         }
2267                 } else if (mode == SEARCH_DISCARD)
2268                         return ret;
2269         }
2270
2271         return ret;
2272 }
2273 #endif
2274
2275 /*
2276  *
2277  * 0) Disconnect the SKB from the firmware (just unmap)
2278  * 1) Pack the ETH header into the SKB
2279  * 2) Pass the SKB to the network stack
2280  *
2281  * When packet is provided by the firmware, it contains the following:
2282  *
2283  * .  ieee80211_hdr
2284  * .  ieee80211_snap_hdr
2285  *
2286  * The size of the constructed ethernet
2287  *
2288  */
2289 #ifdef CONFIG_IPW2100_RX_DEBUG
2290 static u8 packet_data[IPW_RX_NIC_BUFFER_LENGTH];
2291 #endif
2292
2293 static void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i)
2294 {
2295 #ifdef CONFIG_IPW2100_DEBUG_C3
2296         struct ipw2100_status *status = &priv->status_queue.drv[i];
2297         u32 match, reg;
2298         int j;
2299 #endif
2300 #ifdef ACPI_CSTATE_LIMIT_DEFINED
2301         int limit;
2302 #endif
2303
2304         IPW_DEBUG_INFO(": PCI latency error detected at 0x%04zX.\n",
2305                        i * sizeof(struct ipw2100_status));
2306
2307 #ifdef ACPI_CSTATE_LIMIT_DEFINED
2308         IPW_DEBUG_INFO(": Disabling C3 transitions.\n");
2309         limit = acpi_get_cstate_limit();
2310         if (limit > 2) {
2311                 priv->cstate_limit = limit;
2312                 acpi_set_cstate_limit(2);
2313                 priv->config |= CFG_C3_DISABLED;
2314         }
2315 #endif
2316
2317 #ifdef CONFIG_IPW2100_DEBUG_C3
2318         /* Halt the fimrware so we can get a good image */
2319         write_register(priv->net_dev, IPW_REG_RESET_REG,
2320                        IPW_AUX_HOST_RESET_REG_STOP_MASTER);
2321         j = 5;
2322         do {
2323                 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
2324                 read_register(priv->net_dev, IPW_REG_RESET_REG, &reg);
2325
2326                 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
2327                         break;
2328         } while (j--);
2329
2330         match = ipw2100_match_buf(priv, (u8 *) status,
2331                                   sizeof(struct ipw2100_status),
2332                                   SEARCH_SNAPSHOT);
2333         if (match < SEARCH_SUCCESS)
2334                 IPW_DEBUG_INFO("%s: DMA status match in Firmware at "
2335                                "offset 0x%06X, length %d:\n",
2336                                priv->net_dev->name, match,
2337                                sizeof(struct ipw2100_status));
2338         else
2339                 IPW_DEBUG_INFO("%s: No DMA status match in "
2340                                "Firmware.\n", priv->net_dev->name);
2341
2342         printk_buf((u8 *) priv->status_queue.drv,
2343                    sizeof(struct ipw2100_status) * RX_QUEUE_LENGTH);
2344 #endif
2345
2346         priv->fatal_error = IPW2100_ERR_C3_CORRUPTION;
2347         priv->ieee->stats.rx_errors++;
2348         schedule_reset(priv);
2349 }
2350
2351 static void isr_rx(struct ipw2100_priv *priv, int i,
2352                           struct ieee80211_rx_stats *stats)
2353 {
2354         struct ipw2100_status *status = &priv->status_queue.drv[i];
2355         struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2356
2357         IPW_DEBUG_RX("Handler...\n");
2358
2359         if (unlikely(status->frame_size > skb_tailroom(packet->skb))) {
2360                 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2361                                "  Dropping.\n",
2362                                priv->net_dev->name,
2363                                status->frame_size, skb_tailroom(packet->skb));
2364                 priv->ieee->stats.rx_errors++;
2365                 return;
2366         }
2367
2368         if (unlikely(!netif_running(priv->net_dev))) {
2369                 priv->ieee->stats.rx_errors++;
2370                 priv->wstats.discard.misc++;
2371                 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2372                 return;
2373         }
2374 #ifdef CONFIG_IPW2100_MONITOR
2375         if (unlikely(priv->ieee->iw_mode == IW_MODE_MONITOR &&
2376                      priv->config & CFG_CRC_CHECK &&
2377                      status->flags & IPW_STATUS_FLAG_CRC_ERROR)) {
2378                 IPW_DEBUG_RX("CRC error in packet.  Dropping.\n");
2379                 priv->ieee->stats.rx_errors++;
2380                 return;
2381         }
2382 #endif
2383
2384         if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR &&
2385                      !(priv->status & STATUS_ASSOCIATED))) {
2386                 IPW_DEBUG_DROP("Dropping packet while not associated.\n");
2387                 priv->wstats.discard.misc++;
2388                 return;
2389         }
2390
2391         pci_unmap_single(priv->pci_dev,
2392                          packet->dma_addr,
2393                          sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2394
2395         skb_put(packet->skb, status->frame_size);
2396
2397 #ifdef CONFIG_IPW2100_RX_DEBUG
2398         /* Make a copy of the frame so we can dump it to the logs if
2399          * ieee80211_rx fails */
2400         memcpy(packet_data, packet->skb->data,
2401                min_t(u32, status->frame_size, IPW_RX_NIC_BUFFER_LENGTH));
2402 #endif
2403
2404         if (!ieee80211_rx(priv->ieee, packet->skb, stats)) {
2405 #ifdef CONFIG_IPW2100_RX_DEBUG
2406                 IPW_DEBUG_DROP("%s: Non consumed packet:\n",
2407                                priv->net_dev->name);
2408                 printk_buf(IPW_DL_DROP, packet_data, status->frame_size);
2409 #endif
2410                 priv->ieee->stats.rx_errors++;
2411
2412                 /* ieee80211_rx failed, so it didn't free the SKB */
2413                 dev_kfree_skb_any(packet->skb);
2414                 packet->skb = NULL;
2415         }
2416
2417         /* We need to allocate a new SKB and attach it to the RDB. */
2418         if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2419                 printk(KERN_WARNING DRV_NAME ": "
2420                        "%s: Unable to allocate SKB onto RBD ring - disabling "
2421                        "adapter.\n", priv->net_dev->name);
2422                 /* TODO: schedule adapter shutdown */
2423                 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2424         }
2425
2426         /* Update the RDB entry */
2427         priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2428 }
2429
2430 static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i)
2431 {
2432         struct ipw2100_status *status = &priv->status_queue.drv[i];
2433         struct ipw2100_rx *u = priv->rx_buffers[i].rxp;
2434         u16 frame_type = status->status_fields & STATUS_TYPE_MASK;
2435
2436         switch (frame_type) {
2437         case COMMAND_STATUS_VAL:
2438                 return (status->frame_size != sizeof(u->rx_data.command));
2439         case STATUS_CHANGE_VAL:
2440                 return (status->frame_size != sizeof(u->rx_data.status));
2441         case HOST_NOTIFICATION_VAL:
2442                 return (status->frame_size < sizeof(u->rx_data.notification));
2443         case P80211_DATA_VAL:
2444         case P8023_DATA_VAL:
2445 #ifdef CONFIG_IPW2100_MONITOR
2446                 return 0;
2447 #else
2448                 switch (WLAN_FC_GET_TYPE(u->rx_data.header.frame_ctl)) {
2449                 case IEEE80211_FTYPE_MGMT:
2450                 case IEEE80211_FTYPE_CTL:
2451                         return 0;
2452                 case IEEE80211_FTYPE_DATA:
2453                         return (status->frame_size >
2454                                 IPW_MAX_802_11_PAYLOAD_LENGTH);
2455                 }
2456 #endif
2457         }
2458
2459         return 1;
2460 }
2461
2462 /*
2463  * ipw2100 interrupts are disabled at this point, and the ISR
2464  * is the only code that calls this method.  So, we do not need
2465  * to play with any locks.
2466  *
2467  * RX Queue works as follows:
2468  *
2469  * Read index - firmware places packet in entry identified by the
2470  *              Read index and advances Read index.  In this manner,
2471  *              Read index will always point to the next packet to
2472  *              be filled--but not yet valid.
2473  *
2474  * Write index - driver fills this entry with an unused RBD entry.
2475  *               This entry has not filled by the firmware yet.
2476  *
2477  * In between the W and R indexes are the RBDs that have been received
2478  * but not yet processed.
2479  *
2480  * The process of handling packets will start at WRITE + 1 and advance
2481  * until it reaches the READ index.
2482  *
2483  * The WRITE index is cached in the variable 'priv->rx_queue.next'.
2484  *
2485  */
2486 static void __ipw2100_rx_process(struct ipw2100_priv *priv)
2487 {
2488         struct ipw2100_bd_queue *rxq = &priv->rx_queue;
2489         struct ipw2100_status_queue *sq = &priv->status_queue;
2490         struct ipw2100_rx_packet *packet;
2491         u16 frame_type;
2492         u32 r, w, i, s;
2493         struct ipw2100_rx *u;
2494         struct ieee80211_rx_stats stats = {
2495                 .mac_time = jiffies,
2496         };
2497
2498         read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r);
2499         read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w);
2500
2501         if (r >= rxq->entries) {
2502                 IPW_DEBUG_RX("exit - bad read index\n");
2503                 return;
2504         }
2505
2506         i = (rxq->next + 1) % rxq->entries;
2507         s = i;
2508         while (i != r) {
2509                 /* IPW_DEBUG_RX("r = %d : w = %d : processing = %d\n",
2510                    r, rxq->next, i); */
2511
2512                 packet = &priv->rx_buffers[i];
2513
2514                 /* Sync the DMA for the STATUS buffer so CPU is sure to get
2515                  * the correct values */
2516                 pci_dma_sync_single_for_cpu(priv->pci_dev,
2517                                             sq->nic +
2518                                             sizeof(struct ipw2100_status) * i,
2519                                             sizeof(struct ipw2100_status),
2520                                             PCI_DMA_FROMDEVICE);
2521
2522                 /* Sync the DMA for the RX buffer so CPU is sure to get
2523                  * the correct values */
2524                 pci_dma_sync_single_for_cpu(priv->pci_dev, packet->dma_addr,
2525                                             sizeof(struct ipw2100_rx),
2526                                             PCI_DMA_FROMDEVICE);
2527
2528                 if (unlikely(ipw2100_corruption_check(priv, i))) {
2529                         ipw2100_corruption_detected(priv, i);
2530                         goto increment;
2531                 }
2532
2533                 u = packet->rxp;
2534                 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK;
2535                 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM;
2536                 stats.len = sq->drv[i].frame_size;
2537
2538                 stats.mask = 0;
2539                 if (stats.rssi != 0)
2540                         stats.mask |= IEEE80211_STATMASK_RSSI;
2541                 stats.freq = IEEE80211_24GHZ_BAND;
2542
2543                 IPW_DEBUG_RX("%s: '%s' frame type received (%d).\n",
2544                              priv->net_dev->name, frame_types[frame_type],
2545                              stats.len);
2546
2547                 switch (frame_type) {
2548                 case COMMAND_STATUS_VAL:
2549                         /* Reset Rx watchdog */
2550                         isr_rx_complete_command(priv, &u->rx_data.command);
2551                         break;
2552
2553                 case STATUS_CHANGE_VAL:
2554                         isr_status_change(priv, u->rx_data.status);
2555                         break;
2556
2557                 case P80211_DATA_VAL:
2558                 case P8023_DATA_VAL:
2559 #ifdef CONFIG_IPW2100_MONITOR
2560                         if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
2561                                 isr_rx(priv, i, &stats);
2562                                 break;
2563                         }
2564 #endif
2565                         if (stats.len < sizeof(u->rx_data.header))
2566                                 break;
2567                         switch (WLAN_FC_GET_TYPE(u->rx_data.header.frame_ctl)) {
2568                         case IEEE80211_FTYPE_MGMT:
2569                                 ieee80211_rx_mgt(priv->ieee,
2570                                                  &u->rx_data.header, &stats);
2571                                 break;
2572
2573                         case IEEE80211_FTYPE_CTL:
2574                                 break;
2575
2576                         case IEEE80211_FTYPE_DATA:
2577                                 isr_rx(priv, i, &stats);
2578                                 break;
2579
2580                         }
2581                         break;
2582                 }
2583
2584               increment:
2585                 /* clear status field associated with this RBD */
2586                 rxq->drv[i].status.info.field = 0;
2587
2588                 i = (i + 1) % rxq->entries;
2589         }
2590
2591         if (i != s) {
2592                 /* backtrack one entry, wrapping to end if at 0 */
2593                 rxq->next = (i ? i : rxq->entries) - 1;
2594
2595                 write_register(priv->net_dev,
2596                                IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next);
2597         }
2598 }
2599
2600 /*
2601  * __ipw2100_tx_process
2602  *
2603  * This routine will determine whether the next packet on
2604  * the fw_pend_list has been processed by the firmware yet.
2605  *
2606  * If not, then it does nothing and returns.
2607  *
2608  * If so, then it removes the item from the fw_pend_list, frees
2609  * any associated storage, and places the item back on the
2610  * free list of its source (either msg_free_list or tx_free_list)
2611  *
2612  * TX Queue works as follows:
2613  *
2614  * Read index - points to the next TBD that the firmware will
2615  *              process.  The firmware will read the data, and once
2616  *              done processing, it will advance the Read index.
2617  *
2618  * Write index - driver fills this entry with an constructed TBD
2619  *               entry.  The Write index is not advanced until the
2620  *               packet has been configured.
2621  *
2622  * In between the W and R indexes are the TBDs that have NOT been
2623  * processed.  Lagging behind the R index are packets that have
2624  * been processed but have not been freed by the driver.
2625  *
2626  * In order to free old storage, an internal index will be maintained
2627  * that points to the next packet to be freed.  When all used
2628  * packets have been freed, the oldest index will be the same as the
2629  * firmware's read index.
2630  *
2631  * The OLDEST index is cached in the variable 'priv->tx_queue.oldest'
2632  *
2633  * Because the TBD structure can not contain arbitrary data, the
2634  * driver must keep an internal queue of cached allocations such that
2635  * it can put that data back into the tx_free_list and msg_free_list
2636  * for use by future command and data packets.
2637  *
2638  */
2639 static int __ipw2100_tx_process(struct ipw2100_priv *priv)
2640 {
2641         struct ipw2100_bd_queue *txq = &priv->tx_queue;
2642         struct ipw2100_bd *tbd;
2643         struct list_head *element;
2644         struct ipw2100_tx_packet *packet;
2645         int descriptors_used;
2646         int e, i;
2647         u32 r, w, frag_num = 0;
2648
2649         if (list_empty(&priv->fw_pend_list))
2650                 return 0;
2651
2652         element = priv->fw_pend_list.next;
2653
2654         packet = list_entry(element, struct ipw2100_tx_packet, list);
2655         tbd = &txq->drv[packet->index];
2656
2657         /* Determine how many TBD entries must be finished... */
2658         switch (packet->type) {
2659         case COMMAND:
2660                 /* COMMAND uses only one slot; don't advance */
2661                 descriptors_used = 1;
2662                 e = txq->oldest;
2663                 break;
2664
2665         case DATA:
2666                 /* DATA uses two slots; advance and loop position. */
2667                 descriptors_used = tbd->num_fragments;
2668                 frag_num = tbd->num_fragments - 1;
2669                 e = txq->oldest + frag_num;
2670                 e %= txq->entries;
2671                 break;
2672
2673         default:
2674                 printk(KERN_WARNING DRV_NAME ": %s: Bad fw_pend_list entry!\n",
2675                        priv->net_dev->name);
2676                 return 0;
2677         }
2678
2679         /* if the last TBD is not done by NIC yet, then packet is
2680          * not ready to be released.
2681          *
2682          */
2683         read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
2684                       &r);
2685         read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
2686                       &w);
2687         if (w != txq->next)
2688                 printk(KERN_WARNING DRV_NAME ": %s: write index mismatch\n",
2689                        priv->net_dev->name);
2690
2691         /*
2692          * txq->next is the index of the last packet written txq->oldest is
2693          * the index of the r is the index of the next packet to be read by
2694          * firmware
2695          */
2696
2697         /*
2698          * Quick graphic to help you visualize the following
2699          * if / else statement
2700          *
2701          * ===>|                     s---->|===============
2702          *                               e>|
2703          * | a | b | c | d | e | f | g | h | i | j | k | l
2704          *       r---->|
2705          *               w
2706          *
2707          * w - updated by driver
2708          * r - updated by firmware
2709          * s - start of oldest BD entry (txq->oldest)
2710          * e - end of oldest BD entry
2711          *
2712          */
2713         if (!((r <= w && (e < r || e >= w)) || (e < r && e >= w))) {
2714                 IPW_DEBUG_TX("exit - no processed packets ready to release.\n");
2715                 return 0;
2716         }
2717
2718         list_del(element);
2719         DEC_STAT(&priv->fw_pend_stat);
2720
2721 #ifdef CONFIG_IPW2100_DEBUG
2722         {
2723                 int i = txq->oldest;
2724                 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2725                              &txq->drv[i],
2726                              (u32) (txq->nic + i * sizeof(struct ipw2100_bd)),
2727                              txq->drv[i].host_addr, txq->drv[i].buf_length);
2728
2729                 if (packet->type == DATA) {
2730                         i = (i + 1) % txq->entries;
2731
2732                         IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2733                                      &txq->drv[i],
2734                                      (u32) (txq->nic + i *
2735                                             sizeof(struct ipw2100_bd)),
2736                                      (u32) txq->drv[i].host_addr,
2737                                      txq->drv[i].buf_length);
2738                 }
2739         }
2740 #endif
2741
2742         switch (packet->type) {
2743         case DATA:
2744                 if (txq->drv[txq->oldest].status.info.fields.txType != 0)
2745                         printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch.  "
2746                                "Expecting DATA TBD but pulled "
2747                                "something else: ids %d=%d.\n",
2748                                priv->net_dev->name, txq->oldest, packet->index);
2749
2750                 /* DATA packet; we have to unmap and free the SKB */
2751                 for (i = 0; i < frag_num; i++) {
2752                         tbd = &txq->drv[(packet->index + 1 + i) % txq->entries];
2753
2754                         IPW_DEBUG_TX("TX%d P=%08x L=%d\n",
2755                                      (packet->index + 1 + i) % txq->entries,
2756                                      tbd->host_addr, tbd->buf_length);
2757
2758                         pci_unmap_single(priv->pci_dev,
2759                                          tbd->host_addr,
2760                                          tbd->buf_length, PCI_DMA_TODEVICE);
2761                 }
2762
2763                 ieee80211_txb_free(packet->info.d_struct.txb);
2764                 packet->info.d_struct.txb = NULL;
2765
2766                 list_add_tail(element, &priv->tx_free_list);
2767                 INC_STAT(&priv->tx_free_stat);
2768
2769                 /* We have a free slot in the Tx queue, so wake up the
2770                  * transmit layer if it is stopped. */
2771                 if (priv->status & STATUS_ASSOCIATED)
2772                         netif_wake_queue(priv->net_dev);
2773
2774                 /* A packet was processed by the hardware, so update the
2775                  * watchdog */
2776                 priv->net_dev->trans_start = jiffies;
2777
2778                 break;
2779
2780         case COMMAND:
2781                 if (txq->drv[txq->oldest].status.info.fields.txType != 1)
2782                         printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch.  "
2783                                "Expecting COMMAND TBD but pulled "
2784                                "something else: ids %d=%d.\n",
2785                                priv->net_dev->name, txq->oldest, packet->index);
2786
2787 #ifdef CONFIG_IPW2100_DEBUG
2788                 if (packet->info.c_struct.cmd->host_command_reg <
2789                     sizeof(command_types) / sizeof(*command_types))
2790                         IPW_DEBUG_TX("Command '%s (%d)' processed: %d.\n",
2791                                      command_types[packet->info.c_struct.cmd->
2792                                                    host_command_reg],
2793                                      packet->info.c_struct.cmd->
2794                                      host_command_reg,
2795                                      packet->info.c_struct.cmd->cmd_status_reg);
2796 #endif
2797
2798                 list_add_tail(element, &priv->msg_free_list);
2799                 INC_STAT(&priv->msg_free_stat);
2800                 break;
2801         }
2802
2803         /* advance oldest used TBD pointer to start of next entry */
2804         txq->oldest = (e + 1) % txq->entries;
2805         /* increase available TBDs number */
2806         txq->available += descriptors_used;
2807         SET_STAT(&priv->txq_stat, txq->available);
2808
2809         IPW_DEBUG_TX("packet latency (send to process)  %ld jiffies\n",
2810                      jiffies - packet->jiffy_start);
2811
2812         return (!list_empty(&priv->fw_pend_list));
2813 }
2814
2815 static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv)
2816 {
2817         int i = 0;
2818
2819         while (__ipw2100_tx_process(priv) && i < 200)
2820                 i++;
2821
2822         if (i == 200) {
2823                 printk(KERN_WARNING DRV_NAME ": "
2824                        "%s: Driver is running slow (%d iters).\n",
2825                        priv->net_dev->name, i);
2826         }
2827 }
2828
2829 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
2830 {
2831         struct list_head *element;
2832         struct ipw2100_tx_packet *packet;
2833         struct ipw2100_bd_queue *txq = &priv->tx_queue;
2834         struct ipw2100_bd *tbd;
2835         int next = txq->next;
2836
2837         while (!list_empty(&priv->msg_pend_list)) {
2838                 /* if there isn't enough space in TBD queue, then
2839                  * don't stuff a new one in.
2840                  * NOTE: 3 are needed as a command will take one,
2841                  *       and there is a minimum of 2 that must be
2842                  *       maintained between the r and w indexes
2843                  */
2844                 if (txq->available <= 3) {
2845                         IPW_DEBUG_TX("no room in tx_queue\n");
2846                         break;
2847                 }
2848
2849                 element = priv->msg_pend_list.next;
2850                 list_del(element);
2851                 DEC_STAT(&priv->msg_pend_stat);
2852
2853                 packet = list_entry(element, struct ipw2100_tx_packet, list);
2854
2855                 IPW_DEBUG_TX("using TBD at virt=%p, phys=%p\n",
2856                              &txq->drv[txq->next],
2857                              (void *)(txq->nic + txq->next *
2858                                       sizeof(struct ipw2100_bd)));
2859
2860                 packet->index = txq->next;
2861
2862                 tbd = &txq->drv[txq->next];
2863
2864                 /* initialize TBD */
2865                 tbd->host_addr = packet->info.c_struct.cmd_phys;
2866                 tbd->buf_length = sizeof(struct ipw2100_cmd_header);
2867                 /* not marking number of fragments causes problems
2868                  * with f/w debug version */
2869                 tbd->num_fragments = 1;
2870                 tbd->status.info.field =
2871                     IPW_BD_STATUS_TX_FRAME_COMMAND |
2872                     IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
2873
2874                 /* update TBD queue counters */
2875                 txq->next++;
2876                 txq->next %= txq->entries;
2877                 txq->available--;
2878                 DEC_STAT(&priv->txq_stat);
2879
2880                 list_add_tail(element, &priv->fw_pend_list);
2881                 INC_STAT(&priv->fw_pend_stat);
2882         }
2883
2884         if (txq->next != next) {
2885                 /* kick off the DMA by notifying firmware the
2886                  * write index has moved; make sure TBD stores are sync'd */
2887                 wmb();
2888                 write_register(priv->net_dev,
2889                                IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
2890                                txq->next);
2891         }
2892 }
2893
2894 /*
2895  * ipw2100_tx_send_data
2896  *
2897  */
2898 static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
2899 {
2900         struct list_head *element;
2901         struct ipw2100_tx_packet *packet;
2902         struct ipw2100_bd_queue *txq = &priv->tx_queue;
2903         struct ipw2100_bd *tbd;
2904         int next = txq->next;
2905         int i = 0;
2906         struct ipw2100_data_header *ipw_hdr;
2907         struct ieee80211_hdr_3addr *hdr;
2908
2909         while (!list_empty(&priv->tx_pend_list)) {
2910                 /* if there isn't enough space in TBD queue, then
2911                  * don't stuff a new one in.
2912                  * NOTE: 4 are needed as a data will take two,
2913                  *       and there is a minimum of 2 that must be
2914                  *       maintained between the r and w indexes
2915                  */
2916                 element = priv->tx_pend_list.next;
2917                 packet = list_entry(element, struct ipw2100_tx_packet, list);
2918
2919                 if (unlikely(1 + packet->info.d_struct.txb->nr_frags >
2920                              IPW_MAX_BDS)) {
2921                         /* TODO: Support merging buffers if more than
2922                          * IPW_MAX_BDS are used */
2923                         IPW_DEBUG_INFO("%s: Maximum BD theshold exceeded.  "
2924                                        "Increase fragmentation level.\n",
2925                                        priv->net_dev->name);
2926                 }
2927
2928                 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) {
2929                         IPW_DEBUG_TX("no room in tx_queue\n");
2930                         break;
2931                 }
2932
2933                 list_del(element);
2934                 DEC_STAT(&priv->tx_pend_stat);
2935
2936                 tbd = &txq->drv[txq->next];
2937
2938                 packet->index = txq->next;
2939
2940                 ipw_hdr = packet->info.d_struct.data;
2941                 hdr = (struct ieee80211_hdr_3addr *)packet->info.d_struct.txb->
2942                     fragments[0]->data;
2943
2944                 if (priv->ieee->iw_mode == IW_MODE_INFRA) {
2945                         /* To DS: Addr1 = BSSID, Addr2 = SA,
2946                            Addr3 = DA */
2947                         memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
2948                         memcpy(ipw_hdr->dst_addr, hdr->addr3, ETH_ALEN);
2949                 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
2950                         /* not From/To DS: Addr1 = DA, Addr2 = SA,
2951                            Addr3 = BSSID */
2952                         memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
2953                         memcpy(ipw_hdr->dst_addr, hdr->addr1, ETH_ALEN);
2954                 }
2955
2956                 ipw_hdr->host_command_reg = SEND;
2957                 ipw_hdr->host_command_reg1 = 0;
2958
2959                 /* For now we only support host based encryption */
2960                 ipw_hdr->needs_encryption = 0;
2961                 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted;
2962                 if (packet->info.d_struct.txb->nr_frags > 1)
2963                         ipw_hdr->fragment_size =
2964                             packet->info.d_struct.txb->frag_size -
2965                             IEEE80211_3ADDR_LEN;
2966                 else
2967                         ipw_hdr->fragment_size = 0;
2968
2969                 tbd->host_addr = packet->info.d_struct.data_phys;
2970                 tbd->buf_length = sizeof(struct ipw2100_data_header);
2971                 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags;
2972                 tbd->status.info.field =
2973                     IPW_BD_STATUS_TX_FRAME_802_3 |
2974                     IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
2975                 txq->next++;
2976                 txq->next %= txq->entries;
2977
2978                 IPW_DEBUG_TX("data header tbd TX%d P=%08x L=%d\n",
2979                              packet->index, tbd->host_addr, tbd->buf_length);
2980 #ifdef CONFIG_IPW2100_DEBUG
2981                 if (packet->info.d_struct.txb->nr_frags > 1)
2982                         IPW_DEBUG_FRAG("fragment Tx: %d frames\n",
2983                                        packet->info.d_struct.txb->nr_frags);
2984 #endif
2985
2986                 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) {
2987                         tbd = &txq->drv[txq->next];
2988                         if (i == packet->info.d_struct.txb->nr_frags - 1)
2989                                 tbd->status.info.field =
2990                                     IPW_BD_STATUS_TX_FRAME_802_3 |
2991                                     IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
2992                         else
2993                                 tbd->status.info.field =
2994                                     IPW_BD_STATUS_TX_FRAME_802_3 |
2995                                     IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
2996
2997                         tbd->buf_length = packet->info.d_struct.txb->
2998                             fragments[i]->len - IEEE80211_3ADDR_LEN;
2999
3000                         tbd->host_addr = pci_map_single(priv->pci_dev,
3001                                                         packet->info.d_struct.
3002                                                         txb->fragments[i]->
3003                                                         data +
3004                                                         IEEE80211_3ADDR_LEN,
3005                                                         tbd->buf_length,
3006                                                         PCI_DMA_TODEVICE);
3007
3008                         IPW_DEBUG_TX("data frag tbd TX%d P=%08x L=%d\n",
3009                                      txq->next, tbd->host_addr,
3010                                      tbd->buf_length);
3011
3012                         pci_dma_sync_single_for_device(priv->pci_dev,
3013                                                        tbd->host_addr,
3014                                                        tbd->buf_length,
3015                                                        PCI_DMA_TODEVICE);
3016
3017                         txq->next++;
3018                         txq->next %= txq->entries;
3019                 }
3020
3021                 txq->available -= 1 + packet->info.d_struct.txb->nr_frags;
3022                 SET_STAT(&priv->txq_stat, txq->available);
3023
3024                 list_add_tail(element, &priv->fw_pend_list);
3025                 INC_STAT(&priv->fw_pend_stat);
3026         }
3027
3028         if (txq->next != next) {
3029                 /* kick off the DMA by notifying firmware the
3030                  * write index has moved; make sure TBD stores are sync'd */
3031                 write_register(priv->net_dev,
3032                                IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3033                                txq->next);
3034         }
3035         return;
3036 }
3037
3038 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3039 {
3040         struct net_device *dev = priv->net_dev;
3041         unsigned long flags;
3042         u32 inta, tmp;
3043
3044         spin_lock_irqsave(&priv->low_lock, flags);
3045         ipw2100_disable_interrupts(priv);
3046
3047         read_register(dev, IPW_REG_INTA, &inta);
3048
3049         IPW_DEBUG_ISR("enter - INTA: 0x%08lX\n",
3050                       (unsigned long)inta & IPW_INTERRUPT_MASK);
3051
3052         priv->in_isr++;
3053         priv->interrupts++;
3054
3055         /* We do not loop and keep polling for more interrupts as this
3056          * is frowned upon and doesn't play nicely with other potentially
3057          * chained IRQs */
3058         IPW_DEBUG_ISR("INTA: 0x%08lX\n",
3059                       (unsigned long)inta & IPW_INTERRUPT_MASK);
3060
3061         if (inta & IPW2100_INTA_FATAL_ERROR) {
3062                 printk(KERN_WARNING DRV_NAME
3063                        ": Fatal interrupt. Scheduling firmware restart.\n");
3064                 priv->inta_other++;
3065                 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FATAL_ERROR);
3066
3067                 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error);
3068                 IPW_DEBUG_INFO("%s: Fatal error value: 0x%08X\n",
3069                                priv->net_dev->name, priv->fatal_error);
3070
3071                 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp);
3072                 IPW_DEBUG_INFO("%s: Fatal error address value: 0x%08X\n",
3073                                priv->net_dev->name, tmp);
3074
3075                 /* Wake up any sleeping jobs */
3076                 schedule_reset(priv);
3077         }
3078
3079         if (inta & IPW2100_INTA_PARITY_ERROR) {
3080                 printk(KERN_ERR DRV_NAME
3081                        ": ***** PARITY ERROR INTERRUPT !!!! \n");
3082                 priv->inta_other++;
3083                 write_register(dev, IPW_REG_INTA, IPW2100_INTA_PARITY_ERROR);
3084         }
3085
3086         if (inta & IPW2100_INTA_RX_TRANSFER) {
3087                 IPW_DEBUG_ISR("RX interrupt\n");
3088
3089                 priv->rx_interrupts++;
3090
3091                 write_register(dev, IPW_REG_INTA, IPW2100_INTA_RX_TRANSFER);
3092
3093                 __ipw2100_rx_process(priv);
3094                 __ipw2100_tx_complete(priv);
3095         }
3096
3097         if (inta & IPW2100_INTA_TX_TRANSFER) {
3098                 IPW_DEBUG_ISR("TX interrupt\n");
3099
3100                 priv->tx_interrupts++;
3101
3102                 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_TRANSFER);
3103
3104                 __ipw2100_tx_complete(priv);
3105                 ipw2100_tx_send_commands(priv);
3106                 ipw2100_tx_send_data(priv);
3107         }
3108
3109         if (inta & IPW2100_INTA_TX_COMPLETE) {
3110                 IPW_DEBUG_ISR("TX complete\n");
3111                 priv->inta_other++;
3112                 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_COMPLETE);
3113
3114                 __ipw2100_tx_complete(priv);
3115         }
3116
3117         if (inta & IPW2100_INTA_EVENT_INTERRUPT) {
3118                 /* ipw2100_handle_event(dev); */
3119                 priv->inta_other++;
3120                 write_register(dev, IPW_REG_INTA, IPW2100_INTA_EVENT_INTERRUPT);
3121         }
3122
3123         if (inta & IPW2100_INTA_FW_INIT_DONE) {
3124                 IPW_DEBUG_ISR("FW init done interrupt\n");
3125                 priv->inta_other++;
3126
3127                 read_register(dev, IPW_REG_INTA, &tmp);
3128                 if (tmp & (IPW2100_INTA_FATAL_ERROR |
3129                            IPW2100_INTA_PARITY_ERROR)) {
3130                         write_register(dev, IPW_REG_INTA,
3131                                        IPW2100_INTA_FATAL_ERROR |
3132                                        IPW2100_INTA_PARITY_ERROR);
3133                 }
3134
3135                 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FW_INIT_DONE);
3136         }
3137
3138         if (inta & IPW2100_INTA_STATUS_CHANGE) {
3139                 IPW_DEBUG_ISR("Status change interrupt\n");
3140                 priv->inta_other++;
3141                 write_register(dev, IPW_REG_INTA, IPW2100_INTA_STATUS_CHANGE);
3142         }
3143
3144         if (inta & IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE) {
3145                 IPW_DEBUG_ISR("slave host mode interrupt\n");
3146                 priv->inta_other++;
3147                 write_register(dev, IPW_REG_INTA,
3148                                IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE);
3149         }
3150
3151         priv->in_isr--;
3152         ipw2100_enable_interrupts(priv);
3153
3154         spin_unlock_irqrestore(&priv->low_lock, flags);
3155
3156         IPW_DEBUG_ISR("exit\n");
3157 }
3158
3159 static irqreturn_t ipw2100_interrupt(int irq, void *data, struct pt_regs *regs)
3160 {
3161         struct ipw2100_priv *priv = data;
3162         u32 inta, inta_mask;
3163
3164         if (!data)
3165                 return IRQ_NONE;
3166
3167         spin_lock(&priv->low_lock);
3168
3169         /* We check to see if we should be ignoring interrupts before
3170          * we touch the hardware.  During ucode load if we try and handle
3171          * an interrupt we can cause keyboard problems as well as cause
3172          * the ucode to fail to initialize */
3173         if (!(priv->status & STATUS_INT_ENABLED)) {
3174                 /* Shared IRQ */
3175                 goto none;
3176         }
3177
3178         read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
3179         read_register(priv->net_dev, IPW_REG_INTA, &inta);
3180
3181         if (inta == 0xFFFFFFFF) {
3182                 /* Hardware disappeared */
3183                 printk(KERN_WARNING DRV_NAME ": IRQ INTA == 0xFFFFFFFF\n");
3184                 goto none;
3185         }
3186
3187         inta &= IPW_INTERRUPT_MASK;
3188
3189         if (!(inta & inta_mask)) {
3190                 /* Shared interrupt */
3191                 goto none;
3192         }
3193
3194         /* We disable the hardware interrupt here just to prevent unneeded
3195          * calls to be made.  We disable this again within the actual
3196          * work tasklet, so if another part of the code re-enables the
3197          * interrupt, that is fine */
3198         ipw2100_disable_interrupts(priv);
3199
3200         tasklet_schedule(&priv->irq_tasklet);
3201         spin_unlock(&priv->low_lock);
3202
3203         return IRQ_HANDLED;
3204       none:
3205         spin_unlock(&priv->low_lock);
3206         return IRQ_NONE;
3207 }
3208
3209 static int ipw2100_tx(struct ieee80211_txb *txb, struct net_device *dev,
3210                       int pri)
3211 {
3212         struct ipw2100_priv *priv = ieee80211_priv(dev);
3213         struct list_head *element;
3214         struct ipw2100_tx_packet *packet;
3215         unsigned long flags;
3216
3217         spin_lock_irqsave(&priv->low_lock, flags);
3218
3219         if (!(priv->status & STATUS_ASSOCIATED)) {
3220                 IPW_DEBUG_INFO("Can not transmit when not connected.\n");
3221                 priv->ieee->stats.tx_carrier_errors++;
3222                 netif_stop_queue(dev);
3223                 goto fail_unlock;
3224         }
3225
3226         if (list_empty(&priv->tx_free_list))
3227                 goto fail_unlock;
3228
3229         element = priv->tx_free_list.next;
3230         packet = list_entry(element, struct ipw2100_tx_packet, list);
3231
3232         packet->info.d_struct.txb = txb;
3233
3234         IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len);
3235         printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len);
3236
3237         packet->jiffy_start = jiffies;
3238
3239         list_del(element);
3240         DEC_STAT(&priv->tx_free_stat);
3241
3242         list_add_tail(element, &priv->tx_pend_list);
3243         INC_STAT(&priv->tx_pend_stat);
3244
3245         ipw2100_tx_send_data(priv);
3246
3247         spin_unlock_irqrestore(&priv->low_lock, flags);
3248         return 0;
3249
3250       fail_unlock:
3251         netif_stop_queue(dev);
3252         spin_unlock_irqrestore(&priv->low_lock, flags);
3253         return 1;
3254 }
3255
3256 static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3257 {
3258         int i, j, err = -EINVAL;
3259         void *v;
3260         dma_addr_t p;
3261
3262         priv->msg_buffers =
3263             (struct ipw2100_tx_packet *)kmalloc(IPW_COMMAND_POOL_SIZE *
3264                                                 sizeof(struct
3265                                                        ipw2100_tx_packet),
3266                                                 GFP_KERNEL);
3267         if (!priv->msg_buffers) {
3268                 printk(KERN_ERR DRV_NAME ": %s: PCI alloc failed for msg "
3269                        "buffers.\n", priv->net_dev->name);
3270                 return -ENOMEM;
3271         }
3272
3273         for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3274                 v = pci_alloc_consistent(priv->pci_dev,
3275                                          sizeof(struct ipw2100_cmd_header), &p);
3276                 if (!v) {
3277                         printk(KERN_ERR DRV_NAME ": "
3278                                "%s: PCI alloc failed for msg "
3279                                "buffers.\n", priv->net_dev->name);
3280                         err = -ENOMEM;
3281                         break;
3282                 }
3283
3284                 memset(v, 0, sizeof(struct ipw2100_cmd_header));
3285
3286                 priv->msg_buffers[i].type = COMMAND;
3287                 priv->msg_buffers[i].info.c_struct.cmd =
3288                     (struct ipw2100_cmd_header *)v;
3289                 priv->msg_buffers[i].info.c_struct.cmd_phys = p;
3290         }
3291
3292         if (i == IPW_COMMAND_POOL_SIZE)
3293                 return 0;
3294
3295         for (j = 0; j < i; j++) {
3296                 pci_free_consistent(priv->pci_dev,
3297                                     sizeof(struct ipw2100_cmd_header),
3298                                     priv->msg_buffers[j].info.c_struct.cmd,
3299                                     priv->msg_buffers[j].info.c_struct.
3300                                     cmd_phys);
3301         }
3302
3303         kfree(priv->msg_buffers);
3304         priv->msg_buffers = NULL;
3305
3306         return err;
3307 }
3308
3309 static int ipw2100_msg_initialize(struct ipw2100_priv *priv)
3310 {
3311         int i;
3312
3313         INIT_LIST_HEAD(&priv->msg_free_list);
3314         INIT_LIST_HEAD(&priv->msg_pend_list);
3315
3316         for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++)
3317                 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list);
3318         SET_STAT(&priv->msg_free_stat, i);
3319
3320         return 0;
3321 }
3322
3323 static void ipw2100_msg_free(struct ipw2100_priv *priv)
3324 {
3325         int i;
3326
3327         if (!priv->msg_buffers)
3328                 return;
3329
3330         for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3331                 pci_free_consistent(priv->pci_dev,
3332                                     sizeof(struct ipw2100_cmd_header),
3333                                     priv->msg_buffers[i].info.c_struct.cmd,
3334                                     priv->msg_buffers[i].info.c_struct.
3335                                     cmd_phys);
3336         }
3337
3338         kfree(priv->msg_buffers);
3339         priv->msg_buffers = NULL;
3340 }
3341
3342 static ssize_t show_pci(struct device *d, struct device_attribute *attr,
3343                         char *buf)
3344 {
3345         struct pci_dev *pci_dev = container_of(d, struct pci_dev, dev);
3346         char *out = buf;
3347         int i, j;
3348         u32 val;
3349
3350         for (i = 0; i < 16; i++) {
3351                 out += sprintf(out, "[%08X] ", i * 16);
3352                 for (j = 0; j < 16; j += 4) {
3353                         pci_read_config_dword(pci_dev, i * 16 + j, &val);
3354                         out += sprintf(out, "%08X ", val);
3355                 }
3356                 out += sprintf(out, "\n");
3357         }
3358
3359         return out - buf;
3360 }
3361
3362 static DEVICE_ATTR(pci, S_IRUGO, show_pci, NULL);
3363
3364 static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
3365                         char *buf)
3366 {
3367         struct ipw2100_priv *p = d->driver_data;
3368         return sprintf(buf, "0x%08x\n", (int)p->config);
3369 }
3370
3371 static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
3372
3373 static ssize_t show_status(struct device *d, struct device_attribute *attr,
3374                            char *buf)
3375 {
3376         struct ipw2100_priv *p = d->driver_data;
3377         return sprintf(buf, "0x%08x\n", (int)p->status);
3378 }
3379
3380 static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
3381
3382 static ssize_t show_capability(struct device *d, struct device_attribute *attr,
3383                                char *buf)
3384 {
3385         struct ipw2100_priv *p = d->driver_data;
3386         return sprintf(buf, "0x%08x\n", (int)p->capability);
3387 }
3388
3389 static DEVICE_ATTR(capability, S_IRUGO, show_capability, NULL);
3390
3391 #define IPW2100_REG(x) { IPW_ ##x, #x }
3392 static const struct {
3393         u32 addr;
3394         const char *name;
3395 } hw_data[] = {
3396 IPW2100_REG(REG_GP_CNTRL),
3397             IPW2100_REG(REG_GPIO),
3398             IPW2100_REG(REG_INTA),
3399             IPW2100_REG(REG_INTA_MASK), IPW2100_REG(REG_RESET_REG),};
3400 #define IPW2100_NIC(x, s) { x, #x, s }
3401 static const struct {
3402         u32 addr;
3403         const char *name;
3404         size_t size;
3405 } nic_data[] = {
3406 IPW2100_NIC(IPW2100_CONTROL_REG, 2),
3407             IPW2100_NIC(0x210014, 1), IPW2100_NIC(0x210000, 1),};
3408 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
3409 static const struct {
3410         u8 index;
3411         const char *name;
3412         const char *desc;
3413 } ord_data[] = {
3414 IPW2100_ORD(STAT_TX_HOST_REQUESTS, "requested Host Tx's (MSDU)"),
3415             IPW2100_ORD(STAT_TX_HOST_COMPLETE,
3416                                 "successful Host Tx's (MSDU)"),
3417             IPW2100_ORD(STAT_TX_DIR_DATA,
3418                                 "successful Directed Tx's (MSDU)"),
3419             IPW2100_ORD(STAT_TX_DIR_DATA1,
3420                                 "successful Directed Tx's (MSDU) @ 1MB"),
3421             IPW2100_ORD(STAT_TX_DIR_DATA2,
3422                                 "successful Directed Tx's (MSDU) @ 2MB"),
3423             IPW2100_ORD(STAT_TX_DIR_DATA5_5,
3424                                 "successful Directed Tx's (MSDU) @ 5_5MB"),
3425             IPW2100_ORD(STAT_TX_DIR_DATA11,
3426                                 "successful Directed Tx's (MSDU) @ 11MB"),
3427             IPW2100_ORD(STAT_TX_NODIR_DATA1,
3428                                 "successful Non_Directed Tx's (MSDU) @ 1MB"),
3429             IPW2100_ORD(STAT_TX_NODIR_DATA2,
3430                                 "successful Non_Directed Tx's (MSDU) @ 2MB"),
3431             IPW2100_ORD(STAT_TX_NODIR_DATA5_5,
3432                                 "successful Non_Directed Tx's (MSDU) @ 5.5MB"),
3433             IPW2100_ORD(STAT_TX_NODIR_DATA11,
3434                                 "successful Non_Directed Tx's (MSDU) @ 11MB"),
3435             IPW2100_ORD(STAT_NULL_DATA, "successful NULL data Tx's"),
3436             IPW2100_ORD(STAT_TX_RTS, "successful Tx RTS"),
3437             IPW2100_ORD(STAT_TX_CTS, "successful Tx CTS"),
3438             IPW2100_ORD(STAT_TX_ACK, "successful Tx ACK"),
3439             IPW2100_ORD(STAT_TX_ASSN, "successful Association Tx's"),
3440             IPW2100_ORD(STAT_TX_ASSN_RESP,
3441                                 "successful Association response Tx's"),
3442             IPW2100_ORD(STAT_TX_REASSN,
3443                                 "successful Reassociation Tx's"),
3444             IPW2100_ORD(STAT_TX_REASSN_RESP,
3445                                 "successful Reassociation response Tx's"),
3446             IPW2100_ORD(STAT_TX_PROBE,
3447                                 "probes successfully transmitted"),
3448             IPW2100_ORD(STAT_TX_PROBE_RESP,
3449                                 "probe responses successfully transmitted"),
3450             IPW2100_ORD(STAT_TX_BEACON, "tx beacon"),
3451             IPW2100_ORD(STAT_TX_ATIM, "Tx ATIM"),
3452             IPW2100_ORD(STAT_TX_DISASSN,
3453                                 "successful Disassociation TX"),
3454             IPW2100_ORD(STAT_TX_AUTH, "successful Authentication Tx"),
3455             IPW2100_ORD(STAT_TX_DEAUTH,
3456                                 "successful Deauthentication TX"),
3457             IPW2100_ORD(STAT_TX_TOTAL_BYTES,
3458                                 "Total successful Tx data bytes"),
3459             IPW2100_ORD(STAT_TX_RETRIES, "Tx retries"),
3460             IPW2100_ORD(STAT_TX_RETRY1, "Tx retries at 1MBPS"),
3461             IPW2100_ORD(STAT_TX_RETRY2, "Tx retries at 2MBPS"),
3462             IPW2100_ORD(STAT_TX_RETRY5_5, "Tx retries at 5.5MBPS"),
3463             IPW2100_ORD(STAT_TX_RETRY11, "Tx retries at 11MBPS"),
3464             IPW2100_ORD(STAT_TX_FAILURES, "Tx Failures"),
3465             IPW2100_ORD(STAT_TX_MAX_TRIES_IN_HOP,
3466                                 "times max tries in a hop failed"),
3467             IPW2100_ORD(STAT_TX_DISASSN_FAIL,
3468                                 "times disassociation failed"),
3469             IPW2100_ORD(STAT_TX_ERR_CTS, "missed/bad CTS frames"),
3470             IPW2100_ORD(STAT_TX_ERR_ACK, "tx err due to acks"),
3471             IPW2100_ORD(STAT_RX_HOST, "packets passed to host"),
3472             IPW2100_ORD(STAT_RX_DIR_DATA, "directed packets"),
3473             IPW2100_ORD(STAT_RX_DIR_DATA1, "directed packets at 1MB"),
3474             IPW2100_ORD(STAT_RX_DIR_DATA2, "directed packets at 2MB"),
3475             IPW2100_ORD(STAT_RX_DIR_DATA5_5,
3476                                 "directed packets at 5.5MB"),
3477             IPW2100_ORD(STAT_RX_DIR_DATA11, "directed packets at 11MB"),
3478             IPW2100_ORD(STAT_RX_NODIR_DATA, "nondirected packets"),
3479             IPW2100_ORD(STAT_RX_NODIR_DATA1,
3480                                 "nondirected packets at 1MB"),
3481             IPW2100_ORD(STAT_RX_NODIR_DATA2,
3482                                 "nondirected packets at 2MB"),
3483             IPW2100_ORD(STAT_RX_NODIR_DATA5_5,
3484                                 "nondirected packets at 5.5MB"),
3485             IPW2100_ORD(STAT_RX_NODIR_DATA11,
3486                                 "nondirected packets at 11MB"),
3487             IPW2100_ORD(STAT_RX_NULL_DATA, "null data rx's"),
3488             IPW2100_ORD(STAT_RX_RTS, "Rx RTS"), IPW2100_ORD(STAT_RX_CTS,
3489                                                                     "Rx CTS"),
3490             IPW2100_ORD(STAT_RX_ACK, "Rx ACK"),
3491             IPW2100_ORD(STAT_RX_CFEND, "Rx CF End"),
3492             IPW2100_ORD(STAT_RX_CFEND_ACK, "Rx CF End + CF Ack"),
3493             IPW2100_ORD(STAT_RX_ASSN, "Association Rx's"),
3494             IPW2100_ORD(STAT_RX_ASSN_RESP, "Association response Rx's"),
3495             IPW2100_ORD(STAT_RX_REASSN, "Reassociation Rx's"),
3496             IPW2100_ORD(STAT_RX_REASSN_RESP,
3497                                 "Reassociation response Rx's"),
3498             IPW2100_ORD(STAT_RX_PROBE, "probe Rx's"),
3499             IPW2100_ORD(STAT_RX_PROBE_RESP, "probe response Rx's"),
3500             IPW2100_ORD(STAT_RX_BEACON, "Rx beacon"),
3501             IPW2100_ORD(STAT_RX_ATIM, "Rx ATIM"),
3502             IPW2100_ORD(STAT_RX_DISASSN, "disassociation Rx"),
3503             IPW2100_ORD(STAT_RX_AUTH, "authentication Rx"),
3504             IPW2100_ORD(STAT_RX_DEAUTH, "deauthentication Rx"),
3505             IPW2100_ORD(STAT_RX_TOTAL_BYTES,
3506                                 "Total rx data bytes received"),
3507             IPW2100_ORD(STAT_RX_ERR_CRC, "packets with Rx CRC error"),
3508             IPW2100_ORD(STAT_RX_ERR_CRC1, "Rx CRC errors at 1MB"),
3509             IPW2100_ORD(STAT_RX_ERR_CRC2, "Rx CRC errors at 2MB"),
3510             IPW2100_ORD(STAT_RX_ERR_CRC5_5, "Rx CRC errors at 5.5MB"),
3511             IPW2100_ORD(STAT_RX_ERR_CRC11, "Rx CRC errors at 11MB"),
3512             IPW2100_ORD(STAT_RX_DUPLICATE1,
3513                                 "duplicate rx packets at 1MB"),
3514             IPW2100_ORD(STAT_RX_DUPLICATE2,
3515                                 "duplicate rx packets at 2MB"),
3516             IPW2100_ORD(STAT_RX_DUPLICATE5_5,
3517                                 "duplicate rx packets at 5.5MB"),
3518             IPW2100_ORD(STAT_RX_DUPLICATE11,
3519                                 "duplicate rx packets at 11MB"),
3520             IPW2100_ORD(STAT_RX_DUPLICATE, "duplicate rx packets"),
3521             IPW2100_ORD(PERS_DB_LOCK, "locking fw permanent  db"),
3522             IPW2100_ORD(PERS_DB_SIZE, "size of fw permanent  db"),
3523             IPW2100_ORD(PERS_DB_ADDR, "address of fw permanent  db"),
3524             IPW2100_ORD(STAT_RX_INVALID_PROTOCOL,
3525                                 "rx frames with invalid protocol"),
3526             IPW2100_ORD(SYS_BOOT_TIME, "Boot time"),
3527             IPW2100_ORD(STAT_RX_NO_BUFFER,
3528                                 "rx frames rejected due to no buffer"),
3529             IPW2100_ORD(STAT_RX_MISSING_FRAG,
3530                                 "rx frames dropped due to missing fragment"),
3531             IPW2100_ORD(STAT_RX_ORPHAN_FRAG,
3532                                 "rx frames dropped due to non-sequential fragment"),
3533             IPW2100_ORD(STAT_RX_ORPHAN_FRAME,
3534                                 "rx frames dropped due to unmatched 1st frame"),
3535             IPW2100_ORD(STAT_RX_FRAG_AGEOUT,
3536                                 "rx frames dropped due to uncompleted frame"),
3537             IPW2100_ORD(STAT_RX_ICV_ERRORS,
3538                                 "ICV errors during decryption"),
3539             IPW2100_ORD(STAT_PSP_SUSPENSION, "times adapter suspended"),
3540             IPW2100_ORD(STAT_PSP_BCN_TIMEOUT, "beacon timeout"),
3541             IPW2100_ORD(STAT_PSP_POLL_TIMEOUT,
3542                                 "poll response timeouts"),
3543             IPW2100_ORD(STAT_PSP_NONDIR_TIMEOUT,
3544                                 "timeouts waiting for last {broad,multi}cast pkt"),
3545             IPW2100_ORD(STAT_PSP_RX_DTIMS, "PSP DTIMs received"),
3546             IPW2100_ORD(STAT_PSP_RX_TIMS, "PSP TIMs received"),
3547             IPW2100_ORD(STAT_PSP_STATION_ID, "PSP Station ID"),
3548             IPW2100_ORD(LAST_ASSN_TIME, "RTC time of last association"),
3549             IPW2100_ORD(STAT_PERCENT_MISSED_BCNS,
3550                                 "current calculation of % missed beacons"),
3551             IPW2100_ORD(STAT_PERCENT_RETRIES,
3552                                 "current calculation of % missed tx retries"),
3553             IPW2100_ORD(ASSOCIATED_AP_PTR,
3554                                 "0 if not associated, else pointer to AP table entry"),
3555             IPW2100_ORD(AVAILABLE_AP_CNT,
3556                                 "AP's decsribed in the AP table"),
3557             IPW2100_ORD(AP_LIST_PTR, "Ptr to list of available APs"),
3558             IPW2100_ORD(STAT_AP_ASSNS, "associations"),
3559             IPW2100_ORD(STAT_ASSN_FAIL, "association failures"),
3560             IPW2100_ORD(STAT_ASSN_RESP_FAIL,
3561                                 "failures due to response fail"),
3562             IPW2100_ORD(STAT_FULL_SCANS, "full scans"),
3563             IPW2100_ORD(CARD_DISABLED, "Card Disabled"),
3564             IPW2100_ORD(STAT_ROAM_INHIBIT,
3565                                 "times roaming was inhibited due to activity"),
3566             IPW2100_ORD(RSSI_AT_ASSN,
3567                                 "RSSI of associated AP at time of association"),
3568             IPW2100_ORD(STAT_ASSN_CAUSE1,
3569                                 "reassociation: no probe response or TX on hop"),
3570             IPW2100_ORD(STAT_ASSN_CAUSE2,
3571                                 "reassociation: poor tx/rx quality"),
3572             IPW2100_ORD(STAT_ASSN_CAUSE3,
3573                                 "reassociation: tx/rx quality (excessive AP load"),
3574             IPW2100_ORD(STAT_ASSN_CAUSE4,
3575                                 "reassociation: AP RSSI level"),
3576             IPW2100_ORD(STAT_ASSN_CAUSE5,
3577                                 "reassociations due to load leveling"),
3578             IPW2100_ORD(STAT_AUTH_FAIL, "times authentication failed"),
3579             IPW2100_ORD(STAT_AUTH_RESP_FAIL,
3580                                 "times authentication response failed"),
3581             IPW2100_ORD(STATION_TABLE_CNT,
3582                                 "entries in association table"),
3583             IPW2100_ORD(RSSI_AVG_CURR, "Current avg RSSI"),
3584             IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3585             IPW2100_ORD(COUNTRY_CODE,
3586                                 "IEEE country code as recv'd from beacon"),
3587             IPW2100_ORD(COUNTRY_CHANNELS,
3588                                 "channels suported by country"),
3589             IPW2100_ORD(RESET_CNT, "adapter resets (warm)"),
3590             IPW2100_ORD(BEACON_INTERVAL, "Beacon interval"),
3591             IPW2100_ORD(ANTENNA_DIVERSITY,
3592                                 "TRUE if antenna diversity is disabled"),
3593             IPW2100_ORD(DTIM_PERIOD, "beacon intervals between DTIMs"),
3594             IPW2100_ORD(OUR_FREQ,
3595                                 "current radio freq lower digits - channel ID"),
3596             IPW2100_ORD(RTC_TIME, "current RTC time"),
3597             IPW2100_ORD(PORT_TYPE, "operating mode"),
3598             IPW2100_ORD(CURRENT_TX_RATE, "current tx rate"),
3599             IPW2100_ORD(SUPPORTED_RATES, "supported tx rates"),
3600             IPW2100_ORD(ATIM_WINDOW, "current ATIM Window"),
3601             IPW2100_ORD(BASIC_RATES, "basic tx rates"),
3602             IPW2100_ORD(NIC_HIGHEST_RATE, "NIC highest tx rate"),
3603             IPW2100_ORD(AP_HIGHEST_RATE, "AP highest tx rate"),
3604             IPW2100_ORD(CAPABILITIES,
3605                                 "Management frame capability field"),
3606             IPW2100_ORD(AUTH_TYPE, "Type of authentication"),
3607             IPW2100_ORD(RADIO_TYPE, "Adapter card platform type"),
3608             IPW2100_ORD(RTS_THRESHOLD,
3609                                 "Min packet length for RTS handshaking"),
3610             IPW2100_ORD(INT_MODE, "International mode"),
3611             IPW2100_ORD(FRAGMENTATION_THRESHOLD,
3612                                 "protocol frag threshold"),
3613             IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_START_ADDRESS,
3614                                 "EEPROM offset in SRAM"),
3615             IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_SIZE,
3616                                 "EEPROM size in SRAM"),
3617             IPW2100_ORD(EEPROM_SKU_CAPABILITY, "EEPROM SKU Capability"),
3618             IPW2100_ORD(EEPROM_IBSS_11B_CHANNELS,
3619                                 "EEPROM IBSS 11b channel set"),
3620             IPW2100_ORD(MAC_VERSION, "MAC Version"),
3621             IPW2100_ORD(MAC_REVISION, "MAC Revision"),
3622             IPW2100_ORD(RADIO_VERSION, "Radio Version"),
3623             IPW2100_ORD(NIC_MANF_DATE_TIME, "MANF Date/Time STAMP"),
3624             IPW2100_ORD(UCODE_VERSION, "Ucode Version"),};
3625
3626 static ssize_t show_registers(struct device *d, struct device_attribute *attr,
3627                               char *buf)
3628 {
3629         int i;
3630         struct ipw2100_priv *priv = dev_get_drvdata(d);
3631         struct net_device *dev = priv->net_dev;
3632         char *out = buf;
3633         u32 val = 0;
3634
3635         out += sprintf(out, "%30s [Address ] : Hex\n", "Register");
3636
3637         for (i = 0; i < (sizeof(hw_data) / sizeof(*hw_data)); i++) {
3638                 read_register(dev, hw_data[i].addr, &val);
3639                 out += sprintf(out, "%30s [%08X] : %08X\n",
3640                                hw_data[i].name, hw_data[i].addr, val);
3641         }
3642
3643         return out - buf;
3644 }
3645
3646 static DEVICE_ATTR(registers, S_IRUGO, show_registers, NULL);
3647
3648 static ssize_t show_hardware(struct device *d, struct device_attribute *attr,
3649                              char *buf)
3650 {
3651         struct ipw2100_priv *priv = dev_get_drvdata(d);
3652         struct net_device *dev = priv->net_dev;
3653         char *out = buf;
3654         int i;
3655
3656         out += sprintf(out, "%30s [Address ] : Hex\n", "NIC entry");
3657
3658         for (i = 0; i < (sizeof(nic_data) / sizeof(*nic_data)); i++) {
3659                 u8 tmp8;
3660                 u16 tmp16;
3661                 u32 tmp32;
3662
3663                 switch (nic_data[i].size) {
3664                 case 1:
3665                         read_nic_byte(dev, nic_data[i].addr, &tmp8);
3666                         out += sprintf(out, "%30s [%08X] : %02X\n",
3667                                        nic_data[i].name, nic_data[i].addr,
3668                                        tmp8);
3669                         break;
3670                 case 2:
3671                         read_nic_word(dev, nic_data[i].addr, &tmp16);
3672                         out += sprintf(out, "%30s [%08X] : %04X\n",
3673                                        nic_data[i].name, nic_data[i].addr,
3674                                        tmp16);
3675                         break;
3676                 case 4:
3677                         read_nic_dword(dev, nic_data[i].addr, &tmp32);
3678                         out += sprintf(out, "%30s [%08X] : %08X\n",
3679                                        nic_data[i].name, nic_data[i].addr,
3680                                        tmp32);
3681                         break;
3682                 }
3683         }
3684         return out - buf;
3685 }
3686
3687 static DEVICE_ATTR(hardware, S_IRUGO, show_hardware, NULL);
3688
3689 static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3690                            char *buf)
3691 {
3692         struct ipw2100_priv *priv = dev_get_drvdata(d);
3693         struct net_device *dev = priv->net_dev;
3694         static unsigned long loop = 0;
3695         int len = 0;
3696         u32 buffer[4];
3697         int i;
3698         char line[81];
3699
3700         if (loop >= 0x30000)
3701                 loop = 0;
3702
3703         /* sysfs provides us PAGE_SIZE buffer */
3704         while (len < PAGE_SIZE - 128 && loop < 0x30000) {
3705
3706                 if (priv->snapshot[0])
3707                         for (i = 0; i < 4; i++)
3708                                 buffer[i] =
3709                                     *(u32 *) SNAPSHOT_ADDR(loop + i * 4);
3710                 else
3711                         for (i = 0; i < 4; i++)
3712                                 read_nic_dword(dev, loop + i * 4, &buffer[i]);
3713
3714                 if (priv->dump_raw)
3715                         len += sprintf(buf + len,
3716                                        "%c%c%c%c"
3717                                        "%c%c%c%c"
3718                                        "%c%c%c%c"
3719                                        "%c%c%c%c",
3720                                        ((u8 *) buffer)[0x0],
3721                                        ((u8 *) buffer)[0x1],
3722                                        ((u8 *) buffer)[0x2],
3723                                        ((u8 *) buffer)[0x3],
3724                                        ((u8 *) buffer)[0x4],
3725                                        ((u8 *) buffer)[0x5],
3726                                        ((u8 *) buffer)[0x6],
3727                                        ((u8 *) buffer)[0x7],
3728                                        ((u8 *) buffer)[0x8],
3729                                        ((u8 *) buffer)[0x9],
3730                                        ((u8 *) buffer)[0xa],
3731                                        ((u8 *) buffer)[0xb],
3732                                        ((u8 *) buffer)[0xc],
3733                                        ((u8 *) buffer)[0xd],
3734                                        ((u8 *) buffer)[0xe],
3735                                        ((u8 *) buffer)[0xf]);
3736                 else
3737                         len += sprintf(buf + len, "%s\n",
3738                                        snprint_line(line, sizeof(line),
3739                                                     (u8 *) buffer, 16, loop));
3740                 loop += 16;
3741         }
3742
3743         return len;
3744 }
3745
3746 static ssize_t store_memory(struct device *d, struct device_attribute *attr,
3747                             const char *buf, size_t count)
3748 {
3749         struct ipw2100_priv *priv = dev_get_drvdata(d);
3750         struct net_device *dev = priv->net_dev;
3751         const char *p = buf;
3752
3753         (void) dev; /* kill unused-var warning for debug-only code */
3754
3755         if (count < 1)
3756                 return count;
3757
3758         if (p[0] == '1' ||
3759             (count >= 2 && tolower(p[0]) == 'o' && tolower(p[1]) == 'n')) {
3760                 IPW_DEBUG_INFO("%s: Setting memory dump to RAW mode.\n",
3761                                dev->name);
3762                 priv->dump_raw = 1;
3763
3764         } else if (p[0] == '0' || (count >= 2 && tolower(p[0]) == 'o' &&
3765                                    tolower(p[1]) == 'f')) {
3766                 IPW_DEBUG_INFO("%s: Setting memory dump to HEX mode.\n",
3767                                dev->name);
3768                 priv->dump_raw = 0;
3769
3770         } else if (tolower(p[0]) == 'r') {
3771                 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name);
3772                 ipw2100_snapshot_free(priv);
3773
3774         } else
3775                 IPW_DEBUG_INFO("%s: Usage: 0|on = HEX, 1|off = RAW, "
3776                                "reset = clear memory snapshot\n", dev->name);
3777
3778         return count;
3779 }
3780
3781 static DEVICE_ATTR(memory, S_IWUSR | S_IRUGO, show_memory, store_memory);
3782
3783 static ssize_t show_ordinals(struct device *d, struct device_attribute *attr,
3784                              char *buf)
3785 {
3786         struct ipw2100_priv *priv = dev_get_drvdata(d);
3787         u32 val = 0;
3788         int len = 0;
3789         u32 val_len;
3790         static int loop = 0;
3791
3792         if (priv->status & STATUS_RF_KILL_MASK)
3793                 return 0;
3794
3795         if (loop >= sizeof(ord_data) / sizeof(*ord_data))
3796                 loop = 0;
3797
3798         /* sysfs provides us PAGE_SIZE buffer */
3799         while (len < PAGE_SIZE - 128 &&
3800                loop < (sizeof(ord_data) / sizeof(*ord_data))) {
3801
3802                 val_len = sizeof(u32);
3803
3804                 if (ipw2100_get_ordinal(priv, ord_data[loop].index, &val,
3805                                         &val_len))
3806                         len += sprintf(buf + len, "[0x%02X] = ERROR    %s\n",
3807                                        ord_data[loop].index,
3808                                        ord_data[loop].desc);
3809                 else
3810                         len += sprintf(buf + len, "[0x%02X] = 0x%08X %s\n",
3811                                        ord_data[loop].index, val,
3812                                        ord_data[loop].desc);
3813                 loop++;
3814         }
3815
3816         return len;
3817 }
3818
3819 static DEVICE_ATTR(ordinals, S_IRUGO, show_ordinals, NULL);
3820
3821 static ssize_t show_stats(struct device *d, struct device_attribute *attr,
3822                           char *buf)
3823 {
3824         struct ipw2100_priv *priv = dev_get_drvdata(d);
3825         char *out = buf;
3826
3827         out += sprintf(out, "interrupts: %d {tx: %d, rx: %d, other: %d}\n",
3828                        priv->interrupts, priv->tx_interrupts,
3829                        priv->rx_interrupts, priv->inta_other);
3830         out += sprintf(out, "firmware resets: %d\n", priv->resets);
3831         out += sprintf(out, "firmware hangs: %d\n", priv->hangs);
3832 #ifdef CONFIG_IPW2100_DEBUG
3833         out += sprintf(out, "packet mismatch image: %s\n",
3834                        priv->snapshot[0] ? "YES" : "NO");
3835 #endif
3836
3837         return out - buf;
3838 }
3839
3840 static DEVICE_ATTR(stats, S_IRUGO, show_stats, NULL);
3841
3842 static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
3843 {
3844         int err;
3845
3846         if (mode == priv->ieee->iw_mode)
3847                 return 0;
3848
3849         err = ipw2100_disable_adapter(priv);
3850         if (err) {
3851                 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n",
3852                        priv->net_dev->name, err);
3853                 return err;
3854         }
3855
3856         switch (mode) {
3857         case IW_MODE_INFRA:
3858                 priv->net_dev->type = ARPHRD_ETHER;
3859                 break;
3860         case IW_MODE_ADHOC:
3861                 priv->net_dev->type = ARPHRD_ETHER;
3862                 break;
3863 #ifdef CONFIG_IPW2100_MONITOR
3864         case IW_MODE_MONITOR:
3865                 priv->last_mode = priv->ieee->iw_mode;
3866                 priv->net_dev->type = ARPHRD_IEEE80211;
3867                 break;
3868 #endif                          /* CONFIG_IPW2100_MONITOR */
3869         }
3870
3871         priv->ieee->iw_mode = mode;
3872
3873 #ifdef CONFIG_PM
3874         /* Indicate ipw2100_download_firmware download firmware
3875          * from disk instead of memory. */
3876         ipw2100_firmware.version = 0;
3877 #endif
3878
3879         printk(KERN_INFO "%s: Reseting on mode change.\n", priv->net_dev->name);
3880         priv->reset_backoff = 0;
3881         schedule_reset(priv);
3882
3883         return 0;
3884 }
3885
3886 static ssize_t show_internals(struct device *d, struct device_attribute *attr,
3887                               char *buf)
3888 {
3889         struct ipw2100_priv *priv = dev_get_drvdata(d);
3890         int len = 0;
3891
3892 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
3893
3894         if (priv->status & STATUS_ASSOCIATED)
3895                 len += sprintf(buf + len, "connected: %lu\n",
3896                                get_seconds() - priv->connect_start);
3897         else
3898                 len += sprintf(buf + len, "not connected\n");
3899
3900         DUMP_VAR(ieee->crypt[priv->ieee->tx_keyidx], "p");
3901         DUMP_VAR(status, "08lx");
3902         DUMP_VAR(config, "08lx");
3903         DUMP_VAR(capability, "08lx");
3904
3905         len +=
3906             sprintf(buf + len, "last_rtc: %lu\n",
3907                     (unsigned long)priv->last_rtc);
3908
3909         DUMP_VAR(fatal_error, "d");
3910         DUMP_VAR(stop_hang_check, "d");
3911         DUMP_VAR(stop_rf_kill, "d");
3912         DUMP_VAR(messages_sent, "d");
3913
3914         DUMP_VAR(tx_pend_stat.value, "d");
3915         DUMP_VAR(tx_pend_stat.hi, "d");
3916
3917         DUMP_VAR(tx_free_stat.value, "d");
3918         DUMP_VAR(tx_free_stat.lo, "d");
3919
3920         DUMP_VAR(msg_free_stat.value, "d");
3921         DUMP_VAR(msg_free_stat.lo, "d");
3922
3923         DUMP_VAR(msg_pend_stat.value, "d");
3924         DUMP_VAR(msg_pend_stat.hi, "d");
3925
3926         DUMP_VAR(fw_pend_stat.value, "d");
3927         DUMP_VAR(fw_pend_stat.hi, "d");
3928
3929         DUMP_VAR(txq_stat.value, "d");
3930         DUMP_VAR(txq_stat.lo, "d");
3931
3932         DUMP_VAR(ieee->scans, "d");
3933         DUMP_VAR(reset_backoff, "d");
3934
3935         return len;
3936 }
3937
3938 static DEVICE_ATTR(internals, S_IRUGO, show_internals, NULL);
3939
3940 static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr,
3941                             char *buf)
3942 {
3943         struct ipw2100_priv *priv = dev_get_drvdata(d);
3944         char essid[IW_ESSID_MAX_SIZE + 1];
3945         u8 bssid[ETH_ALEN];
3946         u32 chan = 0;
3947         char *out = buf;
3948         int length;
3949         int ret;
3950
3951         if (priv->status & STATUS_RF_KILL_MASK)
3952                 return 0;
3953
3954         memset(essid, 0, sizeof(essid));
3955         memset(bssid, 0, sizeof(bssid));
3956
3957         length = IW_ESSID_MAX_SIZE;
3958         ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID, essid, &length);
3959         if (ret)
3960                 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
3961                                __LINE__);
3962
3963         length = sizeof(bssid);
3964         ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
3965                                   bssid, &length);
3966         if (ret)
3967                 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
3968                                __LINE__);
3969
3970         length = sizeof(u32);
3971         ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &length);
3972         if (ret)
3973                 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
3974                                __LINE__);
3975
3976         out += sprintf(out, "ESSID: %s\n", essid);
3977         out += sprintf(out, "BSSID:   %02x:%02x:%02x:%02x:%02x:%02x\n",
3978                        bssid[0], bssid[1], bssid[2],
3979                        bssid[3], bssid[4], bssid[5]);
3980         out += sprintf(out, "Channel: %d\n", chan);
3981
3982         return out - buf;
3983 }
3984
3985 static DEVICE_ATTR(bssinfo, S_IRUGO, show_bssinfo, NULL);
3986
3987 #ifdef CONFIG_IPW2100_DEBUG
3988 static ssize_t show_debug_level(struct device_driver *d, char *buf)
3989 {
3990         return sprintf(buf, "0x%08X\n", ipw2100_debug_level);
3991 }
3992
3993 static ssize_t store_debug_level(struct device_driver *d,
3994                                  const char *buf, size_t count)
3995 {
3996         char *p = (char *)buf;
3997         u32 val;
3998
3999         if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
4000                 p++;
4001                 if (p[0] == 'x' || p[0] == 'X')
4002                         p++;
4003                 val = simple_strtoul(p, &p, 16);
4004         } else
4005                 val = simple_strtoul(p, &p, 10);
4006         if (p == buf)
4007                 IPW_DEBUG_INFO(": %s is not in hex or decimal form.\n", buf);
4008         else
4009                 ipw2100_debug_level = val;
4010
4011         return strnlen(buf, count);
4012 }
4013
4014 static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, show_debug_level,
4015                    store_debug_level);
4016 #endif                          /* CONFIG_IPW2100_DEBUG */
4017
4018 static ssize_t show_fatal_error(struct device *d,
4019                                 struct device_attribute *attr, char *buf)
4020 {
4021         struct ipw2100_priv *priv = dev_get_drvdata(d);
4022         char *out = buf;
4023         int i;
4024
4025         if (priv->fatal_error)
4026                 out += sprintf(out, "0x%08X\n", priv->fatal_error);
4027         else
4028                 out += sprintf(out, "0\n");
4029
4030         for (i = 1; i <= IPW2100_ERROR_QUEUE; i++) {
4031                 if (!priv->fatal_errors[(priv->fatal_index - i) %
4032                                         IPW2100_ERROR_QUEUE])
4033                         continue;
4034
4035                 out += sprintf(out, "%d. 0x%08X\n", i,
4036                                priv->fatal_errors[(priv->fatal_index - i) %
4037                                                   IPW2100_ERROR_QUEUE]);
4038         }
4039
4040         return out - buf;
4041 }
4042
4043 static ssize_t store_fatal_error(struct device *d,
4044                                  struct device_attribute *attr, const char *buf,
4045                                  size_t count)
4046 {
4047         struct ipw2100_priv *priv = dev_get_drvdata(d);
4048         schedule_reset(priv);
4049         return count;
4050 }
4051
4052 static DEVICE_ATTR(fatal_error, S_IWUSR | S_IRUGO, show_fatal_error,
4053                    store_fatal_error);
4054
4055 static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
4056                              char *buf)
4057 {
4058         struct ipw2100_priv *priv = dev_get_drvdata(d);
4059         return sprintf(buf, "%d\n", priv->ieee->scan_age);
4060 }
4061
4062 static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
4063                               const char *buf, size_t count)
4064 {
4065         struct ipw2100_priv *priv = dev_get_drvdata(d);
4066         struct net_device *dev = priv->net_dev;
4067         char buffer[] = "00000000";
4068         unsigned long len =
4069             (sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1;
4070         unsigned long val;
4071         char *p = buffer;
4072
4073         (void) dev; /* kill unused-var warning for debug-only code */
4074
4075         IPW_DEBUG_INFO("enter\n");
4076
4077         strncpy(buffer, buf, len);
4078         buffer[len] = 0;
4079
4080         if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
4081                 p++;
4082                 if (p[0] == 'x' || p[0] == 'X')
4083                         p++;
4084                 val = simple_strtoul(p, &p, 16);
4085         } else
4086                 val = simple_strtoul(p, &p, 10);
4087         if (p == buffer) {
4088                 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
4089         } else {
4090                 priv->ieee->scan_age = val;
4091                 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
4092         }
4093
4094         IPW_DEBUG_INFO("exit\n");
4095         return len;
4096 }
4097
4098 static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
4099
4100 static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
4101                             char *buf)
4102 {
4103         /* 0 - RF kill not enabled
4104            1 - SW based RF kill active (sysfs)
4105            2 - HW based RF kill active
4106            3 - Both HW and SW baed RF kill active */
4107         struct ipw2100_priv *priv = (struct ipw2100_priv *)d->driver_data;
4108         int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
4109             (rf_kill_active(priv) ? 0x2 : 0x0);
4110         return sprintf(buf, "%i\n", val);
4111 }
4112
4113 static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4114 {
4115         if ((disable_radio ? 1 : 0) ==
4116             (priv->status & STATUS_RF_KILL_SW ? 1 : 0))
4117                 return 0;
4118
4119         IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO  %s\n",
4120                           disable_radio ? "OFF" : "ON");
4121
4122         down(&priv->action_sem);
4123
4124         if (disable_radio) {
4125                 priv->status |= STATUS_RF_KILL_SW;
4126                 ipw2100_down(priv);
4127         } else {
4128                 priv->status &= ~STATUS_RF_KILL_SW;
4129                 if (rf_kill_active(priv)) {
4130                         IPW_DEBUG_RF_KILL("Can not turn radio back on - "
4131                                           "disabled by HW switch\n");
4132                         /* Make sure the RF_KILL check timer is running */
4133                         priv->stop_rf_kill = 0;
4134                         cancel_delayed_work(&priv->rf_kill);
4135                         queue_delayed_work(priv->workqueue, &priv->rf_kill, HZ);
4136                 } else
4137                         schedule_reset(priv);
4138         }
4139
4140         up(&priv->action_sem);
4141         return 1;
4142 }
4143
4144 static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
4145                              const char *buf, size_t count)
4146 {
4147         struct ipw2100_priv *priv = dev_get_drvdata(d);
4148         ipw_radio_kill_sw(priv, buf[0] == '1');
4149         return count;
4150 }
4151
4152 static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
4153
4154 static struct attribute *ipw2100_sysfs_entries[] = {
4155         &dev_attr_hardware.attr,
4156         &dev_attr_registers.attr,
4157         &dev_attr_ordinals.attr,
4158         &dev_attr_pci.attr,
4159         &dev_attr_stats.attr,
4160         &dev_attr_internals.attr,
4161         &dev_attr_bssinfo.attr,
4162         &dev_attr_memory.attr,
4163         &dev_attr_scan_age.attr,
4164         &dev_attr_fatal_error.attr,
4165         &dev_attr_rf_kill.attr,
4166         &dev_attr_cfg.attr,
4167         &dev_attr_status.attr,
4168         &dev_attr_capability.attr,
4169         NULL,
4170 };
4171
4172 static struct attribute_group ipw2100_attribute_group = {
4173         .attrs = ipw2100_sysfs_entries,
4174 };
4175
4176 static int status_queue_allocate(struct ipw2100_priv *priv, int entries)
4177 {
4178         struct ipw2100_status_queue *q = &priv->status_queue;
4179
4180         IPW_DEBUG_INFO("enter\n");
4181
4182         q->size = entries * sizeof(struct ipw2100_status);
4183         q->drv =
4184             (struct ipw2100_status *)pci_alloc_consistent(priv->pci_dev,
4185                                                           q->size, &q->nic);
4186         if (!q->drv) {
4187                 IPW_DEBUG_WARNING("Can not allocate status queue.\n");
4188                 return -ENOMEM;
4189         }
4190
4191         memset(q->drv, 0, q->size);
4192
4193         IPW_DEBUG_INFO("exit\n");
4194
4195         return 0;
4196 }
4197
4198 static void status_queue_free(struct ipw2100_priv *priv)
4199 {
4200         IPW_DEBUG_INFO("enter\n");
4201
4202         if (priv->status_queue.drv) {
4203                 pci_free_consistent(priv->pci_dev, priv->status_queue.size,
4204                                     priv->status_queue.drv,
4205                                     priv->status_queue.nic);
4206                 priv->status_queue.drv = NULL;
4207         }
4208
4209         IPW_DEBUG_INFO("exit\n");
4210 }
4211
4212 static int bd_queue_allocate(struct ipw2100_priv *priv,
4213                              struct ipw2100_bd_queue *q, int entries)
4214 {
4215         IPW_DEBUG_INFO("enter\n");
4216
4217         memset(q, 0, sizeof(struct ipw2100_bd_queue));
4218
4219         q->entries = entries;
4220         q->size = entries * sizeof(struct ipw2100_bd);
4221         q->drv = pci_alloc_consistent(priv->pci_dev, q->size, &q->nic);
4222         if (!q->drv) {
4223                 IPW_DEBUG_INFO
4224                     ("can't allocate shared memory for buffer descriptors\n");
4225                 return -ENOMEM;
4226         }
4227         memset(q->drv, 0, q->size);
4228
4229         IPW_DEBUG_INFO("exit\n");
4230
4231         return 0;
4232 }
4233
4234 static void bd_queue_free(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q)
4235 {
4236         IPW_DEBUG_INFO("enter\n");
4237
4238         if (!q)
4239                 return;
4240
4241         if (q->drv) {
4242                 pci_free_consistent(priv->pci_dev, q->size, q->drv, q->nic);
4243                 q->drv = NULL;
4244         }
4245
4246         IPW_DEBUG_INFO("exit\n");
4247 }
4248
4249 static void bd_queue_initialize(struct ipw2100_priv *priv,
4250                                 struct ipw2100_bd_queue *q, u32 base, u32 size,
4251                                 u32 r, u32 w)
4252 {
4253         IPW_DEBUG_INFO("enter\n");
4254
4255         IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv,
4256                        (u32) q->nic);
4257
4258         write_register(priv->net_dev, base, q->nic);
4259         write_register(priv->net_dev, size, q->entries);
4260         write_register(priv->net_dev, r, q->oldest);
4261         write_register(priv->net_dev, w, q->next);
4262
4263         IPW_DEBUG_INFO("exit\n");
4264 }
4265
4266 static void ipw2100_kill_workqueue(struct ipw2100_priv *priv)
4267 {
4268         if (priv->workqueue) {
4269                 priv->stop_rf_kill = 1;
4270                 priv->stop_hang_check = 1;
4271                 cancel_delayed_work(&priv->reset_work);
4272                 cancel_delayed_work(&priv->security_work);
4273                 cancel_delayed_work(&priv->wx_event_work);
4274                 cancel_delayed_work(&priv->hang_check);
4275                 cancel_delayed_work(&priv->rf_kill);
4276                 destroy_workqueue(priv->workqueue);
4277                 priv->workqueue = NULL;
4278         }
4279 }
4280
4281 static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
4282 {
4283         int i, j, err = -EINVAL;
4284         void *v;
4285         dma_addr_t p;
4286
4287         IPW_DEBUG_INFO("enter\n");
4288
4289         err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH);
4290         if (err) {
4291                 IPW_DEBUG_ERROR("%s: failed bd_queue_allocate\n",
4292                                 priv->net_dev->name);
4293                 return err;
4294         }
4295
4296         priv->tx_buffers =
4297             (struct ipw2100_tx_packet *)kmalloc(TX_PENDED_QUEUE_LENGTH *
4298                                                 sizeof(struct
4299                                                        ipw2100_tx_packet),
4300                                                 GFP_ATOMIC);
4301         if (!priv->tx_buffers) {
4302                 printk(KERN_ERR DRV_NAME
4303                        ": %s: alloc failed form tx buffers.\n",
4304                        priv->net_dev->name);
4305                 bd_queue_free(priv, &priv->tx_queue);
4306                 return -ENOMEM;
4307         }
4308
4309         for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4310                 v = pci_alloc_consistent(priv->pci_dev,
4311                                          sizeof(struct ipw2100_data_header),
4312                                          &p);
4313                 if (!v) {
4314                         printk(KERN_ERR DRV_NAME
4315                                ": %s: PCI alloc failed for tx " "buffers.\n",
4316                                priv->net_dev->name);
4317                         err = -ENOMEM;
4318                         break;
4319                 }
4320
4321                 priv->tx_buffers[i].type = DATA;
4322                 priv->tx_buffers[i].info.d_struct.data =
4323                     (struct ipw2100_data_header *)v;
4324                 priv->tx_buffers[i].info.d_struct.data_phys = p;
4325                 priv->tx_buffers[i].info.d_struct.txb = NULL;
4326         }
4327
4328         if (i == TX_PENDED_QUEUE_LENGTH)
4329                 return 0;
4330
4331         for (j = 0; j < i; j++) {
4332                 pci_free_consistent(priv->pci_dev,
4333                                     sizeof(struct ipw2100_data_header),
4334                                     priv->tx_buffers[j].info.d_struct.data,
4335                                     priv->tx_buffers[j].info.d_struct.
4336                                     data_phys);
4337         }
4338
4339         kfree(priv->tx_buffers);
4340         priv->tx_buffers = NULL;
4341
4342         return err;
4343 }
4344
4345 static void ipw2100_tx_initialize(struct ipw2100_priv *priv)
4346 {
4347         int i;
4348
4349         IPW_DEBUG_INFO("enter\n");
4350
4351         /*
4352          * reinitialize packet info lists
4353          */
4354         INIT_LIST_HEAD(&priv->fw_pend_list);
4355         INIT_STAT(&priv->fw_pend_stat);
4356
4357         /*
4358          * reinitialize lists
4359          */
4360         INIT_LIST_HEAD(&priv->tx_pend_list);
4361         INIT_LIST_HEAD(&priv->tx_free_list);
4362         INIT_STAT(&priv->tx_pend_stat);
4363         INIT_STAT(&priv->tx_free_stat);
4364
4365         for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4366                 /* We simply drop any SKBs that have been queued for
4367                  * transmit */
4368                 if (priv->tx_buffers[i].info.d_struct.txb) {
4369                         ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.
4370                                            txb);
4371                         priv->tx_buffers[i].info.d_struct.txb = NULL;
4372                 }
4373
4374                 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list);
4375         }
4376
4377         SET_STAT(&priv->tx_free_stat, i);
4378
4379         priv->tx_queue.oldest = 0;
4380         priv->tx_queue.available = priv->tx_queue.entries;
4381         priv->tx_queue.next = 0;
4382         INIT_STAT(&priv->txq_stat);
4383         SET_STAT(&priv->txq_stat, priv->tx_queue.available);
4384
4385         bd_queue_initialize(priv, &priv->tx_queue,
4386                             IPW_MEM_HOST_SHARED_TX_QUEUE_BD_BASE,
4387                             IPW_MEM_HOST_SHARED_TX_QUEUE_BD_SIZE,
4388                             IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
4389                             IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX);
4390
4391         IPW_DEBUG_INFO("exit\n");
4392
4393 }
4394
4395 static void ipw2100_tx_free(struct ipw2100_priv *priv)
4396 {
4397         int i;
4398
4399         IPW_DEBUG_INFO("enter\n");
4400
4401         bd_queue_free(priv, &priv->tx_queue);
4402
4403         if (!priv->tx_buffers)
4404                 return;
4405
4406         for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4407                 if (priv->tx_buffers[i].info.d_struct.txb) {
4408                         ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.
4409                                            txb);
4410                         priv->tx_buffers[i].info.d_struct.txb = NULL;
4411                 }
4412                 if (priv->tx_buffers[i].info.d_struct.data)
4413                         pci_free_consistent(priv->pci_dev,
4414                                             sizeof(struct ipw2100_data_header),
4415                                             priv->tx_buffers[i].info.d_struct.
4416                                             data,
4417                                             priv->tx_buffers[i].info.d_struct.
4418                                             data_phys);
4419         }
4420
4421         kfree(priv->tx_buffers);
4422         priv->tx_buffers = NULL;
4423
4424         IPW_DEBUG_INFO("exit\n");
4425 }
4426
4427 static int ipw2100_rx_allocate(struct ipw2100_priv *priv)
4428 {
4429         int i, j, err = -EINVAL;
4430
4431         IPW_DEBUG_INFO("enter\n");
4432
4433         err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH);
4434         if (err) {
4435                 IPW_DEBUG_INFO("failed bd_queue_allocate\n");
4436                 return err;
4437         }
4438
4439         err = status_queue_allocate(priv, RX_QUEUE_LENGTH);
4440         if (err) {
4441                 IPW_DEBUG_INFO("failed status_queue_allocate\n");
4442                 bd_queue_free(priv, &priv->rx_queue);
4443                 return err;
4444         }
4445
4446         /*
4447          * allocate packets
4448          */
4449         priv->rx_buffers = (struct ipw2100_rx_packet *)
4450             kmalloc(RX_QUEUE_LENGTH * sizeof(struct ipw2100_rx_packet),
4451                     GFP_KERNEL);
4452         if (!priv->rx_buffers) {
4453                 IPW_DEBUG_INFO("can't allocate rx packet buffer table\n");
4454
4455                 bd_queue_free(priv, &priv->rx_queue);
4456
4457                 status_queue_free(priv);
4458
4459                 return -ENOMEM;
4460         }
4461
4462         for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4463                 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
4464
4465                 err = ipw2100_alloc_skb(priv, packet);
4466                 if (unlikely(err)) {
4467                         err = -ENOMEM;
4468                         break;
4469                 }
4470
4471                 /* The BD holds the cache aligned address */
4472                 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
4473                 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH;
4474                 priv->status_queue.drv[i].status_fields = 0;
4475         }
4476
4477         if (i == RX_QUEUE_LENGTH)
4478                 return 0;
4479
4480         for (j = 0; j < i; j++) {
4481                 pci_unmap_single(priv->pci_dev, priv->rx_buffers[j].dma_addr,
4482                                  sizeof(struct ipw2100_rx_packet),
4483                                  PCI_DMA_FROMDEVICE);
4484                 dev_kfree_skb(priv->rx_buffers[j].skb);
4485         }
4486
4487         kfree(priv->rx_buffers);
4488         priv->rx_buffers = NULL;
4489
4490         bd_queue_free(priv, &priv->rx_queue);
4491
4492         status_queue_free(priv);
4493
4494         return err;
4495 }
4496
4497 static void ipw2100_rx_initialize(struct ipw2100_priv *priv)
4498 {
4499         IPW_DEBUG_INFO("enter\n");
4500
4501         priv->rx_queue.oldest = 0;
4502         priv->rx_queue.available = priv->rx_queue.entries - 1;
4503         priv->rx_queue.next = priv->rx_queue.entries - 1;
4504
4505         INIT_STAT(&priv->rxq_stat);
4506         SET_STAT(&priv->rxq_stat, priv->rx_queue.available);
4507
4508         bd_queue_initialize(priv, &priv->rx_queue,
4509                             IPW_MEM_HOST_SHARED_RX_BD_BASE,
4510                             IPW_MEM_HOST_SHARED_RX_BD_SIZE,
4511                             IPW_MEM_HOST_SHARED_RX_READ_INDEX,
4512                             IPW_MEM_HOST_SHARED_RX_WRITE_INDEX);
4513
4514         /* set up the status queue */
4515         write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE,
4516                        priv->status_queue.nic);
4517
4518         IPW_DEBUG_INFO("exit\n");
4519 }
4520
4521 static void ipw2100_rx_free(struct ipw2100_priv *priv)
4522 {
4523         int i;
4524
4525         IPW_DEBUG_INFO("enter\n");
4526
4527         bd_queue_free(priv, &priv->rx_queue);
4528         status_queue_free(priv);
4529
4530         if (!priv->rx_buffers)
4531                 return;
4532
4533         for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4534                 if (priv->rx_buffers[i].rxp) {
4535                         pci_unmap_single(priv->pci_dev,
4536                                          priv->rx_buffers[i].dma_addr,
4537                                          sizeof(struct ipw2100_rx),
4538                                          PCI_DMA_FROMDEVICE);
4539                         dev_kfree_skb(priv->rx_buffers[i].skb);
4540                 }
4541         }
4542
4543         kfree(priv->rx_buffers);
4544         priv->rx_buffers = NULL;
4545
4546         IPW_DEBUG_INFO("exit\n");
4547 }
4548
4549 static int ipw2100_read_mac_address(struct ipw2100_priv *priv)
4550 {
4551         u32 length = ETH_ALEN;
4552         u8 mac[ETH_ALEN];
4553
4554         int err;
4555
4556         err = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ADAPTER_MAC, mac, &length);
4557         if (err) {
4558                 IPW_DEBUG_INFO("MAC address read failed\n");
4559                 return -EIO;
4560         }
4561         IPW_DEBUG_INFO("card MAC is %02X:%02X:%02X:%02X:%02X:%02X\n",
4562                        mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
4563
4564         memcpy(priv->net_dev->dev_addr, mac, ETH_ALEN);
4565
4566         return 0;
4567 }
4568
4569 /********************************************************************
4570  *
4571  * Firmware Commands
4572  *
4573  ********************************************************************/
4574
4575 static int ipw2100_set_mac_address(struct ipw2100_priv *priv, int batch_mode)
4576 {
4577         struct host_command cmd = {
4578                 .host_command = ADAPTER_ADDRESS,
4579                 .host_command_sequence = 0,
4580                 .host_command_length = ETH_ALEN
4581         };
4582         int err;
4583
4584         IPW_DEBUG_HC("SET_MAC_ADDRESS\n");
4585
4586         IPW_DEBUG_INFO("enter\n");
4587
4588         if (priv->config & CFG_CUSTOM_MAC) {
4589                 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN);
4590                 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
4591         } else
4592                 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr,
4593                        ETH_ALEN);
4594
4595         err = ipw2100_hw_send_command(priv, &cmd);
4596
4597         IPW_DEBUG_INFO("exit\n");
4598         return err;
4599 }
4600
4601 static int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type,
4602                                  int batch_mode)
4603 {
4604         struct host_command cmd = {
4605                 .host_command = PORT_TYPE,
4606                 .host_command_sequence = 0,
4607                 .host_command_length = sizeof(u32)
4608         };
4609         int err;
4610
4611         switch (port_type) {
4612         case IW_MODE_INFRA:
4613                 cmd.host_command_parameters[0] = IPW_BSS;
4614                 break;
4615         case IW_MODE_ADHOC:
4616                 cmd.host_command_parameters[0] = IPW_IBSS;
4617                 break;
4618         }
4619
4620         IPW_DEBUG_HC("PORT_TYPE: %s\n",
4621                      port_type == IPW_IBSS ? "Ad-Hoc" : "Managed");
4622
4623         if (!batch_mode) {
4624                 err = ipw2100_disable_adapter(priv);
4625                 if (err) {
4626                         printk(KERN_ERR DRV_NAME
4627                                ": %s: Could not disable adapter %d\n",
4628                                priv->net_dev->name, err);
4629                         return err;
4630                 }
4631         }
4632
4633         /* send cmd to firmware */
4634         err = ipw2100_hw_send_command(priv, &cmd);
4635
4636         if (!batch_mode)
4637                 ipw2100_enable_adapter(priv);
4638
4639         return err;
4640 }
4641
4642 static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel,
4643                                int batch_mode)
4644 {
4645         struct host_command cmd = {
4646                 .host_command = CHANNEL,
4647                 .host_command_sequence = 0,
4648                 .host_command_length = sizeof(u32)
4649         };
4650         int err;
4651
4652         cmd.host_command_parameters[0] = channel;
4653
4654         IPW_DEBUG_HC("CHANNEL: %d\n", channel);
4655
4656         /* If BSS then we don't support channel selection */
4657         if (priv->ieee->iw_mode == IW_MODE_INFRA)
4658                 return 0;
4659
4660         if ((channel != 0) &&
4661             ((channel < REG_MIN_CHANNEL) || (channel > REG_MAX_CHANNEL)))
4662                 return -EINVAL;
4663
4664         if (!batch_mode) {
4665                 err = ipw2100_disable_adapter(priv);
4666                 if (err)
4667                         return err;
4668         }
4669
4670         err = ipw2100_hw_send_command(priv, &cmd);
4671         if (err) {
4672                 IPW_DEBUG_INFO("Failed to set channel to %d", channel);
4673                 return err;
4674         }
4675
4676         if (channel)
4677                 priv->config |= CFG_STATIC_CHANNEL;
4678         else
4679                 priv->config &= ~CFG_STATIC_CHANNEL;
4680
4681         priv->channel = channel;
4682
4683         if (!batch_mode) {
4684                 err = ipw2100_enable_adapter(priv);
4685                 if (err)
4686                         return err;
4687         }
4688
4689         return 0;
4690 }
4691
4692 static int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode)
4693 {
4694         struct host_command cmd = {
4695                 .host_command = SYSTEM_CONFIG,
4696                 .host_command_sequence = 0,
4697                 .host_command_length = 12,
4698         };
4699         u32 ibss_mask, len = sizeof(u32);
4700         int err;
4701
4702         /* Set system configuration */
4703
4704         if (!batch_mode) {
4705                 err = ipw2100_disable_adapter(priv);
4706                 if (err)
4707                         return err;
4708         }
4709
4710         if (priv->ieee->iw_mode == IW_MODE_ADHOC)
4711                 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_AUTO_START;
4712
4713         cmd.host_command_parameters[0] |= IPW_CFG_IBSS_MASK |
4714             IPW_CFG_BSS_MASK | IPW_CFG_802_1x_ENABLE;
4715
4716         if (!(priv->config & CFG_LONG_PREAMBLE))
4717                 cmd.host_command_parameters[0] |= IPW_CFG_PREAMBLE_AUTO;
4718
4719         err = ipw2100_get_ordinal(priv,
4720                                   IPW_ORD_EEPROM_IBSS_11B_CHANNELS,
4721                                   &ibss_mask, &len);
4722         if (err)
4723                 ibss_mask = IPW_IBSS_11B_DEFAULT_MASK;
4724
4725         cmd.host_command_parameters[1] = REG_CHANNEL_MASK;
4726         cmd.host_command_parameters[2] = REG_CHANNEL_MASK & ibss_mask;
4727
4728         /* 11b only */
4729         /*cmd.host_command_parameters[0] |= DIVERSITY_ANTENNA_A; */
4730
4731         err = ipw2100_hw_send_command(priv, &cmd);
4732         if (err)
4733                 return err;
4734
4735 /* If IPv6 is configured in the kernel then we don't want to filter out all
4736  * of the multicast packets as IPv6 needs some. */
4737 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
4738         cmd.host_command = ADD_MULTICAST;
4739         cmd.host_command_sequence = 0;
4740         cmd.host_command_length = 0;
4741
4742         ipw2100_hw_send_command(priv, &cmd);
4743 #endif
4744         if (!batch_mode) {
4745                 err = ipw2100_enable_adapter(priv);
4746                 if (err)
4747                         return err;
4748         }
4749
4750         return 0;
4751 }
4752
4753 static int ipw2100_set_tx_rates(struct ipw2100_priv *priv, u32 rate,
4754                                 int batch_mode)
4755 {
4756         struct host_command cmd = {
4757                 .host_command = BASIC_TX_RATES,
4758                 .host_command_sequence = 0,
4759                 .host_command_length = 4
4760         };
4761         int err;
4762
4763         cmd.host_command_parameters[0] = rate & TX_RATE_MASK;
4764
4765         if (!batch_mode) {
4766                 err = ipw2100_disable_adapter(priv);
4767                 if (err)
4768                         return err;
4769         }
4770
4771         /* Set BASIC TX Rate first */
4772         ipw2100_hw_send_command(priv, &cmd);
4773
4774         /* Set TX Rate */
4775         cmd.host_command = TX_RATES;
4776         ipw2100_hw_send_command(priv, &cmd);
4777
4778         /* Set MSDU TX Rate */
4779         cmd.host_command = MSDU_TX_RATES;
4780         ipw2100_hw_send_command(priv, &cmd);
4781
4782         if (!batch_mode) {
4783                 err = ipw2100_enable_adapter(priv);
4784                 if (err)
4785                         return err;
4786         }
4787
4788         priv->tx_rates = rate;
4789
4790         return 0;
4791 }
4792
4793 static int ipw2100_set_power_mode(struct ipw2100_priv *priv, int power_level)
4794 {
4795         struct host_command cmd = {
4796                 .host_command = POWER_MODE,
4797                 .host_command_sequence = 0,
4798                 .host_command_length = 4
4799         };
4800         int err;
4801
4802         cmd.host_command_parameters[0] = power_level;
4803
4804         err = ipw2100_hw_send_command(priv, &cmd);
4805         if (err)
4806                 return err;
4807
4808         if (power_level == IPW_POWER_MODE_CAM)
4809                 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
4810         else
4811                 priv->power_mode = IPW_POWER_ENABLED | power_level;
4812
4813 #ifdef CONFIG_IPW2100_TX_POWER
4814         if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) {
4815                 /* Set beacon interval */
4816                 cmd.host_command = TX_POWER_INDEX;
4817                 cmd.host_command_parameters[0] = (u32) priv->adhoc_power;
4818
4819                 err = ipw2100_hw_send_command(priv, &cmd);
4820                 if (err)
4821                         return err;
4822         }
4823 #endif
4824
4825         return 0;
4826 }
4827
4828 static int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold)
4829 {
4830         struct host_command cmd = {
4831                 .host_command = RTS_THRESHOLD,
4832                 .host_command_sequence = 0,
4833                 .host_command_length = 4
4834         };
4835         int err;
4836
4837         if (threshold & RTS_DISABLED)
4838                 cmd.host_command_parameters[0] = MAX_RTS_THRESHOLD;
4839         else
4840                 cmd.host_command_parameters[0] = threshold & ~RTS_DISABLED;
4841
4842         err = ipw2100_hw_send_command(priv, &cmd);
4843         if (err)
4844                 return err;
4845
4846         priv->rts_threshold = threshold;
4847
4848         return 0;
4849 }
4850
4851 #if 0
4852 int ipw2100_set_fragmentation_threshold(struct ipw2100_priv *priv,
4853                                         u32 threshold, int batch_mode)
4854 {
4855         struct host_command cmd = {
4856                 .host_command = FRAG_THRESHOLD,
4857                 .host_command_sequence = 0,
4858                 .host_command_length = 4,
4859                 .host_command_parameters[0] = 0,
4860         };
4861         int err;
4862
4863         if (!batch_mode) {
4864                 err = ipw2100_disable_adapter(priv);
4865                 if (err)
4866                         return err;
4867         }
4868
4869         if (threshold == 0)
4870                 threshold = DEFAULT_FRAG_THRESHOLD;
4871         else {
4872                 threshold = max(threshold, MIN_FRAG_THRESHOLD);
4873                 threshold = min(threshold, MAX_FRAG_THRESHOLD);
4874         }
4875
4876         cmd.host_command_parameters[0] = threshold;
4877
4878         IPW_DEBUG_HC("FRAG_THRESHOLD: %u\n", threshold);
4879
4880         err = ipw2100_hw_send_command(priv, &cmd);
4881
4882         if (!batch_mode)
4883                 ipw2100_enable_adapter(priv);
4884
4885         if (!err)
4886                 priv->frag_threshold = threshold;
4887
4888         return err;
4889 }
4890 #endif
4891
4892 static int ipw2100_set_short_retry(struct ipw2100_priv *priv, u32 retry)
4893 {
4894         struct host_command cmd = {
4895                 .host_command = SHORT_RETRY_LIMIT,
4896                 .host_command_sequence = 0,
4897                 .host_command_length = 4
4898         };
4899         int err;
4900
4901         cmd.host_command_parameters[0] = retry;
4902
4903         err = ipw2100_hw_send_command(priv, &cmd);
4904         if (err)
4905                 return err;
4906
4907         priv->short_retry_limit = retry;
4908
4909         return 0;
4910 }
4911
4912 static int ipw2100_set_long_retry(struct ipw2100_priv *priv, u32 retry)
4913 {
4914         struct host_command cmd = {
4915                 .host_command = LONG_RETRY_LIMIT,
4916                 .host_command_sequence = 0,
4917                 .host_command_length = 4
4918         };
4919         int err;
4920
4921         cmd.host_command_parameters[0] = retry;
4922
4923         err = ipw2100_hw_send_command(priv, &cmd);
4924         if (err)
4925                 return err;
4926
4927         priv->long_retry_limit = retry;
4928
4929         return 0;
4930 }
4931
4932 static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 * bssid,
4933                                        int batch_mode)
4934 {
4935         struct host_command cmd = {
4936                 .host_command = MANDATORY_BSSID,
4937                 .host_command_sequence = 0,
4938                 .host_command_length = (bssid == NULL) ? 0 : ETH_ALEN
4939         };
4940         int err;
4941
4942 #ifdef CONFIG_IPW2100_DEBUG
4943         if (bssid != NULL)
4944                 IPW_DEBUG_HC("MANDATORY_BSSID: %02X:%02X:%02X:%02X:%02X:%02X\n",
4945                              bssid[0], bssid[1], bssid[2], bssid[3], bssid[4],
4946                              bssid[5]);
4947         else
4948                 IPW_DEBUG_HC("MANDATORY_BSSID: <clear>\n");
4949 #endif
4950         /* if BSSID is empty then we disable mandatory bssid mode */
4951         if (bssid != NULL)
4952                 memcpy(cmd.host_command_parameters, bssid, ETH_ALEN);
4953
4954         if (!batch_mode) {
4955                 err = ipw2100_disable_adapter(priv);
4956                 if (err)
4957                         return err;
4958         }
4959
4960         err = ipw2100_hw_send_command(priv, &cmd);
4961
4962         if (!batch_mode)
4963                 ipw2100_enable_adapter(priv);
4964
4965         return err;
4966 }
4967
4968 static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv)
4969 {
4970         struct host_command cmd = {
4971                 .host_command = DISASSOCIATION_BSSID,
4972                 .host_command_sequence = 0,
4973                 .host_command_length = ETH_ALEN
4974         };
4975         int err;
4976         int len;
4977
4978         IPW_DEBUG_HC("DISASSOCIATION_BSSID\n");
4979
4980         len = ETH_ALEN;
4981         /* The Firmware currently ignores the BSSID and just disassociates from
4982          * the currently associated AP -- but in the off chance that a future
4983          * firmware does use the BSSID provided here, we go ahead and try and
4984          * set it to the currently associated AP's BSSID */
4985         memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN);
4986
4987         err = ipw2100_hw_send_command(priv, &cmd);
4988
4989         return err;
4990 }
4991
4992 static int ipw2100_set_wpa_ie(struct ipw2100_priv *,
4993                               struct ipw2100_wpa_assoc_frame *, int)
4994     __attribute__ ((unused));
4995
4996 static int ipw2100_set_wpa_ie(struct ipw2100_priv *priv,
4997                               struct ipw2100_wpa_assoc_frame *wpa_frame,
4998                               int batch_mode)
4999 {
5000         struct host_command cmd = {
5001                 .host_command = SET_WPA_IE,
5002                 .host_command_sequence = 0,
5003                 .host_command_length = sizeof(struct ipw2100_wpa_assoc_frame),
5004         };
5005         int err;
5006
5007         IPW_DEBUG_HC("SET_WPA_IE\n");
5008
5009         if (!batch_mode) {
5010                 err = ipw2100_disable_adapter(priv);
5011                 if (err)
5012                         return err;
5013         }
5014
5015         memcpy(cmd.host_command_parameters, wpa_frame,
5016                sizeof(struct ipw2100_wpa_assoc_frame));
5017
5018         err = ipw2100_hw_send_command(priv, &cmd);
5019
5020         if (!batch_mode) {
5021                 if (ipw2100_enable_adapter(priv))
5022                         err = -EIO;
5023         }
5024
5025         return err;
5026 }
5027
5028 struct security_info_params {
5029         u32 allowed_ciphers;
5030         u16 version;
5031         u8 auth_mode;
5032         u8 replay_counters_number;
5033         u8 unicast_using_group;
5034 } __attribute__ ((packed));
5035
5036 static int ipw2100_set_security_information(struct ipw2100_priv *priv,
5037                                             int auth_mode,
5038                                             int security_level,
5039                                             int unicast_using_group,
5040                                             int batch_mode)
5041 {
5042         struct host_command cmd = {
5043                 .host_command = SET_SECURITY_INFORMATION,
5044                 .host_command_sequence = 0,
5045                 .host_command_length = sizeof(struct security_info_params)
5046         };
5047         struct security_info_params *security =
5048             (struct security_info_params *)&cmd.host_command_parameters;
5049         int err;
5050         memset(security, 0, sizeof(*security));
5051
5052         /* If shared key AP authentication is turned on, then we need to
5053          * configure the firmware to try and use it.
5054          *
5055          * Actual data encryption/decryption is handled by the host. */
5056         security->auth_mode = auth_mode;
5057         security->unicast_using_group = unicast_using_group;
5058
5059         switch (security_level) {
5060         default:
5061         case SEC_LEVEL_0:
5062                 security->allowed_ciphers = IPW_NONE_CIPHER;
5063                 break;
5064         case SEC_LEVEL_1:
5065                 security->allowed_ciphers = IPW_WEP40_CIPHER |
5066                     IPW_WEP104_CIPHER;
5067                 break;
5068         case SEC_LEVEL_2:
5069                 security->allowed_ciphers = IPW_WEP40_CIPHER |
5070                     IPW_WEP104_CIPHER | IPW_TKIP_CIPHER;
5071                 break;
5072         case SEC_LEVEL_2_CKIP:
5073                 security->allowed_ciphers = IPW_WEP40_CIPHER |
5074                     IPW_WEP104_CIPHER | IPW_CKIP_CIPHER;
5075                 break;
5076         case SEC_LEVEL_3:
5077                 security->allowed_ciphers = IPW_WEP40_CIPHER |
5078                     IPW_WEP104_CIPHER | IPW_TKIP_CIPHER | IPW_CCMP_CIPHER;
5079                 break;
5080         }
5081
5082         IPW_DEBUG_HC
5083             ("SET_SECURITY_INFORMATION: auth:%d cipher:0x%02X (level %d)\n",
5084              security->auth_mode, security->allowed_ciphers, security_level);
5085
5086         security->replay_counters_number = 0;
5087
5088         if (!batch_mode) {
5089                 err = ipw2100_disable_adapter(priv);
5090                 if (err)
5091                         return err;
5092         }
5093
5094         err = ipw2100_hw_send_command(priv, &cmd);
5095
5096         if (!batch_mode)
5097                 ipw2100_enable_adapter(priv);
5098
5099         return err;
5100 }
5101
5102 static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
5103 {
5104         struct host_command cmd = {
5105                 .host_command = TX_POWER_INDEX,
5106                 .host_command_sequence = 0,
5107                 .host_command_length = 4
5108         };
5109         int err = 0;
5110
5111         if (tx_power != IPW_TX_POWER_DEFAULT)
5112                 tx_power = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
5113                     (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
5114
5115         cmd.host_command_parameters[0] = tx_power;
5116
5117         if (priv->ieee->iw_mode == IW_MODE_ADHOC)
5118                 err = ipw2100_hw_send_command(priv, &cmd);
5119         if (!err)
5120                 priv->tx_power = tx_power;
5121
5122         return 0;
5123 }
5124
5125 static int ipw2100_set_ibss_beacon_interval(struct ipw2100_priv *priv,
5126                                             u32 interval, int batch_mode)
5127 {
5128         struct host_command cmd = {
5129                 .host_command = BEACON_INTERVAL,
5130                 .host_command_sequence = 0,
5131                 .host_command_length = 4
5132         };
5133         int err;
5134
5135         cmd.host_command_parameters[0] = interval;
5136
5137         IPW_DEBUG_INFO("enter\n");
5138
5139         if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5140                 if (!batch_mode) {
5141                         err = ipw2100_disable_adapter(priv);
5142                         if (err)
5143                                 return err;
5144                 }
5145
5146                 ipw2100_hw_send_command(priv, &cmd);
5147
5148                 if (!batch_mode) {
5149                         err = ipw2100_enable_adapter(priv);
5150                         if (err)
5151                                 return err;
5152                 }
5153         }
5154
5155         IPW_DEBUG_INFO("exit\n");
5156
5157         return 0;
5158 }
5159
5160 void ipw2100_queues_initialize(struct ipw2100_priv *priv)
5161 {
5162         ipw2100_tx_initialize(priv);
5163         ipw2100_rx_initialize(priv);
5164         ipw2100_msg_initialize(priv);
5165 }
5166
5167 void ipw2100_queues_free(struct ipw2100_priv *priv)
5168 {
5169         ipw2100_tx_free(priv);
5170         ipw2100_rx_free(priv);
5171         ipw2100_msg_free(priv);
5172 }
5173
5174 int ipw2100_queues_allocate(struct ipw2100_priv *priv)
5175 {
5176         if (ipw2100_tx_allocate(priv) ||
5177             ipw2100_rx_allocate(priv) || ipw2100_msg_allocate(priv))
5178                 goto fail;
5179
5180         return 0;
5181
5182       fail:
5183         ipw2100_tx_free(priv);
5184         ipw2100_rx_free(priv);
5185         ipw2100_msg_free(priv);
5186         return -ENOMEM;
5187 }
5188
5189 #define IPW_PRIVACY_CAPABLE 0x0008
5190
5191 static int ipw2100_set_wep_flags(struct ipw2100_priv *priv, u32 flags,
5192                                  int batch_mode)
5193 {
5194         struct host_command cmd = {
5195                 .host_command = WEP_FLAGS,
5196                 .host_command_sequence = 0,
5197                 .host_command_length = 4
5198         };
5199         int err;
5200
5201         cmd.host_command_parameters[0] = flags;
5202
5203         IPW_DEBUG_HC("WEP_FLAGS: flags = 0x%08X\n", flags);
5204
5205         if (!batch_mode) {
5206                 err = ipw2100_disable_adapter(priv);
5207                 if (err) {
5208                         printk(KERN_ERR DRV_NAME
5209                                ": %s: Could not disable adapter %d\n",
5210                                priv->net_dev->name, err);
5211                         return err;
5212                 }
5213         }
5214
5215         /* send cmd to firmware */
5216         err = ipw2100_hw_send_command(priv, &cmd);
5217
5218         if (!batch_mode)
5219                 ipw2100_enable_adapter(priv);
5220
5221         return err;
5222 }
5223
5224 struct ipw2100_wep_key {
5225         u8 idx;
5226         u8 len;
5227         u8 key[13];
5228 };
5229
5230 /* Macros to ease up priting WEP keys */
5231 #define WEP_FMT_64  "%02X%02X%02X%02X-%02X"
5232 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
5233 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
5234 #define WEP_STR_128(x) x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10]
5235
5236 /**
5237  * Set a the wep key
5238  *
5239  * @priv: struct to work on
5240  * @idx: index of the key we want to set
5241  * @key: ptr to the key data to set
5242  * @len: length of the buffer at @key
5243  * @batch_mode: FIXME perform the operation in batch mode, not
5244  *              disabling the device.
5245  *
5246  * @returns 0 if OK, < 0 errno code on error.
5247  *
5248  * Fill out a command structure with the new wep key, length an
5249  * index and send it down the wire.
5250  */
5251 static int ipw2100_set_key(struct ipw2100_priv *priv,
5252                            int idx, char *key, int len, int batch_mode)
5253 {
5254         int keylen = len ? (len <= 5 ? 5 : 13) : 0;
5255         struct host_command cmd = {
5256                 .host_command = WEP_KEY_INFO,
5257                 .host_command_sequence = 0,
5258                 .host_command_length = sizeof(struct ipw2100_wep_key),
5259         };
5260         struct ipw2100_wep_key *wep_key = (void *)cmd.host_command_parameters;
5261         int err;
5262
5263         IPW_DEBUG_HC("WEP_KEY_INFO: index = %d, len = %d/%d\n",
5264                      idx, keylen, len);
5265
5266         /* NOTE: We don't check cached values in case the firmware was reset
5267          * or some other problem is occuring.  If the user is setting the key,
5268          * then we push the change */
5269
5270         wep_key->idx = idx;
5271         wep_key->len = keylen;
5272
5273         if (keylen) {
5274                 memcpy(wep_key->key, key, len);
5275                 memset(wep_key->key + len, 0, keylen - len);
5276         }
5277
5278         /* Will be optimized out on debug not being configured in */
5279         if (keylen == 0)
5280                 IPW_DEBUG_WEP("%s: Clearing key %d\n",
5281                               priv->net_dev->name, wep_key->idx);
5282         else if (keylen == 5)
5283                 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_64 "\n",
5284                               priv->net_dev->name, wep_key->idx, wep_key->len,
5285                               WEP_STR_64(wep_key->key));
5286         else
5287                 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_128
5288                               "\n",
5289                               priv->net_dev->name, wep_key->idx, wep_key->len,
5290                               WEP_STR_128(wep_key->key));
5291
5292         if (!batch_mode) {
5293                 err = ipw2100_disable_adapter(priv);
5294                 /* FIXME: IPG: shouldn't this prink be in _disable_adapter()? */
5295                 if (err) {
5296                         printk(KERN_ERR DRV_NAME
5297                                ": %s: Could not disable adapter %d\n",
5298                                priv->net_dev->name, err);
5299                         return err;
5300                 }
5301         }
5302
5303         /* send cmd to firmware */
5304         err = ipw2100_hw_send_command(priv, &cmd);
5305
5306         if (!batch_mode) {
5307                 int err2 = ipw2100_enable_adapter(priv);
5308                 if (err == 0)
5309                         err = err2;
5310         }
5311         return err;
5312 }
5313
5314 static int ipw2100_set_key_index(struct ipw2100_priv *priv,
5315                                  int idx, int batch_mode)
5316 {
5317         struct host_command cmd = {
5318                 .host_command = WEP_KEY_INDEX,
5319                 .host_command_sequence = 0,
5320                 .host_command_length = 4,
5321                 .host_command_parameters = {idx},
5322         };
5323         int err;
5324
5325         IPW_DEBUG_HC("WEP_KEY_INDEX: index = %d\n", idx);
5326
5327         if (idx < 0 || idx > 3)
5328                 return -EINVAL;
5329
5330         if (!batch_mode) {
5331                 err = ipw2100_disable_adapter(priv);
5332                 if (err) {
5333                         printk(KERN_ERR DRV_NAME
5334                                ": %s: Could not disable adapter %d\n",
5335                                priv->net_dev->name, err);
5336                         return err;
5337                 }
5338         }
5339
5340         /* send cmd to firmware */
5341         err = ipw2100_hw_send_command(priv, &cmd);
5342
5343         if (!batch_mode)
5344                 ipw2100_enable_adapter(priv);
5345
5346         return err;
5347 }
5348
5349 static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode)
5350 {
5351         int i, err, auth_mode, sec_level, use_group;
5352
5353         if (!(priv->status & STATUS_RUNNING))
5354                 return 0;
5355
5356         if (!batch_mode) {
5357                 err = ipw2100_disable_adapter(priv);
5358                 if (err)
5359                         return err;
5360         }
5361
5362         if (!priv->ieee->sec.enabled) {
5363                 err =
5364                     ipw2100_set_security_information(priv, IPW_AUTH_OPEN,
5365                                                      SEC_LEVEL_0, 0, 1);
5366         } else {
5367                 auth_mode = IPW_AUTH_OPEN;
5368                 if ((priv->ieee->sec.flags & SEC_AUTH_MODE) &&
5369                     (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY))
5370                         auth_mode = IPW_AUTH_SHARED;
5371
5372                 sec_level = SEC_LEVEL_0;
5373                 if (priv->ieee->sec.flags & SEC_LEVEL)
5374                         sec_level = priv->ieee->sec.level;
5375
5376                 use_group = 0;
5377                 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP)
5378                         use_group = priv->ieee->sec.unicast_uses_group;
5379
5380                 err =
5381                     ipw2100_set_security_information(priv, auth_mode, sec_level,
5382                                                      use_group, 1);
5383         }
5384
5385         if (err)
5386                 goto exit;
5387
5388         if (priv->ieee->sec.enabled) {
5389                 for (i = 0; i < 4; i++) {
5390                         if (!(priv->ieee->sec.flags & (1 << i))) {
5391                                 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN);
5392                                 priv->ieee->sec.key_sizes[i] = 0;
5393                         } else {
5394                                 err = ipw2100_set_key(priv, i,
5395                                                       priv->ieee->sec.keys[i],
5396                                                       priv->ieee->sec.
5397                                                       key_sizes[i], 1);
5398                                 if (err)
5399                                         goto exit;
5400                         }
5401                 }
5402
5403                 ipw2100_set_key_index(priv, priv->ieee->tx_keyidx, 1);
5404         }
5405
5406         /* Always enable privacy so the Host can filter WEP packets if
5407          * encrypted data is sent up */
5408         err =
5409             ipw2100_set_wep_flags(priv,
5410                                   priv->ieee->sec.
5411                                   enabled ? IPW_PRIVACY_CAPABLE : 0, 1);
5412         if (err)
5413                 goto exit;
5414
5415         priv->status &= ~STATUS_SECURITY_UPDATED;
5416
5417       exit:
5418         if (!batch_mode)
5419                 ipw2100_enable_adapter(priv);
5420
5421         return err;
5422 }
5423
5424 static void ipw2100_security_work(struct ipw2100_priv *priv)
5425 {
5426         /* If we happen to have reconnected before we get a chance to
5427          * process this, then update the security settings--which causes
5428          * a disassociation to occur */
5429         if (!(priv->status & STATUS_ASSOCIATED) &&
5430             priv->status & STATUS_SECURITY_UPDATED)
5431                 ipw2100_configure_security(priv, 0);
5432 }
5433
5434 static void shim__set_security(struct net_device *dev,
5435                                struct ieee80211_security *sec)
5436 {
5437         struct ipw2100_priv *priv = ieee80211_priv(dev);
5438         int i, force_update = 0;
5439
5440         down(&priv->action_sem);
5441         if (!(priv->status & STATUS_INITIALIZED))
5442                 goto done;
5443
5444         for (i = 0; i < 4; i++) {
5445                 if (sec->flags & (1 << i)) {
5446                         priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
5447                         if (sec->key_sizes[i] == 0)
5448                                 priv->ieee->sec.flags &= ~(1 << i);
5449                         else
5450                                 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
5451                                        sec->key_sizes[i]);
5452                         if (sec->level == SEC_LEVEL_1) {
5453                                 priv->ieee->sec.flags |= (1 << i);
5454                                 priv->status |= STATUS_SECURITY_UPDATED;
5455                         } else
5456                                 priv->ieee->sec.flags &= ~(1 << i);
5457                 }
5458         }
5459
5460         if ((sec->flags & SEC_ACTIVE_KEY) &&
5461             priv->ieee->sec.active_key != sec->active_key) {
5462                 if (sec->active_key <= 3) {
5463                         priv->ieee->sec.active_key = sec->active_key;
5464                         priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
5465                 } else
5466                         priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
5467
5468                 priv->status |= STATUS_SECURITY_UPDATED;
5469         }
5470
5471         if ((sec->flags & SEC_AUTH_MODE) &&
5472             (priv->ieee->sec.auth_mode != sec->auth_mode)) {
5473                 priv->ieee->sec.auth_mode = sec->auth_mode;
5474                 priv->ieee->sec.flags |= SEC_AUTH_MODE;
5475                 priv->status |= STATUS_SECURITY_UPDATED;
5476         }
5477
5478         if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
5479                 priv->ieee->sec.flags |= SEC_ENABLED;
5480                 priv->ieee->sec.enabled = sec->enabled;
5481                 priv->status |= STATUS_SECURITY_UPDATED;
5482                 force_update = 1;
5483         }
5484
5485         if (sec->flags & SEC_ENCRYPT)
5486                 priv->ieee->sec.encrypt = sec->encrypt;
5487
5488         if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
5489                 priv->ieee->sec.level = sec->level;
5490                 priv->ieee->sec.flags |= SEC_LEVEL;
5491                 priv->status |= STATUS_SECURITY_UPDATED;
5492         }
5493
5494         IPW_DEBUG_WEP("Security flags: %c %c%c%c%c %c%c%c%c\n",
5495                       priv->ieee->sec.flags & (1 << 8) ? '1' : '0',
5496                       priv->ieee->sec.flags & (1 << 7) ? '1' : '0',
5497                       priv->ieee->sec.flags & (1 << 6) ? '1' : '0',
5498                       priv->ieee->sec.flags & (1 << 5) ? '1' : '0',
5499                       priv->ieee->sec.flags & (1 << 4) ? '1' : '0',
5500                       priv->ieee->sec.flags & (1 << 3) ? '1' : '0',
5501                       priv->ieee->sec.flags & (1 << 2) ? '1' : '0',
5502                       priv->ieee->sec.flags & (1 << 1) ? '1' : '0',
5503                       priv->ieee->sec.flags & (1 << 0) ? '1' : '0');
5504
5505 /* As a temporary work around to enable WPA until we figure out why
5506  * wpa_supplicant toggles the security capability of the driver, which
5507  * forces a disassocation with force_update...
5508  *
5509  *      if (force_update || !(priv->status & STATUS_ASSOCIATED))*/
5510         if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
5511                 ipw2100_configure_security(priv, 0);
5512       done:
5513         up(&priv->action_sem);
5514 }
5515
5516 static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5517 {
5518         int err;
5519         int batch_mode = 1;
5520         u8 *bssid;
5521
5522         IPW_DEBUG_INFO("enter\n");
5523
5524         err = ipw2100_disable_adapter(priv);
5525         if (err)
5526                 return err;
5527 #ifdef CONFIG_IPW2100_MONITOR
5528         if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
5529                 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5530                 if (err)
5531                         return err;
5532
5533                 IPW_DEBUG_INFO("exit\n");
5534
5535                 return 0;
5536         }
5537 #endif                          /* CONFIG_IPW2100_MONITOR */
5538
5539         err = ipw2100_read_mac_address(priv);
5540         if (err)
5541                 return -EIO;
5542
5543         err = ipw2100_set_mac_address(priv, batch_mode);
5544         if (err)
5545                 return err;
5546
5547         err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode);
5548         if (err)
5549                 return err;
5550
5551         if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5552                 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5553                 if (err)
5554                         return err;
5555         }
5556
5557         err = ipw2100_system_config(priv, batch_mode);
5558         if (err)
5559                 return err;
5560
5561         err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode);
5562         if (err)
5563                 return err;
5564
5565         /* Default to power mode OFF */
5566         err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
5567         if (err)
5568                 return err;
5569
5570         err = ipw2100_set_rts_threshold(priv, priv->rts_threshold);
5571         if (err)
5572                 return err;
5573
5574         if (priv->config & CFG_STATIC_BSSID)
5575                 bssid = priv->bssid;
5576         else
5577                 bssid = NULL;
5578         err = ipw2100_set_mandatory_bssid(priv, bssid, batch_mode);
5579         if (err)
5580                 return err;
5581
5582         if (priv->config & CFG_STATIC_ESSID)
5583                 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len,
5584                                         batch_mode);
5585         else
5586                 err = ipw2100_set_essid(priv, NULL, 0, batch_mode);
5587         if (err)
5588                 return err;
5589
5590         err = ipw2100_configure_security(priv, batch_mode);
5591         if (err)
5592                 return err;
5593
5594         if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5595                 err =
5596                     ipw2100_set_ibss_beacon_interval(priv,
5597                                                      priv->beacon_interval,
5598                                                      batch_mode);
5599                 if (err)
5600                         return err;
5601
5602                 err = ipw2100_set_tx_power(priv, priv->tx_power);
5603                 if (err)
5604                         return err;
5605         }
5606
5607         /*
5608            err = ipw2100_set_fragmentation_threshold(
5609            priv, priv->frag_threshold, batch_mode);
5610            if (err)
5611            return err;
5612          */
5613
5614         IPW_DEBUG_INFO("exit\n");
5615
5616         return 0;
5617 }
5618
5619 /*************************************************************************
5620  *
5621  * EXTERNALLY CALLED METHODS
5622  *
5623  *************************************************************************/
5624
5625 /* This method is called by the network layer -- not to be confused with
5626  * ipw2100_set_mac_address() declared above called by this driver (and this
5627  * method as well) to talk to the firmware */
5628 static int ipw2100_set_address(struct net_device *dev, void *p)
5629 {
5630         struct ipw2100_priv *priv = ieee80211_priv(dev);
5631         struct sockaddr *addr = p;
5632         int err = 0;
5633
5634         if (!is_valid_ether_addr(addr->sa_data))
5635                 return -EADDRNOTAVAIL;
5636
5637         down(&priv->action_sem);
5638
5639         priv->config |= CFG_CUSTOM_MAC;
5640         memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
5641
5642         err = ipw2100_set_mac_address(priv, 0);
5643         if (err)
5644                 goto done;
5645
5646         priv->reset_backoff = 0;
5647         up(&priv->action_sem);
5648         ipw2100_reset_adapter(priv);
5649         return 0;
5650
5651       done:
5652         up(&priv->action_sem);
5653         return err;
5654 }
5655
5656 static int ipw2100_open(struct net_device *dev)
5657 {
5658         struct ipw2100_priv *priv = ieee80211_priv(dev);
5659         unsigned long flags;
5660         IPW_DEBUG_INFO("dev->open\n");
5661
5662         spin_lock_irqsave(&priv->low_lock, flags);
5663         if (priv->status & STATUS_ASSOCIATED) {
5664                 netif_carrier_on(dev);
5665                 netif_start_queue(dev);
5666         }
5667         spin_unlock_irqrestore(&priv->low_lock, flags);
5668
5669         return 0;
5670 }
5671
5672 static int ipw2100_close(struct net_device *dev)
5673 {
5674         struct ipw2100_priv *priv = ieee80211_priv(dev);
5675         unsigned long flags;
5676         struct list_head *element;
5677         struct ipw2100_tx_packet *packet;
5678
5679         IPW_DEBUG_INFO("enter\n");
5680
5681         spin_lock_irqsave(&priv->low_lock, flags);
5682
5683         if (priv->status & STATUS_ASSOCIATED)
5684                 netif_carrier_off(dev);
5685         netif_stop_queue(dev);
5686
5687         /* Flush the TX queue ... */
5688         while (!list_empty(&priv->tx_pend_list)) {
5689                 element = priv->tx_pend_list.next;
5690                 packet = list_entry(element, struct ipw2100_tx_packet, list);
5691
5692                 list_del(element);
5693                 DEC_STAT(&priv->tx_pend_stat);
5694
5695                 ieee80211_txb_free(packet->info.d_struct.txb);
5696                 packet->info.d_struct.txb = NULL;
5697
5698                 list_add_tail(element, &priv->tx_free_list);
5699                 INC_STAT(&priv->tx_free_stat);
5700         }
5701         spin_unlock_irqrestore(&priv->low_lock, flags);
5702
5703         IPW_DEBUG_INFO("exit\n");
5704
5705         return 0;
5706 }
5707
5708 /*
5709  * TODO:  Fix this function... its just wrong
5710  */
5711 static void ipw2100_tx_timeout(struct net_device *dev)
5712 {
5713         struct ipw2100_priv *priv = ieee80211_priv(dev);
5714
5715         priv->ieee->stats.tx_errors++;
5716
5717 #ifdef CONFIG_IPW2100_MONITOR
5718         if (priv->ieee->iw_mode == IW_MODE_MONITOR)
5719                 return;
5720 #endif
5721
5722         IPW_DEBUG_INFO("%s: TX timed out.  Scheduling firmware restart.\n",
5723                        dev->name);
5724         schedule_reset(priv);
5725 }
5726
5727 /*
5728  * TODO: reimplement it so that it reads statistics
5729  *       from the adapter using ordinal tables
5730  *       instead of/in addition to collecting them
5731  *       in the driver
5732  */
5733 static struct net_device_stats *ipw2100_stats(struct net_device *dev)
5734 {
5735         struct ipw2100_priv *priv = ieee80211_priv(dev);
5736
5737         return &priv->ieee->stats;
5738 }
5739
5740 static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value)
5741 {
5742         /* This is called when wpa_supplicant loads and closes the driver
5743          * interface. */
5744         priv->ieee->wpa_enabled = value;
5745         return 0;
5746 }
5747
5748 static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
5749 {
5750
5751         struct ieee80211_device *ieee = priv->ieee;
5752         struct ieee80211_security sec = {
5753                 .flags = SEC_AUTH_MODE,
5754         };
5755         int ret = 0;
5756
5757         if (value & IW_AUTH_ALG_SHARED_KEY) {
5758                 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
5759                 ieee->open_wep = 0;
5760         } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
5761                 sec.auth_mode = WLAN_AUTH_OPEN;
5762                 ieee->open_wep = 1;
5763         } else
5764                 return -EINVAL;
5765
5766         if (ieee->set_security)
5767                 ieee->set_security(ieee->dev, &sec);
5768         else
5769                 ret = -EOPNOTSUPP;
5770
5771         return ret;
5772 }
5773
5774 void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
5775                              char *wpa_ie, int wpa_ie_len)
5776 {
5777
5778         struct ipw2100_wpa_assoc_frame frame;
5779
5780         frame.fixed_ie_mask = 0;
5781
5782         /* copy WPA IE */
5783         memcpy(frame.var_ie, wpa_ie, wpa_ie_len);
5784         frame.var_ie_len = wpa_ie_len;
5785
5786         /* make sure WPA is enabled */
5787         ipw2100_wpa_enable(priv, 1);
5788         ipw2100_set_wpa_ie(priv, &frame, 0);
5789 }
5790
5791 static void ipw_ethtool_get_drvinfo(struct net_device *dev,
5792                                     struct ethtool_drvinfo *info)
5793 {
5794         struct ipw2100_priv *priv = ieee80211_priv(dev);
5795         char fw_ver[64], ucode_ver[64];
5796
5797         strcpy(info->driver, DRV_NAME);
5798         strcpy(info->version, DRV_VERSION);
5799
5800         ipw2100_get_fwversion(priv, fw_ver, sizeof(fw_ver));
5801         ipw2100_get_ucodeversion(priv, ucode_ver, sizeof(ucode_ver));
5802
5803         snprintf(info->fw_version, sizeof(info->fw_version), "%s:%d:%s",
5804                  fw_ver, priv->eeprom_version, ucode_ver);
5805
5806         strcpy(info->bus_info, pci_name(priv->pci_dev));
5807 }
5808
5809 static u32 ipw2100_ethtool_get_link(struct net_device *dev)
5810 {
5811         struct ipw2100_priv *priv = ieee80211_priv(dev);
5812         return (priv->status & STATUS_ASSOCIATED) ? 1 : 0;
5813 }
5814
5815 static struct ethtool_ops ipw2100_ethtool_ops = {
5816         .get_link = ipw2100_ethtool_get_link,
5817         .get_drvinfo = ipw_ethtool_get_drvinfo,
5818 };
5819
5820 static void ipw2100_hang_check(void *adapter)
5821 {
5822         struct ipw2100_priv *priv = adapter;
5823         unsigned long flags;
5824         u32 rtc = 0xa5a5a5a5;
5825         u32 len = sizeof(rtc);
5826         int restart = 0;
5827
5828         spin_lock_irqsave(&priv->low_lock, flags);
5829
5830         if (priv->fatal_error != 0) {
5831                 /* If fatal_error is set then we need to restart */
5832                 IPW_DEBUG_INFO("%s: Hardware fatal error detected.\n",
5833                                priv->net_dev->name);
5834
5835                 restart = 1;
5836         } else if (ipw2100_get_ordinal(priv, IPW_ORD_RTC_TIME, &rtc, &len) ||
5837                    (rtc == priv->last_rtc)) {
5838                 /* Check if firmware is hung */
5839                 IPW_DEBUG_INFO("%s: Firmware RTC stalled.\n",
5840                                priv->net_dev->name);
5841
5842                 restart = 1;
5843         }
5844
5845         if (restart) {
5846                 /* Kill timer */
5847                 priv->stop_hang_check = 1;
5848                 priv->hangs++;
5849
5850                 /* Restart the NIC */
5851                 schedule_reset(priv);
5852         }
5853
5854         priv->last_rtc = rtc;
5855
5856         if (!priv->stop_hang_check)
5857                 queue_delayed_work(priv->workqueue, &priv->hang_check, HZ / 2);
5858
5859         spin_unlock_irqrestore(&priv->low_lock, flags);
5860 }
5861
5862 static void ipw2100_rf_kill(void *adapter)
5863 {
5864         struct ipw2100_priv *priv = adapter;
5865         unsigned long flags;
5866
5867         spin_lock_irqsave(&priv->low_lock, flags);
5868
5869         if (rf_kill_active(priv)) {
5870                 IPW_DEBUG_RF_KILL("RF Kill active, rescheduling GPIO check\n");
5871                 if (!priv->stop_rf_kill)
5872                         queue_delayed_work(priv->workqueue, &priv->rf_kill, HZ);
5873                 goto exit_unlock;
5874         }
5875
5876         /* RF Kill is now disabled, so bring the device back up */
5877
5878         if (!(priv->status & STATUS_RF_KILL_MASK)) {
5879                 IPW_DEBUG_RF_KILL("HW RF Kill no longer active, restarting "
5880                                   "device\n");
5881                 schedule_reset(priv);
5882         } else
5883                 IPW_DEBUG_RF_KILL("HW RF Kill deactivated.  SW RF Kill still "
5884                                   "enabled\n");
5885
5886       exit_unlock:
5887         spin_unlock_irqrestore(&priv->low_lock, flags);
5888 }
5889
5890 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv);
5891
5892 /* Look into using netdev destructor to shutdown ieee80211? */
5893
5894 static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
5895                                                void __iomem * base_addr,
5896                                                unsigned long mem_start,
5897                                                unsigned long mem_len)
5898 {
5899         struct ipw2100_priv *priv;
5900         struct net_device *dev;
5901
5902         dev = alloc_ieee80211(sizeof(struct ipw2100_priv));
5903         if (!dev)
5904                 return NULL;
5905         priv = ieee80211_priv(dev);
5906         priv->ieee = netdev_priv(dev);
5907         priv->pci_dev = pci_dev;
5908         priv->net_dev = dev;
5909
5910         priv->ieee->hard_start_xmit = ipw2100_tx;
5911         priv->ieee->set_security = shim__set_security;
5912
5913         priv->ieee->perfect_rssi = -20;
5914         priv->ieee->worst_rssi = -85;
5915
5916         dev->open = ipw2100_open;
5917         dev->stop = ipw2100_close;
5918         dev->init = ipw2100_net_init;
5919         dev->get_stats = ipw2100_stats;
5920         dev->ethtool_ops = &ipw2100_ethtool_ops;
5921         dev->tx_timeout = ipw2100_tx_timeout;
5922         dev->wireless_handlers = &ipw2100_wx_handler_def;
5923         priv->wireless_data.ieee80211 = priv->ieee;
5924         dev->wireless_data = &priv->wireless_data;
5925         dev->set_mac_address = ipw2100_set_address;
5926         dev->watchdog_timeo = 3 * HZ;
5927         dev->irq = 0;
5928
5929         dev->base_addr = (unsigned long)base_addr;
5930         dev->mem_start = mem_start;
5931         dev->mem_end = dev->mem_start + mem_len - 1;
5932
5933         /* NOTE: We don't use the wireless_handlers hook
5934          * in dev as the system will start throwing WX requests
5935          * to us before we're actually initialized and it just
5936          * ends up causing problems.  So, we just handle
5937          * the WX extensions through the ipw2100_ioctl interface */
5938
5939         /* memset() puts everything to 0, so we only have explicitely set
5940          * those values that need to be something else */
5941
5942         /* If power management is turned on, default to AUTO mode */
5943         priv->power_mode = IPW_POWER_AUTO;
5944
5945 #ifdef CONFIG_IPW2100_MONITOR
5946         priv->config |= CFG_CRC_CHECK;
5947 #endif
5948         priv->ieee->wpa_enabled = 0;
5949         priv->ieee->drop_unencrypted = 0;
5950         priv->ieee->privacy_invoked = 0;
5951         priv->ieee->ieee802_1x = 1;
5952
5953         /* Set module parameters */
5954         switch (mode) {
5955         case 1:
5956                 priv->ieee->iw_mode = IW_MODE_ADHOC;
5957                 break;
5958 #ifdef CONFIG_IPW2100_MONITOR
5959         case 2:
5960                 priv->ieee->iw_mode = IW_MODE_MONITOR;
5961                 break;
5962 #endif
5963         default:
5964         case 0:
5965                 priv->ieee->iw_mode = IW_MODE_INFRA;
5966                 break;
5967         }
5968
5969         if (disable == 1)
5970                 priv->status |= STATUS_RF_KILL_SW;
5971
5972         if (channel != 0 &&
5973             ((channel >= REG_MIN_CHANNEL) && (channel <= REG_MAX_CHANNEL))) {
5974                 priv->config |= CFG_STATIC_CHANNEL;
5975                 priv->channel = channel;
5976         }
5977
5978         if (associate)
5979                 priv->config |= CFG_ASSOCIATE;
5980
5981         priv->beacon_interval = DEFAULT_BEACON_INTERVAL;
5982         priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT;
5983         priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT;
5984         priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED;
5985         priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED;
5986         priv->tx_power = IPW_TX_POWER_DEFAULT;
5987         priv->tx_rates = DEFAULT_TX_RATES;
5988
5989         strcpy(priv->nick, "ipw2100");
5990
5991         spin_lock_init(&priv->low_lock);
5992         sema_init(&priv->action_sem, 1);
5993         sema_init(&priv->adapter_sem, 1);
5994
5995         init_waitqueue_head(&priv->wait_command_queue);
5996
5997         netif_carrier_off(dev);
5998
5999         INIT_LIST_HEAD(&priv->msg_free_list);
6000         INIT_LIST_HEAD(&priv->msg_pend_list);
6001         INIT_STAT(&priv->msg_free_stat);
6002         INIT_STAT(&priv->msg_pend_stat);
6003
6004         INIT_LIST_HEAD(&priv->tx_free_list);
6005         INIT_LIST_HEAD(&priv->tx_pend_list);
6006         INIT_STAT(&priv->tx_free_stat);
6007         INIT_STAT(&priv->tx_pend_stat);
6008
6009         INIT_LIST_HEAD(&priv->fw_pend_list);
6010         INIT_STAT(&priv->fw_pend_stat);
6011
6012         priv->workqueue = create_workqueue(DRV_NAME);
6013
6014         INIT_WORK(&priv->reset_work,
6015                   (void (*)(void *))ipw2100_reset_adapter, priv);
6016         INIT_WORK(&priv->security_work,
6017                   (void (*)(void *))ipw2100_security_work, priv);
6018         INIT_WORK(&priv->wx_event_work,
6019                   (void (*)(void *))ipw2100_wx_event_work, priv);
6020         INIT_WORK(&priv->hang_check, ipw2100_hang_check, priv);
6021         INIT_WORK(&priv->rf_kill, ipw2100_rf_kill, priv);
6022
6023         tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
6024                      ipw2100_irq_tasklet, (unsigned long)priv);
6025
6026         /* NOTE:  We do not start the deferred work for status checks yet */
6027         priv->stop_rf_kill = 1;
6028         priv->stop_hang_check = 1;
6029
6030         return dev;
6031 }
6032
6033 static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6034                                 const struct pci_device_id *ent)
6035 {
6036         unsigned long mem_start, mem_len, mem_flags;
6037         void __iomem *base_addr = NULL;
6038         struct net_device *dev = NULL;
6039         struct ipw2100_priv *priv = NULL;
6040         int err = 0;
6041         int registered = 0;
6042         u32 val;
6043
6044         IPW_DEBUG_INFO("enter\n");
6045
6046         mem_start = pci_resource_start(pci_dev, 0);
6047         mem_len = pci_resource_len(pci_dev, 0);
6048         mem_flags = pci_resource_flags(pci_dev, 0);
6049
6050         if ((mem_flags & IORESOURCE_MEM) != IORESOURCE_MEM) {
6051                 IPW_DEBUG_INFO("weird - resource type is not memory\n");
6052                 err = -ENODEV;
6053                 goto fail;
6054         }
6055
6056         base_addr = ioremap_nocache(mem_start, mem_len);
6057         if (!base_addr) {
6058                 printk(KERN_WARNING DRV_NAME
6059                        "Error calling ioremap_nocache.\n");
6060                 err = -EIO;
6061                 goto fail;
6062         }
6063
6064         /* allocate and initialize our net_device */
6065         dev = ipw2100_alloc_device(pci_dev, base_addr, mem_start, mem_len);
6066         if (!dev) {
6067                 printk(KERN_WARNING DRV_NAME
6068                        "Error calling ipw2100_alloc_device.\n");
6069                 err = -ENOMEM;
6070                 goto fail;
6071         }
6072
6073         /* set up PCI mappings for device */
6074         err = pci_enable_device(pci_dev);
6075         if (err) {
6076                 printk(KERN_WARNING DRV_NAME
6077                        "Error calling pci_enable_device.\n");
6078                 return err;
6079         }
6080
6081         priv = ieee80211_priv(dev);
6082
6083         pci_set_master(pci_dev);
6084         pci_set_drvdata(pci_dev, priv);
6085
6086         err = pci_set_dma_mask(pci_dev, DMA_32BIT_MASK);
6087         if (err) {
6088                 printk(KERN_WARNING DRV_NAME
6089                        "Error calling pci_set_dma_mask.\n");
6090                 pci_disable_device(pci_dev);
6091                 return err;
6092         }
6093
6094         err = pci_request_regions(pci_dev, DRV_NAME);
6095         if (err) {
6096                 printk(KERN_WARNING DRV_NAME
6097                        "Error calling pci_request_regions.\n");
6098                 pci_disable_device(pci_dev);
6099                 return err;
6100         }
6101
6102         /* We disable the RETRY_TIMEOUT register (0x41) to keep
6103          * PCI Tx retries from interfering with C3 CPU state */
6104         pci_read_config_dword(pci_dev, 0x40, &val);
6105         if ((val & 0x0000ff00) != 0)
6106                 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6107
6108         pci_set_power_state(pci_dev, PCI_D0);
6109
6110         if (!ipw2100_hw_is_adapter_in_system(dev)) {
6111                 printk(KERN_WARNING DRV_NAME
6112                        "Device not found via register read.\n");
6113                 err = -ENODEV;
6114                 goto fail;
6115         }
6116
6117         SET_NETDEV_DEV(dev, &pci_dev->dev);
6118
6119         /* Force interrupts to be shut off on the device */
6120         priv->status |= STATUS_INT_ENABLED;
6121         ipw2100_disable_interrupts(priv);
6122
6123         /* Allocate and initialize the Tx/Rx queues and lists */
6124         if (ipw2100_queues_allocate(priv)) {
6125                 printk(KERN_WARNING DRV_NAME
6126                        "Error calilng ipw2100_queues_allocate.\n");
6127                 err = -ENOMEM;
6128                 goto fail;
6129         }
6130         ipw2100_queues_initialize(priv);
6131
6132         err = request_irq(pci_dev->irq,
6133                           ipw2100_interrupt, SA_SHIRQ, dev->name, priv);
6134         if (err) {
6135                 printk(KERN_WARNING DRV_NAME
6136                        "Error calling request_irq: %d.\n", pci_dev->irq);
6137                 goto fail;
6138         }
6139         dev->irq = pci_dev->irq;
6140
6141         IPW_DEBUG_INFO("Attempting to register device...\n");
6142
6143         SET_MODULE_OWNER(dev);
6144
6145         printk(KERN_INFO DRV_NAME
6146                ": Detected Intel PRO/Wireless 2100 Network Connection\n");
6147
6148         /* Bring up the interface.  Pre 0.46, after we registered the
6149          * network device we would call ipw2100_up.  This introduced a race
6150          * condition with newer hotplug configurations (network was coming
6151          * up and making calls before the device was initialized).
6152          *
6153          * If we called ipw2100_up before we registered the device, then the
6154          * device name wasn't registered.  So, we instead use the net_dev->init
6155          * member to call a function that then just turns and calls ipw2100_up.
6156          * net_dev->init is called after name allocation but before the
6157          * notifier chain is called */
6158         down(&priv->action_sem);
6159         err = register_netdev(dev);
6160         if (err) {
6161                 printk(KERN_WARNING DRV_NAME
6162                        "Error calling register_netdev.\n");
6163                 goto fail_unlock;
6164         }
6165         registered = 1;
6166
6167         IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev));
6168
6169         /* perform this after register_netdev so that dev->name is set */
6170         sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6171
6172         /* If the RF Kill switch is disabled, go ahead and complete the
6173          * startup sequence */
6174         if (!(priv->status & STATUS_RF_KILL_MASK)) {
6175                 /* Enable the adapter - sends HOST_COMPLETE */
6176                 if (ipw2100_enable_adapter(priv)) {
6177                         printk(KERN_WARNING DRV_NAME
6178                                ": %s: failed in call to enable adapter.\n",
6179                                priv->net_dev->name);
6180                         ipw2100_hw_stop_adapter(priv);
6181                         err = -EIO;
6182                         goto fail_unlock;
6183                 }
6184
6185                 /* Start a scan . . . */
6186                 ipw2100_set_scan_options(priv);
6187                 ipw2100_start_scan(priv);
6188         }
6189
6190         IPW_DEBUG_INFO("exit\n");
6191
6192         priv->status |= STATUS_INITIALIZED;
6193
6194         up(&priv->action_sem);
6195
6196         return 0;
6197
6198       fail_unlock:
6199         up(&priv->action_sem);
6200
6201       fail:
6202         if (dev) {
6203                 if (registered)
6204                         unregister_netdev(dev);
6205
6206                 ipw2100_hw_stop_adapter(priv);
6207
6208                 ipw2100_disable_interrupts(priv);
6209
6210                 if (dev->irq)
6211                         free_irq(dev->irq, priv);
6212
6213                 ipw2100_kill_workqueue(priv);
6214
6215                 /* These are safe to call even if they weren't allocated */
6216                 ipw2100_queues_free(priv);
6217                 sysfs_remove_group(&pci_dev->dev.kobj,
6218                                    &ipw2100_attribute_group);
6219
6220                 free_ieee80211(dev);
6221                 pci_set_drvdata(pci_dev, NULL);
6222         }
6223
6224         if (base_addr)
6225                 iounmap(base_addr);
6226
6227         pci_release_regions(pci_dev);
6228         pci_disable_device(pci_dev);
6229
6230         return err;
6231 }
6232
6233 static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6234 {
6235         struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6236         struct net_device *dev;
6237
6238         if (priv) {
6239                 down(&priv->action_sem);
6240
6241                 priv->status &= ~STATUS_INITIALIZED;
6242
6243                 dev = priv->net_dev;
6244                 sysfs_remove_group(&pci_dev->dev.kobj,
6245                                    &ipw2100_attribute_group);
6246
6247 #ifdef CONFIG_PM
6248                 if (ipw2100_firmware.version)
6249                         ipw2100_release_firmware(priv, &ipw2100_firmware);
6250 #endif
6251                 /* Take down the hardware */
6252                 ipw2100_down(priv);
6253
6254                 /* Release the semaphore so that the network subsystem can
6255                  * complete any needed calls into the driver... */
6256                 up(&priv->action_sem);
6257
6258                 /* Unregister the device first - this results in close()
6259                  * being called if the device is open.  If we free storage
6260                  * first, then close() will crash. */
6261                 unregister_netdev(dev);
6262
6263                 /* ipw2100_down will ensure that there is no more pending work
6264                  * in the workqueue's, so we can safely remove them now. */
6265                 ipw2100_kill_workqueue(priv);
6266
6267                 ipw2100_queues_free(priv);
6268
6269                 /* Free potential debugging firmware snapshot */
6270                 ipw2100_snapshot_free(priv);
6271
6272                 if (dev->irq)
6273                         free_irq(dev->irq, priv);
6274
6275                 if (dev->base_addr)
6276                         iounmap((void __iomem *)dev->base_addr);
6277
6278                 free_ieee80211(dev);
6279         }
6280
6281         pci_release_regions(pci_dev);
6282         pci_disable_device(pci_dev);
6283
6284         IPW_DEBUG_INFO("exit\n");
6285 }
6286
6287 #ifdef CONFIG_PM
6288 static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6289 {
6290         struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6291         struct net_device *dev = priv->net_dev;
6292
6293         IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name);
6294
6295         down(&priv->action_sem);
6296         if (priv->status & STATUS_INITIALIZED) {
6297                 /* Take down the device; powers it off, etc. */
6298                 ipw2100_down(priv);
6299         }
6300
6301         /* Remove the PRESENT state of the device */
6302         netif_device_detach(dev);
6303
6304         pci_save_state(pci_dev);
6305         pci_disable_device(pci_dev);
6306         pci_set_power_state(pci_dev, PCI_D3hot);
6307
6308         up(&priv->action_sem);
6309
6310         return 0;
6311 }
6312
6313 static int ipw2100_resume(struct pci_dev *pci_dev)
6314 {
6315         struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6316         struct net_device *dev = priv->net_dev;
6317         u32 val;
6318
6319         if (IPW2100_PM_DISABLED)
6320                 return 0;
6321
6322         down(&priv->action_sem);
6323
6324         IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name);
6325
6326         pci_set_power_state(pci_dev, PCI_D0);
6327         pci_enable_device(pci_dev);
6328         pci_restore_state(pci_dev);
6329
6330         /*
6331          * Suspend/Resume resets the PCI configuration space, so we have to
6332          * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
6333          * from interfering with C3 CPU state. pci_restore_state won't help
6334          * here since it only restores the first 64 bytes pci config header.
6335          */
6336         pci_read_config_dword(pci_dev, 0x40, &val);
6337         if ((val & 0x0000ff00) != 0)
6338                 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6339
6340         /* Set the device back into the PRESENT state; this will also wake
6341          * the queue of needed */
6342         netif_device_attach(dev);
6343
6344         /* Bring the device back up */
6345         if (!(priv->status & STATUS_RF_KILL_SW))
6346                 ipw2100_up(priv, 0);
6347
6348         up(&priv->action_sem);
6349
6350         return 0;
6351 }
6352 #endif
6353
6354 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
6355
6356 static struct pci_device_id ipw2100_pci_id_table[] __devinitdata = {
6357         IPW2100_DEV_ID(0x2520), /* IN 2100A mPCI 3A */
6358         IPW2100_DEV_ID(0x2521), /* IN 2100A mPCI 3B */
6359         IPW2100_DEV_ID(0x2524), /* IN 2100A mPCI 3B */
6360         IPW2100_DEV_ID(0x2525), /* IN 2100A mPCI 3B */
6361         IPW2100_DEV_ID(0x2526), /* IN 2100A mPCI Gen A3 */
6362         IPW2100_DEV_ID(0x2522), /* IN 2100 mPCI 3B */
6363         IPW2100_DEV_ID(0x2523), /* IN 2100 mPCI 3A */
6364         IPW2100_DEV_ID(0x2527), /* IN 2100 mPCI 3B */
6365         IPW2100_DEV_ID(0x2528), /* IN 2100 mPCI 3B */
6366         IPW2100_DEV_ID(0x2529), /* IN 2100 mPCI 3B */
6367         IPW2100_DEV_ID(0x252B), /* IN 2100 mPCI 3A */
6368         IPW2100_DEV_ID(0x252C), /* IN 2100 mPCI 3A */
6369         IPW2100_DEV_ID(0x252D), /* IN 2100 mPCI 3A */
6370
6371         IPW2100_DEV_ID(0x2550), /* IB 2100A mPCI 3B */
6372         IPW2100_DEV_ID(0x2551), /* IB 2100 mPCI 3B */
6373         IPW2100_DEV_ID(0x2553), /* IB 2100 mPCI 3B */
6374         IPW2100_DEV_ID(0x2554), /* IB 2100 mPCI 3B */
6375         IPW2100_DEV_ID(0x2555), /* IB 2100 mPCI 3B */
6376
6377         IPW2100_DEV_ID(0x2560), /* DE 2100A mPCI 3A */
6378         IPW2100_DEV_ID(0x2562), /* DE 2100A mPCI 3A */
6379         IPW2100_DEV_ID(0x2563), /* DE 2100A mPCI 3A */
6380         IPW2100_DEV_ID(0x2561), /* DE 2100 mPCI 3A */
6381         IPW2100_DEV_ID(0x2565), /* DE 2100 mPCI 3A */
6382         IPW2100_DEV_ID(0x2566), /* DE 2100 mPCI 3A */
6383         IPW2100_DEV_ID(0x2567), /* DE 2100 mPCI 3A */
6384
6385         IPW2100_DEV_ID(0x2570), /* GA 2100 mPCI 3B */
6386
6387         IPW2100_DEV_ID(0x2580), /* TO 2100A mPCI 3B */
6388         IPW2100_DEV_ID(0x2582), /* TO 2100A mPCI 3B */
6389         IPW2100_DEV_ID(0x2583), /* TO 2100A mPCI 3B */
6390         IPW2100_DEV_ID(0x2581), /* TO 2100 mPCI 3B */
6391         IPW2100_DEV_ID(0x2585), /* TO 2100 mPCI 3B */
6392         IPW2100_DEV_ID(0x2586), /* TO 2100 mPCI 3B */
6393         IPW2100_DEV_ID(0x2587), /* TO 2100 mPCI 3B */
6394
6395         IPW2100_DEV_ID(0x2590), /* SO 2100A mPCI 3B */
6396         IPW2100_DEV_ID(0x2592), /* SO 2100A mPCI 3B */
6397         IPW2100_DEV_ID(0x2591), /* SO 2100 mPCI 3B */
6398         IPW2100_DEV_ID(0x2593), /* SO 2100 mPCI 3B */
6399         IPW2100_DEV_ID(0x2596), /* SO 2100 mPCI 3B */
6400         IPW2100_DEV_ID(0x2598), /* SO 2100 mPCI 3B */
6401
6402         IPW2100_DEV_ID(0x25A0), /* HP 2100 mPCI 3B */
6403         {0,},
6404 };
6405
6406 MODULE_DEVICE_TABLE(pci, ipw2100_pci_id_table);
6407
6408 static struct pci_driver ipw2100_pci_driver = {
6409         .name = DRV_NAME,
6410         .id_table = ipw2100_pci_id_table,
6411         .probe = ipw2100_pci_init_one,
6412         .remove = __devexit_p(ipw2100_pci_remove_one),
6413 #ifdef CONFIG_PM
6414         .suspend = ipw2100_suspend,
6415         .resume = ipw2100_resume,
6416 #endif
6417 };
6418
6419 /**
6420  * Initialize the ipw2100 driver/module
6421  *
6422  * @returns 0 if ok, < 0 errno node con error.
6423  *
6424  * Note: we cannot init the /proc stuff until the PCI driver is there,
6425  * or we risk an unlikely race condition on someone accessing
6426  * uninitialized data in the PCI dev struct through /proc.
6427  */
6428 static int __init ipw2100_init(void)
6429 {
6430         int ret;
6431
6432         printk(KERN_INFO DRV_NAME ": %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
6433         printk(KERN_INFO DRV_NAME ": %s\n", DRV_COPYRIGHT);
6434
6435         ret = pci_module_init(&ipw2100_pci_driver);
6436
6437 #ifdef CONFIG_IPW2100_DEBUG
6438         ipw2100_debug_level = debug;
6439         driver_create_file(&ipw2100_pci_driver.driver,
6440                            &driver_attr_debug_level);
6441 #endif
6442
6443         return ret;
6444 }
6445
6446 /**
6447  * Cleanup ipw2100 driver registration
6448  */
6449 static void __exit ipw2100_exit(void)
6450 {
6451         /* FIXME: IPG: check that we have no instances of the devices open */
6452 #ifdef CONFIG_IPW2100_DEBUG
6453         driver_remove_file(&ipw2100_pci_driver.driver,
6454                            &driver_attr_debug_level);
6455 #endif
6456         pci_unregister_driver(&ipw2100_pci_driver);
6457 }
6458
6459 module_init(ipw2100_init);
6460 module_exit(ipw2100_exit);
6461
6462 #define WEXT_USECHANNELS 1
6463
6464 static const long ipw2100_frequencies[] = {
6465         2412, 2417, 2422, 2427,
6466         2432, 2437, 2442, 2447,
6467         2452, 2457, 2462, 2467,
6468         2472, 2484
6469 };
6470
6471 #define FREQ_COUNT (sizeof(ipw2100_frequencies) / \
6472                     sizeof(ipw2100_frequencies[0]))
6473
6474 static const long ipw2100_rates_11b[] = {
6475         1000000,
6476         2000000,
6477         5500000,
6478         11000000
6479 };
6480
6481 #define RATE_COUNT (sizeof(ipw2100_rates_11b) / sizeof(ipw2100_rates_11b[0]))
6482
6483 static int ipw2100_wx_get_name(struct net_device *dev,
6484                                struct iw_request_info *info,
6485                                union iwreq_data *wrqu, char *extra)
6486 {
6487         /*
6488          * This can be called at any time.  No action lock required
6489          */
6490
6491         struct ipw2100_priv *priv = ieee80211_priv(dev);
6492         if (!(priv->status & STATUS_ASSOCIATED))
6493                 strcpy(wrqu->name, "unassociated");
6494         else
6495                 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b");
6496
6497         IPW_DEBUG_WX("Name: %s\n", wrqu->name);
6498         return 0;
6499 }
6500
6501 static int ipw2100_wx_set_freq(struct net_device *dev,
6502                                struct iw_request_info *info,
6503                                union iwreq_data *wrqu, char *extra)
6504 {
6505         struct ipw2100_priv *priv = ieee80211_priv(dev);
6506         struct iw_freq *fwrq = &wrqu->freq;
6507         int err = 0;
6508
6509         if (priv->ieee->iw_mode == IW_MODE_INFRA)
6510                 return -EOPNOTSUPP;
6511
6512         down(&priv->action_sem);
6513         if (!(priv->status & STATUS_INITIALIZED)) {
6514                 err = -EIO;
6515                 goto done;
6516         }
6517
6518         /* if setting by freq convert to channel */
6519         if (fwrq->e == 1) {
6520                 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) {
6521                         int f = fwrq->m / 100000;
6522                         int c = 0;
6523
6524                         while ((c < REG_MAX_CHANNEL) &&
6525                                (f != ipw2100_frequencies[c]))
6526                                 c++;
6527
6528                         /* hack to fall through */
6529                         fwrq->e = 0;
6530                         fwrq->m = c + 1;
6531                 }
6532         }
6533
6534         if (fwrq->e > 0 || fwrq->m > 1000) {
6535                 err = -EOPNOTSUPP;
6536                 goto done;
6537         } else {                /* Set the channel */
6538                 IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m);
6539                 err = ipw2100_set_channel(priv, fwrq->m, 0);
6540         }
6541
6542       done:
6543         up(&priv->action_sem);
6544         return err;
6545 }
6546
6547 static int ipw2100_wx_get_freq(struct net_device *dev,
6548                                struct iw_request_info *info,
6549                                union iwreq_data *wrqu, char *extra)
6550 {
6551         /*
6552          * This can be called at any time.  No action lock required
6553          */
6554
6555         struct ipw2100_priv *priv = ieee80211_priv(dev);
6556
6557         wrqu->freq.e = 0;
6558
6559         /* If we are associated, trying to associate, or have a statically
6560          * configured CHANNEL then return that; otherwise return ANY */
6561         if (priv->config & CFG_STATIC_CHANNEL ||
6562             priv->status & STATUS_ASSOCIATED)
6563                 wrqu->freq.m = priv->channel;
6564         else
6565                 wrqu->freq.m = 0;
6566
6567         IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel);
6568         return 0;
6569
6570 }
6571
6572 static int ipw2100_wx_set_mode(struct net_device *dev,
6573                                struct iw_request_info *info,
6574                                union iwreq_data *wrqu, char *extra)
6575 {
6576         struct ipw2100_priv *priv = ieee80211_priv(dev);
6577         int err = 0;
6578
6579         IPW_DEBUG_WX("SET Mode -> %d \n", wrqu->mode);
6580
6581         if (wrqu->mode == priv->ieee->iw_mode)
6582                 return 0;
6583
6584         down(&priv->action_sem);
6585         if (!(priv->status & STATUS_INITIALIZED)) {
6586                 err = -EIO;
6587                 goto done;
6588         }
6589
6590         switch (wrqu->mode) {
6591 #ifdef CONFIG_IPW2100_MONITOR
6592         case IW_MODE_MONITOR:
6593                 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
6594                 break;
6595 #endif                          /* CONFIG_IPW2100_MONITOR */
6596         case IW_MODE_ADHOC:
6597                 err = ipw2100_switch_mode(priv, IW_MODE_ADHOC);
6598                 break;
6599         case IW_MODE_INFRA:
6600         case IW_MODE_AUTO:
6601         default:
6602                 err = ipw2100_switch_mode(priv, IW_MODE_INFRA);
6603                 break;
6604         }
6605
6606       done:
6607         up(&priv->action_sem);
6608         return err;
6609 }
6610
6611 static int ipw2100_wx_get_mode(struct net_device *dev,
6612                                struct iw_request_info *info,
6613                                union iwreq_data *wrqu, char *extra)
6614 {
6615         /*
6616          * This can be called at any time.  No action lock required
6617          */
6618
6619         struct ipw2100_priv *priv = ieee80211_priv(dev);
6620
6621         wrqu->mode = priv->ieee->iw_mode;
6622         IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode);
6623
6624         return 0;
6625 }
6626
6627 #define POWER_MODES 5
6628
6629 /* Values are in microsecond */
6630 static const s32 timeout_duration[POWER_MODES] = {
6631         350000,
6632         250000,
6633         75000,
6634         37000,
6635         25000,
6636 };
6637
6638 static const s32 period_duration[POWER_MODES] = {
6639         400000,
6640         700000,
6641         1000000,
6642         1000000,
6643         1000000
6644 };
6645
6646 static int ipw2100_wx_get_range(struct net_device *dev,
6647                                 struct iw_request_info *info,
6648                                 union iwreq_data *wrqu, char *extra)
6649 {
6650         /*
6651          * This can be called at any time.  No action lock required
6652          */
6653
6654         struct ipw2100_priv *priv = ieee80211_priv(dev);
6655         struct iw_range *range = (struct iw_range *)extra;
6656         u16 val;
6657         int i, level;
6658
6659         wrqu->data.length = sizeof(*range);
6660         memset(range, 0, sizeof(*range));
6661
6662         /* Let's try to keep this struct in the same order as in
6663          * linux/include/wireless.h
6664          */
6665
6666         /* TODO: See what values we can set, and remove the ones we can't
6667          * set, or fill them with some default data.
6668          */
6669
6670         /* ~5 Mb/s real (802.11b) */
6671         range->throughput = 5 * 1000 * 1000;
6672
6673 //      range->sensitivity;     /* signal level threshold range */
6674
6675         range->max_qual.qual = 100;
6676         /* TODO: Find real max RSSI and stick here */
6677         range->max_qual.level = 0;
6678         range->max_qual.noise = 0;
6679         range->max_qual.updated = 7;    /* Updated all three */
6680
6681         range->avg_qual.qual = 70;      /* > 8% missed beacons is 'bad' */
6682         /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
6683         range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM;
6684         range->avg_qual.noise = 0;
6685         range->avg_qual.updated = 7;    /* Updated all three */
6686
6687         range->num_bitrates = RATE_COUNT;
6688
6689         for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
6690                 range->bitrate[i] = ipw2100_rates_11b[i];
6691         }
6692
6693         range->min_rts = MIN_RTS_THRESHOLD;
6694         range->max_rts = MAX_RTS_THRESHOLD;
6695         range->min_frag = MIN_FRAG_THRESHOLD;
6696         range->max_frag = MAX_FRAG_THRESHOLD;
6697
6698         range->min_pmp = period_duration[0];    /* Minimal PM period */
6699         range->max_pmp = period_duration[POWER_MODES - 1];      /* Maximal PM period */
6700         range->min_pmt = timeout_duration[POWER_MODES - 1];     /* Minimal PM timeout */
6701         range->max_pmt = timeout_duration[0];   /* Maximal PM timeout */
6702
6703         /* How to decode max/min PM period */
6704         range->pmp_flags = IW_POWER_PERIOD;
6705         /* How to decode max/min PM period */
6706         range->pmt_flags = IW_POWER_TIMEOUT;
6707         /* What PM options are supported */
6708         range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD;
6709
6710         range->encoding_size[0] = 5;
6711         range->encoding_size[1] = 13;   /* Different token sizes */
6712         range->num_encoding_sizes = 2;  /* Number of entry in the list */
6713         range->max_encoding_tokens = WEP_KEYS;  /* Max number of tokens */
6714 //      range->encoding_login_index;            /* token index for login token */
6715
6716         if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
6717                 range->txpower_capa = IW_TXPOW_DBM;
6718                 range->num_txpower = IW_MAX_TXPOWER;
6719                 for (i = 0, level = (IPW_TX_POWER_MAX_DBM * 16);
6720                      i < IW_MAX_TXPOWER;
6721                      i++, level -=
6722                      ((IPW_TX_POWER_MAX_DBM -
6723                        IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1))
6724                         range->txpower[i] = level / 16;
6725         } else {
6726                 range->txpower_capa = 0;
6727                 range->num_txpower = 0;
6728         }
6729
6730         /* Set the Wireless Extension versions */
6731         range->we_version_compiled = WIRELESS_EXT;
6732         range->we_version_source = 18;
6733
6734 //      range->retry_capa;      /* What retry options are supported */
6735 //      range->retry_flags;     /* How to decode max/min retry limit */
6736 //      range->r_time_flags;    /* How to decode max/min retry life */
6737 //      range->min_retry;       /* Minimal number of retries */
6738 //      range->max_retry;       /* Maximal number of retries */
6739 //      range->min_r_time;      /* Minimal retry lifetime */
6740 //      range->max_r_time;      /* Maximal retry lifetime */
6741
6742         range->num_channels = FREQ_COUNT;
6743
6744         val = 0;
6745         for (i = 0; i < FREQ_COUNT; i++) {
6746                 // TODO: Include only legal frequencies for some countries
6747 //              if (local->channel_mask & (1 << i)) {
6748                 range->freq[val].i = i + 1;
6749                 range->freq[val].m = ipw2100_frequencies[i] * 100000;
6750                 range->freq[val].e = 1;
6751                 val++;
6752 //              }
6753                 if (val == IW_MAX_FREQUENCIES)
6754                         break;
6755         }
6756         range->num_frequency = val;
6757
6758         /* Event capability (kernel + driver) */
6759         range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
6760                                 IW_EVENT_CAPA_MASK(SIOCGIWAP));
6761         range->event_capa[1] = IW_EVENT_CAPA_K_1;
6762
6763         range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
6764                 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
6765
6766         IPW_DEBUG_WX("GET Range\n");
6767
6768         return 0;
6769 }
6770
6771 static int ipw2100_wx_set_wap(struct net_device *dev,
6772                               struct iw_request_info *info,
6773                               union iwreq_data *wrqu, char *extra)
6774 {
6775         struct ipw2100_priv *priv = ieee80211_priv(dev);
6776         int err = 0;
6777
6778         static const unsigned char any[] = {
6779                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
6780         };
6781         static const unsigned char off[] = {
6782                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
6783         };
6784
6785         // sanity checks
6786         if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
6787                 return -EINVAL;
6788
6789         down(&priv->action_sem);
6790         if (!(priv->status & STATUS_INITIALIZED)) {
6791                 err = -EIO;
6792                 goto done;
6793         }
6794
6795         if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) ||
6796             !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) {
6797                 /* we disable mandatory BSSID association */
6798                 IPW_DEBUG_WX("exit - disable mandatory BSSID\n");
6799                 priv->config &= ~CFG_STATIC_BSSID;
6800                 err = ipw2100_set_mandatory_bssid(priv, NULL, 0);
6801                 goto done;
6802         }
6803
6804         priv->config |= CFG_STATIC_BSSID;
6805         memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN);
6806
6807         err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0);
6808
6809         IPW_DEBUG_WX("SET BSSID -> %02X:%02X:%02X:%02X:%02X:%02X\n",
6810                      wrqu->ap_addr.sa_data[0] & 0xff,
6811                      wrqu->ap_addr.sa_data[1] & 0xff,
6812                      wrqu->ap_addr.sa_data[2] & 0xff,
6813                      wrqu->ap_addr.sa_data[3] & 0xff,
6814                      wrqu->ap_addr.sa_data[4] & 0xff,
6815                      wrqu->ap_addr.sa_data[5] & 0xff);
6816
6817       done:
6818         up(&priv->action_sem);
6819         return err;
6820 }
6821
6822 static int ipw2100_wx_get_wap(struct net_device *dev,
6823                               struct iw_request_info *info,
6824                               union iwreq_data *wrqu, char *extra)
6825 {
6826         /*
6827          * This can be called at any time.  No action lock required
6828          */
6829
6830         struct ipw2100_priv *priv = ieee80211_priv(dev);
6831
6832         /* If we are associated, trying to associate, or have a statically
6833          * configured BSSID then return that; otherwise return ANY */
6834         if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) {
6835                 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
6836                 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
6837         } else
6838                 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
6839
6840         IPW_DEBUG_WX("Getting WAP BSSID: " MAC_FMT "\n",
6841                      MAC_ARG(wrqu->ap_addr.sa_data));
6842         return 0;
6843 }
6844
6845 static int ipw2100_wx_set_essid(struct net_device *dev,
6846                                 struct iw_request_info *info,
6847                                 union iwreq_data *wrqu, char *extra)
6848 {
6849         struct ipw2100_priv *priv = ieee80211_priv(dev);
6850         char *essid = "";       /* ANY */
6851         int length = 0;
6852         int err = 0;
6853
6854         down(&priv->action_sem);
6855         if (!(priv->status & STATUS_INITIALIZED)) {
6856                 err = -EIO;
6857                 goto done;
6858         }
6859
6860         if (wrqu->essid.flags && wrqu->essid.length) {
6861                 length = wrqu->essid.length - 1;
6862                 essid = extra;
6863         }
6864
6865         if (length == 0) {
6866                 IPW_DEBUG_WX("Setting ESSID to ANY\n");
6867                 priv->config &= ~CFG_STATIC_ESSID;
6868                 err = ipw2100_set_essid(priv, NULL, 0, 0);
6869                 goto done;
6870         }
6871
6872         length = min(length, IW_ESSID_MAX_SIZE);
6873
6874         priv->config |= CFG_STATIC_ESSID;
6875
6876         if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) {
6877                 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
6878                 err = 0;
6879                 goto done;
6880         }
6881
6882         IPW_DEBUG_WX("Setting ESSID: '%s' (%d)\n", escape_essid(essid, length),
6883                      length);
6884
6885         priv->essid_len = length;
6886         memcpy(priv->essid, essid, priv->essid_len);
6887
6888         err = ipw2100_set_essid(priv, essid, length, 0);
6889
6890       done:
6891         up(&priv->action_sem);
6892         return err;
6893 }
6894
6895 static int ipw2100_wx_get_essid(struct net_device *dev,
6896                                 struct iw_request_info *info,
6897                                 union iwreq_data *wrqu, char *extra)
6898 {
6899         /*
6900          * This can be called at any time.  No action lock required
6901          */
6902
6903         struct ipw2100_priv *priv = ieee80211_priv(dev);
6904
6905         /* If we are associated, trying to associate, or have a statically
6906          * configured ESSID then return that; otherwise return ANY */
6907         if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) {
6908                 IPW_DEBUG_WX("Getting essid: '%s'\n",
6909                              escape_essid(priv->essid, priv->essid_len));
6910                 memcpy(extra, priv->essid, priv->essid_len);
6911                 wrqu->essid.length = priv->essid_len;
6912                 wrqu->essid.flags = 1;  /* active */
6913         } else {
6914                 IPW_DEBUG_WX("Getting essid: ANY\n");
6915                 wrqu->essid.length = 0;
6916                 wrqu->essid.flags = 0;  /* active */
6917         }
6918
6919         return 0;
6920 }
6921
6922 static int ipw2100_wx_set_nick(struct net_device *dev,
6923                                struct iw_request_info *info,
6924                                union iwreq_data *wrqu, char *extra)
6925 {
6926         /*
6927          * This can be called at any time.  No action lock required
6928          */
6929
6930         struct ipw2100_priv *priv = ieee80211_priv(dev);
6931
6932         if (wrqu->data.length > IW_ESSID_MAX_SIZE)
6933                 return -E2BIG;
6934
6935         wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
6936         memset(priv->nick, 0, sizeof(priv->nick));
6937         memcpy(priv->nick, extra, wrqu->data.length);
6938
6939         IPW_DEBUG_WX("SET Nickname -> %s \n", priv->nick);
6940
6941         return 0;
6942 }
6943
6944 static int ipw2100_wx_get_nick(struct net_device *dev,
6945                                struct iw_request_info *info,
6946                                union iwreq_data *wrqu, char *extra)
6947 {
6948         /*
6949          * This can be called at any time.  No action lock required
6950          */
6951
6952         struct ipw2100_priv *priv = ieee80211_priv(dev);
6953
6954         wrqu->data.length = strlen(priv->nick) + 1;
6955         memcpy(extra, priv->nick, wrqu->data.length);
6956         wrqu->data.flags = 1;   /* active */
6957
6958         IPW_DEBUG_WX("GET Nickname -> %s \n", extra);
6959
6960         return 0;
6961 }
6962
6963 static int ipw2100_wx_set_rate(struct net_device *dev,
6964                                struct iw_request_info *info,
6965                                union iwreq_data *wrqu, char *extra)
6966 {
6967         struct ipw2100_priv *priv = ieee80211_priv(dev);
6968         u32 target_rate = wrqu->bitrate.value;
6969         u32 rate;
6970         int err = 0;
6971
6972         down(&priv->action_sem);
6973         if (!(priv->status & STATUS_INITIALIZED)) {
6974                 err = -EIO;
6975                 goto done;
6976         }
6977
6978         rate = 0;
6979
6980         if (target_rate == 1000000 ||
6981             (!wrqu->bitrate.fixed && target_rate > 1000000))
6982                 rate |= TX_RATE_1_MBIT;
6983         if (target_rate == 2000000 ||
6984             (!wrqu->bitrate.fixed && target_rate > 2000000))
6985                 rate |= TX_RATE_2_MBIT;
6986         if (target_rate == 5500000 ||
6987             (!wrqu->bitrate.fixed && target_rate > 5500000))
6988                 rate |= TX_RATE_5_5_MBIT;
6989         if (target_rate == 11000000 ||
6990             (!wrqu->bitrate.fixed && target_rate > 11000000))
6991                 rate |= TX_RATE_11_MBIT;
6992         if (rate == 0)
6993                 rate = DEFAULT_TX_RATES;
6994
6995         err = ipw2100_set_tx_rates(priv, rate, 0);
6996
6997         IPW_DEBUG_WX("SET Rate -> %04X \n", rate);
6998       done:
6999         up(&priv->action_sem);
7000         return err;
7001 }
7002
7003 static int ipw2100_wx_get_rate(struct net_device *dev,
7004                                struct iw_request_info *info,
7005                                union iwreq_data *wrqu, char *extra)
7006 {
7007         struct ipw2100_priv *priv = ieee80211_priv(dev);
7008         int val;
7009         int len = sizeof(val);
7010         int err = 0;
7011
7012         if (!(priv->status & STATUS_ENABLED) ||
7013             priv->status & STATUS_RF_KILL_MASK ||
7014             !(priv->status & STATUS_ASSOCIATED)) {
7015                 wrqu->bitrate.value = 0;
7016                 return 0;
7017         }
7018
7019         down(&priv->action_sem);
7020         if (!(priv->status & STATUS_INITIALIZED)) {
7021                 err = -EIO;
7022                 goto done;
7023         }
7024
7025         err = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &val, &len);
7026         if (err) {
7027                 IPW_DEBUG_WX("failed querying ordinals.\n");
7028                 return err;
7029         }
7030
7031         switch (val & TX_RATE_MASK) {
7032         case TX_RATE_1_MBIT:
7033                 wrqu->bitrate.value = 1000000;
7034                 break;
7035         case TX_RATE_2_MBIT:
7036                 wrqu->bitrate.value = 2000000;
7037                 break;
7038         case TX_RATE_5_5_MBIT:
7039                 wrqu->bitrate.value = 5500000;
7040                 break;
7041         case TX_RATE_11_MBIT:
7042                 wrqu->bitrate.value = 11000000;
7043                 break;
7044         default:
7045                 wrqu->bitrate.value = 0;
7046         }
7047
7048         IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value);
7049
7050       done:
7051         up(&priv->action_sem);
7052         return err;
7053 }
7054
7055 static int ipw2100_wx_set_rts(struct net_device *dev,
7056                               struct iw_request_info *info,
7057                               union iwreq_data *wrqu, char *extra)
7058 {
7059         struct ipw2100_priv *priv = ieee80211_priv(dev);
7060         int value, err;
7061
7062         /* Auto RTS not yet supported */
7063         if (wrqu->rts.fixed == 0)
7064                 return -EINVAL;
7065
7066         down(&priv->action_sem);
7067         if (!(priv->status & STATUS_INITIALIZED)) {
7068                 err = -EIO;
7069                 goto done;
7070         }
7071
7072         if (wrqu->rts.disabled)
7073                 value = priv->rts_threshold | RTS_DISABLED;
7074         else {
7075                 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) {
7076                         err = -EINVAL;
7077                         goto done;
7078                 }
7079                 value = wrqu->rts.value;
7080         }
7081
7082         err = ipw2100_set_rts_threshold(priv, value);
7083
7084         IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value);
7085       done:
7086         up(&priv->action_sem);
7087         return err;
7088 }
7089
7090 static int ipw2100_wx_get_rts(struct net_device *dev,
7091                               struct iw_request_info *info,
7092                               union iwreq_data *wrqu, char *extra)
7093 {
7094         /*
7095          * This can be called at any time.  No action lock required
7096          */
7097
7098         struct ipw2100_priv *priv = ieee80211_priv(dev);
7099
7100         wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED;
7101         wrqu->rts.fixed = 1;    /* no auto select */
7102
7103         /* If RTS is set to the default value, then it is disabled */
7104         wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0;
7105
7106         IPW_DEBUG_WX("GET RTS Threshold -> 0x%08X \n", wrqu->rts.value);
7107
7108         return 0;
7109 }
7110
7111 static int ipw2100_wx_set_txpow(struct net_device *dev,
7112                                 struct iw_request_info *info,
7113                                 union iwreq_data *wrqu, char *extra)
7114 {
7115         struct ipw2100_priv *priv = ieee80211_priv(dev);
7116         int err = 0, value;
7117         
7118         if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled))
7119                 return -EINPROGRESS;
7120
7121         if (priv->ieee->iw_mode != IW_MODE_ADHOC)
7122                 return 0;
7123
7124         if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
7125                 return -EINVAL;
7126
7127         if (wrqu->txpower.fixed == 0)
7128                 value = IPW_TX_POWER_DEFAULT;
7129         else {
7130                 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
7131                     wrqu->txpower.value > IPW_TX_POWER_MAX_DBM)
7132                         return -EINVAL;
7133
7134                 value = wrqu->txpower.value;
7135         }
7136
7137         down(&priv->action_sem);
7138         if (!(priv->status & STATUS_INITIALIZED)) {
7139                 err = -EIO;
7140                 goto done;
7141         }
7142
7143         err = ipw2100_set_tx_power(priv, value);
7144
7145         IPW_DEBUG_WX("SET TX Power -> %d \n", value);
7146
7147       done:
7148         up(&priv->action_sem);
7149         return err;
7150 }
7151
7152 static int ipw2100_wx_get_txpow(struct net_device *dev,
7153                                 struct iw_request_info *info,
7154                                 union iwreq_data *wrqu, char *extra)
7155 {
7156         /*
7157          * This can be called at any time.  No action lock required
7158          */
7159
7160         struct ipw2100_priv *priv = ieee80211_priv(dev);
7161
7162         wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
7163
7164         if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
7165                 wrqu->txpower.fixed = 0;
7166                 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM;
7167         } else {
7168                 wrqu->txpower.fixed = 1;
7169                 wrqu->txpower.value = priv->tx_power;
7170         }
7171
7172         wrqu->txpower.flags = IW_TXPOW_DBM;
7173
7174         IPW_DEBUG_WX("GET TX Power -> %d \n", wrqu->txpower.value);
7175
7176         return 0;
7177 }
7178
7179 static int ipw2100_wx_set_frag(struct net_device *dev,
7180                                struct iw_request_info *info,
7181                                union iwreq_data *wrqu, char *extra)
7182 {
7183         /*
7184          * This can be called at any time.  No action lock required
7185          */
7186
7187         struct ipw2100_priv *priv = ieee80211_priv(dev);
7188
7189         if (!wrqu->frag.fixed)
7190                 return -EINVAL;
7191
7192         if (wrqu->frag.disabled) {
7193                 priv->frag_threshold |= FRAG_DISABLED;
7194                 priv->ieee->fts = DEFAULT_FTS;
7195         } else {
7196                 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
7197                     wrqu->frag.value > MAX_FRAG_THRESHOLD)
7198                         return -EINVAL;
7199
7200                 priv->ieee->fts = wrqu->frag.value & ~0x1;
7201                 priv->frag_threshold = priv->ieee->fts;
7202         }
7203
7204         IPW_DEBUG_WX("SET Frag Threshold -> %d \n", priv->ieee->fts);
7205
7206         return 0;
7207 }
7208
7209 static int ipw2100_wx_get_frag(struct net_device *dev,
7210                                struct iw_request_info *info,
7211                                union iwreq_data *wrqu, char *extra)
7212 {
7213         /*
7214          * This can be called at any time.  No action lock required
7215          */
7216
7217         struct ipw2100_priv *priv = ieee80211_priv(dev);
7218         wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED;
7219         wrqu->frag.fixed = 0;   /* no auto select */
7220         wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0;
7221
7222         IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value);
7223
7224         return 0;
7225 }
7226
7227 static int ipw2100_wx_set_retry(struct net_device *dev,
7228                                 struct iw_request_info *info,
7229                                 union iwreq_data *wrqu, char *extra)
7230 {
7231         struct ipw2100_priv *priv = ieee80211_priv(dev);
7232         int err = 0;
7233
7234         if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
7235                 return -EINVAL;
7236
7237         if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
7238                 return 0;
7239
7240         down(&priv->action_sem);
7241         if (!(priv->status & STATUS_INITIALIZED)) {
7242                 err = -EIO;
7243                 goto done;
7244         }
7245
7246         if (wrqu->retry.flags & IW_RETRY_MIN) {
7247                 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7248                 IPW_DEBUG_WX("SET Short Retry Limit -> %d \n",
7249                              wrqu->retry.value);
7250                 goto done;
7251         }
7252
7253         if (wrqu->retry.flags & IW_RETRY_MAX) {
7254                 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7255                 IPW_DEBUG_WX("SET Long Retry Limit -> %d \n",
7256                              wrqu->retry.value);
7257                 goto done;
7258         }
7259
7260         err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7261         if (!err)
7262                 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7263
7264         IPW_DEBUG_WX("SET Both Retry Limits -> %d \n", wrqu->retry.value);
7265
7266       done:
7267         up(&priv->action_sem);
7268         return err;
7269 }
7270
7271 static int ipw2100_wx_get_retry(struct net_device *dev,
7272                                 struct iw_request_info *info,
7273                                 union iwreq_data *wrqu, char *extra)
7274 {
7275         /*
7276          * This can be called at any time.  No action lock required
7277          */
7278
7279         struct ipw2100_priv *priv = ieee80211_priv(dev);
7280
7281         wrqu->retry.disabled = 0;       /* can't be disabled */
7282
7283         if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME)
7284                 return -EINVAL;
7285
7286         if (wrqu->retry.flags & IW_RETRY_MAX) {
7287                 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
7288                 wrqu->retry.value = priv->long_retry_limit;
7289         } else {
7290                 wrqu->retry.flags =
7291                     (priv->short_retry_limit !=
7292                      priv->long_retry_limit) ?
7293                     IW_RETRY_LIMIT | IW_RETRY_MIN : IW_RETRY_LIMIT;
7294
7295                 wrqu->retry.value = priv->short_retry_limit;
7296         }
7297
7298         IPW_DEBUG_WX("GET Retry -> %d \n", wrqu->retry.value);
7299
7300         return 0;
7301 }
7302
7303 static int ipw2100_wx_set_scan(struct net_device *dev,
7304                                struct iw_request_info *info,
7305                                union iwreq_data *wrqu, char *extra)
7306 {
7307         struct ipw2100_priv *priv = ieee80211_priv(dev);
7308         int err = 0;
7309
7310         down(&priv->action_sem);
7311         if (!(priv->status & STATUS_INITIALIZED)) {
7312                 err = -EIO;
7313                 goto done;
7314         }
7315
7316         IPW_DEBUG_WX("Initiating scan...\n");
7317         if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) {
7318                 IPW_DEBUG_WX("Start scan failed.\n");
7319
7320                 /* TODO: Mark a scan as pending so when hardware initialized
7321                  *       a scan starts */
7322         }
7323
7324       done:
7325         up(&priv->action_sem);
7326         return err;
7327 }
7328
7329 static int ipw2100_wx_get_scan(struct net_device *dev,
7330                                struct iw_request_info *info,
7331                                union iwreq_data *wrqu, char *extra)
7332 {
7333         /*
7334          * This can be called at any time.  No action lock required
7335          */
7336
7337         struct ipw2100_priv *priv = ieee80211_priv(dev);
7338         return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra);
7339 }
7340
7341 /*
7342  * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c
7343  */
7344 static int ipw2100_wx_set_encode(struct net_device *dev,
7345                                  struct iw_request_info *info,
7346                                  union iwreq_data *wrqu, char *key)
7347 {
7348         /*
7349          * No check of STATUS_INITIALIZED required
7350          */
7351
7352         struct ipw2100_priv *priv = ieee80211_priv(dev);
7353         return ieee80211_wx_set_encode(priv->ieee, info, wrqu, key);
7354 }
7355
7356 static int ipw2100_wx_get_encode(struct net_device *dev,
7357                                  struct iw_request_info *info,
7358                                  union iwreq_data *wrqu, char *key)
7359 {
7360         /*
7361          * This can be called at any time.  No action lock required
7362          */
7363
7364         struct ipw2100_priv *priv = ieee80211_priv(dev);
7365         return ieee80211_wx_get_encode(priv->ieee, info, wrqu, key);
7366 }
7367
7368 static int ipw2100_wx_set_power(struct net_device *dev,
7369                                 struct iw_request_info *info,
7370                                 union iwreq_data *wrqu, char *extra)
7371 {
7372         struct ipw2100_priv *priv = ieee80211_priv(dev);
7373         int err = 0;
7374
7375         down(&priv->action_sem);
7376         if (!(priv->status & STATUS_INITIALIZED)) {
7377                 err = -EIO;
7378                 goto done;
7379         }
7380
7381         if (wrqu->power.disabled) {
7382                 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
7383                 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
7384                 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
7385                 goto done;
7386         }
7387
7388         switch (wrqu->power.flags & IW_POWER_MODE) {
7389         case IW_POWER_ON:       /* If not specified */
7390         case IW_POWER_MODE:     /* If set all mask */
7391         case IW_POWER_ALL_R:    /* If explicitely state all */
7392                 break;
7393         default:                /* Otherwise we don't support it */
7394                 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
7395                              wrqu->power.flags);
7396                 err = -EOPNOTSUPP;
7397                 goto done;
7398         }
7399
7400         /* If the user hasn't specified a power management mode yet, default
7401          * to BATTERY */
7402         priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
7403         err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
7404
7405         IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
7406
7407       done:
7408         up(&priv->action_sem);
7409         return err;
7410
7411 }
7412
7413 static int ipw2100_wx_get_power(struct net_device *dev,
7414                                 struct iw_request_info *info,
7415                                 union iwreq_data *wrqu, char *extra)
7416 {
7417         /*
7418          * This can be called at any time.  No action lock required
7419          */
7420
7421         struct ipw2100_priv *priv = ieee80211_priv(dev);
7422
7423         if (!(priv->power_mode & IPW_POWER_ENABLED))
7424                 wrqu->power.disabled = 1;
7425         else {
7426                 wrqu->power.disabled = 0;
7427                 wrqu->power.flags = 0;
7428         }
7429
7430         IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode);
7431
7432         return 0;
7433 }
7434
7435 /*
7436  * WE-18 WPA support
7437  */
7438
7439 /* SIOCSIWGENIE */
7440 static int ipw2100_wx_set_genie(struct net_device *dev,
7441                                 struct iw_request_info *info,
7442                                 union iwreq_data *wrqu, char *extra)
7443 {
7444
7445         struct ipw2100_priv *priv = ieee80211_priv(dev);
7446         struct ieee80211_device *ieee = priv->ieee;
7447         u8 *buf;
7448
7449         if (!ieee->wpa_enabled)
7450                 return -EOPNOTSUPP;
7451
7452         if (wrqu->data.length > MAX_WPA_IE_LEN ||
7453             (wrqu->data.length && extra == NULL))
7454                 return -EINVAL;
7455
7456         if (wrqu->data.length) {
7457                 buf = kmalloc(wrqu->data.length, GFP_KERNEL);
7458                 if (buf == NULL)
7459                         return -ENOMEM;
7460
7461                 memcpy(buf, extra, wrqu->data.length);
7462                 kfree(ieee->wpa_ie);
7463                 ieee->wpa_ie = buf;
7464                 ieee->wpa_ie_len = wrqu->data.length;
7465         } else {
7466                 kfree(ieee->wpa_ie);
7467                 ieee->wpa_ie = NULL;
7468                 ieee->wpa_ie_len = 0;
7469         }
7470
7471         ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
7472
7473         return 0;
7474 }
7475
7476 /* SIOCGIWGENIE */
7477 static int ipw2100_wx_get_genie(struct net_device *dev,
7478                                 struct iw_request_info *info,
7479                                 union iwreq_data *wrqu, char *extra)
7480 {
7481         struct ipw2100_priv *priv = ieee80211_priv(dev);
7482         struct ieee80211_device *ieee = priv->ieee;
7483
7484         if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
7485                 wrqu->data.length = 0;
7486                 return 0;
7487         }
7488
7489         if (wrqu->data.length < ieee->wpa_ie_len)
7490                 return -E2BIG;
7491
7492         wrqu->data.length = ieee->wpa_ie_len;
7493         memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
7494
7495         return 0;
7496 }
7497
7498 /* SIOCSIWAUTH */
7499 static int ipw2100_wx_set_auth(struct net_device *dev,
7500                                struct iw_request_info *info,
7501                                union iwreq_data *wrqu, char *extra)
7502 {
7503         struct ipw2100_priv *priv = ieee80211_priv(dev);
7504         struct ieee80211_device *ieee = priv->ieee;
7505         struct iw_param *param = &wrqu->param;
7506         struct ieee80211_crypt_data *crypt;
7507         unsigned long flags;
7508         int ret = 0;
7509
7510         switch (param->flags & IW_AUTH_INDEX) {
7511         case IW_AUTH_WPA_VERSION:
7512         case IW_AUTH_CIPHER_PAIRWISE:
7513         case IW_AUTH_CIPHER_GROUP:
7514         case IW_AUTH_KEY_MGMT:
7515                 /*
7516                  * ipw2200 does not use these parameters
7517                  */
7518                 break;
7519
7520         case IW_AUTH_TKIP_COUNTERMEASURES:
7521                 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
7522                 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags)
7523                         break;
7524
7525                 flags = crypt->ops->get_flags(crypt->priv);
7526
7527                 if (param->value)
7528                         flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7529                 else
7530                         flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7531
7532                 crypt->ops->set_flags(flags, crypt->priv);
7533
7534                 break;
7535
7536         case IW_AUTH_DROP_UNENCRYPTED:{
7537                         /* HACK:
7538                          *
7539                          * wpa_supplicant calls set_wpa_enabled when the driver
7540                          * is loaded and unloaded, regardless of if WPA is being
7541                          * used.  No other calls are made which can be used to
7542                          * determine if encryption will be used or not prior to
7543                          * association being expected.  If encryption is not being
7544                          * used, drop_unencrypted is set to false, else true -- we
7545                          * can use this to determine if the CAP_PRIVACY_ON bit should
7546                          * be set.
7547                          */
7548                         struct ieee80211_security sec = {
7549                                 .flags = SEC_ENABLED,
7550                                 .enabled = param->value,
7551                         };
7552                         priv->ieee->drop_unencrypted = param->value;
7553                         /* We only change SEC_LEVEL for open mode. Others
7554                          * are set by ipw_wpa_set_encryption.
7555                          */
7556                         if (!param->value) {
7557                                 sec.flags |= SEC_LEVEL;
7558                                 sec.level = SEC_LEVEL_0;
7559                         } else {
7560                                 sec.flags |= SEC_LEVEL;
7561                                 sec.level = SEC_LEVEL_1;
7562                         }
7563                         if (priv->ieee->set_security)
7564                                 priv->ieee->set_security(priv->ieee->dev, &sec);
7565                         break;
7566                 }
7567
7568         case IW_AUTH_80211_AUTH_ALG:
7569                 ret = ipw2100_wpa_set_auth_algs(priv, param->value);
7570                 break;
7571
7572         case IW_AUTH_WPA_ENABLED:
7573                 ret = ipw2100_wpa_enable(priv, param->value);
7574                 break;
7575
7576         case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7577                 ieee->ieee802_1x = param->value;
7578                 break;
7579
7580                 //case IW_AUTH_ROAMING_CONTROL:
7581         case IW_AUTH_PRIVACY_INVOKED:
7582                 ieee->privacy_invoked = param->value;
7583                 break;
7584
7585         default:
7586                 return -EOPNOTSUPP;
7587         }
7588         return ret;
7589 }
7590
7591 /* SIOCGIWAUTH */
7592 static int ipw2100_wx_get_auth(struct net_device *dev,
7593                                struct iw_request_info *info,
7594                                union iwreq_data *wrqu, char *extra)
7595 {
7596         struct ipw2100_priv *priv = ieee80211_priv(dev);
7597         struct ieee80211_device *ieee = priv->ieee;
7598         struct ieee80211_crypt_data *crypt;
7599         struct iw_param *param = &wrqu->param;
7600         int ret = 0;
7601
7602         switch (param->flags & IW_AUTH_INDEX) {
7603         case IW_AUTH_WPA_VERSION:
7604         case IW_AUTH_CIPHER_PAIRWISE:
7605         case IW_AUTH_CIPHER_GROUP:
7606         case IW_AUTH_KEY_MGMT:
7607                 /*
7608                  * wpa_supplicant will control these internally
7609                  */
7610                 ret = -EOPNOTSUPP;
7611                 break;
7612
7613         case IW_AUTH_TKIP_COUNTERMEASURES:
7614                 crypt = priv->ieee->crypt[priv->ieee->tx_keyidx];
7615                 if (!crypt || !crypt->ops->get_flags) {
7616                         IPW_DEBUG_WARNING("Can't get TKIP countermeasures: "
7617                                           "crypt not set!\n");
7618                         break;
7619                 }
7620
7621                 param->value = (crypt->ops->get_flags(crypt->priv) &
7622                                 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
7623
7624                 break;
7625
7626         case IW_AUTH_DROP_UNENCRYPTED:
7627                 param->value = ieee->drop_unencrypted;
7628                 break;
7629
7630         case IW_AUTH_80211_AUTH_ALG:
7631                 param->value = priv->ieee->sec.auth_mode;
7632                 break;
7633
7634         case IW_AUTH_WPA_ENABLED:
7635                 param->value = ieee->wpa_enabled;
7636                 break;
7637
7638         case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7639                 param->value = ieee->ieee802_1x;
7640                 break;
7641
7642         case IW_AUTH_ROAMING_CONTROL:
7643         case IW_AUTH_PRIVACY_INVOKED:
7644                 param->value = ieee->privacy_invoked;
7645                 break;
7646
7647         default:
7648                 return -EOPNOTSUPP;
7649         }
7650         return 0;
7651 }
7652
7653 /* SIOCSIWENCODEEXT */
7654 static int ipw2100_wx_set_encodeext(struct net_device *dev,
7655                                     struct iw_request_info *info,
7656                                     union iwreq_data *wrqu, char *extra)
7657 {
7658         struct ipw2100_priv *priv = ieee80211_priv(dev);
7659         return ieee80211_wx_set_encodeext(priv->ieee, info, wrqu, extra);
7660 }
7661
7662 /* SIOCGIWENCODEEXT */
7663 static int ipw2100_wx_get_encodeext(struct net_device *dev,
7664                                     struct iw_request_info *info,
7665                                     union iwreq_data *wrqu, char *extra)
7666 {
7667         struct ipw2100_priv *priv = ieee80211_priv(dev);
7668         return ieee80211_wx_get_encodeext(priv->ieee, info, wrqu, extra);
7669 }
7670
7671 /* SIOCSIWMLME */
7672 static int ipw2100_wx_set_mlme(struct net_device *dev,
7673                                struct iw_request_info *info,
7674                                union iwreq_data *wrqu, char *extra)
7675 {
7676         struct ipw2100_priv *priv = ieee80211_priv(dev);
7677         struct iw_mlme *mlme = (struct iw_mlme *)extra;
7678         u16 reason;
7679
7680         reason = cpu_to_le16(mlme->reason_code);
7681
7682         switch (mlme->cmd) {
7683         case IW_MLME_DEAUTH:
7684                 // silently ignore
7685                 break;
7686
7687         case IW_MLME_DISASSOC:
7688                 ipw2100_disassociate_bssid(priv);
7689                 break;
7690
7691         default:
7692                 return -EOPNOTSUPP;
7693         }
7694         return 0;
7695 }
7696
7697 /*
7698  *
7699  * IWPRIV handlers
7700  *
7701  */
7702 #ifdef CONFIG_IPW2100_MONITOR
7703 static int ipw2100_wx_set_promisc(struct net_device *dev,
7704                                   struct iw_request_info *info,
7705                                   union iwreq_data *wrqu, char *extra)
7706 {
7707         struct ipw2100_priv *priv = ieee80211_priv(dev);
7708         int *parms = (int *)extra;
7709         int enable = (parms[0] > 0);
7710         int err = 0;
7711
7712         down(&priv->action_sem);
7713         if (!(priv->status & STATUS_INITIALIZED)) {
7714                 err = -EIO;
7715                 goto done;
7716         }
7717
7718         if (enable) {
7719                 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7720                         err = ipw2100_set_channel(priv, parms[1], 0);
7721                         goto done;
7722                 }
7723                 priv->channel = parms[1];
7724                 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
7725         } else {
7726                 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
7727                         err = ipw2100_switch_mode(priv, priv->last_mode);
7728         }
7729       done:
7730         up(&priv->action_sem);
7731         return err;
7732 }
7733
7734 static int ipw2100_wx_reset(struct net_device *dev,
7735                             struct iw_request_info *info,
7736                             union iwreq_data *wrqu, char *extra)
7737 {
7738         struct ipw2100_priv *priv = ieee80211_priv(dev);
7739         if (priv->status & STATUS_INITIALIZED)
7740                 schedule_reset(priv);
7741         return 0;
7742 }
7743
7744 #endif
7745
7746 static int ipw2100_wx_set_powermode(struct net_device *dev,
7747                                     struct iw_request_info *info,
7748                                     union iwreq_data *wrqu, char *extra)
7749 {
7750         struct ipw2100_priv *priv = ieee80211_priv(dev);
7751         int err = 0, mode = *(int *)extra;
7752
7753         down(&priv->action_sem);
7754         if (!(priv->status & STATUS_INITIALIZED)) {
7755                 err = -EIO;
7756                 goto done;
7757         }
7758
7759         if ((mode < 1) || (mode > POWER_MODES))
7760                 mode = IPW_POWER_AUTO;
7761
7762         if (priv->power_mode != mode)
7763                 err = ipw2100_set_power_mode(priv, mode);
7764       done:
7765         up(&priv->action_sem);
7766         return err;
7767 }
7768
7769 #define MAX_POWER_STRING 80
7770 static int ipw2100_wx_get_powermode(struct net_device *dev,
7771                                     struct iw_request_info *info,
7772                                     union iwreq_data *wrqu, char *extra)
7773 {
7774         /*
7775          * This can be called at any time.  No action lock required
7776          */
7777
7778         struct ipw2100_priv *priv = ieee80211_priv(dev);
7779         int level = IPW_POWER_LEVEL(priv->power_mode);
7780         s32 timeout, period;
7781
7782         if (!(priv->power_mode & IPW_POWER_ENABLED)) {
7783                 snprintf(extra, MAX_POWER_STRING,
7784                          "Power save level: %d (Off)", level);
7785         } else {
7786                 switch (level) {
7787                 case IPW_POWER_MODE_CAM:
7788                         snprintf(extra, MAX_POWER_STRING,
7789                                  "Power save level: %d (None)", level);
7790                         break;
7791                 case IPW_POWER_AUTO:
7792                         snprintf(extra, MAX_POWER_STRING,
7793                                  "Power save level: %d (Auto)", 0);
7794                         break;
7795                 default:
7796                         timeout = timeout_duration[level - 1] / 1000;
7797                         period = period_duration[level - 1] / 1000;
7798                         snprintf(extra, MAX_POWER_STRING,
7799                                  "Power save level: %d "
7800                                  "(Timeout %dms, Period %dms)",
7801                                  level, timeout, period);
7802                 }
7803         }
7804
7805         wrqu->data.length = strlen(extra) + 1;
7806
7807         return 0;
7808 }
7809
7810 static int ipw2100_wx_set_preamble(struct net_device *dev,
7811                                    struct iw_request_info *info,
7812                                    union iwreq_data *wrqu, char *extra)
7813 {
7814         struct ipw2100_priv *priv = ieee80211_priv(dev);
7815         int err, mode = *(int *)extra;
7816
7817         down(&priv->action_sem);
7818         if (!(priv->status & STATUS_INITIALIZED)) {
7819                 err = -EIO;
7820                 goto done;
7821         }
7822
7823         if (mode == 1)
7824                 priv->config |= CFG_LONG_PREAMBLE;
7825         else if (mode == 0)
7826                 priv->config &= ~CFG_LONG_PREAMBLE;
7827         else {
7828                 err = -EINVAL;
7829                 goto done;
7830         }
7831
7832         err = ipw2100_system_config(priv, 0);
7833
7834       done:
7835         up(&priv->action_sem);
7836         return err;
7837 }
7838
7839 static int ipw2100_wx_get_preamble(struct net_device *dev,
7840                                    struct iw_request_info *info,
7841                                    union iwreq_data *wrqu, char *extra)
7842 {
7843         /*
7844          * This can be called at any time.  No action lock required
7845          */
7846
7847         struct ipw2100_priv *priv = ieee80211_priv(dev);
7848
7849         if (priv->config & CFG_LONG_PREAMBLE)
7850                 snprintf(wrqu->name, IFNAMSIZ, "long (1)");
7851         else
7852                 snprintf(wrqu->name, IFNAMSIZ, "auto (0)");
7853
7854         return 0;
7855 }
7856
7857 #ifdef CONFIG_IPW2100_MONITOR
7858 static int ipw2100_wx_set_crc_check(struct net_device *dev,
7859                                     struct iw_request_info *info,
7860                                     union iwreq_data *wrqu, char *extra)
7861 {
7862         struct ipw2100_priv *priv = ieee80211_priv(dev);
7863         int err, mode = *(int *)extra;
7864
7865         down(&priv->action_sem);
7866         if (!(priv->status & STATUS_INITIALIZED)) {
7867                 err = -EIO;
7868                 goto done;
7869         }
7870
7871         if (mode == 1)
7872                 priv->config |= CFG_CRC_CHECK;
7873         else if (mode == 0)
7874                 priv->config &= ~CFG_CRC_CHECK;
7875         else {
7876                 err = -EINVAL;
7877                 goto done;
7878         }
7879         err = 0;
7880
7881       done:
7882         up(&priv->action_sem);
7883         return err;
7884 }
7885
7886 static int ipw2100_wx_get_crc_check(struct net_device *dev,
7887                                     struct iw_request_info *info,
7888                                     union iwreq_data *wrqu, char *extra)
7889 {
7890         /*
7891          * This can be called at any time.  No action lock required
7892          */
7893
7894         struct ipw2100_priv *priv = ieee80211_priv(dev);
7895
7896         if (priv->config & CFG_CRC_CHECK)
7897                 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)");
7898         else
7899                 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)");
7900
7901         return 0;
7902 }
7903 #endif                          /* CONFIG_IPW2100_MONITOR */
7904
7905 static iw_handler ipw2100_wx_handlers[] = {
7906         NULL,                   /* SIOCSIWCOMMIT */
7907         ipw2100_wx_get_name,    /* SIOCGIWNAME */
7908         NULL,                   /* SIOCSIWNWID */
7909         NULL,                   /* SIOCGIWNWID */
7910         ipw2100_wx_set_freq,    /* SIOCSIWFREQ */
7911         ipw2100_wx_get_freq,    /* SIOCGIWFREQ */
7912         ipw2100_wx_set_mode,    /* SIOCSIWMODE */
7913         ipw2100_wx_get_mode,    /* SIOCGIWMODE */
7914         NULL,                   /* SIOCSIWSENS */
7915         NULL,                   /* SIOCGIWSENS */
7916         NULL,                   /* SIOCSIWRANGE */
7917         ipw2100_wx_get_range,   /* SIOCGIWRANGE */
7918         NULL,                   /* SIOCSIWPRIV */
7919         NULL,                   /* SIOCGIWPRIV */
7920         NULL,                   /* SIOCSIWSTATS */
7921         NULL,                   /* SIOCGIWSTATS */
7922         NULL,                   /* SIOCSIWSPY */
7923         NULL,                   /* SIOCGIWSPY */
7924         NULL,                   /* SIOCGIWTHRSPY */
7925         NULL,                   /* SIOCWIWTHRSPY */
7926         ipw2100_wx_set_wap,     /* SIOCSIWAP */
7927         ipw2100_wx_get_wap,     /* SIOCGIWAP */
7928         ipw2100_wx_set_mlme,    /* SIOCSIWMLME */
7929         NULL,                   /* SIOCGIWAPLIST -- deprecated */
7930         ipw2100_wx_set_scan,    /* SIOCSIWSCAN */
7931         ipw2100_wx_get_scan,    /* SIOCGIWSCAN */
7932         ipw2100_wx_set_essid,   /* SIOCSIWESSID */
7933         ipw2100_wx_get_essid,   /* SIOCGIWESSID */
7934         ipw2100_wx_set_nick,    /* SIOCSIWNICKN */
7935         ipw2100_wx_get_nick,    /* SIOCGIWNICKN */
7936         NULL,                   /* -- hole -- */
7937         NULL,                   /* -- hole -- */
7938         ipw2100_wx_set_rate,    /* SIOCSIWRATE */
7939         ipw2100_wx_get_rate,    /* SIOCGIWRATE */
7940         ipw2100_wx_set_rts,     /* SIOCSIWRTS */
7941         ipw2100_wx_get_rts,     /* SIOCGIWRTS */
7942         ipw2100_wx_set_frag,    /* SIOCSIWFRAG */
7943         ipw2100_wx_get_frag,    /* SIOCGIWFRAG */
7944         ipw2100_wx_set_txpow,   /* SIOCSIWTXPOW */
7945         ipw2100_wx_get_txpow,   /* SIOCGIWTXPOW */
7946         ipw2100_wx_set_retry,   /* SIOCSIWRETRY */
7947         ipw2100_wx_get_retry,   /* SIOCGIWRETRY */
7948         ipw2100_wx_set_encode,  /* SIOCSIWENCODE */
7949         ipw2100_wx_get_encode,  /* SIOCGIWENCODE */
7950         ipw2100_wx_set_power,   /* SIOCSIWPOWER */
7951         ipw2100_wx_get_power,   /* SIOCGIWPOWER */
7952         NULL,                   /* -- hole -- */
7953         NULL,                   /* -- hole -- */
7954         ipw2100_wx_set_genie,   /* SIOCSIWGENIE */
7955         ipw2100_wx_get_genie,   /* SIOCGIWGENIE */
7956         ipw2100_wx_set_auth,    /* SIOCSIWAUTH */
7957         ipw2100_wx_get_auth,    /* SIOCGIWAUTH */
7958         ipw2100_wx_set_encodeext,       /* SIOCSIWENCODEEXT */
7959         ipw2100_wx_get_encodeext,       /* SIOCGIWENCODEEXT */
7960         NULL,                   /* SIOCSIWPMKSA */
7961 };
7962
7963 #define IPW2100_PRIV_SET_MONITOR        SIOCIWFIRSTPRIV
7964 #define IPW2100_PRIV_RESET              SIOCIWFIRSTPRIV+1
7965 #define IPW2100_PRIV_SET_POWER          SIOCIWFIRSTPRIV+2
7966 #define IPW2100_PRIV_GET_POWER          SIOCIWFIRSTPRIV+3
7967 #define IPW2100_PRIV_SET_LONGPREAMBLE   SIOCIWFIRSTPRIV+4
7968 #define IPW2100_PRIV_GET_LONGPREAMBLE   SIOCIWFIRSTPRIV+5
7969 #define IPW2100_PRIV_SET_CRC_CHECK      SIOCIWFIRSTPRIV+6
7970 #define IPW2100_PRIV_GET_CRC_CHECK      SIOCIWFIRSTPRIV+7
7971
7972 static const struct iw_priv_args ipw2100_private_args[] = {
7973
7974 #ifdef CONFIG_IPW2100_MONITOR
7975         {
7976          IPW2100_PRIV_SET_MONITOR,
7977          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
7978         {
7979          IPW2100_PRIV_RESET,
7980          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
7981 #endif                          /* CONFIG_IPW2100_MONITOR */
7982
7983         {
7984          IPW2100_PRIV_SET_POWER,
7985          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_power"},
7986         {
7987          IPW2100_PRIV_GET_POWER,
7988          0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_POWER_STRING,
7989          "get_power"},
7990         {
7991          IPW2100_PRIV_SET_LONGPREAMBLE,
7992          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble"},
7993         {
7994          IPW2100_PRIV_GET_LONGPREAMBLE,
7995          0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_preamble"},
7996 #ifdef CONFIG_IPW2100_MONITOR
7997         {
7998          IPW2100_PRIV_SET_CRC_CHECK,
7999          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_crc_check"},
8000         {
8001          IPW2100_PRIV_GET_CRC_CHECK,
8002          0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_crc_check"},
8003 #endif                          /* CONFIG_IPW2100_MONITOR */
8004 };
8005
8006 static iw_handler ipw2100_private_handler[] = {
8007 #ifdef CONFIG_IPW2100_MONITOR
8008         ipw2100_wx_set_promisc,
8009         ipw2100_wx_reset,
8010 #else                           /* CONFIG_IPW2100_MONITOR */
8011         NULL,
8012         NULL,
8013 #endif                          /* CONFIG_IPW2100_MONITOR */
8014         ipw2100_wx_set_powermode,
8015         ipw2100_wx_get_powermode,
8016         ipw2100_wx_set_preamble,
8017         ipw2100_wx_get_preamble,
8018 #ifdef CONFIG_IPW2100_MONITOR
8019         ipw2100_wx_set_crc_check,
8020         ipw2100_wx_get_crc_check,
8021 #else                           /* CONFIG_IPW2100_MONITOR */
8022         NULL,
8023         NULL,
8024 #endif                          /* CONFIG_IPW2100_MONITOR */
8025 };
8026
8027 /*
8028  * Get wireless statistics.
8029  * Called by /proc/net/wireless
8030  * Also called by SIOCGIWSTATS
8031  */
8032 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
8033 {
8034         enum {
8035                 POOR = 30,
8036                 FAIR = 60,
8037                 GOOD = 80,
8038                 VERY_GOOD = 90,
8039                 EXCELLENT = 95,
8040                 PERFECT = 100
8041         };
8042         int rssi_qual;
8043         int tx_qual;
8044         int beacon_qual;
8045
8046         struct ipw2100_priv *priv = ieee80211_priv(dev);
8047         struct iw_statistics *wstats;
8048         u32 rssi, quality, tx_retries, missed_beacons, tx_failures;
8049         u32 ord_len = sizeof(u32);
8050
8051         if (!priv)
8052                 return (struct iw_statistics *)NULL;
8053
8054         wstats = &priv->wstats;
8055
8056         /* if hw is disabled, then ipw2100_get_ordinal() can't be called.
8057          * ipw2100_wx_wireless_stats seems to be called before fw is
8058          * initialized.  STATUS_ASSOCIATED will only be set if the hw is up
8059          * and associated; if not associcated, the values are all meaningless
8060          * anyway, so set them all to NULL and INVALID */
8061         if (!(priv->status & STATUS_ASSOCIATED)) {
8062                 wstats->miss.beacon = 0;
8063                 wstats->discard.retries = 0;
8064                 wstats->qual.qual = 0;
8065                 wstats->qual.level = 0;
8066                 wstats->qual.noise = 0;
8067                 wstats->qual.updated = 7;
8068                 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
8069                     IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
8070                 return wstats;
8071         }
8072
8073         if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_MISSED_BCNS,
8074                                 &missed_beacons, &ord_len))
8075                 goto fail_get_ordinal;
8076
8077         /* If we don't have a connection the quality and level is 0 */
8078         if (!(priv->status & STATUS_ASSOCIATED)) {
8079                 wstats->qual.qual = 0;
8080                 wstats->qual.level = 0;
8081         } else {
8082                 if (ipw2100_get_ordinal(priv, IPW_ORD_RSSI_AVG_CURR,
8083                                         &rssi, &ord_len))
8084                         goto fail_get_ordinal;
8085                 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8086                 if (rssi < 10)
8087                         rssi_qual = rssi * POOR / 10;
8088                 else if (rssi < 15)
8089                         rssi_qual = (rssi - 10) * (FAIR - POOR) / 5 + POOR;
8090                 else if (rssi < 20)
8091                         rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR;
8092                 else if (rssi < 30)
8093                         rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) /
8094                             10 + GOOD;
8095                 else
8096                         rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) /
8097                             10 + VERY_GOOD;
8098
8099                 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_RETRIES,
8100                                         &tx_retries, &ord_len))
8101                         goto fail_get_ordinal;
8102
8103                 if (tx_retries > 75)
8104                         tx_qual = (90 - tx_retries) * POOR / 15;
8105                 else if (tx_retries > 70)
8106                         tx_qual = (75 - tx_retries) * (FAIR - POOR) / 5 + POOR;
8107                 else if (tx_retries > 65)
8108                         tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR;
8109                 else if (tx_retries > 50)
8110                         tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) /
8111                             15 + GOOD;
8112                 else
8113                         tx_qual = (50 - tx_retries) *
8114                             (PERFECT - VERY_GOOD) / 50 + VERY_GOOD;
8115
8116                 if (missed_beacons > 50)
8117                         beacon_qual = (60 - missed_beacons) * POOR / 10;
8118                 else if (missed_beacons > 40)
8119                         beacon_qual = (50 - missed_beacons) * (FAIR - POOR) /
8120                             10 + POOR;
8121                 else if (missed_beacons > 32)
8122                         beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) /
8123                             18 + FAIR;
8124                 else if (missed_beacons > 20)
8125                         beacon_qual = (32 - missed_beacons) *
8126                             (VERY_GOOD - GOOD) / 20 + GOOD;
8127                 else
8128                         beacon_qual = (20 - missed_beacons) *
8129                             (PERFECT - VERY_GOOD) / 20 + VERY_GOOD;
8130
8131                 quality = min(beacon_qual, min(tx_qual, rssi_qual));
8132
8133 #ifdef CONFIG_IPW2100_DEBUG
8134                 if (beacon_qual == quality)
8135                         IPW_DEBUG_WX("Quality clamped by Missed Beacons\n");
8136                 else if (tx_qual == quality)
8137                         IPW_DEBUG_WX("Quality clamped by Tx Retries\n");
8138                 else if (quality != 100)
8139                         IPW_DEBUG_WX("Quality clamped by Signal Strength\n");
8140                 else
8141                         IPW_DEBUG_WX("Quality not clamped.\n");
8142 #endif
8143
8144                 wstats->qual.qual = quality;
8145                 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8146         }
8147
8148         wstats->qual.noise = 0;
8149         wstats->qual.updated = 7;
8150         wstats->qual.updated |= IW_QUAL_NOISE_INVALID;
8151
8152         /* FIXME: this is percent and not a # */
8153         wstats->miss.beacon = missed_beacons;
8154
8155         if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURES,
8156                                 &tx_failures, &ord_len))
8157                 goto fail_get_ordinal;
8158         wstats->discard.retries = tx_failures;
8159
8160         return wstats;
8161
8162       fail_get_ordinal:
8163         IPW_DEBUG_WX("failed querying ordinals.\n");
8164
8165         return (struct iw_statistics *)NULL;
8166 }
8167
8168 static struct iw_handler_def ipw2100_wx_handler_def = {
8169         .standard = ipw2100_wx_handlers,
8170         .num_standard = sizeof(ipw2100_wx_handlers) / sizeof(iw_handler),
8171         .num_private = sizeof(ipw2100_private_handler) / sizeof(iw_handler),
8172         .num_private_args = sizeof(ipw2100_private_args) /
8173             sizeof(struct iw_priv_args),
8174         .private = (iw_handler *) ipw2100_private_handler,
8175         .private_args = (struct iw_priv_args *)ipw2100_private_args,
8176         .get_wireless_stats = ipw2100_wx_wireless_stats,
8177 };
8178
8179 static void ipw2100_wx_event_work(struct ipw2100_priv *priv)
8180 {
8181         union iwreq_data wrqu;
8182         int len = ETH_ALEN;
8183
8184         if (priv->status & STATUS_STOPPING)
8185                 return;
8186
8187         down(&priv->action_sem);
8188
8189         IPW_DEBUG_WX("enter\n");
8190
8191         up(&priv->action_sem);
8192
8193         wrqu.ap_addr.sa_family = ARPHRD_ETHER;
8194
8195         /* Fetch BSSID from the hardware */
8196         if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) ||
8197             priv->status & STATUS_RF_KILL_MASK ||
8198             ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
8199                                 &priv->bssid, &len)) {
8200                 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
8201         } else {
8202                 /* We now have the BSSID, so can finish setting to the full
8203                  * associated state */
8204                 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
8205                 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN);
8206                 priv->status &= ~STATUS_ASSOCIATING;
8207                 priv->status |= STATUS_ASSOCIATED;
8208                 netif_carrier_on(priv->net_dev);
8209                 netif_wake_queue(priv->net_dev);
8210         }
8211
8212         if (!(priv->status & STATUS_ASSOCIATED)) {
8213                 IPW_DEBUG_WX("Configuring ESSID\n");
8214                 down(&priv->action_sem);
8215                 /* This is a disassociation event, so kick the firmware to
8216                  * look for another AP */
8217                 if (priv->config & CFG_STATIC_ESSID)
8218                         ipw2100_set_essid(priv, priv->essid, priv->essid_len,
8219                                           0);
8220                 else
8221                         ipw2100_set_essid(priv, NULL, 0, 0);
8222                 up(&priv->action_sem);
8223         }
8224
8225         wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
8226 }
8227
8228 #define IPW2100_FW_MAJOR_VERSION 1
8229 #define IPW2100_FW_MINOR_VERSION 3
8230
8231 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
8232 #define IPW2100_FW_MAJOR(x) (x & 0xff)
8233
8234 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
8235                              IPW2100_FW_MAJOR_VERSION)
8236
8237 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8238 "." __stringify(IPW2100_FW_MINOR_VERSION)
8239
8240 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
8241
8242 /*
8243
8244 BINARY FIRMWARE HEADER FORMAT
8245
8246 offset      length   desc
8247 0           2        version
8248 2           2        mode == 0:BSS,1:IBSS,2:MONITOR
8249 4           4        fw_len
8250 8           4        uc_len
8251 C           fw_len   firmware data
8252 12 + fw_len uc_len   microcode data
8253
8254 */
8255
8256 struct ipw2100_fw_header {
8257         short version;
8258         short mode;
8259         unsigned int fw_size;
8260         unsigned int uc_size;
8261 } __attribute__ ((packed));
8262
8263 static int ipw2100_mod_firmware_load(struct ipw2100_fw *fw)
8264 {
8265         struct ipw2100_fw_header *h =
8266             (struct ipw2100_fw_header *)fw->fw_entry->data;
8267
8268         if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) {
8269                 printk(KERN_WARNING DRV_NAME ": Firmware image not compatible "
8270                        "(detected version id of %u). "
8271                        "See Documentation/networking/README.ipw2100\n",
8272                        h->version);
8273                 return 1;
8274         }
8275
8276         fw->version = h->version;
8277         fw->fw.data = fw->fw_entry->data + sizeof(struct ipw2100_fw_header);
8278         fw->fw.size = h->fw_size;
8279         fw->uc.data = fw->fw.data + h->fw_size;
8280         fw->uc.size = h->uc_size;
8281
8282         return 0;
8283 }
8284
8285 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
8286                                 struct ipw2100_fw *fw)
8287 {
8288         char *fw_name;
8289         int rc;
8290
8291         IPW_DEBUG_INFO("%s: Using hotplug firmware load.\n",
8292                        priv->net_dev->name);
8293
8294         switch (priv->ieee->iw_mode) {
8295         case IW_MODE_ADHOC:
8296                 fw_name = IPW2100_FW_NAME("-i");
8297                 break;
8298 #ifdef CONFIG_IPW2100_MONITOR
8299         case IW_MODE_MONITOR:
8300                 fw_name = IPW2100_FW_NAME("-p");
8301                 break;
8302 #endif
8303         case IW_MODE_INFRA:
8304         default:
8305                 fw_name = IPW2100_FW_NAME("");
8306                 break;
8307         }
8308
8309         rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev);
8310
8311         if (rc < 0) {
8312                 printk(KERN_ERR DRV_NAME ": "
8313                        "%s: Firmware '%s' not available or load failed.\n",
8314                        priv->net_dev->name, fw_name);
8315                 return rc;
8316         }
8317         IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data,
8318                        fw->fw_entry->size);
8319
8320         ipw2100_mod_firmware_load(fw);
8321
8322         return 0;
8323 }
8324
8325 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
8326                                      struct ipw2100_fw *fw)
8327 {
8328         fw->version = 0;
8329         if (fw->fw_entry)
8330                 release_firmware(fw->fw_entry);
8331         fw->fw_entry = NULL;
8332 }
8333
8334 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
8335                                  size_t max)
8336 {
8337         char ver[MAX_FW_VERSION_LEN];
8338         u32 len = MAX_FW_VERSION_LEN;
8339         u32 tmp;
8340         int i;
8341         /* firmware version is an ascii string (max len of 14) */
8342         if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM, ver, &len))
8343                 return -EIO;
8344         tmp = max;
8345         if (len >= max)
8346                 len = max - 1;
8347         for (i = 0; i < len; i++)
8348                 buf[i] = ver[i];
8349         buf[i] = '\0';
8350         return tmp;
8351 }
8352
8353 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
8354                                     size_t max)
8355 {
8356         u32 ver;
8357         u32 len = sizeof(ver);
8358         /* microcode version is a 32 bit integer */
8359         if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION, &ver, &len))
8360                 return -EIO;
8361         return snprintf(buf, max, "%08X", ver);
8362 }
8363
8364 /*
8365  * On exit, the firmware will have been freed from the fw list
8366  */
8367 static int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
8368 {
8369         /* firmware is constructed of N contiguous entries, each entry is
8370          * structured as:
8371          *
8372          * offset    sie         desc
8373          * 0         4           address to write to
8374          * 4         2           length of data run
8375          * 6         length      data
8376          */
8377         unsigned int addr;
8378         unsigned short len;
8379
8380         const unsigned char *firmware_data = fw->fw.data;
8381         unsigned int firmware_data_left = fw->fw.size;
8382
8383         while (firmware_data_left > 0) {
8384                 addr = *(u32 *) (firmware_data);
8385                 firmware_data += 4;
8386                 firmware_data_left -= 4;
8387
8388                 len = *(u16 *) (firmware_data);
8389                 firmware_data += 2;
8390                 firmware_data_left -= 2;
8391
8392                 if (len > 32) {
8393                         printk(KERN_ERR DRV_NAME ": "
8394                                "Invalid firmware run-length of %d bytes\n",
8395                                len);
8396                         return -EINVAL;
8397                 }
8398
8399                 write_nic_memory(priv->net_dev, addr, len, firmware_data);
8400                 firmware_data += len;
8401                 firmware_data_left -= len;
8402         }
8403
8404         return 0;
8405 }
8406
8407 struct symbol_alive_response {
8408         u8 cmd_id;
8409         u8 seq_num;
8410         u8 ucode_rev;
8411         u8 eeprom_valid;
8412         u16 valid_flags;
8413         u8 IEEE_addr[6];
8414         u16 flags;
8415         u16 pcb_rev;
8416         u16 clock_settle_time;  // 1us LSB
8417         u16 powerup_settle_time;        // 1us LSB
8418         u16 hop_settle_time;    // 1us LSB
8419         u8 date[3];             // month, day, year
8420         u8 time[2];             // hours, minutes
8421         u8 ucode_valid;
8422 };
8423
8424 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
8425                                   struct ipw2100_fw *fw)
8426 {
8427         struct net_device *dev = priv->net_dev;
8428         const unsigned char *microcode_data = fw->uc.data;
8429         unsigned int microcode_data_left = fw->uc.size;
8430         void __iomem *reg = (void __iomem *)dev->base_addr;
8431
8432         struct symbol_alive_response response;
8433         int i, j;
8434         u8 data;
8435
8436         /* Symbol control */
8437         write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8438         readl(reg);
8439         write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8440         readl(reg);
8441
8442         /* HW config */
8443         write_nic_byte(dev, 0x210014, 0x72);    /* fifo width =16 */
8444         readl(reg);
8445         write_nic_byte(dev, 0x210014, 0x72);    /* fifo width =16 */
8446         readl(reg);
8447
8448         /* EN_CS_ACCESS bit to reset control store pointer */
8449         write_nic_byte(dev, 0x210000, 0x40);
8450         readl(reg);
8451         write_nic_byte(dev, 0x210000, 0x0);
8452         readl(reg);
8453         write_nic_byte(dev, 0x210000, 0x40);
8454         readl(reg);
8455
8456         /* copy microcode from buffer into Symbol */
8457
8458         while (microcode_data_left > 0) {
8459                 write_nic_byte(dev, 0x210010, *microcode_data++);
8460                 write_nic_byte(dev, 0x210010, *microcode_data++);
8461                 microcode_data_left -= 2;
8462         }
8463
8464         /* EN_CS_ACCESS bit to reset the control store pointer */
8465         write_nic_byte(dev, 0x210000, 0x0);
8466         readl(reg);
8467
8468         /* Enable System (Reg 0)
8469          * first enable causes garbage in RX FIFO */
8470         write_nic_byte(dev, 0x210000, 0x0);
8471         readl(reg);
8472         write_nic_byte(dev, 0x210000, 0x80);
8473         readl(reg);
8474
8475         /* Reset External Baseband Reg */
8476         write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8477         readl(reg);
8478         write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8479         readl(reg);
8480
8481         /* HW Config (Reg 5) */
8482         write_nic_byte(dev, 0x210014, 0x72);    // fifo width =16
8483         readl(reg);
8484         write_nic_byte(dev, 0x210014, 0x72);    // fifo width =16
8485         readl(reg);
8486
8487         /* Enable System (Reg 0)
8488          * second enable should be OK */
8489         write_nic_byte(dev, 0x210000, 0x00);    // clear enable system
8490         readl(reg);
8491         write_nic_byte(dev, 0x210000, 0x80);    // set enable system
8492
8493         /* check Symbol is enabled - upped this from 5 as it wasn't always
8494          * catching the update */
8495         for (i = 0; i < 10; i++) {
8496                 udelay(10);
8497
8498                 /* check Dino is enabled bit */
8499                 read_nic_byte(dev, 0x210000, &data);
8500                 if (data & 0x1)
8501                         break;
8502         }
8503
8504         if (i == 10) {
8505                 printk(KERN_ERR DRV_NAME ": %s: Error initializing Symbol\n",
8506                        dev->name);
8507                 return -EIO;
8508         }
8509
8510         /* Get Symbol alive response */
8511         for (i = 0; i < 30; i++) {
8512                 /* Read alive response structure */
8513                 for (j = 0;
8514                      j < (sizeof(struct symbol_alive_response) >> 1); j++)
8515                         read_nic_word(dev, 0x210004, ((u16 *) & response) + j);
8516
8517                 if ((response.cmd_id == 1) && (response.ucode_valid == 0x1))
8518                         break;
8519                 udelay(10);
8520         }
8521
8522         if (i == 30) {
8523                 printk(KERN_ERR DRV_NAME
8524                        ": %s: No response from Symbol - hw not alive\n",
8525                        dev->name);
8526                 printk_buf(IPW_DL_ERROR, (u8 *) & response, sizeof(response));
8527                 return -EIO;
8528         }
8529
8530         return 0;
8531 }