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