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