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