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