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