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