1 /******************************************************************************
3 Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
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.
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
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.
18 The full GNU General Public License is included in this distribution in the
22 James P. Ketrenos <ipw2100-admin@linux.intel.com>
23 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
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
29 Portions of this file are based on the Host AP project,
30 Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
32 Copyright (c) 2002-2003, Jouni Malinen <j@w1.fi>
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
38 ******************************************************************************/
41 Initial driver on which this is based was developed by Janusz Gorycki,
42 Maciej Urbaniak, and Maciej Sosnowski.
44 Promiscuous mode support added by Jacek Wysoczynski and Maciej Urbaniak.
48 Tx - Commands and Data
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.
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
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
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 referrs to the actual packet location.
68 The Tx flow cycle is as follows:
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
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
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
89 11)The packet structure is placed onto the tx_free_list
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
96 Critical Sections / Locking :
98 There are two locks utilized. The first is the low level lock (priv->low_lock)
99 that protects the following:
101 - Access to the Tx/Rx queue lists via priv->low_lock. The lists are as follows:
103 tx_free_list : Holds pre-allocated Tx buffers.
104 TAIL modified in __ipw2100_tx_process()
105 HEAD modified in ipw2100_tx()
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()
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()
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()
119 The flow of data on the TX side is as follows:
121 MSG_FREE_LIST + COMMAND => MSG_PEND_LIST => TBD => MSG_FREE_LIST
122 TX_FREE_LIST + DATA => TX_PEND_LIST => TBD => TX_FREE_LIST
124 The methods that work on the TBD ring are protected via priv->low_lock.
126 - The internal data state of the device itself
127 - Access to the firmware read/write indexes for the BD queues
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.
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>
153 #include <linux/fs.h>
154 #include <linux/mm.h>
155 #include <linux/slab.h>
156 #include <linux/unistd.h>
157 #include <linux/stringify.h>
158 #include <linux/tcp.h>
159 #include <linux/types.h>
160 #include <linux/time.h>
161 #include <linux/firmware.h>
162 #include <linux/acpi.h>
163 #include <linux/ctype.h>
164 #include <linux/pm_qos_params.h>
166 #include <net/lib80211.h>
170 #define IPW2100_VERSION "git-1.2.2"
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"
177 /* Debugging stuff */
178 #ifdef CONFIG_IPW2100_DEBUG
179 #define IPW2100_RX_DEBUG /* Reception debugging */
182 MODULE_DESCRIPTION(DRV_DESCRIPTION);
183 MODULE_VERSION(DRV_VERSION);
184 MODULE_AUTHOR(DRV_COPYRIGHT);
185 MODULE_LICENSE("GPL");
187 static int debug = 0;
189 static int channel = 0;
190 static int associate = 0;
191 static int disable = 0;
193 static struct ipw2100_fw ipw2100_firmware;
196 #include <linux/moduleparam.h>
197 module_param(debug, int, 0444);
198 module_param(mode, int, 0444);
199 module_param(channel, int, 0444);
200 module_param(associate, int, 0444);
201 module_param(disable, int, 0444);
203 MODULE_PARM_DESC(debug, "debug level");
204 MODULE_PARM_DESC(mode, "network mode (0=BSS,1=IBSS,2=Monitor)");
205 MODULE_PARM_DESC(channel, "channel");
206 MODULE_PARM_DESC(associate, "auto associate when scanning (default off)");
207 MODULE_PARM_DESC(disable, "manually disable the radio (default 0 [radio on])");
209 static u32 ipw2100_debug_level = IPW_DL_NONE;
211 #ifdef CONFIG_IPW2100_DEBUG
212 #define IPW_DEBUG(level, message...) \
214 if (ipw2100_debug_level & (level)) { \
215 printk(KERN_DEBUG "ipw2100: %c %s ", \
216 in_interrupt() ? 'I' : 'U', __func__); \
221 #define IPW_DEBUG(level, message...) do {} while (0)
222 #endif /* CONFIG_IPW2100_DEBUG */
224 #ifdef CONFIG_IPW2100_DEBUG
225 static const char *command_types[] = {
227 "unused", /* HOST_ATTENTION */
229 "unused", /* SLEEP */
230 "unused", /* HOST_POWER_DOWN */
233 "unused", /* SET_IMR */
236 "AUTHENTICATION_TYPE",
239 "INTERNATIONAL_MODE",
254 "CLEAR_ALL_MULTICAST",
275 "AP_OR_STATION_TABLE",
279 "unused", /* SAVE_CALIBRATION */
280 "unused", /* RESTORE_CALIBRATION */
284 "HOST_PRE_POWER_DOWN",
285 "unused", /* HOST_INTERRUPT_COALESCING */
287 "CARD_DISABLE_PHY_OFF",
288 "MSDU_TX_RATES" "undefined",
290 "SET_STATION_STAT_BITS",
291 "CLEAR_STATIONS_STAT_BITS",
293 "SET_SECURITY_INFORMATION",
294 "DISASSOCIATION_BSSID",
299 /* Pre-decl until we get the code solid and then we can clean it up */
300 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv);
301 static void ipw2100_tx_send_data(struct ipw2100_priv *priv);
302 static int ipw2100_adapter_setup(struct ipw2100_priv *priv);
304 static void ipw2100_queues_initialize(struct ipw2100_priv *priv);
305 static void ipw2100_queues_free(struct ipw2100_priv *priv);
306 static int ipw2100_queues_allocate(struct ipw2100_priv *priv);
308 static int ipw2100_fw_download(struct ipw2100_priv *priv,
309 struct ipw2100_fw *fw);
310 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
311 struct ipw2100_fw *fw);
312 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
314 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
316 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
317 struct ipw2100_fw *fw);
318 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
319 struct ipw2100_fw *fw);
320 static void ipw2100_wx_event_work(struct work_struct *work);
321 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev);
322 static struct iw_handler_def ipw2100_wx_handler_def;
324 static inline void read_register(struct net_device *dev, u32 reg, u32 * val)
326 *val = readl((void __iomem *)(dev->base_addr + reg));
327 IPW_DEBUG_IO("r: 0x%08X => 0x%08X\n", reg, *val);
330 static inline void write_register(struct net_device *dev, u32 reg, u32 val)
332 writel(val, (void __iomem *)(dev->base_addr + reg));
333 IPW_DEBUG_IO("w: 0x%08X <= 0x%08X\n", reg, val);
336 static inline void read_register_word(struct net_device *dev, u32 reg,
339 *val = readw((void __iomem *)(dev->base_addr + reg));
340 IPW_DEBUG_IO("r: 0x%08X => %04X\n", reg, *val);
343 static inline void read_register_byte(struct net_device *dev, u32 reg, u8 * val)
345 *val = readb((void __iomem *)(dev->base_addr + reg));
346 IPW_DEBUG_IO("r: 0x%08X => %02X\n", reg, *val);
349 static inline void write_register_word(struct net_device *dev, u32 reg, u16 val)
351 writew(val, (void __iomem *)(dev->base_addr + reg));
352 IPW_DEBUG_IO("w: 0x%08X <= %04X\n", reg, val);
355 static inline void write_register_byte(struct net_device *dev, u32 reg, u8 val)
357 writeb(val, (void __iomem *)(dev->base_addr + reg));
358 IPW_DEBUG_IO("w: 0x%08X =< %02X\n", reg, val);
361 static inline void read_nic_dword(struct net_device *dev, u32 addr, u32 * val)
363 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
364 addr & IPW_REG_INDIRECT_ADDR_MASK);
365 read_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
368 static inline void write_nic_dword(struct net_device *dev, u32 addr, u32 val)
370 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
371 addr & IPW_REG_INDIRECT_ADDR_MASK);
372 write_register(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
375 static inline void read_nic_word(struct net_device *dev, u32 addr, u16 * val)
377 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
378 addr & IPW_REG_INDIRECT_ADDR_MASK);
379 read_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
382 static inline void write_nic_word(struct net_device *dev, u32 addr, u16 val)
384 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
385 addr & IPW_REG_INDIRECT_ADDR_MASK);
386 write_register_word(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
389 static inline void read_nic_byte(struct net_device *dev, u32 addr, u8 * val)
391 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
392 addr & IPW_REG_INDIRECT_ADDR_MASK);
393 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
396 static inline void write_nic_byte(struct net_device *dev, u32 addr, u8 val)
398 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
399 addr & IPW_REG_INDIRECT_ADDR_MASK);
400 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA, val);
403 static inline void write_nic_auto_inc_address(struct net_device *dev, u32 addr)
405 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS,
406 addr & IPW_REG_INDIRECT_ADDR_MASK);
409 static inline void write_nic_dword_auto_inc(struct net_device *dev, u32 val)
411 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, val);
414 static void write_nic_memory(struct net_device *dev, u32 addr, u32 len,
422 /* read first nibble byte by byte */
423 aligned_addr = addr & (~0x3);
424 dif_len = addr - aligned_addr;
426 /* Start reading at aligned_addr + dif_len */
427 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
429 for (i = dif_len; i < 4; i++, buf++)
430 write_register_byte(dev,
431 IPW_REG_INDIRECT_ACCESS_DATA + i,
438 /* read DWs through autoincrement registers */
439 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
440 aligned_len = len & (~0x3);
441 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
442 write_register(dev, IPW_REG_AUTOINCREMENT_DATA, *(u32 *) buf);
444 /* copy the last nibble */
445 dif_len = len - aligned_len;
446 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
447 for (i = 0; i < dif_len; i++, buf++)
448 write_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i,
452 static void read_nic_memory(struct net_device *dev, u32 addr, u32 len,
460 /* read first nibble byte by byte */
461 aligned_addr = addr & (~0x3);
462 dif_len = addr - aligned_addr;
464 /* Start reading at aligned_addr + dif_len */
465 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS,
467 for (i = dif_len; i < 4; i++, buf++)
468 read_register_byte(dev,
469 IPW_REG_INDIRECT_ACCESS_DATA + i,
476 /* read DWs through autoincrement registers */
477 write_register(dev, IPW_REG_AUTOINCREMENT_ADDRESS, aligned_addr);
478 aligned_len = len & (~0x3);
479 for (i = 0; i < aligned_len; i += 4, buf += 4, aligned_addr += 4)
480 read_register(dev, IPW_REG_AUTOINCREMENT_DATA, (u32 *) buf);
482 /* copy the last nibble */
483 dif_len = len - aligned_len;
484 write_register(dev, IPW_REG_INDIRECT_ACCESS_ADDRESS, aligned_addr);
485 for (i = 0; i < dif_len; i++, buf++)
486 read_register_byte(dev, IPW_REG_INDIRECT_ACCESS_DATA + i, buf);
489 static inline int ipw2100_hw_is_adapter_in_system(struct net_device *dev)
491 return (dev->base_addr &&
493 ((void __iomem *)(dev->base_addr +
494 IPW_REG_DOA_DEBUG_AREA_START))
495 == IPW_DATA_DOA_DEBUG_VALUE));
498 static int ipw2100_get_ordinal(struct ipw2100_priv *priv, u32 ord,
499 void *val, u32 * len)
501 struct ipw2100_ordinals *ordinals = &priv->ordinals;
508 if (ordinals->table1_addr == 0) {
509 printk(KERN_WARNING DRV_NAME ": attempt to use fw ordinals "
510 "before they have been loaded.\n");
514 if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
515 if (*len < IPW_ORD_TAB_1_ENTRY_SIZE) {
516 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
518 printk(KERN_WARNING DRV_NAME
519 ": ordinal buffer length too small, need %zd\n",
520 IPW_ORD_TAB_1_ENTRY_SIZE);
525 read_nic_dword(priv->net_dev,
526 ordinals->table1_addr + (ord << 2), &addr);
527 read_nic_dword(priv->net_dev, addr, val);
529 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
534 if (IS_ORDINAL_TABLE_TWO(ordinals, ord)) {
536 ord -= IPW_START_ORD_TAB_2;
538 /* get the address of statistic */
539 read_nic_dword(priv->net_dev,
540 ordinals->table2_addr + (ord << 3), &addr);
542 /* get the second DW of statistics ;
543 * two 16-bit words - first is length, second is count */
544 read_nic_dword(priv->net_dev,
545 ordinals->table2_addr + (ord << 3) + sizeof(u32),
548 /* get each entry length */
549 field_len = *((u16 *) & field_info);
551 /* get number of entries */
552 field_count = *(((u16 *) & field_info) + 1);
554 /* abort if no enought memory */
555 total_length = field_len * field_count;
556 if (total_length > *len) {
565 /* read the ordinal data from the SRAM */
566 read_nic_memory(priv->net_dev, addr, total_length, val);
571 printk(KERN_WARNING DRV_NAME ": ordinal %d neither in table 1 nor "
572 "in table 2\n", ord);
577 static int ipw2100_set_ordinal(struct ipw2100_priv *priv, u32 ord, u32 * val,
580 struct ipw2100_ordinals *ordinals = &priv->ordinals;
583 if (IS_ORDINAL_TABLE_ONE(ordinals, ord)) {
584 if (*len != IPW_ORD_TAB_1_ENTRY_SIZE) {
585 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
586 IPW_DEBUG_INFO("wrong size\n");
590 read_nic_dword(priv->net_dev,
591 ordinals->table1_addr + (ord << 2), &addr);
593 write_nic_dword(priv->net_dev, addr, *val);
595 *len = IPW_ORD_TAB_1_ENTRY_SIZE;
600 IPW_DEBUG_INFO("wrong table\n");
601 if (IS_ORDINAL_TABLE_TWO(ordinals, ord))
607 static char *snprint_line(char *buf, size_t count,
608 const u8 * data, u32 len, u32 ofs)
613 out = snprintf(buf, count, "%08X", ofs);
615 for (l = 0, i = 0; i < 2; i++) {
616 out += snprintf(buf + out, count - out, " ");
617 for (j = 0; j < 8 && l < len; j++, l++)
618 out += snprintf(buf + out, count - out, "%02X ",
621 out += snprintf(buf + out, count - out, " ");
624 out += snprintf(buf + out, count - out, " ");
625 for (l = 0, i = 0; i < 2; i++) {
626 out += snprintf(buf + out, count - out, " ");
627 for (j = 0; j < 8 && l < len; j++, l++) {
628 c = data[(i * 8 + j)];
629 if (!isascii(c) || !isprint(c))
632 out += snprintf(buf + out, count - out, "%c", c);
636 out += snprintf(buf + out, count - out, " ");
642 static void printk_buf(int level, const u8 * data, u32 len)
646 if (!(ipw2100_debug_level & level))
650 printk(KERN_DEBUG "%s\n",
651 snprint_line(line, sizeof(line), &data[ofs],
652 min(len, 16U), ofs));
654 len -= min(len, 16U);
658 #define MAX_RESET_BACKOFF 10
660 static void schedule_reset(struct ipw2100_priv *priv)
662 unsigned long now = get_seconds();
664 /* If we haven't received a reset request within the backoff period,
665 * then we can reset the backoff interval so this reset occurs
667 if (priv->reset_backoff &&
668 (now - priv->last_reset > priv->reset_backoff))
669 priv->reset_backoff = 0;
671 priv->last_reset = get_seconds();
673 if (!(priv->status & STATUS_RESET_PENDING)) {
674 IPW_DEBUG_INFO("%s: Scheduling firmware restart (%ds).\n",
675 priv->net_dev->name, priv->reset_backoff);
676 netif_carrier_off(priv->net_dev);
677 netif_stop_queue(priv->net_dev);
678 priv->status |= STATUS_RESET_PENDING;
679 if (priv->reset_backoff)
680 queue_delayed_work(priv->workqueue, &priv->reset_work,
681 priv->reset_backoff * HZ);
683 queue_delayed_work(priv->workqueue, &priv->reset_work,
686 if (priv->reset_backoff < MAX_RESET_BACKOFF)
687 priv->reset_backoff++;
689 wake_up_interruptible(&priv->wait_command_queue);
691 IPW_DEBUG_INFO("%s: Firmware restart already in progress.\n",
692 priv->net_dev->name);
696 #define HOST_COMPLETE_TIMEOUT (2 * HZ)
697 static int ipw2100_hw_send_command(struct ipw2100_priv *priv,
698 struct host_command *cmd)
700 struct list_head *element;
701 struct ipw2100_tx_packet *packet;
705 IPW_DEBUG_HC("Sending %s command (#%d), %d bytes\n",
706 command_types[cmd->host_command], cmd->host_command,
707 cmd->host_command_length);
708 printk_buf(IPW_DL_HC, (u8 *) cmd->host_command_parameters,
709 cmd->host_command_length);
711 spin_lock_irqsave(&priv->low_lock, flags);
713 if (priv->fatal_error) {
715 ("Attempt to send command while hardware in fatal error condition.\n");
720 if (!(priv->status & STATUS_RUNNING)) {
722 ("Attempt to send command while hardware is not running.\n");
727 if (priv->status & STATUS_CMD_ACTIVE) {
729 ("Attempt to send command while another command is pending.\n");
734 if (list_empty(&priv->msg_free_list)) {
735 IPW_DEBUG_INFO("no available msg buffers\n");
739 priv->status |= STATUS_CMD_ACTIVE;
740 priv->messages_sent++;
742 element = priv->msg_free_list.next;
744 packet = list_entry(element, struct ipw2100_tx_packet, list);
745 packet->jiffy_start = jiffies;
747 /* initialize the firmware command packet */
748 packet->info.c_struct.cmd->host_command_reg = cmd->host_command;
749 packet->info.c_struct.cmd->host_command_reg1 = cmd->host_command1;
750 packet->info.c_struct.cmd->host_command_len_reg =
751 cmd->host_command_length;
752 packet->info.c_struct.cmd->sequence = cmd->host_command_sequence;
754 memcpy(packet->info.c_struct.cmd->host_command_params_reg,
755 cmd->host_command_parameters,
756 sizeof(packet->info.c_struct.cmd->host_command_params_reg));
759 DEC_STAT(&priv->msg_free_stat);
761 list_add_tail(element, &priv->msg_pend_list);
762 INC_STAT(&priv->msg_pend_stat);
764 ipw2100_tx_send_commands(priv);
765 ipw2100_tx_send_data(priv);
767 spin_unlock_irqrestore(&priv->low_lock, flags);
770 * We must wait for this command to complete before another
771 * command can be sent... but if we wait more than 3 seconds
772 * then there is a problem.
776 wait_event_interruptible_timeout(priv->wait_command_queue,
778 status & STATUS_CMD_ACTIVE),
779 HOST_COMPLETE_TIMEOUT);
782 IPW_DEBUG_INFO("Command completion failed out after %dms.\n",
783 1000 * (HOST_COMPLETE_TIMEOUT / HZ));
784 priv->fatal_error = IPW2100_ERR_MSG_TIMEOUT;
785 priv->status &= ~STATUS_CMD_ACTIVE;
786 schedule_reset(priv);
790 if (priv->fatal_error) {
791 printk(KERN_WARNING DRV_NAME ": %s: firmware fatal error\n",
792 priv->net_dev->name);
796 /* !!!!! HACK TEST !!!!!
797 * When lots of debug trace statements are enabled, the driver
798 * doesn't seem to have as many firmware restart cycles...
800 * As a test, we're sticking in a 1/100s delay here */
801 schedule_timeout_uninterruptible(msecs_to_jiffies(10));
806 spin_unlock_irqrestore(&priv->low_lock, flags);
812 * Verify the values and data access of the hardware
813 * No locks needed or used. No functions called.
815 static int ipw2100_verify(struct ipw2100_priv *priv)
820 u32 val1 = 0x76543210;
821 u32 val2 = 0xFEDCBA98;
823 /* Domain 0 check - all values should be DOA_DEBUG */
824 for (address = IPW_REG_DOA_DEBUG_AREA_START;
825 address < IPW_REG_DOA_DEBUG_AREA_END; address += sizeof(u32)) {
826 read_register(priv->net_dev, address, &data1);
827 if (data1 != IPW_DATA_DOA_DEBUG_VALUE)
831 /* Domain 1 check - use arbitrary read/write compare */
832 for (address = 0; address < 5; address++) {
833 /* The memory area is not used now */
834 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
836 write_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
838 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x32,
840 read_register(priv->net_dev, IPW_REG_DOMAIN_1_OFFSET + 0x36,
842 if (val1 == data1 && val2 == data2)
851 * Loop until the CARD_DISABLED bit is the same value as the
854 * TODO: See if it would be more efficient to do a wait/wake
855 * cycle and have the completion event trigger the wakeup
858 #define IPW_CARD_DISABLE_COMPLETE_WAIT 100 // 100 milli
859 static int ipw2100_wait_for_card_state(struct ipw2100_priv *priv, int state)
863 u32 len = sizeof(card_state);
866 for (i = 0; i <= IPW_CARD_DISABLE_COMPLETE_WAIT * 1000; i += 50) {
867 err = ipw2100_get_ordinal(priv, IPW_ORD_CARD_DISABLED,
870 IPW_DEBUG_INFO("Query of CARD_DISABLED ordinal "
875 /* We'll break out if either the HW state says it is
876 * in the state we want, or if HOST_COMPLETE command
878 if ((card_state == state) ||
879 ((priv->status & STATUS_ENABLED) ?
880 IPW_HW_STATE_ENABLED : IPW_HW_STATE_DISABLED) == state) {
881 if (state == IPW_HW_STATE_ENABLED)
882 priv->status |= STATUS_ENABLED;
884 priv->status &= ~STATUS_ENABLED;
892 IPW_DEBUG_INFO("ipw2100_wait_for_card_state to %s state timed out\n",
893 state ? "DISABLED" : "ENABLED");
897 /*********************************************************************
898 Procedure : sw_reset_and_clock
899 Purpose : Asserts s/w reset, asserts clock initialization
900 and waits for clock stabilization
901 ********************************************************************/
902 static int sw_reset_and_clock(struct ipw2100_priv *priv)
908 write_register(priv->net_dev, IPW_REG_RESET_REG,
909 IPW_AUX_HOST_RESET_REG_SW_RESET);
911 // wait for clock stabilization
912 for (i = 0; i < 1000; i++) {
913 udelay(IPW_WAIT_RESET_ARC_COMPLETE_DELAY);
915 // check clock ready bit
916 read_register(priv->net_dev, IPW_REG_RESET_REG, &r);
917 if (r & IPW_AUX_HOST_RESET_REG_PRINCETON_RESET)
922 return -EIO; // TODO: better error value
924 /* set "initialization complete" bit to move adapter to
926 write_register(priv->net_dev, IPW_REG_GP_CNTRL,
927 IPW_AUX_HOST_GP_CNTRL_BIT_INIT_DONE);
929 /* wait for clock stabilization */
930 for (i = 0; i < 10000; i++) {
931 udelay(IPW_WAIT_CLOCK_STABILIZATION_DELAY * 4);
933 /* check clock ready bit */
934 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
935 if (r & IPW_AUX_HOST_GP_CNTRL_BIT_CLOCK_READY)
940 return -EIO; /* TODO: better error value */
942 /* set D0 standby bit */
943 read_register(priv->net_dev, IPW_REG_GP_CNTRL, &r);
944 write_register(priv->net_dev, IPW_REG_GP_CNTRL,
945 r | IPW_AUX_HOST_GP_CNTRL_BIT_HOST_ALLOWS_STANDBY);
950 /*********************************************************************
951 Procedure : ipw2100_download_firmware
952 Purpose : Initiaze adapter after power on.
954 1. assert s/w reset first!
955 2. awake clocks & wait for clock stabilization
956 3. hold ARC (don't ask me why...)
957 4. load Dino ucode and reset/clock init again
958 5. zero-out shared mem
960 *******************************************************************/
961 static int ipw2100_download_firmware(struct ipw2100_priv *priv)
967 /* Fetch the firmware and microcode */
968 struct ipw2100_fw ipw2100_firmware;
971 if (priv->fatal_error) {
972 IPW_DEBUG_ERROR("%s: ipw2100_download_firmware called after "
973 "fatal error %d. Interface must be brought down.\n",
974 priv->net_dev->name, priv->fatal_error);
978 if (!ipw2100_firmware.version) {
979 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
981 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
982 priv->net_dev->name, err);
983 priv->fatal_error = IPW2100_ERR_FW_LOAD;
988 err = ipw2100_get_firmware(priv, &ipw2100_firmware);
990 IPW_DEBUG_ERROR("%s: ipw2100_get_firmware failed: %d\n",
991 priv->net_dev->name, err);
992 priv->fatal_error = IPW2100_ERR_FW_LOAD;
996 priv->firmware_version = ipw2100_firmware.version;
998 /* s/w reset and clock stabilization */
999 err = sw_reset_and_clock(priv);
1001 IPW_DEBUG_ERROR("%s: sw_reset_and_clock failed: %d\n",
1002 priv->net_dev->name, err);
1006 err = ipw2100_verify(priv);
1008 IPW_DEBUG_ERROR("%s: ipw2100_verify failed: %d\n",
1009 priv->net_dev->name, err);
1014 write_nic_dword(priv->net_dev,
1015 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x80000000);
1017 /* allow ARC to run */
1018 write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1020 /* load microcode */
1021 err = ipw2100_ucode_download(priv, &ipw2100_firmware);
1023 printk(KERN_ERR DRV_NAME ": %s: Error loading microcode: %d\n",
1024 priv->net_dev->name, err);
1029 write_nic_dword(priv->net_dev,
1030 IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x00000000);
1032 /* s/w reset and clock stabilization (again!!!) */
1033 err = sw_reset_and_clock(priv);
1035 printk(KERN_ERR DRV_NAME
1036 ": %s: sw_reset_and_clock failed: %d\n",
1037 priv->net_dev->name, err);
1042 err = ipw2100_fw_download(priv, &ipw2100_firmware);
1044 IPW_DEBUG_ERROR("%s: Error loading firmware: %d\n",
1045 priv->net_dev->name, err);
1050 * When the .resume method of the driver is called, the other
1051 * part of the system, i.e. the ide driver could still stay in
1052 * the suspend stage. This prevents us from loading the firmware
1053 * from the disk. --YZ
1056 /* free any storage allocated for firmware image */
1057 ipw2100_release_firmware(priv, &ipw2100_firmware);
1060 /* zero out Domain 1 area indirectly (Si requirement) */
1061 for (address = IPW_HOST_FW_SHARED_AREA0;
1062 address < IPW_HOST_FW_SHARED_AREA0_END; address += 4)
1063 write_nic_dword(priv->net_dev, address, 0);
1064 for (address = IPW_HOST_FW_SHARED_AREA1;
1065 address < IPW_HOST_FW_SHARED_AREA1_END; address += 4)
1066 write_nic_dword(priv->net_dev, address, 0);
1067 for (address = IPW_HOST_FW_SHARED_AREA2;
1068 address < IPW_HOST_FW_SHARED_AREA2_END; address += 4)
1069 write_nic_dword(priv->net_dev, address, 0);
1070 for (address = IPW_HOST_FW_SHARED_AREA3;
1071 address < IPW_HOST_FW_SHARED_AREA3_END; address += 4)
1072 write_nic_dword(priv->net_dev, address, 0);
1073 for (address = IPW_HOST_FW_INTERRUPT_AREA;
1074 address < IPW_HOST_FW_INTERRUPT_AREA_END; address += 4)
1075 write_nic_dword(priv->net_dev, address, 0);
1080 ipw2100_release_firmware(priv, &ipw2100_firmware);
1084 static inline void ipw2100_enable_interrupts(struct ipw2100_priv *priv)
1086 if (priv->status & STATUS_INT_ENABLED)
1088 priv->status |= STATUS_INT_ENABLED;
1089 write_register(priv->net_dev, IPW_REG_INTA_MASK, IPW_INTERRUPT_MASK);
1092 static inline void ipw2100_disable_interrupts(struct ipw2100_priv *priv)
1094 if (!(priv->status & STATUS_INT_ENABLED))
1096 priv->status &= ~STATUS_INT_ENABLED;
1097 write_register(priv->net_dev, IPW_REG_INTA_MASK, 0x0);
1100 static void ipw2100_initialize_ordinals(struct ipw2100_priv *priv)
1102 struct ipw2100_ordinals *ord = &priv->ordinals;
1104 IPW_DEBUG_INFO("enter\n");
1106 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_1,
1109 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_ORDINALS_TABLE_2,
1112 read_nic_dword(priv->net_dev, ord->table1_addr, &ord->table1_size);
1113 read_nic_dword(priv->net_dev, ord->table2_addr, &ord->table2_size);
1115 ord->table2_size &= 0x0000FFFF;
1117 IPW_DEBUG_INFO("table 1 size: %d\n", ord->table1_size);
1118 IPW_DEBUG_INFO("table 2 size: %d\n", ord->table2_size);
1119 IPW_DEBUG_INFO("exit\n");
1122 static inline void ipw2100_hw_set_gpio(struct ipw2100_priv *priv)
1126 * Set GPIO 3 writable by FW; GPIO 1 writable
1127 * by driver and enable clock
1129 reg = (IPW_BIT_GPIO_GPIO3_MASK | IPW_BIT_GPIO_GPIO1_ENABLE |
1130 IPW_BIT_GPIO_LED_OFF);
1131 write_register(priv->net_dev, IPW_REG_GPIO, reg);
1134 static int rf_kill_active(struct ipw2100_priv *priv)
1136 #define MAX_RF_KILL_CHECKS 5
1137 #define RF_KILL_CHECK_DELAY 40
1139 unsigned short value = 0;
1143 if (!(priv->hw_features & HW_FEATURE_RFKILL)) {
1144 priv->status &= ~STATUS_RF_KILL_HW;
1148 for (i = 0; i < MAX_RF_KILL_CHECKS; i++) {
1149 udelay(RF_KILL_CHECK_DELAY);
1150 read_register(priv->net_dev, IPW_REG_GPIO, ®);
1151 value = (value << 1) | ((reg & IPW_BIT_GPIO_RF_KILL) ? 0 : 1);
1155 priv->status |= STATUS_RF_KILL_HW;
1157 priv->status &= ~STATUS_RF_KILL_HW;
1159 return (value == 0);
1162 static int ipw2100_get_hw_features(struct ipw2100_priv *priv)
1168 * EEPROM_SRAM_DB_START_ADDRESS using ordinal in ordinal table 1
1171 if (ipw2100_get_ordinal
1172 (priv, IPW_ORD_EEPROM_SRAM_DB_BLOCK_START_ADDRESS, &addr, &len)) {
1173 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1178 IPW_DEBUG_INFO("EEPROM address: %08X\n", addr);
1181 * EEPROM version is the byte at offset 0xfd in firmware
1182 * We read 4 bytes, then shift out the byte we actually want */
1183 read_nic_dword(priv->net_dev, addr + 0xFC, &val);
1184 priv->eeprom_version = (val >> 24) & 0xFF;
1185 IPW_DEBUG_INFO("EEPROM version: %d\n", priv->eeprom_version);
1188 * HW RF Kill enable is bit 0 in byte at offset 0x21 in firmware
1190 * notice that the EEPROM bit is reverse polarity, i.e.
1191 * bit = 0 signifies HW RF kill switch is supported
1192 * bit = 1 signifies HW RF kill switch is NOT supported
1194 read_nic_dword(priv->net_dev, addr + 0x20, &val);
1195 if (!((val >> 24) & 0x01))
1196 priv->hw_features |= HW_FEATURE_RFKILL;
1198 IPW_DEBUG_INFO("HW RF Kill: %ssupported.\n",
1199 (priv->hw_features & HW_FEATURE_RFKILL) ? "" : "not ");
1205 * Start firmware execution after power on and intialization
1208 * 2. Wait for f/w initialization completes;
1210 static int ipw2100_start_adapter(struct ipw2100_priv *priv)
1213 u32 inta, inta_mask, gpio;
1215 IPW_DEBUG_INFO("enter\n");
1217 if (priv->status & STATUS_RUNNING)
1221 * Initialize the hw - drive adapter to DO state by setting
1222 * init_done bit. Wait for clk_ready bit and Download
1225 if (ipw2100_download_firmware(priv)) {
1226 printk(KERN_ERR DRV_NAME
1227 ": %s: Failed to power on the adapter.\n",
1228 priv->net_dev->name);
1232 /* Clear the Tx, Rx and Msg queues and the r/w indexes
1233 * in the firmware RBD and TBD ring queue */
1234 ipw2100_queues_initialize(priv);
1236 ipw2100_hw_set_gpio(priv);
1238 /* TODO -- Look at disabling interrupts here to make sure none
1239 * get fired during FW initialization */
1241 /* Release ARC - clear reset bit */
1242 write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1244 /* wait for f/w intialization complete */
1245 IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n");
1248 schedule_timeout_uninterruptible(msecs_to_jiffies(40));
1249 /* Todo... wait for sync command ... */
1251 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1253 /* check "init done" bit */
1254 if (inta & IPW2100_INTA_FW_INIT_DONE) {
1255 /* reset "init done" bit */
1256 write_register(priv->net_dev, IPW_REG_INTA,
1257 IPW2100_INTA_FW_INIT_DONE);
1261 /* check error conditions : we check these after the firmware
1262 * check so that if there is an error, the interrupt handler
1263 * will see it and the adapter will be reset */
1265 (IPW2100_INTA_FATAL_ERROR | IPW2100_INTA_PARITY_ERROR)) {
1266 /* clear error conditions */
1267 write_register(priv->net_dev, IPW_REG_INTA,
1268 IPW2100_INTA_FATAL_ERROR |
1269 IPW2100_INTA_PARITY_ERROR);
1273 /* Clear out any pending INTAs since we aren't supposed to have
1274 * interrupts enabled at this point... */
1275 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1276 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
1277 inta &= IPW_INTERRUPT_MASK;
1278 /* Clear out any pending interrupts */
1279 if (inta & inta_mask)
1280 write_register(priv->net_dev, IPW_REG_INTA, inta);
1282 IPW_DEBUG_FW("f/w initialization complete: %s\n",
1283 i ? "SUCCESS" : "FAILED");
1286 printk(KERN_WARNING DRV_NAME
1287 ": %s: Firmware did not initialize.\n",
1288 priv->net_dev->name);
1292 /* allow firmware to write to GPIO1 & GPIO3 */
1293 read_register(priv->net_dev, IPW_REG_GPIO, &gpio);
1295 gpio |= (IPW_BIT_GPIO_GPIO1_MASK | IPW_BIT_GPIO_GPIO3_MASK);
1297 write_register(priv->net_dev, IPW_REG_GPIO, gpio);
1299 /* Ready to receive commands */
1300 priv->status |= STATUS_RUNNING;
1302 /* The adapter has been reset; we are not associated */
1303 priv->status &= ~(STATUS_ASSOCIATING | STATUS_ASSOCIATED);
1305 IPW_DEBUG_INFO("exit\n");
1310 static inline void ipw2100_reset_fatalerror(struct ipw2100_priv *priv)
1312 if (!priv->fatal_error)
1315 priv->fatal_errors[priv->fatal_index++] = priv->fatal_error;
1316 priv->fatal_index %= IPW2100_ERROR_QUEUE;
1317 priv->fatal_error = 0;
1320 /* NOTE: Our interrupt is disabled when this method is called */
1321 static int ipw2100_power_cycle_adapter(struct ipw2100_priv *priv)
1326 IPW_DEBUG_INFO("Power cycling the hardware.\n");
1328 ipw2100_hw_set_gpio(priv);
1330 /* Step 1. Stop Master Assert */
1331 write_register(priv->net_dev, IPW_REG_RESET_REG,
1332 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1334 /* Step 2. Wait for stop Master Assert
1335 * (not more than 50us, otherwise ret error */
1338 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
1339 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
1341 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1345 priv->status &= ~STATUS_RESET_PENDING;
1349 ("exit - waited too long for master assert stop\n");
1353 write_register(priv->net_dev, IPW_REG_RESET_REG,
1354 IPW_AUX_HOST_RESET_REG_SW_RESET);
1356 /* Reset any fatal_error conditions */
1357 ipw2100_reset_fatalerror(priv);
1359 /* At this point, the adapter is now stopped and disabled */
1360 priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING |
1361 STATUS_ASSOCIATED | STATUS_ENABLED);
1367 * Send the CARD_DISABLE_PHY_OFF comamnd to the card to disable it
1369 * After disabling, if the card was associated, a STATUS_ASSN_LOST will be sent.
1371 * STATUS_CARD_DISABLE_NOTIFICATION will be sent regardless of
1372 * if STATUS_ASSN_LOST is sent.
1374 static int ipw2100_hw_phy_off(struct ipw2100_priv *priv)
1377 #define HW_PHY_OFF_LOOP_DELAY (HZ / 5000)
1379 struct host_command cmd = {
1380 .host_command = CARD_DISABLE_PHY_OFF,
1381 .host_command_sequence = 0,
1382 .host_command_length = 0,
1387 IPW_DEBUG_HC("CARD_DISABLE_PHY_OFF\n");
1389 /* Turn off the radio */
1390 err = ipw2100_hw_send_command(priv, &cmd);
1394 for (i = 0; i < 2500; i++) {
1395 read_nic_dword(priv->net_dev, IPW2100_CONTROL_REG, &val1);
1396 read_nic_dword(priv->net_dev, IPW2100_COMMAND, &val2);
1398 if ((val1 & IPW2100_CONTROL_PHY_OFF) &&
1399 (val2 & IPW2100_COMMAND_PHY_OFF))
1402 schedule_timeout_uninterruptible(HW_PHY_OFF_LOOP_DELAY);
1408 static int ipw2100_enable_adapter(struct ipw2100_priv *priv)
1410 struct host_command cmd = {
1411 .host_command = HOST_COMPLETE,
1412 .host_command_sequence = 0,
1413 .host_command_length = 0
1417 IPW_DEBUG_HC("HOST_COMPLETE\n");
1419 if (priv->status & STATUS_ENABLED)
1422 mutex_lock(&priv->adapter_mutex);
1424 if (rf_kill_active(priv)) {
1425 IPW_DEBUG_HC("Command aborted due to RF kill active.\n");
1429 err = ipw2100_hw_send_command(priv, &cmd);
1431 IPW_DEBUG_INFO("Failed to send HOST_COMPLETE command\n");
1435 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_ENABLED);
1437 IPW_DEBUG_INFO("%s: card not responding to init command.\n",
1438 priv->net_dev->name);
1442 if (priv->stop_hang_check) {
1443 priv->stop_hang_check = 0;
1444 queue_delayed_work(priv->workqueue, &priv->hang_check, HZ / 2);
1448 mutex_unlock(&priv->adapter_mutex);
1452 static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv)
1454 #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100))
1456 struct host_command cmd = {
1457 .host_command = HOST_PRE_POWER_DOWN,
1458 .host_command_sequence = 0,
1459 .host_command_length = 0,
1464 if (!(priv->status & STATUS_RUNNING))
1467 priv->status |= STATUS_STOPPING;
1469 /* We can only shut down the card if the firmware is operational. So,
1470 * if we haven't reset since a fatal_error, then we can not send the
1471 * shutdown commands. */
1472 if (!priv->fatal_error) {
1473 /* First, make sure the adapter is enabled so that the PHY_OFF
1474 * command can shut it down */
1475 ipw2100_enable_adapter(priv);
1477 err = ipw2100_hw_phy_off(priv);
1479 printk(KERN_WARNING DRV_NAME
1480 ": Error disabling radio %d\n", err);
1483 * If in D0-standby mode going directly to D3 may cause a
1484 * PCI bus violation. Therefore we must change out of the D0
1487 * Sending the PREPARE_FOR_POWER_DOWN will restrict the
1488 * hardware from going into standby mode and will transition
1489 * out of D0-standby if it is already in that state.
1491 * STATUS_PREPARE_POWER_DOWN_COMPLETE will be sent by the
1492 * driver upon completion. Once received, the driver can
1493 * proceed to the D3 state.
1495 * Prepare for power down command to fw. This command would
1496 * take HW out of D0-standby and prepare it for D3 state.
1498 * Currently FW does not support event notification for this
1499 * event. Therefore, skip waiting for it. Just wait a fixed
1502 IPW_DEBUG_HC("HOST_PRE_POWER_DOWN\n");
1504 err = ipw2100_hw_send_command(priv, &cmd);
1506 printk(KERN_WARNING DRV_NAME ": "
1507 "%s: Power down command failed: Error %d\n",
1508 priv->net_dev->name, err);
1510 schedule_timeout_uninterruptible(HW_POWER_DOWN_DELAY);
1513 priv->status &= ~STATUS_ENABLED;
1516 * Set GPIO 3 writable by FW; GPIO 1 writable
1517 * by driver and enable clock
1519 ipw2100_hw_set_gpio(priv);
1522 * Power down adapter. Sequence:
1523 * 1. Stop master assert (RESET_REG[9]=1)
1524 * 2. Wait for stop master (RESET_REG[8]==1)
1525 * 3. S/w reset assert (RESET_REG[7] = 1)
1528 /* Stop master assert */
1529 write_register(priv->net_dev, IPW_REG_RESET_REG,
1530 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1532 /* wait stop master not more than 50 usec.
1533 * Otherwise return error. */
1534 for (i = 5; i > 0; i--) {
1537 /* Check master stop bit */
1538 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
1540 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
1545 printk(KERN_WARNING DRV_NAME
1546 ": %s: Could now power down adapter.\n",
1547 priv->net_dev->name);
1549 /* assert s/w reset */
1550 write_register(priv->net_dev, IPW_REG_RESET_REG,
1551 IPW_AUX_HOST_RESET_REG_SW_RESET);
1553 priv->status &= ~(STATUS_RUNNING | STATUS_STOPPING);
1558 static int ipw2100_disable_adapter(struct ipw2100_priv *priv)
1560 struct host_command cmd = {
1561 .host_command = CARD_DISABLE,
1562 .host_command_sequence = 0,
1563 .host_command_length = 0
1567 IPW_DEBUG_HC("CARD_DISABLE\n");
1569 if (!(priv->status & STATUS_ENABLED))
1572 /* Make sure we clear the associated state */
1573 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1575 if (!priv->stop_hang_check) {
1576 priv->stop_hang_check = 1;
1577 cancel_delayed_work(&priv->hang_check);
1580 mutex_lock(&priv->adapter_mutex);
1582 err = ipw2100_hw_send_command(priv, &cmd);
1584 printk(KERN_WARNING DRV_NAME
1585 ": exit - failed to send CARD_DISABLE command\n");
1589 err = ipw2100_wait_for_card_state(priv, IPW_HW_STATE_DISABLED);
1591 printk(KERN_WARNING DRV_NAME
1592 ": exit - card failed to change to DISABLED\n");
1596 IPW_DEBUG_INFO("TODO: implement scan state machine\n");
1599 mutex_unlock(&priv->adapter_mutex);
1603 static int ipw2100_set_scan_options(struct ipw2100_priv *priv)
1605 struct host_command cmd = {
1606 .host_command = SET_SCAN_OPTIONS,
1607 .host_command_sequence = 0,
1608 .host_command_length = 8
1612 IPW_DEBUG_INFO("enter\n");
1614 IPW_DEBUG_SCAN("setting scan options\n");
1616 cmd.host_command_parameters[0] = 0;
1618 if (!(priv->config & CFG_ASSOCIATE))
1619 cmd.host_command_parameters[0] |= IPW_SCAN_NOASSOCIATE;
1620 if ((priv->ieee->sec.flags & SEC_ENABLED) && priv->ieee->sec.enabled)
1621 cmd.host_command_parameters[0] |= IPW_SCAN_MIXED_CELL;
1622 if (priv->config & CFG_PASSIVE_SCAN)
1623 cmd.host_command_parameters[0] |= IPW_SCAN_PASSIVE;
1625 cmd.host_command_parameters[1] = priv->channel_mask;
1627 err = ipw2100_hw_send_command(priv, &cmd);
1629 IPW_DEBUG_HC("SET_SCAN_OPTIONS 0x%04X\n",
1630 cmd.host_command_parameters[0]);
1635 static int ipw2100_start_scan(struct ipw2100_priv *priv)
1637 struct host_command cmd = {
1638 .host_command = BROADCAST_SCAN,
1639 .host_command_sequence = 0,
1640 .host_command_length = 4
1644 IPW_DEBUG_HC("START_SCAN\n");
1646 cmd.host_command_parameters[0] = 0;
1648 /* No scanning if in monitor mode */
1649 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
1652 if (priv->status & STATUS_SCANNING) {
1653 IPW_DEBUG_SCAN("Scan requested while already in scan...\n");
1657 IPW_DEBUG_INFO("enter\n");
1659 /* Not clearing here; doing so makes iwlist always return nothing...
1661 * We should modify the table logic to use aging tables vs. clearing
1662 * the table on each scan start.
1664 IPW_DEBUG_SCAN("starting scan\n");
1666 priv->status |= STATUS_SCANNING;
1667 err = ipw2100_hw_send_command(priv, &cmd);
1669 priv->status &= ~STATUS_SCANNING;
1671 IPW_DEBUG_INFO("exit\n");
1676 static const struct ieee80211_geo ipw_geos[] = {
1680 .bg = {{2412, 1}, {2417, 2}, {2422, 3},
1681 {2427, 4}, {2432, 5}, {2437, 6},
1682 {2442, 7}, {2447, 8}, {2452, 9},
1683 {2457, 10}, {2462, 11}, {2467, 12},
1684 {2472, 13}, {2484, 14}},
1688 static int ipw2100_up(struct ipw2100_priv *priv, int deferred)
1690 unsigned long flags;
1693 u32 ord_len = sizeof(lock);
1695 /* Age scan list entries found before suspend */
1696 if (priv->suspend_time) {
1697 ieee80211_networks_age(priv->ieee, priv->suspend_time);
1698 priv->suspend_time = 0;
1701 /* Quiet if manually disabled. */
1702 if (priv->status & STATUS_RF_KILL_SW) {
1703 IPW_DEBUG_INFO("%s: Radio is disabled by Manual Disable "
1704 "switch\n", priv->net_dev->name);
1708 /* the ipw2100 hardware really doesn't want power management delays
1709 * longer than 175usec
1711 pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100", 175);
1713 /* If the interrupt is enabled, turn it off... */
1714 spin_lock_irqsave(&priv->low_lock, flags);
1715 ipw2100_disable_interrupts(priv);
1717 /* Reset any fatal_error conditions */
1718 ipw2100_reset_fatalerror(priv);
1719 spin_unlock_irqrestore(&priv->low_lock, flags);
1721 if (priv->status & STATUS_POWERED ||
1722 (priv->status & STATUS_RESET_PENDING)) {
1723 /* Power cycle the card ... */
1724 if (ipw2100_power_cycle_adapter(priv)) {
1725 printk(KERN_WARNING DRV_NAME
1726 ": %s: Could not cycle adapter.\n",
1727 priv->net_dev->name);
1732 priv->status |= STATUS_POWERED;
1734 /* Load the firmware, start the clocks, etc. */
1735 if (ipw2100_start_adapter(priv)) {
1736 printk(KERN_ERR DRV_NAME
1737 ": %s: Failed to start the firmware.\n",
1738 priv->net_dev->name);
1743 ipw2100_initialize_ordinals(priv);
1745 /* Determine capabilities of this particular HW configuration */
1746 if (ipw2100_get_hw_features(priv)) {
1747 printk(KERN_ERR DRV_NAME
1748 ": %s: Failed to determine HW features.\n",
1749 priv->net_dev->name);
1754 /* Initialize the geo */
1755 if (ieee80211_set_geo(priv->ieee, &ipw_geos[0])) {
1756 printk(KERN_WARNING DRV_NAME "Could not set geo\n");
1759 priv->ieee->freq_band = IEEE80211_24GHZ_BAND;
1762 if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
1763 printk(KERN_ERR DRV_NAME
1764 ": %s: Failed to clear ordinal lock.\n",
1765 priv->net_dev->name);
1770 priv->status &= ~STATUS_SCANNING;
1772 if (rf_kill_active(priv)) {
1773 printk(KERN_INFO "%s: Radio is disabled by RF switch.\n",
1774 priv->net_dev->name);
1776 if (priv->stop_rf_kill) {
1777 priv->stop_rf_kill = 0;
1778 queue_delayed_work(priv->workqueue, &priv->rf_kill,
1779 round_jiffies_relative(HZ));
1785 /* Turn on the interrupt so that commands can be processed */
1786 ipw2100_enable_interrupts(priv);
1788 /* Send all of the commands that must be sent prior to
1790 if (ipw2100_adapter_setup(priv)) {
1791 printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n",
1792 priv->net_dev->name);
1798 /* Enable the adapter - sends HOST_COMPLETE */
1799 if (ipw2100_enable_adapter(priv)) {
1800 printk(KERN_ERR DRV_NAME ": "
1801 "%s: failed in call to enable adapter.\n",
1802 priv->net_dev->name);
1803 ipw2100_hw_stop_adapter(priv);
1808 /* Start a scan . . . */
1809 ipw2100_set_scan_options(priv);
1810 ipw2100_start_scan(priv);
1817 /* Called by register_netdev() */
1818 static int ipw2100_net_init(struct net_device *dev)
1820 struct ipw2100_priv *priv = ieee80211_priv(dev);
1821 return ipw2100_up(priv, 1);
1824 static void ipw2100_down(struct ipw2100_priv *priv)
1826 unsigned long flags;
1827 union iwreq_data wrqu = {
1829 .sa_family = ARPHRD_ETHER}
1831 int associated = priv->status & STATUS_ASSOCIATED;
1833 /* Kill the RF switch timer */
1834 if (!priv->stop_rf_kill) {
1835 priv->stop_rf_kill = 1;
1836 cancel_delayed_work(&priv->rf_kill);
1839 /* Kill the firmware hang check timer */
1840 if (!priv->stop_hang_check) {
1841 priv->stop_hang_check = 1;
1842 cancel_delayed_work(&priv->hang_check);
1845 /* Kill any pending resets */
1846 if (priv->status & STATUS_RESET_PENDING)
1847 cancel_delayed_work(&priv->reset_work);
1849 /* Make sure the interrupt is on so that FW commands will be
1850 * processed correctly */
1851 spin_lock_irqsave(&priv->low_lock, flags);
1852 ipw2100_enable_interrupts(priv);
1853 spin_unlock_irqrestore(&priv->low_lock, flags);
1855 if (ipw2100_hw_stop_adapter(priv))
1856 printk(KERN_ERR DRV_NAME ": %s: Error stopping adapter.\n",
1857 priv->net_dev->name);
1859 /* Do not disable the interrupt until _after_ we disable
1860 * the adaptor. Otherwise the CARD_DISABLE command will never
1861 * be ack'd by the firmware */
1862 spin_lock_irqsave(&priv->low_lock, flags);
1863 ipw2100_disable_interrupts(priv);
1864 spin_unlock_irqrestore(&priv->low_lock, flags);
1866 pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100",
1867 PM_QOS_DEFAULT_VALUE);
1869 /* We have to signal any supplicant if we are disassociating */
1871 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1873 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1874 netif_carrier_off(priv->net_dev);
1875 netif_stop_queue(priv->net_dev);
1878 static void ipw2100_reset_adapter(struct work_struct *work)
1880 struct ipw2100_priv *priv =
1881 container_of(work, struct ipw2100_priv, reset_work.work);
1882 unsigned long flags;
1883 union iwreq_data wrqu = {
1885 .sa_family = ARPHRD_ETHER}
1887 int associated = priv->status & STATUS_ASSOCIATED;
1889 spin_lock_irqsave(&priv->low_lock, flags);
1890 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name);
1892 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1893 priv->status |= STATUS_SECURITY_UPDATED;
1895 /* Force a power cycle even if interface hasn't been opened
1897 cancel_delayed_work(&priv->reset_work);
1898 priv->status |= STATUS_RESET_PENDING;
1899 spin_unlock_irqrestore(&priv->low_lock, flags);
1901 mutex_lock(&priv->action_mutex);
1902 /* stop timed checks so that they don't interfere with reset */
1903 priv->stop_hang_check = 1;
1904 cancel_delayed_work(&priv->hang_check);
1906 /* We have to signal any supplicant if we are disassociating */
1908 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1910 ipw2100_up(priv, 0);
1911 mutex_unlock(&priv->action_mutex);
1915 static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1918 #define MAC_ASSOCIATION_READ_DELAY (HZ)
1920 unsigned int len, essid_len;
1921 char essid[IW_ESSID_MAX_SIZE];
1926 DECLARE_SSID_BUF(ssid);
1929 * TBD: BSSID is usually 00:00:00:00:00:00 here and not
1930 * an actual MAC of the AP. Seems like FW sets this
1931 * address too late. Read it later and expose through
1932 * /proc or schedule a later task to query and update
1935 essid_len = IW_ESSID_MAX_SIZE;
1936 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID,
1939 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1945 ret = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &txrate, &len);
1947 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1953 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &len);
1955 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1960 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, &bssid, &len);
1962 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1966 memcpy(priv->ieee->bssid, bssid, ETH_ALEN);
1969 case TX_RATE_1_MBIT:
1970 txratename = "1Mbps";
1972 case TX_RATE_2_MBIT:
1973 txratename = "2Mbsp";
1975 case TX_RATE_5_5_MBIT:
1976 txratename = "5.5Mbps";
1978 case TX_RATE_11_MBIT:
1979 txratename = "11Mbps";
1982 IPW_DEBUG_INFO("Unknown rate: %d\n", txrate);
1983 txratename = "unknown rate";
1987 IPW_DEBUG_INFO("%s: Associated with '%s' at %s, channel %d (BSSID=%pM)\n",
1988 priv->net_dev->name, print_ssid(ssid, essid, essid_len),
1989 txratename, chan, bssid);
1991 /* now we copy read ssid into dev */
1992 if (!(priv->config & CFG_STATIC_ESSID)) {
1993 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE);
1994 memcpy(priv->essid, essid, priv->essid_len);
1996 priv->channel = chan;
1997 memcpy(priv->bssid, bssid, ETH_ALEN);
1999 priv->status |= STATUS_ASSOCIATING;
2000 priv->connect_start = get_seconds();
2002 queue_delayed_work(priv->workqueue, &priv->wx_event_work, HZ / 10);
2005 static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
2006 int length, int batch_mode)
2008 int ssid_len = min(length, IW_ESSID_MAX_SIZE);
2009 struct host_command cmd = {
2010 .host_command = SSID,
2011 .host_command_sequence = 0,
2012 .host_command_length = ssid_len
2015 DECLARE_SSID_BUF(ssid);
2017 IPW_DEBUG_HC("SSID: '%s'\n", print_ssid(ssid, essid, ssid_len));
2020 memcpy(cmd.host_command_parameters, essid, ssid_len);
2023 err = ipw2100_disable_adapter(priv);
2028 /* Bug in FW currently doesn't honor bit 0 in SET_SCAN_OPTIONS to
2029 * disable auto association -- so we cheat by setting a bogus SSID */
2030 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) {
2032 u8 *bogus = (u8 *) cmd.host_command_parameters;
2033 for (i = 0; i < IW_ESSID_MAX_SIZE; i++)
2034 bogus[i] = 0x18 + i;
2035 cmd.host_command_length = IW_ESSID_MAX_SIZE;
2038 /* NOTE: We always send the SSID command even if the provided ESSID is
2039 * the same as what we currently think is set. */
2041 err = ipw2100_hw_send_command(priv, &cmd);
2043 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len);
2044 memcpy(priv->essid, essid, ssid_len);
2045 priv->essid_len = ssid_len;
2049 if (ipw2100_enable_adapter(priv))
2056 static void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status)
2058 DECLARE_SSID_BUF(ssid);
2060 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | IPW_DL_ASSOC,
2061 "disassociated: '%s' %pM \n",
2062 print_ssid(ssid, priv->essid, priv->essid_len),
2065 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
2067 if (priv->status & STATUS_STOPPING) {
2068 IPW_DEBUG_INFO("Card is stopping itself, discard ASSN_LOST.\n");
2072 memset(priv->bssid, 0, ETH_ALEN);
2073 memset(priv->ieee->bssid, 0, ETH_ALEN);
2075 netif_carrier_off(priv->net_dev);
2076 netif_stop_queue(priv->net_dev);
2078 if (!(priv->status & STATUS_RUNNING))
2081 if (priv->status & STATUS_SECURITY_UPDATED)
2082 queue_delayed_work(priv->workqueue, &priv->security_work, 0);
2084 queue_delayed_work(priv->workqueue, &priv->wx_event_work, 0);
2087 static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
2089 IPW_DEBUG_INFO("%s: RF Kill state changed to radio OFF.\n",
2090 priv->net_dev->name);
2092 /* RF_KILL is now enabled (else we wouldn't be here) */
2093 priv->status |= STATUS_RF_KILL_HW;
2095 /* Make sure the RF Kill check timer is running */
2096 priv->stop_rf_kill = 0;
2097 cancel_delayed_work(&priv->rf_kill);
2098 queue_delayed_work(priv->workqueue, &priv->rf_kill,
2099 round_jiffies_relative(HZ));
2102 static void send_scan_event(void *data)
2104 struct ipw2100_priv *priv = data;
2105 union iwreq_data wrqu;
2107 wrqu.data.length = 0;
2108 wrqu.data.flags = 0;
2109 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
2112 static void ipw2100_scan_event_later(struct work_struct *work)
2114 send_scan_event(container_of(work, struct ipw2100_priv,
2115 scan_event_later.work));
2118 static void ipw2100_scan_event_now(struct work_struct *work)
2120 send_scan_event(container_of(work, struct ipw2100_priv,
2124 static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
2126 IPW_DEBUG_SCAN("scan complete\n");
2127 /* Age the scan results... */
2128 priv->ieee->scans++;
2129 priv->status &= ~STATUS_SCANNING;
2131 /* Only userspace-requested scan completion events go out immediately */
2132 if (!priv->user_requested_scan) {
2133 if (!delayed_work_pending(&priv->scan_event_later))
2134 queue_delayed_work(priv->workqueue,
2135 &priv->scan_event_later,
2136 round_jiffies_relative(msecs_to_jiffies(4000)));
2138 priv->user_requested_scan = 0;
2139 cancel_delayed_work(&priv->scan_event_later);
2140 queue_work(priv->workqueue, &priv->scan_event_now);
2144 #ifdef CONFIG_IPW2100_DEBUG
2145 #define IPW2100_HANDLER(v, f) { v, f, # v }
2146 struct ipw2100_status_indicator {
2148 void (*cb) (struct ipw2100_priv * priv, u32 status);
2152 #define IPW2100_HANDLER(v, f) { v, f }
2153 struct ipw2100_status_indicator {
2155 void (*cb) (struct ipw2100_priv * priv, u32 status);
2157 #endif /* CONFIG_IPW2100_DEBUG */
2159 static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status)
2161 IPW_DEBUG_SCAN("Scanning...\n");
2162 priv->status |= STATUS_SCANNING;
2165 static const struct ipw2100_status_indicator status_handlers[] = {
2166 IPW2100_HANDLER(IPW_STATE_INITIALIZED, NULL),
2167 IPW2100_HANDLER(IPW_STATE_COUNTRY_FOUND, NULL),
2168 IPW2100_HANDLER(IPW_STATE_ASSOCIATED, isr_indicate_associated),
2169 IPW2100_HANDLER(IPW_STATE_ASSN_LOST, isr_indicate_association_lost),
2170 IPW2100_HANDLER(IPW_STATE_ASSN_CHANGED, NULL),
2171 IPW2100_HANDLER(IPW_STATE_SCAN_COMPLETE, isr_scan_complete),
2172 IPW2100_HANDLER(IPW_STATE_ENTERED_PSP, NULL),
2173 IPW2100_HANDLER(IPW_STATE_LEFT_PSP, NULL),
2174 IPW2100_HANDLER(IPW_STATE_RF_KILL, isr_indicate_rf_kill),
2175 IPW2100_HANDLER(IPW_STATE_DISABLED, NULL),
2176 IPW2100_HANDLER(IPW_STATE_POWER_DOWN, NULL),
2177 IPW2100_HANDLER(IPW_STATE_SCANNING, isr_indicate_scanning),
2178 IPW2100_HANDLER(-1, NULL)
2181 static void isr_status_change(struct ipw2100_priv *priv, int status)
2185 if (status == IPW_STATE_SCANNING &&
2186 priv->status & STATUS_ASSOCIATED &&
2187 !(priv->status & STATUS_SCANNING)) {
2188 IPW_DEBUG_INFO("Scan detected while associated, with "
2189 "no scan request. Restarting firmware.\n");
2191 /* Wake up any sleeping jobs */
2192 schedule_reset(priv);
2195 for (i = 0; status_handlers[i].status != -1; i++) {
2196 if (status == status_handlers[i].status) {
2197 IPW_DEBUG_NOTIF("Status change: %s\n",
2198 status_handlers[i].name);
2199 if (status_handlers[i].cb)
2200 status_handlers[i].cb(priv, status);
2201 priv->wstats.status = status;
2206 IPW_DEBUG_NOTIF("unknown status received: %04x\n", status);
2209 static void isr_rx_complete_command(struct ipw2100_priv *priv,
2210 struct ipw2100_cmd_header *cmd)
2212 #ifdef CONFIG_IPW2100_DEBUG
2213 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) {
2214 IPW_DEBUG_HC("Command completed '%s (%d)'\n",
2215 command_types[cmd->host_command_reg],
2216 cmd->host_command_reg);
2219 if (cmd->host_command_reg == HOST_COMPLETE)
2220 priv->status |= STATUS_ENABLED;
2222 if (cmd->host_command_reg == CARD_DISABLE)
2223 priv->status &= ~STATUS_ENABLED;
2225 priv->status &= ~STATUS_CMD_ACTIVE;
2227 wake_up_interruptible(&priv->wait_command_queue);
2230 #ifdef CONFIG_IPW2100_DEBUG
2231 static const char *frame_types[] = {
2232 "COMMAND_STATUS_VAL",
2233 "STATUS_CHANGE_VAL",
2236 "HOST_NOTIFICATION_VAL"
2240 static int ipw2100_alloc_skb(struct ipw2100_priv *priv,
2241 struct ipw2100_rx_packet *packet)
2243 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx));
2247 packet->rxp = (struct ipw2100_rx *)packet->skb->data;
2248 packet->dma_addr = pci_map_single(priv->pci_dev, packet->skb->data,
2249 sizeof(struct ipw2100_rx),
2250 PCI_DMA_FROMDEVICE);
2251 /* NOTE: pci_map_single does not return an error code, and 0 is a valid
2257 #define SEARCH_ERROR 0xffffffff
2258 #define SEARCH_FAIL 0xfffffffe
2259 #define SEARCH_SUCCESS 0xfffffff0
2260 #define SEARCH_DISCARD 0
2261 #define SEARCH_SNAPSHOT 1
2263 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2264 static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
2267 if (!priv->snapshot[0])
2269 for (i = 0; i < 0x30; i++)
2270 kfree(priv->snapshot[i]);
2271 priv->snapshot[0] = NULL;
2274 #ifdef IPW2100_DEBUG_C3
2275 static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
2278 if (priv->snapshot[0])
2280 for (i = 0; i < 0x30; i++) {
2281 priv->snapshot[i] = kmalloc(0x1000, GFP_ATOMIC);
2282 if (!priv->snapshot[i]) {
2283 IPW_DEBUG_INFO("%s: Error allocating snapshot "
2284 "buffer %d\n", priv->net_dev->name, i);
2286 kfree(priv->snapshot[--i]);
2287 priv->snapshot[0] = NULL;
2295 static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
2296 size_t len, int mode)
2304 if (mode == SEARCH_SNAPSHOT) {
2305 if (!ipw2100_snapshot_alloc(priv))
2306 mode = SEARCH_DISCARD;
2309 for (ret = SEARCH_FAIL, i = 0; i < 0x30000; i += 4) {
2310 read_nic_dword(priv->net_dev, i, &tmp);
2311 if (mode == SEARCH_SNAPSHOT)
2312 *(u32 *) SNAPSHOT_ADDR(i) = tmp;
2313 if (ret == SEARCH_FAIL) {
2315 for (j = 0; j < 4; j++) {
2324 if ((s - in_buf) == len)
2325 ret = (i + j) - len + 1;
2327 } else if (mode == SEARCH_DISCARD)
2337 * 0) Disconnect the SKB from the firmware (just unmap)
2338 * 1) Pack the ETH header into the SKB
2339 * 2) Pass the SKB to the network stack
2341 * When packet is provided by the firmware, it contains the following:
2344 * . ieee80211_snap_hdr
2346 * The size of the constructed ethernet
2349 #ifdef IPW2100_RX_DEBUG
2350 static u8 packet_data[IPW_RX_NIC_BUFFER_LENGTH];
2353 static void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i)
2355 #ifdef IPW2100_DEBUG_C3
2356 struct ipw2100_status *status = &priv->status_queue.drv[i];
2361 IPW_DEBUG_INFO(": PCI latency error detected at 0x%04zX.\n",
2362 i * sizeof(struct ipw2100_status));
2364 #ifdef IPW2100_DEBUG_C3
2365 /* Halt the fimrware so we can get a good image */
2366 write_register(priv->net_dev, IPW_REG_RESET_REG,
2367 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
2370 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
2371 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
2373 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
2377 match = ipw2100_match_buf(priv, (u8 *) status,
2378 sizeof(struct ipw2100_status),
2380 if (match < SEARCH_SUCCESS)
2381 IPW_DEBUG_INFO("%s: DMA status match in Firmware at "
2382 "offset 0x%06X, length %d:\n",
2383 priv->net_dev->name, match,
2384 sizeof(struct ipw2100_status));
2386 IPW_DEBUG_INFO("%s: No DMA status match in "
2387 "Firmware.\n", priv->net_dev->name);
2389 printk_buf((u8 *) priv->status_queue.drv,
2390 sizeof(struct ipw2100_status) * RX_QUEUE_LENGTH);
2393 priv->fatal_error = IPW2100_ERR_C3_CORRUPTION;
2394 priv->ieee->stats.rx_errors++;
2395 schedule_reset(priv);
2398 static void isr_rx(struct ipw2100_priv *priv, int i,
2399 struct ieee80211_rx_stats *stats)
2401 struct ipw2100_status *status = &priv->status_queue.drv[i];
2402 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2404 IPW_DEBUG_RX("Handler...\n");
2406 if (unlikely(status->frame_size > skb_tailroom(packet->skb))) {
2407 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2409 priv->net_dev->name,
2410 status->frame_size, skb_tailroom(packet->skb));
2411 priv->ieee->stats.rx_errors++;
2415 if (unlikely(!netif_running(priv->net_dev))) {
2416 priv->ieee->stats.rx_errors++;
2417 priv->wstats.discard.misc++;
2418 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2422 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR &&
2423 !(priv->status & STATUS_ASSOCIATED))) {
2424 IPW_DEBUG_DROP("Dropping packet while not associated.\n");
2425 priv->wstats.discard.misc++;
2429 pci_unmap_single(priv->pci_dev,
2431 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2433 skb_put(packet->skb, status->frame_size);
2435 #ifdef IPW2100_RX_DEBUG
2436 /* Make a copy of the frame so we can dump it to the logs if
2437 * ieee80211_rx fails */
2438 skb_copy_from_linear_data(packet->skb, packet_data,
2439 min_t(u32, status->frame_size,
2440 IPW_RX_NIC_BUFFER_LENGTH));
2443 if (!ieee80211_rx(priv->ieee, packet->skb, stats)) {
2444 #ifdef IPW2100_RX_DEBUG
2445 IPW_DEBUG_DROP("%s: Non consumed packet:\n",
2446 priv->net_dev->name);
2447 printk_buf(IPW_DL_DROP, packet_data, status->frame_size);
2449 priv->ieee->stats.rx_errors++;
2451 /* ieee80211_rx failed, so it didn't free the SKB */
2452 dev_kfree_skb_any(packet->skb);
2456 /* We need to allocate a new SKB and attach it to the RDB. */
2457 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2458 printk(KERN_WARNING DRV_NAME ": "
2459 "%s: Unable to allocate SKB onto RBD ring - disabling "
2460 "adapter.\n", priv->net_dev->name);
2461 /* TODO: schedule adapter shutdown */
2462 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2465 /* Update the RDB entry */
2466 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2469 #ifdef CONFIG_IPW2100_MONITOR
2471 static void isr_rx_monitor(struct ipw2100_priv *priv, int i,
2472 struct ieee80211_rx_stats *stats)
2474 struct ipw2100_status *status = &priv->status_queue.drv[i];
2475 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2477 /* Magic struct that slots into the radiotap header -- no reason
2478 * to build this manually element by element, we can write it much
2479 * more efficiently than we can parse it. ORDER MATTERS HERE */
2481 struct ieee80211_radiotap_header rt_hdr;
2482 s8 rt_dbmsignal; /* signal in dbM, kluged to signed */
2485 IPW_DEBUG_RX("Handler...\n");
2487 if (unlikely(status->frame_size > skb_tailroom(packet->skb) -
2488 sizeof(struct ipw_rt_hdr))) {
2489 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2491 priv->net_dev->name,
2493 skb_tailroom(packet->skb));
2494 priv->ieee->stats.rx_errors++;
2498 if (unlikely(!netif_running(priv->net_dev))) {
2499 priv->ieee->stats.rx_errors++;
2500 priv->wstats.discard.misc++;
2501 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2505 if (unlikely(priv->config & CFG_CRC_CHECK &&
2506 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) {
2507 IPW_DEBUG_RX("CRC error in packet. Dropping.\n");
2508 priv->ieee->stats.rx_errors++;
2512 pci_unmap_single(priv->pci_dev, packet->dma_addr,
2513 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2514 memmove(packet->skb->data + sizeof(struct ipw_rt_hdr),
2515 packet->skb->data, status->frame_size);
2517 ipw_rt = (struct ipw_rt_hdr *) packet->skb->data;
2519 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
2520 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */
2521 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr)); /* total hdr+data */
2523 ipw_rt->rt_hdr.it_present = cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
2525 ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM;
2527 skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr));
2529 if (!ieee80211_rx(priv->ieee, packet->skb, stats)) {
2530 priv->ieee->stats.rx_errors++;
2532 /* ieee80211_rx failed, so it didn't free the SKB */
2533 dev_kfree_skb_any(packet->skb);
2537 /* We need to allocate a new SKB and attach it to the RDB. */
2538 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2540 "%s: Unable to allocate SKB onto RBD ring - disabling "
2541 "adapter.\n", priv->net_dev->name);
2542 /* TODO: schedule adapter shutdown */
2543 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2546 /* Update the RDB entry */
2547 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2552 static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i)
2554 struct ipw2100_status *status = &priv->status_queue.drv[i];
2555 struct ipw2100_rx *u = priv->rx_buffers[i].rxp;
2556 u16 frame_type = status->status_fields & STATUS_TYPE_MASK;
2558 switch (frame_type) {
2559 case COMMAND_STATUS_VAL:
2560 return (status->frame_size != sizeof(u->rx_data.command));
2561 case STATUS_CHANGE_VAL:
2562 return (status->frame_size != sizeof(u->rx_data.status));
2563 case HOST_NOTIFICATION_VAL:
2564 return (status->frame_size < sizeof(u->rx_data.notification));
2565 case P80211_DATA_VAL:
2566 case P8023_DATA_VAL:
2567 #ifdef CONFIG_IPW2100_MONITOR
2570 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2571 case IEEE80211_FTYPE_MGMT:
2572 case IEEE80211_FTYPE_CTL:
2574 case IEEE80211_FTYPE_DATA:
2575 return (status->frame_size >
2576 IPW_MAX_802_11_PAYLOAD_LENGTH);
2585 * ipw2100 interrupts are disabled at this point, and the ISR
2586 * is the only code that calls this method. So, we do not need
2587 * to play with any locks.
2589 * RX Queue works as follows:
2591 * Read index - firmware places packet in entry identified by the
2592 * Read index and advances Read index. In this manner,
2593 * Read index will always point to the next packet to
2594 * be filled--but not yet valid.
2596 * Write index - driver fills this entry with an unused RBD entry.
2597 * This entry has not filled by the firmware yet.
2599 * In between the W and R indexes are the RBDs that have been received
2600 * but not yet processed.
2602 * The process of handling packets will start at WRITE + 1 and advance
2603 * until it reaches the READ index.
2605 * The WRITE index is cached in the variable 'priv->rx_queue.next'.
2608 static void __ipw2100_rx_process(struct ipw2100_priv *priv)
2610 struct ipw2100_bd_queue *rxq = &priv->rx_queue;
2611 struct ipw2100_status_queue *sq = &priv->status_queue;
2612 struct ipw2100_rx_packet *packet;
2615 struct ipw2100_rx *u;
2616 struct ieee80211_rx_stats stats = {
2617 .mac_time = jiffies,
2620 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r);
2621 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w);
2623 if (r >= rxq->entries) {
2624 IPW_DEBUG_RX("exit - bad read index\n");
2628 i = (rxq->next + 1) % rxq->entries;
2631 /* IPW_DEBUG_RX("r = %d : w = %d : processing = %d\n",
2632 r, rxq->next, i); */
2634 packet = &priv->rx_buffers[i];
2636 /* Sync the DMA for the STATUS buffer so CPU is sure to get
2637 * the correct values */
2638 pci_dma_sync_single_for_cpu(priv->pci_dev,
2640 sizeof(struct ipw2100_status) * i,
2641 sizeof(struct ipw2100_status),
2642 PCI_DMA_FROMDEVICE);
2644 /* Sync the DMA for the RX buffer so CPU is sure to get
2645 * the correct values */
2646 pci_dma_sync_single_for_cpu(priv->pci_dev, packet->dma_addr,
2647 sizeof(struct ipw2100_rx),
2648 PCI_DMA_FROMDEVICE);
2650 if (unlikely(ipw2100_corruption_check(priv, i))) {
2651 ipw2100_corruption_detected(priv, i);
2656 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK;
2657 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM;
2658 stats.len = sq->drv[i].frame_size;
2661 if (stats.rssi != 0)
2662 stats.mask |= IEEE80211_STATMASK_RSSI;
2663 stats.freq = IEEE80211_24GHZ_BAND;
2665 IPW_DEBUG_RX("%s: '%s' frame type received (%d).\n",
2666 priv->net_dev->name, frame_types[frame_type],
2669 switch (frame_type) {
2670 case COMMAND_STATUS_VAL:
2671 /* Reset Rx watchdog */
2672 isr_rx_complete_command(priv, &u->rx_data.command);
2675 case STATUS_CHANGE_VAL:
2676 isr_status_change(priv, u->rx_data.status);
2679 case P80211_DATA_VAL:
2680 case P8023_DATA_VAL:
2681 #ifdef CONFIG_IPW2100_MONITOR
2682 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
2683 isr_rx_monitor(priv, i, &stats);
2687 if (stats.len < sizeof(struct ieee80211_hdr_3addr))
2689 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2690 case IEEE80211_FTYPE_MGMT:
2691 ieee80211_rx_mgt(priv->ieee,
2692 &u->rx_data.header, &stats);
2695 case IEEE80211_FTYPE_CTL:
2698 case IEEE80211_FTYPE_DATA:
2699 isr_rx(priv, i, &stats);
2707 /* clear status field associated with this RBD */
2708 rxq->drv[i].status.info.field = 0;
2710 i = (i + 1) % rxq->entries;
2714 /* backtrack one entry, wrapping to end if at 0 */
2715 rxq->next = (i ? i : rxq->entries) - 1;
2717 write_register(priv->net_dev,
2718 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next);
2723 * __ipw2100_tx_process
2725 * This routine will determine whether the next packet on
2726 * the fw_pend_list has been processed by the firmware yet.
2728 * If not, then it does nothing and returns.
2730 * If so, then it removes the item from the fw_pend_list, frees
2731 * any associated storage, and places the item back on the
2732 * free list of its source (either msg_free_list or tx_free_list)
2734 * TX Queue works as follows:
2736 * Read index - points to the next TBD that the firmware will
2737 * process. The firmware will read the data, and once
2738 * done processing, it will advance the Read index.
2740 * Write index - driver fills this entry with an constructed TBD
2741 * entry. The Write index is not advanced until the
2742 * packet has been configured.
2744 * In between the W and R indexes are the TBDs that have NOT been
2745 * processed. Lagging behind the R index are packets that have
2746 * been processed but have not been freed by the driver.
2748 * In order to free old storage, an internal index will be maintained
2749 * that points to the next packet to be freed. When all used
2750 * packets have been freed, the oldest index will be the same as the
2751 * firmware's read index.
2753 * The OLDEST index is cached in the variable 'priv->tx_queue.oldest'
2755 * Because the TBD structure can not contain arbitrary data, the
2756 * driver must keep an internal queue of cached allocations such that
2757 * it can put that data back into the tx_free_list and msg_free_list
2758 * for use by future command and data packets.
2761 static int __ipw2100_tx_process(struct ipw2100_priv *priv)
2763 struct ipw2100_bd_queue *txq = &priv->tx_queue;
2764 struct ipw2100_bd *tbd;
2765 struct list_head *element;
2766 struct ipw2100_tx_packet *packet;
2767 int descriptors_used;
2769 u32 r, w, frag_num = 0;
2771 if (list_empty(&priv->fw_pend_list))
2774 element = priv->fw_pend_list.next;
2776 packet = list_entry(element, struct ipw2100_tx_packet, list);
2777 tbd = &txq->drv[packet->index];
2779 /* Determine how many TBD entries must be finished... */
2780 switch (packet->type) {
2782 /* COMMAND uses only one slot; don't advance */
2783 descriptors_used = 1;
2788 /* DATA uses two slots; advance and loop position. */
2789 descriptors_used = tbd->num_fragments;
2790 frag_num = tbd->num_fragments - 1;
2791 e = txq->oldest + frag_num;
2796 printk(KERN_WARNING DRV_NAME ": %s: Bad fw_pend_list entry!\n",
2797 priv->net_dev->name);
2801 /* if the last TBD is not done by NIC yet, then packet is
2802 * not ready to be released.
2805 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
2807 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
2810 printk(KERN_WARNING DRV_NAME ": %s: write index mismatch\n",
2811 priv->net_dev->name);
2814 * txq->next is the index of the last packet written txq->oldest is
2815 * the index of the r is the index of the next packet to be read by
2820 * Quick graphic to help you visualize the following
2821 * if / else statement
2823 * ===>| s---->|===============
2825 * | a | b | c | d | e | f | g | h | i | j | k | l
2829 * w - updated by driver
2830 * r - updated by firmware
2831 * s - start of oldest BD entry (txq->oldest)
2832 * e - end of oldest BD entry
2835 if (!((r <= w && (e < r || e >= w)) || (e < r && e >= w))) {
2836 IPW_DEBUG_TX("exit - no processed packets ready to release.\n");
2841 DEC_STAT(&priv->fw_pend_stat);
2843 #ifdef CONFIG_IPW2100_DEBUG
2845 int i = txq->oldest;
2846 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2848 (u32) (txq->nic + i * sizeof(struct ipw2100_bd)),
2849 txq->drv[i].host_addr, txq->drv[i].buf_length);
2851 if (packet->type == DATA) {
2852 i = (i + 1) % txq->entries;
2854 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2856 (u32) (txq->nic + i *
2857 sizeof(struct ipw2100_bd)),
2858 (u32) txq->drv[i].host_addr,
2859 txq->drv[i].buf_length);
2864 switch (packet->type) {
2866 if (txq->drv[txq->oldest].status.info.fields.txType != 0)
2867 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2868 "Expecting DATA TBD but pulled "
2869 "something else: ids %d=%d.\n",
2870 priv->net_dev->name, txq->oldest, packet->index);
2872 /* DATA packet; we have to unmap and free the SKB */
2873 for (i = 0; i < frag_num; i++) {
2874 tbd = &txq->drv[(packet->index + 1 + i) % txq->entries];
2876 IPW_DEBUG_TX("TX%d P=%08x L=%d\n",
2877 (packet->index + 1 + i) % txq->entries,
2878 tbd->host_addr, tbd->buf_length);
2880 pci_unmap_single(priv->pci_dev,
2882 tbd->buf_length, PCI_DMA_TODEVICE);
2885 ieee80211_txb_free(packet->info.d_struct.txb);
2886 packet->info.d_struct.txb = NULL;
2888 list_add_tail(element, &priv->tx_free_list);
2889 INC_STAT(&priv->tx_free_stat);
2891 /* We have a free slot in the Tx queue, so wake up the
2892 * transmit layer if it is stopped. */
2893 if (priv->status & STATUS_ASSOCIATED)
2894 netif_wake_queue(priv->net_dev);
2896 /* A packet was processed by the hardware, so update the
2898 priv->net_dev->trans_start = jiffies;
2903 if (txq->drv[txq->oldest].status.info.fields.txType != 1)
2904 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2905 "Expecting COMMAND TBD but pulled "
2906 "something else: ids %d=%d.\n",
2907 priv->net_dev->name, txq->oldest, packet->index);
2909 #ifdef CONFIG_IPW2100_DEBUG
2910 if (packet->info.c_struct.cmd->host_command_reg <
2911 ARRAY_SIZE(command_types))
2912 IPW_DEBUG_TX("Command '%s (%d)' processed: %d.\n",
2913 command_types[packet->info.c_struct.cmd->
2915 packet->info.c_struct.cmd->
2917 packet->info.c_struct.cmd->cmd_status_reg);
2920 list_add_tail(element, &priv->msg_free_list);
2921 INC_STAT(&priv->msg_free_stat);
2925 /* advance oldest used TBD pointer to start of next entry */
2926 txq->oldest = (e + 1) % txq->entries;
2927 /* increase available TBDs number */
2928 txq->available += descriptors_used;
2929 SET_STAT(&priv->txq_stat, txq->available);
2931 IPW_DEBUG_TX("packet latency (send to process) %ld jiffies\n",
2932 jiffies - packet->jiffy_start);
2934 return (!list_empty(&priv->fw_pend_list));
2937 static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv)
2941 while (__ipw2100_tx_process(priv) && i < 200)
2945 printk(KERN_WARNING DRV_NAME ": "
2946 "%s: Driver is running slow (%d iters).\n",
2947 priv->net_dev->name, i);
2951 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
2953 struct list_head *element;
2954 struct ipw2100_tx_packet *packet;
2955 struct ipw2100_bd_queue *txq = &priv->tx_queue;
2956 struct ipw2100_bd *tbd;
2957 int next = txq->next;
2959 while (!list_empty(&priv->msg_pend_list)) {
2960 /* if there isn't enough space in TBD queue, then
2961 * don't stuff a new one in.
2962 * NOTE: 3 are needed as a command will take one,
2963 * and there is a minimum of 2 that must be
2964 * maintained between the r and w indexes
2966 if (txq->available <= 3) {
2967 IPW_DEBUG_TX("no room in tx_queue\n");
2971 element = priv->msg_pend_list.next;
2973 DEC_STAT(&priv->msg_pend_stat);
2975 packet = list_entry(element, struct ipw2100_tx_packet, list);
2977 IPW_DEBUG_TX("using TBD at virt=%p, phys=%p\n",
2978 &txq->drv[txq->next],
2979 (void *)(txq->nic + txq->next *
2980 sizeof(struct ipw2100_bd)));
2982 packet->index = txq->next;
2984 tbd = &txq->drv[txq->next];
2986 /* initialize TBD */
2987 tbd->host_addr = packet->info.c_struct.cmd_phys;
2988 tbd->buf_length = sizeof(struct ipw2100_cmd_header);
2989 /* not marking number of fragments causes problems
2990 * with f/w debug version */
2991 tbd->num_fragments = 1;
2992 tbd->status.info.field =
2993 IPW_BD_STATUS_TX_FRAME_COMMAND |
2994 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
2996 /* update TBD queue counters */
2998 txq->next %= txq->entries;
3000 DEC_STAT(&priv->txq_stat);
3002 list_add_tail(element, &priv->fw_pend_list);
3003 INC_STAT(&priv->fw_pend_stat);
3006 if (txq->next != next) {
3007 /* kick off the DMA by notifying firmware the
3008 * write index has moved; make sure TBD stores are sync'd */
3010 write_register(priv->net_dev,
3011 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3017 * ipw2100_tx_send_data
3020 static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
3022 struct list_head *element;
3023 struct ipw2100_tx_packet *packet;
3024 struct ipw2100_bd_queue *txq = &priv->tx_queue;
3025 struct ipw2100_bd *tbd;
3026 int next = txq->next;
3028 struct ipw2100_data_header *ipw_hdr;
3029 struct ieee80211_hdr_3addr *hdr;
3031 while (!list_empty(&priv->tx_pend_list)) {
3032 /* if there isn't enough space in TBD queue, then
3033 * don't stuff a new one in.
3034 * NOTE: 4 are needed as a data will take two,
3035 * and there is a minimum of 2 that must be
3036 * maintained between the r and w indexes
3038 element = priv->tx_pend_list.next;
3039 packet = list_entry(element, struct ipw2100_tx_packet, list);
3041 if (unlikely(1 + packet->info.d_struct.txb->nr_frags >
3043 /* TODO: Support merging buffers if more than
3044 * IPW_MAX_BDS are used */
3045 IPW_DEBUG_INFO("%s: Maximum BD theshold exceeded. "
3046 "Increase fragmentation level.\n",
3047 priv->net_dev->name);
3050 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) {
3051 IPW_DEBUG_TX("no room in tx_queue\n");
3056 DEC_STAT(&priv->tx_pend_stat);
3058 tbd = &txq->drv[txq->next];
3060 packet->index = txq->next;
3062 ipw_hdr = packet->info.d_struct.data;
3063 hdr = (struct ieee80211_hdr_3addr *)packet->info.d_struct.txb->
3066 if (priv->ieee->iw_mode == IW_MODE_INFRA) {
3067 /* To DS: Addr1 = BSSID, Addr2 = SA,
3069 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3070 memcpy(ipw_hdr->dst_addr, hdr->addr3, ETH_ALEN);
3071 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
3072 /* not From/To DS: Addr1 = DA, Addr2 = SA,
3074 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3075 memcpy(ipw_hdr->dst_addr, hdr->addr1, ETH_ALEN);
3078 ipw_hdr->host_command_reg = SEND;
3079 ipw_hdr->host_command_reg1 = 0;
3081 /* For now we only support host based encryption */
3082 ipw_hdr->needs_encryption = 0;
3083 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted;
3084 if (packet->info.d_struct.txb->nr_frags > 1)
3085 ipw_hdr->fragment_size =
3086 packet->info.d_struct.txb->frag_size -
3087 IEEE80211_3ADDR_LEN;
3089 ipw_hdr->fragment_size = 0;
3091 tbd->host_addr = packet->info.d_struct.data_phys;
3092 tbd->buf_length = sizeof(struct ipw2100_data_header);
3093 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags;
3094 tbd->status.info.field =
3095 IPW_BD_STATUS_TX_FRAME_802_3 |
3096 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3098 txq->next %= txq->entries;
3100 IPW_DEBUG_TX("data header tbd TX%d P=%08x L=%d\n",
3101 packet->index, tbd->host_addr, tbd->buf_length);
3102 #ifdef CONFIG_IPW2100_DEBUG
3103 if (packet->info.d_struct.txb->nr_frags > 1)
3104 IPW_DEBUG_FRAG("fragment Tx: %d frames\n",
3105 packet->info.d_struct.txb->nr_frags);
3108 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) {
3109 tbd = &txq->drv[txq->next];
3110 if (i == packet->info.d_struct.txb->nr_frags - 1)
3111 tbd->status.info.field =
3112 IPW_BD_STATUS_TX_FRAME_802_3 |
3113 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
3115 tbd->status.info.field =
3116 IPW_BD_STATUS_TX_FRAME_802_3 |
3117 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3119 tbd->buf_length = packet->info.d_struct.txb->
3120 fragments[i]->len - IEEE80211_3ADDR_LEN;
3122 tbd->host_addr = pci_map_single(priv->pci_dev,
3123 packet->info.d_struct.
3126 IEEE80211_3ADDR_LEN,
3130 IPW_DEBUG_TX("data frag tbd TX%d P=%08x L=%d\n",
3131 txq->next, tbd->host_addr,
3134 pci_dma_sync_single_for_device(priv->pci_dev,
3140 txq->next %= txq->entries;
3143 txq->available -= 1 + packet->info.d_struct.txb->nr_frags;
3144 SET_STAT(&priv->txq_stat, txq->available);
3146 list_add_tail(element, &priv->fw_pend_list);
3147 INC_STAT(&priv->fw_pend_stat);
3150 if (txq->next != next) {
3151 /* kick off the DMA by notifying firmware the
3152 * write index has moved; make sure TBD stores are sync'd */
3153 write_register(priv->net_dev,
3154 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3160 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3162 struct net_device *dev = priv->net_dev;
3163 unsigned long flags;
3166 spin_lock_irqsave(&priv->low_lock, flags);
3167 ipw2100_disable_interrupts(priv);
3169 read_register(dev, IPW_REG_INTA, &inta);
3171 IPW_DEBUG_ISR("enter - INTA: 0x%08lX\n",
3172 (unsigned long)inta & IPW_INTERRUPT_MASK);
3177 /* We do not loop and keep polling for more interrupts as this
3178 * is frowned upon and doesn't play nicely with other potentially
3180 IPW_DEBUG_ISR("INTA: 0x%08lX\n",
3181 (unsigned long)inta & IPW_INTERRUPT_MASK);
3183 if (inta & IPW2100_INTA_FATAL_ERROR) {
3184 printk(KERN_WARNING DRV_NAME
3185 ": Fatal interrupt. Scheduling firmware restart.\n");
3187 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FATAL_ERROR);
3189 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error);
3190 IPW_DEBUG_INFO("%s: Fatal error value: 0x%08X\n",
3191 priv->net_dev->name, priv->fatal_error);
3193 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp);
3194 IPW_DEBUG_INFO("%s: Fatal error address value: 0x%08X\n",
3195 priv->net_dev->name, tmp);
3197 /* Wake up any sleeping jobs */
3198 schedule_reset(priv);
3201 if (inta & IPW2100_INTA_PARITY_ERROR) {
3202 printk(KERN_ERR DRV_NAME
3203 ": ***** PARITY ERROR INTERRUPT !!!! \n");
3205 write_register(dev, IPW_REG_INTA, IPW2100_INTA_PARITY_ERROR);
3208 if (inta & IPW2100_INTA_RX_TRANSFER) {
3209 IPW_DEBUG_ISR("RX interrupt\n");
3211 priv->rx_interrupts++;
3213 write_register(dev, IPW_REG_INTA, IPW2100_INTA_RX_TRANSFER);
3215 __ipw2100_rx_process(priv);
3216 __ipw2100_tx_complete(priv);
3219 if (inta & IPW2100_INTA_TX_TRANSFER) {
3220 IPW_DEBUG_ISR("TX interrupt\n");
3222 priv->tx_interrupts++;
3224 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_TRANSFER);
3226 __ipw2100_tx_complete(priv);
3227 ipw2100_tx_send_commands(priv);
3228 ipw2100_tx_send_data(priv);
3231 if (inta & IPW2100_INTA_TX_COMPLETE) {
3232 IPW_DEBUG_ISR("TX complete\n");
3234 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_COMPLETE);
3236 __ipw2100_tx_complete(priv);
3239 if (inta & IPW2100_INTA_EVENT_INTERRUPT) {
3240 /* ipw2100_handle_event(dev); */
3242 write_register(dev, IPW_REG_INTA, IPW2100_INTA_EVENT_INTERRUPT);
3245 if (inta & IPW2100_INTA_FW_INIT_DONE) {
3246 IPW_DEBUG_ISR("FW init done interrupt\n");
3249 read_register(dev, IPW_REG_INTA, &tmp);
3250 if (tmp & (IPW2100_INTA_FATAL_ERROR |
3251 IPW2100_INTA_PARITY_ERROR)) {
3252 write_register(dev, IPW_REG_INTA,
3253 IPW2100_INTA_FATAL_ERROR |
3254 IPW2100_INTA_PARITY_ERROR);
3257 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FW_INIT_DONE);
3260 if (inta & IPW2100_INTA_STATUS_CHANGE) {
3261 IPW_DEBUG_ISR("Status change interrupt\n");
3263 write_register(dev, IPW_REG_INTA, IPW2100_INTA_STATUS_CHANGE);
3266 if (inta & IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE) {
3267 IPW_DEBUG_ISR("slave host mode interrupt\n");
3269 write_register(dev, IPW_REG_INTA,
3270 IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE);
3274 ipw2100_enable_interrupts(priv);
3276 spin_unlock_irqrestore(&priv->low_lock, flags);
3278 IPW_DEBUG_ISR("exit\n");
3281 static irqreturn_t ipw2100_interrupt(int irq, void *data)
3283 struct ipw2100_priv *priv = data;
3284 u32 inta, inta_mask;
3289 spin_lock(&priv->low_lock);
3291 /* We check to see if we should be ignoring interrupts before
3292 * we touch the hardware. During ucode load if we try and handle
3293 * an interrupt we can cause keyboard problems as well as cause
3294 * the ucode to fail to initialize */
3295 if (!(priv->status & STATUS_INT_ENABLED)) {
3300 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
3301 read_register(priv->net_dev, IPW_REG_INTA, &inta);
3303 if (inta == 0xFFFFFFFF) {
3304 /* Hardware disappeared */
3305 printk(KERN_WARNING DRV_NAME ": IRQ INTA == 0xFFFFFFFF\n");
3309 inta &= IPW_INTERRUPT_MASK;
3311 if (!(inta & inta_mask)) {
3312 /* Shared interrupt */
3316 /* We disable the hardware interrupt here just to prevent unneeded
3317 * calls to be made. We disable this again within the actual
3318 * work tasklet, so if another part of the code re-enables the
3319 * interrupt, that is fine */
3320 ipw2100_disable_interrupts(priv);
3322 tasklet_schedule(&priv->irq_tasklet);
3323 spin_unlock(&priv->low_lock);
3327 spin_unlock(&priv->low_lock);
3331 static int ipw2100_tx(struct ieee80211_txb *txb, struct net_device *dev,
3334 struct ipw2100_priv *priv = ieee80211_priv(dev);
3335 struct list_head *element;
3336 struct ipw2100_tx_packet *packet;
3337 unsigned long flags;
3339 spin_lock_irqsave(&priv->low_lock, flags);
3341 if (!(priv->status & STATUS_ASSOCIATED)) {
3342 IPW_DEBUG_INFO("Can not transmit when not connected.\n");
3343 priv->ieee->stats.tx_carrier_errors++;
3344 netif_stop_queue(dev);
3348 if (list_empty(&priv->tx_free_list))
3351 element = priv->tx_free_list.next;
3352 packet = list_entry(element, struct ipw2100_tx_packet, list);
3354 packet->info.d_struct.txb = txb;
3356 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len);
3357 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len);
3359 packet->jiffy_start = jiffies;
3362 DEC_STAT(&priv->tx_free_stat);
3364 list_add_tail(element, &priv->tx_pend_list);
3365 INC_STAT(&priv->tx_pend_stat);
3367 ipw2100_tx_send_data(priv);
3369 spin_unlock_irqrestore(&priv->low_lock, flags);
3373 netif_stop_queue(dev);
3374 spin_unlock_irqrestore(&priv->low_lock, flags);
3378 static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3380 int i, j, err = -EINVAL;
3385 (struct ipw2100_tx_packet *)kmalloc(IPW_COMMAND_POOL_SIZE *
3389 if (!priv->msg_buffers) {
3390 printk(KERN_ERR DRV_NAME ": %s: PCI alloc failed for msg "
3391 "buffers.\n", priv->net_dev->name);
3395 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3396 v = pci_alloc_consistent(priv->pci_dev,
3397 sizeof(struct ipw2100_cmd_header), &p);
3399 printk(KERN_ERR DRV_NAME ": "
3400 "%s: PCI alloc failed for msg "
3401 "buffers.\n", priv->net_dev->name);
3406 memset(v, 0, sizeof(struct ipw2100_cmd_header));
3408 priv->msg_buffers[i].type = COMMAND;
3409 priv->msg_buffers[i].info.c_struct.cmd =
3410 (struct ipw2100_cmd_header *)v;
3411 priv->msg_buffers[i].info.c_struct.cmd_phys = p;
3414 if (i == IPW_COMMAND_POOL_SIZE)
3417 for (j = 0; j < i; j++) {
3418 pci_free_consistent(priv->pci_dev,
3419 sizeof(struct ipw2100_cmd_header),
3420 priv->msg_buffers[j].info.c_struct.cmd,
3421 priv->msg_buffers[j].info.c_struct.
3425 kfree(priv->msg_buffers);
3426 priv->msg_buffers = NULL;
3431 static int ipw2100_msg_initialize(struct ipw2100_priv *priv)
3435 INIT_LIST_HEAD(&priv->msg_free_list);
3436 INIT_LIST_HEAD(&priv->msg_pend_list);
3438 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++)
3439 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list);
3440 SET_STAT(&priv->msg_free_stat, i);
3445 static void ipw2100_msg_free(struct ipw2100_priv *priv)
3449 if (!priv->msg_buffers)
3452 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3453 pci_free_consistent(priv->pci_dev,
3454 sizeof(struct ipw2100_cmd_header),
3455 priv->msg_buffers[i].info.c_struct.cmd,
3456 priv->msg_buffers[i].info.c_struct.
3460 kfree(priv->msg_buffers);
3461 priv->msg_buffers = NULL;
3464 static ssize_t show_pci(struct device *d, struct device_attribute *attr,
3467 struct pci_dev *pci_dev = container_of(d, struct pci_dev, dev);
3472 for (i = 0; i < 16; i++) {
3473 out += sprintf(out, "[%08X] ", i * 16);
3474 for (j = 0; j < 16; j += 4) {
3475 pci_read_config_dword(pci_dev, i * 16 + j, &val);
3476 out += sprintf(out, "%08X ", val);
3478 out += sprintf(out, "\n");
3484 static DEVICE_ATTR(pci, S_IRUGO, show_pci, NULL);
3486 static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
3489 struct ipw2100_priv *p = d->driver_data;
3490 return sprintf(buf, "0x%08x\n", (int)p->config);
3493 static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
3495 static ssize_t show_status(struct device *d, struct device_attribute *attr,
3498 struct ipw2100_priv *p = d->driver_data;
3499 return sprintf(buf, "0x%08x\n", (int)p->status);
3502 static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
3504 static ssize_t show_capability(struct device *d, struct device_attribute *attr,
3507 struct ipw2100_priv *p = d->driver_data;
3508 return sprintf(buf, "0x%08x\n", (int)p->capability);
3511 static DEVICE_ATTR(capability, S_IRUGO, show_capability, NULL);
3513 #define IPW2100_REG(x) { IPW_ ##x, #x }
3514 static const struct {
3518 IPW2100_REG(REG_GP_CNTRL),
3519 IPW2100_REG(REG_GPIO),
3520 IPW2100_REG(REG_INTA),
3521 IPW2100_REG(REG_INTA_MASK), IPW2100_REG(REG_RESET_REG),};
3522 #define IPW2100_NIC(x, s) { x, #x, s }
3523 static const struct {
3528 IPW2100_NIC(IPW2100_CONTROL_REG, 2),
3529 IPW2100_NIC(0x210014, 1), IPW2100_NIC(0x210000, 1),};
3530 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
3531 static const struct {
3536 IPW2100_ORD(STAT_TX_HOST_REQUESTS, "requested Host Tx's (MSDU)"),
3537 IPW2100_ORD(STAT_TX_HOST_COMPLETE,
3538 "successful Host Tx's (MSDU)"),
3539 IPW2100_ORD(STAT_TX_DIR_DATA,
3540 "successful Directed Tx's (MSDU)"),
3541 IPW2100_ORD(STAT_TX_DIR_DATA1,
3542 "successful Directed Tx's (MSDU) @ 1MB"),
3543 IPW2100_ORD(STAT_TX_DIR_DATA2,
3544 "successful Directed Tx's (MSDU) @ 2MB"),
3545 IPW2100_ORD(STAT_TX_DIR_DATA5_5,
3546 "successful Directed Tx's (MSDU) @ 5_5MB"),
3547 IPW2100_ORD(STAT_TX_DIR_DATA11,
3548 "successful Directed Tx's (MSDU) @ 11MB"),
3549 IPW2100_ORD(STAT_TX_NODIR_DATA1,
3550 "successful Non_Directed Tx's (MSDU) @ 1MB"),
3551 IPW2100_ORD(STAT_TX_NODIR_DATA2,
3552 "successful Non_Directed Tx's (MSDU) @ 2MB"),
3553 IPW2100_ORD(STAT_TX_NODIR_DATA5_5,
3554 "successful Non_Directed Tx's (MSDU) @ 5.5MB"),
3555 IPW2100_ORD(STAT_TX_NODIR_DATA11,
3556 "successful Non_Directed Tx's (MSDU) @ 11MB"),
3557 IPW2100_ORD(STAT_NULL_DATA, "successful NULL data Tx's"),
3558 IPW2100_ORD(STAT_TX_RTS, "successful Tx RTS"),
3559 IPW2100_ORD(STAT_TX_CTS, "successful Tx CTS"),
3560 IPW2100_ORD(STAT_TX_ACK, "successful Tx ACK"),
3561 IPW2100_ORD(STAT_TX_ASSN, "successful Association Tx's"),
3562 IPW2100_ORD(STAT_TX_ASSN_RESP,
3563 "successful Association response Tx's"),
3564 IPW2100_ORD(STAT_TX_REASSN,
3565 "successful Reassociation Tx's"),
3566 IPW2100_ORD(STAT_TX_REASSN_RESP,
3567 "successful Reassociation response Tx's"),
3568 IPW2100_ORD(STAT_TX_PROBE,
3569 "probes successfully transmitted"),
3570 IPW2100_ORD(STAT_TX_PROBE_RESP,
3571 "probe responses successfully transmitted"),
3572 IPW2100_ORD(STAT_TX_BEACON, "tx beacon"),
3573 IPW2100_ORD(STAT_TX_ATIM, "Tx ATIM"),
3574 IPW2100_ORD(STAT_TX_DISASSN,
3575 "successful Disassociation TX"),
3576 IPW2100_ORD(STAT_TX_AUTH, "successful Authentication Tx"),
3577 IPW2100_ORD(STAT_TX_DEAUTH,
3578 "successful Deauthentication TX"),
3579 IPW2100_ORD(STAT_TX_TOTAL_BYTES,
3580 "Total successful Tx data bytes"),
3581 IPW2100_ORD(STAT_TX_RETRIES, "Tx retries"),
3582 IPW2100_ORD(STAT_TX_RETRY1, "Tx retries at 1MBPS"),
3583 IPW2100_ORD(STAT_TX_RETRY2, "Tx retries at 2MBPS"),
3584 IPW2100_ORD(STAT_TX_RETRY5_5, "Tx retries at 5.5MBPS"),
3585 IPW2100_ORD(STAT_TX_RETRY11, "Tx retries at 11MBPS"),
3586 IPW2100_ORD(STAT_TX_FAILURES, "Tx Failures"),
3587 IPW2100_ORD(STAT_TX_MAX_TRIES_IN_HOP,
3588 "times max tries in a hop failed"),
3589 IPW2100_ORD(STAT_TX_DISASSN_FAIL,
3590 "times disassociation failed"),
3591 IPW2100_ORD(STAT_TX_ERR_CTS, "missed/bad CTS frames"),
3592 IPW2100_ORD(STAT_TX_ERR_ACK, "tx err due to acks"),
3593 IPW2100_ORD(STAT_RX_HOST, "packets passed to host"),
3594 IPW2100_ORD(STAT_RX_DIR_DATA, "directed packets"),
3595 IPW2100_ORD(STAT_RX_DIR_DATA1, "directed packets at 1MB"),
3596 IPW2100_ORD(STAT_RX_DIR_DATA2, "directed packets at 2MB"),
3597 IPW2100_ORD(STAT_RX_DIR_DATA5_5,
3598 "directed packets at 5.5MB"),
3599 IPW2100_ORD(STAT_RX_DIR_DATA11, "directed packets at 11MB"),
3600 IPW2100_ORD(STAT_RX_NODIR_DATA, "nondirected packets"),
3601 IPW2100_ORD(STAT_RX_NODIR_DATA1,
3602 "nondirected packets at 1MB"),
3603 IPW2100_ORD(STAT_RX_NODIR_DATA2,
3604 "nondirected packets at 2MB"),
3605 IPW2100_ORD(STAT_RX_NODIR_DATA5_5,
3606 "nondirected packets at 5.5MB"),
3607 IPW2100_ORD(STAT_RX_NODIR_DATA11,
3608 "nondirected packets at 11MB"),
3609 IPW2100_ORD(STAT_RX_NULL_DATA, "null data rx's"),
3610 IPW2100_ORD(STAT_RX_RTS, "Rx RTS"), IPW2100_ORD(STAT_RX_CTS,
3612 IPW2100_ORD(STAT_RX_ACK, "Rx ACK"),
3613 IPW2100_ORD(STAT_RX_CFEND, "Rx CF End"),
3614 IPW2100_ORD(STAT_RX_CFEND_ACK, "Rx CF End + CF Ack"),
3615 IPW2100_ORD(STAT_RX_ASSN, "Association Rx's"),
3616 IPW2100_ORD(STAT_RX_ASSN_RESP, "Association response Rx's"),
3617 IPW2100_ORD(STAT_RX_REASSN, "Reassociation Rx's"),
3618 IPW2100_ORD(STAT_RX_REASSN_RESP,
3619 "Reassociation response Rx's"),
3620 IPW2100_ORD(STAT_RX_PROBE, "probe Rx's"),
3621 IPW2100_ORD(STAT_RX_PROBE_RESP, "probe response Rx's"),
3622 IPW2100_ORD(STAT_RX_BEACON, "Rx beacon"),
3623 IPW2100_ORD(STAT_RX_ATIM, "Rx ATIM"),
3624 IPW2100_ORD(STAT_RX_DISASSN, "disassociation Rx"),
3625 IPW2100_ORD(STAT_RX_AUTH, "authentication Rx"),
3626 IPW2100_ORD(STAT_RX_DEAUTH, "deauthentication Rx"),
3627 IPW2100_ORD(STAT_RX_TOTAL_BYTES,
3628 "Total rx data bytes received"),
3629 IPW2100_ORD(STAT_RX_ERR_CRC, "packets with Rx CRC error"),
3630 IPW2100_ORD(STAT_RX_ERR_CRC1, "Rx CRC errors at 1MB"),
3631 IPW2100_ORD(STAT_RX_ERR_CRC2, "Rx CRC errors at 2MB"),
3632 IPW2100_ORD(STAT_RX_ERR_CRC5_5, "Rx CRC errors at 5.5MB"),
3633 IPW2100_ORD(STAT_RX_ERR_CRC11, "Rx CRC errors at 11MB"),
3634 IPW2100_ORD(STAT_RX_DUPLICATE1,
3635 "duplicate rx packets at 1MB"),
3636 IPW2100_ORD(STAT_RX_DUPLICATE2,
3637 "duplicate rx packets at 2MB"),
3638 IPW2100_ORD(STAT_RX_DUPLICATE5_5,
3639 "duplicate rx packets at 5.5MB"),
3640 IPW2100_ORD(STAT_RX_DUPLICATE11,
3641 "duplicate rx packets at 11MB"),
3642 IPW2100_ORD(STAT_RX_DUPLICATE, "duplicate rx packets"),
3643 IPW2100_ORD(PERS_DB_LOCK, "locking fw permanent db"),
3644 IPW2100_ORD(PERS_DB_SIZE, "size of fw permanent db"),
3645 IPW2100_ORD(PERS_DB_ADDR, "address of fw permanent db"),
3646 IPW2100_ORD(STAT_RX_INVALID_PROTOCOL,
3647 "rx frames with invalid protocol"),
3648 IPW2100_ORD(SYS_BOOT_TIME, "Boot time"),
3649 IPW2100_ORD(STAT_RX_NO_BUFFER,
3650 "rx frames rejected due to no buffer"),
3651 IPW2100_ORD(STAT_RX_MISSING_FRAG,
3652 "rx frames dropped due to missing fragment"),
3653 IPW2100_ORD(STAT_RX_ORPHAN_FRAG,
3654 "rx frames dropped due to non-sequential fragment"),
3655 IPW2100_ORD(STAT_RX_ORPHAN_FRAME,
3656 "rx frames dropped due to unmatched 1st frame"),
3657 IPW2100_ORD(STAT_RX_FRAG_AGEOUT,
3658 "rx frames dropped due to uncompleted frame"),
3659 IPW2100_ORD(STAT_RX_ICV_ERRORS,
3660 "ICV errors during decryption"),
3661 IPW2100_ORD(STAT_PSP_SUSPENSION, "times adapter suspended"),
3662 IPW2100_ORD(STAT_PSP_BCN_TIMEOUT, "beacon timeout"),
3663 IPW2100_ORD(STAT_PSP_POLL_TIMEOUT,
3664 "poll response timeouts"),
3665 IPW2100_ORD(STAT_PSP_NONDIR_TIMEOUT,
3666 "timeouts waiting for last {broad,multi}cast pkt"),
3667 IPW2100_ORD(STAT_PSP_RX_DTIMS, "PSP DTIMs received"),
3668 IPW2100_ORD(STAT_PSP_RX_TIMS, "PSP TIMs received"),
3669 IPW2100_ORD(STAT_PSP_STATION_ID, "PSP Station ID"),
3670 IPW2100_ORD(LAST_ASSN_TIME, "RTC time of last association"),
3671 IPW2100_ORD(STAT_PERCENT_MISSED_BCNS,
3672 "current calculation of % missed beacons"),
3673 IPW2100_ORD(STAT_PERCENT_RETRIES,
3674 "current calculation of % missed tx retries"),
3675 IPW2100_ORD(ASSOCIATED_AP_PTR,
3676 "0 if not associated, else pointer to AP table entry"),
3677 IPW2100_ORD(AVAILABLE_AP_CNT,
3678 "AP's decsribed in the AP table"),
3679 IPW2100_ORD(AP_LIST_PTR, "Ptr to list of available APs"),
3680 IPW2100_ORD(STAT_AP_ASSNS, "associations"),
3681 IPW2100_ORD(STAT_ASSN_FAIL, "association failures"),
3682 IPW2100_ORD(STAT_ASSN_RESP_FAIL,
3683 "failures due to response fail"),
3684 IPW2100_ORD(STAT_FULL_SCANS, "full scans"),
3685 IPW2100_ORD(CARD_DISABLED, "Card Disabled"),
3686 IPW2100_ORD(STAT_ROAM_INHIBIT,
3687 "times roaming was inhibited due to activity"),
3688 IPW2100_ORD(RSSI_AT_ASSN,
3689 "RSSI of associated AP at time of association"),
3690 IPW2100_ORD(STAT_ASSN_CAUSE1,
3691 "reassociation: no probe response or TX on hop"),
3692 IPW2100_ORD(STAT_ASSN_CAUSE2,
3693 "reassociation: poor tx/rx quality"),
3694 IPW2100_ORD(STAT_ASSN_CAUSE3,
3695 "reassociation: tx/rx quality (excessive AP load"),
3696 IPW2100_ORD(STAT_ASSN_CAUSE4,
3697 "reassociation: AP RSSI level"),
3698 IPW2100_ORD(STAT_ASSN_CAUSE5,
3699 "reassociations due to load leveling"),
3700 IPW2100_ORD(STAT_AUTH_FAIL, "times authentication failed"),
3701 IPW2100_ORD(STAT_AUTH_RESP_FAIL,
3702 "times authentication response failed"),
3703 IPW2100_ORD(STATION_TABLE_CNT,
3704 "entries in association table"),
3705 IPW2100_ORD(RSSI_AVG_CURR, "Current avg RSSI"),
3706 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3707 IPW2100_ORD(COUNTRY_CODE,
3708 "IEEE country code as recv'd from beacon"),
3709 IPW2100_ORD(COUNTRY_CHANNELS,
3710 "channels suported by country"),
3711 IPW2100_ORD(RESET_CNT, "adapter resets (warm)"),
3712 IPW2100_ORD(BEACON_INTERVAL, "Beacon interval"),
3713 IPW2100_ORD(ANTENNA_DIVERSITY,
3714 "TRUE if antenna diversity is disabled"),
3715 IPW2100_ORD(DTIM_PERIOD, "beacon intervals between DTIMs"),
3716 IPW2100_ORD(OUR_FREQ,
3717 "current radio freq lower digits - channel ID"),
3718 IPW2100_ORD(RTC_TIME, "current RTC time"),
3719 IPW2100_ORD(PORT_TYPE, "operating mode"),
3720 IPW2100_ORD(CURRENT_TX_RATE, "current tx rate"),
3721 IPW2100_ORD(SUPPORTED_RATES, "supported tx rates"),
3722 IPW2100_ORD(ATIM_WINDOW, "current ATIM Window"),
3723 IPW2100_ORD(BASIC_RATES, "basic tx rates"),
3724 IPW2100_ORD(NIC_HIGHEST_RATE, "NIC highest tx rate"),
3725 IPW2100_ORD(AP_HIGHEST_RATE, "AP highest tx rate"),
3726 IPW2100_ORD(CAPABILITIES,
3727 "Management frame capability field"),
3728 IPW2100_ORD(AUTH_TYPE, "Type of authentication"),
3729 IPW2100_ORD(RADIO_TYPE, "Adapter card platform type"),
3730 IPW2100_ORD(RTS_THRESHOLD,
3731 "Min packet length for RTS handshaking"),
3732 IPW2100_ORD(INT_MODE, "International mode"),
3733 IPW2100_ORD(FRAGMENTATION_THRESHOLD,
3734 "protocol frag threshold"),
3735 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_START_ADDRESS,
3736 "EEPROM offset in SRAM"),
3737 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_SIZE,
3738 "EEPROM size in SRAM"),
3739 IPW2100_ORD(EEPROM_SKU_CAPABILITY, "EEPROM SKU Capability"),
3740 IPW2100_ORD(EEPROM_IBSS_11B_CHANNELS,
3741 "EEPROM IBSS 11b channel set"),
3742 IPW2100_ORD(MAC_VERSION, "MAC Version"),
3743 IPW2100_ORD(MAC_REVISION, "MAC Revision"),
3744 IPW2100_ORD(RADIO_VERSION, "Radio Version"),
3745 IPW2100_ORD(NIC_MANF_DATE_TIME, "MANF Date/Time STAMP"),
3746 IPW2100_ORD(UCODE_VERSION, "Ucode Version"),};
3748 static ssize_t show_registers(struct device *d, struct device_attribute *attr,
3752 struct ipw2100_priv *priv = dev_get_drvdata(d);
3753 struct net_device *dev = priv->net_dev;
3757 out += sprintf(out, "%30s [Address ] : Hex\n", "Register");
3759 for (i = 0; i < ARRAY_SIZE(hw_data); i++) {
3760 read_register(dev, hw_data[i].addr, &val);
3761 out += sprintf(out, "%30s [%08X] : %08X\n",
3762 hw_data[i].name, hw_data[i].addr, val);
3768 static DEVICE_ATTR(registers, S_IRUGO, show_registers, NULL);
3770 static ssize_t show_hardware(struct device *d, struct device_attribute *attr,
3773 struct ipw2100_priv *priv = dev_get_drvdata(d);
3774 struct net_device *dev = priv->net_dev;
3778 out += sprintf(out, "%30s [Address ] : Hex\n", "NIC entry");
3780 for (i = 0; i < ARRAY_SIZE(nic_data); i++) {
3785 switch (nic_data[i].size) {
3787 read_nic_byte(dev, nic_data[i].addr, &tmp8);
3788 out += sprintf(out, "%30s [%08X] : %02X\n",
3789 nic_data[i].name, nic_data[i].addr,
3793 read_nic_word(dev, nic_data[i].addr, &tmp16);
3794 out += sprintf(out, "%30s [%08X] : %04X\n",
3795 nic_data[i].name, nic_data[i].addr,
3799 read_nic_dword(dev, nic_data[i].addr, &tmp32);
3800 out += sprintf(out, "%30s [%08X] : %08X\n",
3801 nic_data[i].name, nic_data[i].addr,
3809 static DEVICE_ATTR(hardware, S_IRUGO, show_hardware, NULL);
3811 static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3814 struct ipw2100_priv *priv = dev_get_drvdata(d);
3815 struct net_device *dev = priv->net_dev;
3816 static unsigned long loop = 0;
3822 if (loop >= 0x30000)
3825 /* sysfs provides us PAGE_SIZE buffer */
3826 while (len < PAGE_SIZE - 128 && loop < 0x30000) {
3828 if (priv->snapshot[0])
3829 for (i = 0; i < 4; i++)
3831 *(u32 *) SNAPSHOT_ADDR(loop + i * 4);
3833 for (i = 0; i < 4; i++)
3834 read_nic_dword(dev, loop + i * 4, &buffer[i]);
3837 len += sprintf(buf + len,
3842 ((u8 *) buffer)[0x0],
3843 ((u8 *) buffer)[0x1],
3844 ((u8 *) buffer)[0x2],
3845 ((u8 *) buffer)[0x3],
3846 ((u8 *) buffer)[0x4],
3847 ((u8 *) buffer)[0x5],
3848 ((u8 *) buffer)[0x6],
3849 ((u8 *) buffer)[0x7],
3850 ((u8 *) buffer)[0x8],
3851 ((u8 *) buffer)[0x9],
3852 ((u8 *) buffer)[0xa],
3853 ((u8 *) buffer)[0xb],
3854 ((u8 *) buffer)[0xc],
3855 ((u8 *) buffer)[0xd],
3856 ((u8 *) buffer)[0xe],
3857 ((u8 *) buffer)[0xf]);
3859 len += sprintf(buf + len, "%s\n",
3860 snprint_line(line, sizeof(line),
3861 (u8 *) buffer, 16, loop));
3868 static ssize_t store_memory(struct device *d, struct device_attribute *attr,
3869 const char *buf, size_t count)
3871 struct ipw2100_priv *priv = dev_get_drvdata(d);
3872 struct net_device *dev = priv->net_dev;
3873 const char *p = buf;
3875 (void)dev; /* kill unused-var warning for debug-only code */
3881 (count >= 2 && tolower(p[0]) == 'o' && tolower(p[1]) == 'n')) {
3882 IPW_DEBUG_INFO("%s: Setting memory dump to RAW mode.\n",
3886 } else if (p[0] == '0' || (count >= 2 && tolower(p[0]) == 'o' &&
3887 tolower(p[1]) == 'f')) {
3888 IPW_DEBUG_INFO("%s: Setting memory dump to HEX mode.\n",
3892 } else if (tolower(p[0]) == 'r') {
3893 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name);
3894 ipw2100_snapshot_free(priv);
3897 IPW_DEBUG_INFO("%s: Usage: 0|on = HEX, 1|off = RAW, "
3898 "reset = clear memory snapshot\n", dev->name);
3903 static DEVICE_ATTR(memory, S_IWUSR | S_IRUGO, show_memory, store_memory);
3905 static ssize_t show_ordinals(struct device *d, struct device_attribute *attr,
3908 struct ipw2100_priv *priv = dev_get_drvdata(d);
3912 static int loop = 0;
3914 if (priv->status & STATUS_RF_KILL_MASK)
3917 if (loop >= ARRAY_SIZE(ord_data))
3920 /* sysfs provides us PAGE_SIZE buffer */
3921 while (len < PAGE_SIZE - 128 && loop < ARRAY_SIZE(ord_data)) {
3922 val_len = sizeof(u32);
3924 if (ipw2100_get_ordinal(priv, ord_data[loop].index, &val,
3926 len += sprintf(buf + len, "[0x%02X] = ERROR %s\n",
3927 ord_data[loop].index,
3928 ord_data[loop].desc);
3930 len += sprintf(buf + len, "[0x%02X] = 0x%08X %s\n",
3931 ord_data[loop].index, val,
3932 ord_data[loop].desc);
3939 static DEVICE_ATTR(ordinals, S_IRUGO, show_ordinals, NULL);
3941 static ssize_t show_stats(struct device *d, struct device_attribute *attr,
3944 struct ipw2100_priv *priv = dev_get_drvdata(d);
3947 out += sprintf(out, "interrupts: %d {tx: %d, rx: %d, other: %d}\n",
3948 priv->interrupts, priv->tx_interrupts,
3949 priv->rx_interrupts, priv->inta_other);
3950 out += sprintf(out, "firmware resets: %d\n", priv->resets);
3951 out += sprintf(out, "firmware hangs: %d\n", priv->hangs);
3952 #ifdef CONFIG_IPW2100_DEBUG
3953 out += sprintf(out, "packet mismatch image: %s\n",
3954 priv->snapshot[0] ? "YES" : "NO");
3960 static DEVICE_ATTR(stats, S_IRUGO, show_stats, NULL);
3962 static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
3966 if (mode == priv->ieee->iw_mode)
3969 err = ipw2100_disable_adapter(priv);
3971 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n",
3972 priv->net_dev->name, err);
3978 priv->net_dev->type = ARPHRD_ETHER;
3981 priv->net_dev->type = ARPHRD_ETHER;
3983 #ifdef CONFIG_IPW2100_MONITOR
3984 case IW_MODE_MONITOR:
3985 priv->last_mode = priv->ieee->iw_mode;
3986 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
3988 #endif /* CONFIG_IPW2100_MONITOR */
3991 priv->ieee->iw_mode = mode;
3994 /* Indicate ipw2100_download_firmware download firmware
3995 * from disk instead of memory. */
3996 ipw2100_firmware.version = 0;
3999 printk(KERN_INFO "%s: Reseting on mode change.\n", priv->net_dev->name);
4000 priv->reset_backoff = 0;
4001 schedule_reset(priv);
4006 static ssize_t show_internals(struct device *d, struct device_attribute *attr,
4009 struct ipw2100_priv *priv = dev_get_drvdata(d);
4012 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
4014 if (priv->status & STATUS_ASSOCIATED)
4015 len += sprintf(buf + len, "connected: %lu\n",
4016 get_seconds() - priv->connect_start);
4018 len += sprintf(buf + len, "not connected\n");
4020 DUMP_VAR(ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx], "p");
4021 DUMP_VAR(status, "08lx");
4022 DUMP_VAR(config, "08lx");
4023 DUMP_VAR(capability, "08lx");
4026 sprintf(buf + len, "last_rtc: %lu\n",
4027 (unsigned long)priv->last_rtc);
4029 DUMP_VAR(fatal_error, "d");
4030 DUMP_VAR(stop_hang_check, "d");
4031 DUMP_VAR(stop_rf_kill, "d");
4032 DUMP_VAR(messages_sent, "d");
4034 DUMP_VAR(tx_pend_stat.value, "d");
4035 DUMP_VAR(tx_pend_stat.hi, "d");
4037 DUMP_VAR(tx_free_stat.value, "d");
4038 DUMP_VAR(tx_free_stat.lo, "d");
4040 DUMP_VAR(msg_free_stat.value, "d");
4041 DUMP_VAR(msg_free_stat.lo, "d");
4043 DUMP_VAR(msg_pend_stat.value, "d");
4044 DUMP_VAR(msg_pend_stat.hi, "d");
4046 DUMP_VAR(fw_pend_stat.value, "d");
4047 DUMP_VAR(fw_pend_stat.hi, "d");
4049 DUMP_VAR(txq_stat.value, "d");
4050 DUMP_VAR(txq_stat.lo, "d");
4052 DUMP_VAR(ieee->scans, "d");
4053 DUMP_VAR(reset_backoff, "d");
4058 static DEVICE_ATTR(internals, S_IRUGO, show_internals, NULL);
4060 static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr,
4063 struct ipw2100_priv *priv = dev_get_drvdata(d);
4064 char essid[IW_ESSID_MAX_SIZE + 1];
4068 unsigned int length;
4071 if (priv->status & STATUS_RF_KILL_MASK)
4074 memset(essid, 0, sizeof(essid));
4075 memset(bssid, 0, sizeof(bssid));
4077 length = IW_ESSID_MAX_SIZE;
4078 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID, essid, &length);
4080 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4083 length = sizeof(bssid);
4084 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
4087 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4090 length = sizeof(u32);
4091 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &length);
4093 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4096 out += sprintf(out, "ESSID: %s\n", essid);
4097 out += sprintf(out, "BSSID: %pM\n", bssid);
4098 out += sprintf(out, "Channel: %d\n", chan);
4103 static DEVICE_ATTR(bssinfo, S_IRUGO, show_bssinfo, NULL);
4105 #ifdef CONFIG_IPW2100_DEBUG
4106 static ssize_t show_debug_level(struct device_driver *d, char *buf)
4108 return sprintf(buf, "0x%08X\n", ipw2100_debug_level);
4111 static ssize_t store_debug_level(struct device_driver *d,
4112 const char *buf, size_t count)
4114 char *p = (char *)buf;
4117 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
4119 if (p[0] == 'x' || p[0] == 'X')
4121 val = simple_strtoul(p, &p, 16);
4123 val = simple_strtoul(p, &p, 10);
4125 IPW_DEBUG_INFO(": %s is not in hex or decimal form.\n", buf);
4127 ipw2100_debug_level = val;
4129 return strnlen(buf, count);
4132 static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, show_debug_level,
4134 #endif /* CONFIG_IPW2100_DEBUG */
4136 static ssize_t show_fatal_error(struct device *d,
4137 struct device_attribute *attr, char *buf)
4139 struct ipw2100_priv *priv = dev_get_drvdata(d);
4143 if (priv->fatal_error)
4144 out += sprintf(out, "0x%08X\n", priv->fatal_error);
4146 out += sprintf(out, "0\n");
4148 for (i = 1; i <= IPW2100_ERROR_QUEUE; i++) {
4149 if (!priv->fatal_errors[(priv->fatal_index - i) %
4150 IPW2100_ERROR_QUEUE])
4153 out += sprintf(out, "%d. 0x%08X\n", i,
4154 priv->fatal_errors[(priv->fatal_index - i) %
4155 IPW2100_ERROR_QUEUE]);
4161 static ssize_t store_fatal_error(struct device *d,
4162 struct device_attribute *attr, const char *buf,
4165 struct ipw2100_priv *priv = dev_get_drvdata(d);
4166 schedule_reset(priv);
4170 static DEVICE_ATTR(fatal_error, S_IWUSR | S_IRUGO, show_fatal_error,
4173 static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
4176 struct ipw2100_priv *priv = dev_get_drvdata(d);
4177 return sprintf(buf, "%d\n", priv->ieee->scan_age);
4180 static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
4181 const char *buf, size_t count)
4183 struct ipw2100_priv *priv = dev_get_drvdata(d);
4184 struct net_device *dev = priv->net_dev;
4185 char buffer[] = "00000000";
4187 (sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1;
4191 (void)dev; /* kill unused-var warning for debug-only code */
4193 IPW_DEBUG_INFO("enter\n");
4195 strncpy(buffer, buf, len);
4198 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
4200 if (p[0] == 'x' || p[0] == 'X')
4202 val = simple_strtoul(p, &p, 16);
4204 val = simple_strtoul(p, &p, 10);
4206 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
4208 priv->ieee->scan_age = val;
4209 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
4212 IPW_DEBUG_INFO("exit\n");
4216 static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
4218 static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
4221 /* 0 - RF kill not enabled
4222 1 - SW based RF kill active (sysfs)
4223 2 - HW based RF kill active
4224 3 - Both HW and SW baed RF kill active */
4225 struct ipw2100_priv *priv = (struct ipw2100_priv *)d->driver_data;
4226 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
4227 (rf_kill_active(priv) ? 0x2 : 0x0);
4228 return sprintf(buf, "%i\n", val);
4231 static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4233 if ((disable_radio ? 1 : 0) ==
4234 (priv->status & STATUS_RF_KILL_SW ? 1 : 0))
4237 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
4238 disable_radio ? "OFF" : "ON");
4240 mutex_lock(&priv->action_mutex);
4242 if (disable_radio) {
4243 priv->status |= STATUS_RF_KILL_SW;
4246 priv->status &= ~STATUS_RF_KILL_SW;
4247 if (rf_kill_active(priv)) {
4248 IPW_DEBUG_RF_KILL("Can not turn radio back on - "
4249 "disabled by HW switch\n");
4250 /* Make sure the RF_KILL check timer is running */
4251 priv->stop_rf_kill = 0;
4252 cancel_delayed_work(&priv->rf_kill);
4253 queue_delayed_work(priv->workqueue, &priv->rf_kill,
4254 round_jiffies_relative(HZ));
4256 schedule_reset(priv);
4259 mutex_unlock(&priv->action_mutex);
4263 static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
4264 const char *buf, size_t count)
4266 struct ipw2100_priv *priv = dev_get_drvdata(d);
4267 ipw_radio_kill_sw(priv, buf[0] == '1');
4271 static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
4273 static struct attribute *ipw2100_sysfs_entries[] = {
4274 &dev_attr_hardware.attr,
4275 &dev_attr_registers.attr,
4276 &dev_attr_ordinals.attr,
4278 &dev_attr_stats.attr,
4279 &dev_attr_internals.attr,
4280 &dev_attr_bssinfo.attr,
4281 &dev_attr_memory.attr,
4282 &dev_attr_scan_age.attr,
4283 &dev_attr_fatal_error.attr,
4284 &dev_attr_rf_kill.attr,
4286 &dev_attr_status.attr,
4287 &dev_attr_capability.attr,
4291 static struct attribute_group ipw2100_attribute_group = {
4292 .attrs = ipw2100_sysfs_entries,
4295 static int status_queue_allocate(struct ipw2100_priv *priv, int entries)
4297 struct ipw2100_status_queue *q = &priv->status_queue;
4299 IPW_DEBUG_INFO("enter\n");
4301 q->size = entries * sizeof(struct ipw2100_status);
4303 (struct ipw2100_status *)pci_alloc_consistent(priv->pci_dev,
4306 IPW_DEBUG_WARNING("Can not allocate status queue.\n");
4310 memset(q->drv, 0, q->size);
4312 IPW_DEBUG_INFO("exit\n");
4317 static void status_queue_free(struct ipw2100_priv *priv)
4319 IPW_DEBUG_INFO("enter\n");
4321 if (priv->status_queue.drv) {
4322 pci_free_consistent(priv->pci_dev, priv->status_queue.size,
4323 priv->status_queue.drv,
4324 priv->status_queue.nic);
4325 priv->status_queue.drv = NULL;
4328 IPW_DEBUG_INFO("exit\n");
4331 static int bd_queue_allocate(struct ipw2100_priv *priv,
4332 struct ipw2100_bd_queue *q, int entries)
4334 IPW_DEBUG_INFO("enter\n");
4336 memset(q, 0, sizeof(struct ipw2100_bd_queue));
4338 q->entries = entries;
4339 q->size = entries * sizeof(struct ipw2100_bd);
4340 q->drv = pci_alloc_consistent(priv->pci_dev, q->size, &q->nic);
4343 ("can't allocate shared memory for buffer descriptors\n");
4346 memset(q->drv, 0, q->size);
4348 IPW_DEBUG_INFO("exit\n");
4353 static void bd_queue_free(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q)
4355 IPW_DEBUG_INFO("enter\n");
4361 pci_free_consistent(priv->pci_dev, q->size, q->drv, q->nic);
4365 IPW_DEBUG_INFO("exit\n");
4368 static void bd_queue_initialize(struct ipw2100_priv *priv,
4369 struct ipw2100_bd_queue *q, u32 base, u32 size,
4372 IPW_DEBUG_INFO("enter\n");
4374 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv,
4377 write_register(priv->net_dev, base, q->nic);
4378 write_register(priv->net_dev, size, q->entries);
4379 write_register(priv->net_dev, r, q->oldest);
4380 write_register(priv->net_dev, w, q->next);
4382 IPW_DEBUG_INFO("exit\n");
4385 static void ipw2100_kill_workqueue(struct ipw2100_priv *priv)
4387 if (priv->workqueue) {
4388 priv->stop_rf_kill = 1;
4389 priv->stop_hang_check = 1;
4390 cancel_delayed_work(&priv->reset_work);
4391 cancel_delayed_work(&priv->security_work);
4392 cancel_delayed_work(&priv->wx_event_work);
4393 cancel_delayed_work(&priv->hang_check);
4394 cancel_delayed_work(&priv->rf_kill);
4395 cancel_delayed_work(&priv->scan_event_later);
4396 destroy_workqueue(priv->workqueue);
4397 priv->workqueue = NULL;
4401 static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
4403 int i, j, err = -EINVAL;
4407 IPW_DEBUG_INFO("enter\n");
4409 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH);
4411 IPW_DEBUG_ERROR("%s: failed bd_queue_allocate\n",
4412 priv->net_dev->name);
4417 (struct ipw2100_tx_packet *)kmalloc(TX_PENDED_QUEUE_LENGTH *
4421 if (!priv->tx_buffers) {
4422 printk(KERN_ERR DRV_NAME
4423 ": %s: alloc failed form tx buffers.\n",
4424 priv->net_dev->name);
4425 bd_queue_free(priv, &priv->tx_queue);
4429 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4430 v = pci_alloc_consistent(priv->pci_dev,
4431 sizeof(struct ipw2100_data_header),
4434 printk(KERN_ERR DRV_NAME
4435 ": %s: PCI alloc failed for tx " "buffers.\n",
4436 priv->net_dev->name);
4441 priv->tx_buffers[i].type = DATA;
4442 priv->tx_buffers[i].info.d_struct.data =
4443 (struct ipw2100_data_header *)v;
4444 priv->tx_buffers[i].info.d_struct.data_phys = p;
4445 priv->tx_buffers[i].info.d_struct.txb = NULL;
4448 if (i == TX_PENDED_QUEUE_LENGTH)
4451 for (j = 0; j < i; j++) {
4452 pci_free_consistent(priv->pci_dev,
4453 sizeof(struct ipw2100_data_header),
4454 priv->tx_buffers[j].info.d_struct.data,
4455 priv->tx_buffers[j].info.d_struct.
4459 kfree(priv->tx_buffers);
4460 priv->tx_buffers = NULL;
4465 static void ipw2100_tx_initialize(struct ipw2100_priv *priv)
4469 IPW_DEBUG_INFO("enter\n");
4472 * reinitialize packet info lists
4474 INIT_LIST_HEAD(&priv->fw_pend_list);
4475 INIT_STAT(&priv->fw_pend_stat);
4478 * reinitialize lists
4480 INIT_LIST_HEAD(&priv->tx_pend_list);
4481 INIT_LIST_HEAD(&priv->tx_free_list);
4482 INIT_STAT(&priv->tx_pend_stat);
4483 INIT_STAT(&priv->tx_free_stat);
4485 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4486 /* We simply drop any SKBs that have been queued for
4488 if (priv->tx_buffers[i].info.d_struct.txb) {
4489 ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.
4491 priv->tx_buffers[i].info.d_struct.txb = NULL;
4494 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list);
4497 SET_STAT(&priv->tx_free_stat, i);
4499 priv->tx_queue.oldest = 0;
4500 priv->tx_queue.available = priv->tx_queue.entries;
4501 priv->tx_queue.next = 0;
4502 INIT_STAT(&priv->txq_stat);
4503 SET_STAT(&priv->txq_stat, priv->tx_queue.available);
4505 bd_queue_initialize(priv, &priv->tx_queue,
4506 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_BASE,
4507 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_SIZE,
4508 IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
4509 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX);
4511 IPW_DEBUG_INFO("exit\n");
4515 static void ipw2100_tx_free(struct ipw2100_priv *priv)
4519 IPW_DEBUG_INFO("enter\n");
4521 bd_queue_free(priv, &priv->tx_queue);
4523 if (!priv->tx_buffers)
4526 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4527 if (priv->tx_buffers[i].info.d_struct.txb) {
4528 ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.
4530 priv->tx_buffers[i].info.d_struct.txb = NULL;
4532 if (priv->tx_buffers[i].info.d_struct.data)
4533 pci_free_consistent(priv->pci_dev,
4534 sizeof(struct ipw2100_data_header),
4535 priv->tx_buffers[i].info.d_struct.
4537 priv->tx_buffers[i].info.d_struct.
4541 kfree(priv->tx_buffers);
4542 priv->tx_buffers = NULL;
4544 IPW_DEBUG_INFO("exit\n");
4547 static int ipw2100_rx_allocate(struct ipw2100_priv *priv)
4549 int i, j, err = -EINVAL;
4551 IPW_DEBUG_INFO("enter\n");
4553 err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH);
4555 IPW_DEBUG_INFO("failed bd_queue_allocate\n");
4559 err = status_queue_allocate(priv, RX_QUEUE_LENGTH);
4561 IPW_DEBUG_INFO("failed status_queue_allocate\n");
4562 bd_queue_free(priv, &priv->rx_queue);
4569 priv->rx_buffers = (struct ipw2100_rx_packet *)
4570 kmalloc(RX_QUEUE_LENGTH * sizeof(struct ipw2100_rx_packet),
4572 if (!priv->rx_buffers) {
4573 IPW_DEBUG_INFO("can't allocate rx packet buffer table\n");
4575 bd_queue_free(priv, &priv->rx_queue);
4577 status_queue_free(priv);
4582 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4583 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
4585 err = ipw2100_alloc_skb(priv, packet);
4586 if (unlikely(err)) {
4591 /* The BD holds the cache aligned address */
4592 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
4593 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH;
4594 priv->status_queue.drv[i].status_fields = 0;
4597 if (i == RX_QUEUE_LENGTH)
4600 for (j = 0; j < i; j++) {
4601 pci_unmap_single(priv->pci_dev, priv->rx_buffers[j].dma_addr,
4602 sizeof(struct ipw2100_rx_packet),
4603 PCI_DMA_FROMDEVICE);
4604 dev_kfree_skb(priv->rx_buffers[j].skb);
4607 kfree(priv->rx_buffers);
4608 priv->rx_buffers = NULL;
4610 bd_queue_free(priv, &priv->rx_queue);
4612 status_queue_free(priv);
4617 static void ipw2100_rx_initialize(struct ipw2100_priv *priv)
4619 IPW_DEBUG_INFO("enter\n");
4621 priv->rx_queue.oldest = 0;
4622 priv->rx_queue.available = priv->rx_queue.entries - 1;
4623 priv->rx_queue.next = priv->rx_queue.entries - 1;
4625 INIT_STAT(&priv->rxq_stat);
4626 SET_STAT(&priv->rxq_stat, priv->rx_queue.available);
4628 bd_queue_initialize(priv, &priv->rx_queue,
4629 IPW_MEM_HOST_SHARED_RX_BD_BASE,
4630 IPW_MEM_HOST_SHARED_RX_BD_SIZE,
4631 IPW_MEM_HOST_SHARED_RX_READ_INDEX,
4632 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX);
4634 /* set up the status queue */
4635 write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE,
4636 priv->status_queue.nic);
4638 IPW_DEBUG_INFO("exit\n");
4641 static void ipw2100_rx_free(struct ipw2100_priv *priv)
4645 IPW_DEBUG_INFO("enter\n");
4647 bd_queue_free(priv, &priv->rx_queue);
4648 status_queue_free(priv);
4650 if (!priv->rx_buffers)
4653 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4654 if (priv->rx_buffers[i].rxp) {
4655 pci_unmap_single(priv->pci_dev,
4656 priv->rx_buffers[i].dma_addr,
4657 sizeof(struct ipw2100_rx),
4658 PCI_DMA_FROMDEVICE);
4659 dev_kfree_skb(priv->rx_buffers[i].skb);
4663 kfree(priv->rx_buffers);
4664 priv->rx_buffers = NULL;
4666 IPW_DEBUG_INFO("exit\n");
4669 static int ipw2100_read_mac_address(struct ipw2100_priv *priv)
4671 u32 length = ETH_ALEN;
4676 err = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ADAPTER_MAC, addr, &length);
4678 IPW_DEBUG_INFO("MAC address read failed\n");
4682 memcpy(priv->net_dev->dev_addr, addr, ETH_ALEN);
4683 IPW_DEBUG_INFO("card MAC is %pM\n", priv->net_dev->dev_addr);
4688 /********************************************************************
4692 ********************************************************************/
4694 static int ipw2100_set_mac_address(struct ipw2100_priv *priv, int batch_mode)
4696 struct host_command cmd = {
4697 .host_command = ADAPTER_ADDRESS,
4698 .host_command_sequence = 0,
4699 .host_command_length = ETH_ALEN
4703 IPW_DEBUG_HC("SET_MAC_ADDRESS\n");
4705 IPW_DEBUG_INFO("enter\n");
4707 if (priv->config & CFG_CUSTOM_MAC) {
4708 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN);
4709 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
4711 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr,
4714 err = ipw2100_hw_send_command(priv, &cmd);
4716 IPW_DEBUG_INFO("exit\n");
4720 static int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type,
4723 struct host_command cmd = {
4724 .host_command = PORT_TYPE,
4725 .host_command_sequence = 0,
4726 .host_command_length = sizeof(u32)
4730 switch (port_type) {
4732 cmd.host_command_parameters[0] = IPW_BSS;
4735 cmd.host_command_parameters[0] = IPW_IBSS;
4739 IPW_DEBUG_HC("PORT_TYPE: %s\n",
4740 port_type == IPW_IBSS ? "Ad-Hoc" : "Managed");
4743 err = ipw2100_disable_adapter(priv);
4745 printk(KERN_ERR DRV_NAME
4746 ": %s: Could not disable adapter %d\n",
4747 priv->net_dev->name, err);
4752 /* send cmd to firmware */
4753 err = ipw2100_hw_send_command(priv, &cmd);
4756 ipw2100_enable_adapter(priv);
4761 static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel,
4764 struct host_command cmd = {
4765 .host_command = CHANNEL,
4766 .host_command_sequence = 0,
4767 .host_command_length = sizeof(u32)
4771 cmd.host_command_parameters[0] = channel;
4773 IPW_DEBUG_HC("CHANNEL: %d\n", channel);
4775 /* If BSS then we don't support channel selection */
4776 if (priv->ieee->iw_mode == IW_MODE_INFRA)
4779 if ((channel != 0) &&
4780 ((channel < REG_MIN_CHANNEL) || (channel > REG_MAX_CHANNEL)))
4784 err = ipw2100_disable_adapter(priv);
4789 err = ipw2100_hw_send_command(priv, &cmd);
4791 IPW_DEBUG_INFO("Failed to set channel to %d", channel);
4796 priv->config |= CFG_STATIC_CHANNEL;
4798 priv->config &= ~CFG_STATIC_CHANNEL;
4800 priv->channel = channel;
4803 err = ipw2100_enable_adapter(priv);
4811 static int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode)
4813 struct host_command cmd = {
4814 .host_command = SYSTEM_CONFIG,
4815 .host_command_sequence = 0,
4816 .host_command_length = 12,
4818 u32 ibss_mask, len = sizeof(u32);
4821 /* Set system configuration */
4824 err = ipw2100_disable_adapter(priv);
4829 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
4830 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_AUTO_START;
4832 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_MASK |
4833 IPW_CFG_BSS_MASK | IPW_CFG_802_1x_ENABLE;
4835 if (!(priv->config & CFG_LONG_PREAMBLE))
4836 cmd.host_command_parameters[0] |= IPW_CFG_PREAMBLE_AUTO;
4838 err = ipw2100_get_ordinal(priv,
4839 IPW_ORD_EEPROM_IBSS_11B_CHANNELS,
4842 ibss_mask = IPW_IBSS_11B_DEFAULT_MASK;
4844 cmd.host_command_parameters[1] = REG_CHANNEL_MASK;
4845 cmd.host_command_parameters[2] = REG_CHANNEL_MASK & ibss_mask;
4848 /*cmd.host_command_parameters[0] |= DIVERSITY_ANTENNA_A; */
4850 err = ipw2100_hw_send_command(priv, &cmd);
4854 /* If IPv6 is configured in the kernel then we don't want to filter out all
4855 * of the multicast packets as IPv6 needs some. */
4856 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
4857 cmd.host_command = ADD_MULTICAST;
4858 cmd.host_command_sequence = 0;
4859 cmd.host_command_length = 0;
4861 ipw2100_hw_send_command(priv, &cmd);
4864 err = ipw2100_enable_adapter(priv);
4872 static int ipw2100_set_tx_rates(struct ipw2100_priv *priv, u32 rate,
4875 struct host_command cmd = {
4876 .host_command = BASIC_TX_RATES,
4877 .host_command_sequence = 0,
4878 .host_command_length = 4
4882 cmd.host_command_parameters[0] = rate & TX_RATE_MASK;
4885 err = ipw2100_disable_adapter(priv);
4890 /* Set BASIC TX Rate first */
4891 ipw2100_hw_send_command(priv, &cmd);
4894 cmd.host_command = TX_RATES;
4895 ipw2100_hw_send_command(priv, &cmd);
4897 /* Set MSDU TX Rate */
4898 cmd.host_command = MSDU_TX_RATES;
4899 ipw2100_hw_send_command(priv, &cmd);
4902 err = ipw2100_enable_adapter(priv);
4907 priv->tx_rates = rate;
4912 static int ipw2100_set_power_mode(struct ipw2100_priv *priv, int power_level)
4914 struct host_command cmd = {
4915 .host_command = POWER_MODE,
4916 .host_command_sequence = 0,
4917 .host_command_length = 4
4921 cmd.host_command_parameters[0] = power_level;
4923 err = ipw2100_hw_send_command(priv, &cmd);
4927 if (power_level == IPW_POWER_MODE_CAM)
4928 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
4930 priv->power_mode = IPW_POWER_ENABLED | power_level;
4932 #ifdef IPW2100_TX_POWER
4933 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) {
4934 /* Set beacon interval */
4935 cmd.host_command = TX_POWER_INDEX;
4936 cmd.host_command_parameters[0] = (u32) priv->adhoc_power;
4938 err = ipw2100_hw_send_command(priv, &cmd);
4947 static int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold)
4949 struct host_command cmd = {
4950 .host_command = RTS_THRESHOLD,
4951 .host_command_sequence = 0,
4952 .host_command_length = 4
4956 if (threshold & RTS_DISABLED)
4957 cmd.host_command_parameters[0] = MAX_RTS_THRESHOLD;
4959 cmd.host_command_parameters[0] = threshold & ~RTS_DISABLED;
4961 err = ipw2100_hw_send_command(priv, &cmd);
4965 priv->rts_threshold = threshold;
4971 int ipw2100_set_fragmentation_threshold(struct ipw2100_priv *priv,
4972 u32 threshold, int batch_mode)
4974 struct host_command cmd = {
4975 .host_command = FRAG_THRESHOLD,
4976 .host_command_sequence = 0,
4977 .host_command_length = 4,
4978 .host_command_parameters[0] = 0,
4983 err = ipw2100_disable_adapter(priv);
4989 threshold = DEFAULT_FRAG_THRESHOLD;
4991 threshold = max(threshold, MIN_FRAG_THRESHOLD);
4992 threshold = min(threshold, MAX_FRAG_THRESHOLD);
4995 cmd.host_command_parameters[0] = threshold;
4997 IPW_DEBUG_HC("FRAG_THRESHOLD: %u\n", threshold);
4999 err = ipw2100_hw_send_command(priv, &cmd);
5002 ipw2100_enable_adapter(priv);
5005 priv->frag_threshold = threshold;
5011 static int ipw2100_set_short_retry(struct ipw2100_priv *priv, u32 retry)
5013 struct host_command cmd = {
5014 .host_command = SHORT_RETRY_LIMIT,
5015 .host_command_sequence = 0,
5016 .host_command_length = 4
5020 cmd.host_command_parameters[0] = retry;
5022 err = ipw2100_hw_send_command(priv, &cmd);
5026 priv->short_retry_limit = retry;
5031 static int ipw2100_set_long_retry(struct ipw2100_priv *priv, u32 retry)
5033 struct host_command cmd = {
5034 .host_command = LONG_RETRY_LIMIT,
5035 .host_command_sequence = 0,
5036 .host_command_length = 4
5040 cmd.host_command_parameters[0] = retry;
5042 err = ipw2100_hw_send_command(priv, &cmd);
5046 priv->long_retry_limit = retry;
5051 static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 * bssid,
5054 struct host_command cmd = {
5055 .host_command = MANDATORY_BSSID,
5056 .host_command_sequence = 0,
5057 .host_command_length = (bssid == NULL) ? 0 : ETH_ALEN
5061 #ifdef CONFIG_IPW2100_DEBUG
5063 IPW_DEBUG_HC("MANDATORY_BSSID: %pM\n", bssid);
5065 IPW_DEBUG_HC("MANDATORY_BSSID: <clear>\n");
5067 /* if BSSID is empty then we disable mandatory bssid mode */
5069 memcpy(cmd.host_command_parameters, bssid, ETH_ALEN);
5072 err = ipw2100_disable_adapter(priv);
5077 err = ipw2100_hw_send_command(priv, &cmd);
5080 ipw2100_enable_adapter(priv);
5085 static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv)
5087 struct host_command cmd = {
5088 .host_command = DISASSOCIATION_BSSID,
5089 .host_command_sequence = 0,
5090 .host_command_length = ETH_ALEN
5095 IPW_DEBUG_HC("DISASSOCIATION_BSSID\n");
5098 /* The Firmware currently ignores the BSSID and just disassociates from
5099 * the currently associated AP -- but in the off chance that a future
5100 * firmware does use the BSSID provided here, we go ahead and try and
5101 * set it to the currently associated AP's BSSID */
5102 memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN);
5104 err = ipw2100_hw_send_command(priv, &cmd);
5109 static int ipw2100_set_wpa_ie(struct ipw2100_priv *,
5110 struct ipw2100_wpa_assoc_frame *, int)
5111 __attribute__ ((unused));
5113 static int ipw2100_set_wpa_ie(struct ipw2100_priv *priv,
5114 struct ipw2100_wpa_assoc_frame *wpa_frame,
5117 struct host_command cmd = {
5118 .host_command = SET_WPA_IE,
5119 .host_command_sequence = 0,
5120 .host_command_length = sizeof(struct ipw2100_wpa_assoc_frame),
5124 IPW_DEBUG_HC("SET_WPA_IE\n");
5127 err = ipw2100_disable_adapter(priv);
5132 memcpy(cmd.host_command_parameters, wpa_frame,
5133 sizeof(struct ipw2100_wpa_assoc_frame));
5135 err = ipw2100_hw_send_command(priv, &cmd);
5138 if (ipw2100_enable_adapter(priv))
5145 struct security_info_params {
5146 u32 allowed_ciphers;
5149 u8 replay_counters_number;
5150 u8 unicast_using_group;
5151 } __attribute__ ((packed));
5153 static int ipw2100_set_security_information(struct ipw2100_priv *priv,
5156 int unicast_using_group,
5159 struct host_command cmd = {
5160 .host_command = SET_SECURITY_INFORMATION,
5161 .host_command_sequence = 0,
5162 .host_command_length = sizeof(struct security_info_params)
5164 struct security_info_params *security =
5165 (struct security_info_params *)&cmd.host_command_parameters;
5167 memset(security, 0, sizeof(*security));
5169 /* If shared key AP authentication is turned on, then we need to
5170 * configure the firmware to try and use it.
5172 * Actual data encryption/decryption is handled by the host. */
5173 security->auth_mode = auth_mode;
5174 security->unicast_using_group = unicast_using_group;
5176 switch (security_level) {
5179 security->allowed_ciphers = IPW_NONE_CIPHER;
5182 security->allowed_ciphers = IPW_WEP40_CIPHER |
5186 security->allowed_ciphers = IPW_WEP40_CIPHER |
5187 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER;
5189 case SEC_LEVEL_2_CKIP:
5190 security->allowed_ciphers = IPW_WEP40_CIPHER |
5191 IPW_WEP104_CIPHER | IPW_CKIP_CIPHER;
5194 security->allowed_ciphers = IPW_WEP40_CIPHER |
5195 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER | IPW_CCMP_CIPHER;
5200 ("SET_SECURITY_INFORMATION: auth:%d cipher:0x%02X (level %d)\n",
5201 security->auth_mode, security->allowed_ciphers, security_level);
5203 security->replay_counters_number = 0;
5206 err = ipw2100_disable_adapter(priv);
5211 err = ipw2100_hw_send_command(priv, &cmd);
5214 ipw2100_enable_adapter(priv);
5219 static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
5221 struct host_command cmd = {
5222 .host_command = TX_POWER_INDEX,
5223 .host_command_sequence = 0,
5224 .host_command_length = 4
5229 if (tx_power != IPW_TX_POWER_DEFAULT)
5230 tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
5231 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
5233 cmd.host_command_parameters[0] = tmp;
5235 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
5236 err = ipw2100_hw_send_command(priv, &cmd);
5238 priv->tx_power = tx_power;
5243 static int ipw2100_set_ibss_beacon_interval(struct ipw2100_priv *priv,
5244 u32 interval, int batch_mode)
5246 struct host_command cmd = {
5247 .host_command = BEACON_INTERVAL,
5248 .host_command_sequence = 0,
5249 .host_command_length = 4
5253 cmd.host_command_parameters[0] = interval;
5255 IPW_DEBUG_INFO("enter\n");
5257 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5259 err = ipw2100_disable_adapter(priv);
5264 ipw2100_hw_send_command(priv, &cmd);
5267 err = ipw2100_enable_adapter(priv);
5273 IPW_DEBUG_INFO("exit\n");
5278 static void ipw2100_queues_initialize(struct ipw2100_priv *priv)
5280 ipw2100_tx_initialize(priv);
5281 ipw2100_rx_initialize(priv);
5282 ipw2100_msg_initialize(priv);
5285 static void ipw2100_queues_free(struct ipw2100_priv *priv)
5287 ipw2100_tx_free(priv);
5288 ipw2100_rx_free(priv);
5289 ipw2100_msg_free(priv);
5292 static int ipw2100_queues_allocate(struct ipw2100_priv *priv)
5294 if (ipw2100_tx_allocate(priv) ||
5295 ipw2100_rx_allocate(priv) || ipw2100_msg_allocate(priv))
5301 ipw2100_tx_free(priv);
5302 ipw2100_rx_free(priv);
5303 ipw2100_msg_free(priv);
5307 #define IPW_PRIVACY_CAPABLE 0x0008
5309 static int ipw2100_set_wep_flags(struct ipw2100_priv *priv, u32 flags,
5312 struct host_command cmd = {
5313 .host_command = WEP_FLAGS,
5314 .host_command_sequence = 0,
5315 .host_command_length = 4
5319 cmd.host_command_parameters[0] = flags;
5321 IPW_DEBUG_HC("WEP_FLAGS: flags = 0x%08X\n", flags);
5324 err = ipw2100_disable_adapter(priv);
5326 printk(KERN_ERR DRV_NAME
5327 ": %s: Could not disable adapter %d\n",
5328 priv->net_dev->name, err);
5333 /* send cmd to firmware */
5334 err = ipw2100_hw_send_command(priv, &cmd);
5337 ipw2100_enable_adapter(priv);
5342 struct ipw2100_wep_key {
5348 /* Macros to ease up priting WEP keys */
5349 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
5350 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
5351 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
5352 #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]
5357 * @priv: struct to work on
5358 * @idx: index of the key we want to set
5359 * @key: ptr to the key data to set
5360 * @len: length of the buffer at @key
5361 * @batch_mode: FIXME perform the operation in batch mode, not
5362 * disabling the device.
5364 * @returns 0 if OK, < 0 errno code on error.
5366 * Fill out a command structure with the new wep key, length an
5367 * index and send it down the wire.
5369 static int ipw2100_set_key(struct ipw2100_priv *priv,
5370 int idx, char *key, int len, int batch_mode)
5372 int keylen = len ? (len <= 5 ? 5 : 13) : 0;
5373 struct host_command cmd = {
5374 .host_command = WEP_KEY_INFO,
5375 .host_command_sequence = 0,
5376 .host_command_length = sizeof(struct ipw2100_wep_key),
5378 struct ipw2100_wep_key *wep_key = (void *)cmd.host_command_parameters;
5381 IPW_DEBUG_HC("WEP_KEY_INFO: index = %d, len = %d/%d\n",
5384 /* NOTE: We don't check cached values in case the firmware was reset
5385 * or some other problem is occurring. If the user is setting the key,
5386 * then we push the change */
5389 wep_key->len = keylen;
5392 memcpy(wep_key->key, key, len);
5393 memset(wep_key->key + len, 0, keylen - len);
5396 /* Will be optimized out on debug not being configured in */
5398 IPW_DEBUG_WEP("%s: Clearing key %d\n",
5399 priv->net_dev->name, wep_key->idx);
5400 else if (keylen == 5)
5401 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_64 "\n",
5402 priv->net_dev->name, wep_key->idx, wep_key->len,
5403 WEP_STR_64(wep_key->key));
5405 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_128
5407 priv->net_dev->name, wep_key->idx, wep_key->len,
5408 WEP_STR_128(wep_key->key));
5411 err = ipw2100_disable_adapter(priv);
5412 /* FIXME: IPG: shouldn't this prink be in _disable_adapter()? */
5414 printk(KERN_ERR DRV_NAME
5415 ": %s: Could not disable adapter %d\n",
5416 priv->net_dev->name, err);
5421 /* send cmd to firmware */
5422 err = ipw2100_hw_send_command(priv, &cmd);
5425 int err2 = ipw2100_enable_adapter(priv);
5432 static int ipw2100_set_key_index(struct ipw2100_priv *priv,
5433 int idx, int batch_mode)
5435 struct host_command cmd = {
5436 .host_command = WEP_KEY_INDEX,
5437 .host_command_sequence = 0,
5438 .host_command_length = 4,
5439 .host_command_parameters = {idx},
5443 IPW_DEBUG_HC("WEP_KEY_INDEX: index = %d\n", idx);
5445 if (idx < 0 || idx > 3)
5449 err = ipw2100_disable_adapter(priv);
5451 printk(KERN_ERR DRV_NAME
5452 ": %s: Could not disable adapter %d\n",
5453 priv->net_dev->name, err);
5458 /* send cmd to firmware */
5459 err = ipw2100_hw_send_command(priv, &cmd);
5462 ipw2100_enable_adapter(priv);
5467 static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode)
5469 int i, err, auth_mode, sec_level, use_group;
5471 if (!(priv->status & STATUS_RUNNING))
5475 err = ipw2100_disable_adapter(priv);
5480 if (!priv->ieee->sec.enabled) {
5482 ipw2100_set_security_information(priv, IPW_AUTH_OPEN,
5485 auth_mode = IPW_AUTH_OPEN;
5486 if (priv->ieee->sec.flags & SEC_AUTH_MODE) {
5487 if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)
5488 auth_mode = IPW_AUTH_SHARED;
5489 else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)
5490 auth_mode = IPW_AUTH_LEAP_CISCO_ID;
5493 sec_level = SEC_LEVEL_0;
5494 if (priv->ieee->sec.flags & SEC_LEVEL)
5495 sec_level = priv->ieee->sec.level;
5498 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP)
5499 use_group = priv->ieee->sec.unicast_uses_group;
5502 ipw2100_set_security_information(priv, auth_mode, sec_level,
5509 if (priv->ieee->sec.enabled) {
5510 for (i = 0; i < 4; i++) {
5511 if (!(priv->ieee->sec.flags & (1 << i))) {
5512 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN);
5513 priv->ieee->sec.key_sizes[i] = 0;
5515 err = ipw2100_set_key(priv, i,
5516 priv->ieee->sec.keys[i],
5524 ipw2100_set_key_index(priv, priv->ieee->crypt_info.tx_keyidx, 1);
5527 /* Always enable privacy so the Host can filter WEP packets if
5528 * encrypted data is sent up */
5530 ipw2100_set_wep_flags(priv,
5532 enabled ? IPW_PRIVACY_CAPABLE : 0, 1);
5536 priv->status &= ~STATUS_SECURITY_UPDATED;
5540 ipw2100_enable_adapter(priv);
5545 static void ipw2100_security_work(struct work_struct *work)
5547 struct ipw2100_priv *priv =
5548 container_of(work, struct ipw2100_priv, security_work.work);
5550 /* If we happen to have reconnected before we get a chance to
5551 * process this, then update the security settings--which causes
5552 * a disassociation to occur */
5553 if (!(priv->status & STATUS_ASSOCIATED) &&
5554 priv->status & STATUS_SECURITY_UPDATED)
5555 ipw2100_configure_security(priv, 0);
5558 static void shim__set_security(struct net_device *dev,
5559 struct ieee80211_security *sec)
5561 struct ipw2100_priv *priv = ieee80211_priv(dev);
5562 int i, force_update = 0;
5564 mutex_lock(&priv->action_mutex);
5565 if (!(priv->status & STATUS_INITIALIZED))
5568 for (i = 0; i < 4; i++) {
5569 if (sec->flags & (1 << i)) {
5570 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
5571 if (sec->key_sizes[i] == 0)
5572 priv->ieee->sec.flags &= ~(1 << i);
5574 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
5576 if (sec->level == SEC_LEVEL_1) {
5577 priv->ieee->sec.flags |= (1 << i);
5578 priv->status |= STATUS_SECURITY_UPDATED;
5580 priv->ieee->sec.flags &= ~(1 << i);
5584 if ((sec->flags & SEC_ACTIVE_KEY) &&
5585 priv->ieee->sec.active_key != sec->active_key) {
5586 if (sec->active_key <= 3) {
5587 priv->ieee->sec.active_key = sec->active_key;
5588 priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
5590 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
5592 priv->status |= STATUS_SECURITY_UPDATED;
5595 if ((sec->flags & SEC_AUTH_MODE) &&
5596 (priv->ieee->sec.auth_mode != sec->auth_mode)) {
5597 priv->ieee->sec.auth_mode = sec->auth_mode;
5598 priv->ieee->sec.flags |= SEC_AUTH_MODE;
5599 priv->status |= STATUS_SECURITY_UPDATED;
5602 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
5603 priv->ieee->sec.flags |= SEC_ENABLED;
5604 priv->ieee->sec.enabled = sec->enabled;
5605 priv->status |= STATUS_SECURITY_UPDATED;
5609 if (sec->flags & SEC_ENCRYPT)
5610 priv->ieee->sec.encrypt = sec->encrypt;
5612 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
5613 priv->ieee->sec.level = sec->level;
5614 priv->ieee->sec.flags |= SEC_LEVEL;
5615 priv->status |= STATUS_SECURITY_UPDATED;
5618 IPW_DEBUG_WEP("Security flags: %c %c%c%c%c %c%c%c%c\n",
5619 priv->ieee->sec.flags & (1 << 8) ? '1' : '0',
5620 priv->ieee->sec.flags & (1 << 7) ? '1' : '0',
5621 priv->ieee->sec.flags & (1 << 6) ? '1' : '0',
5622 priv->ieee->sec.flags & (1 << 5) ? '1' : '0',
5623 priv->ieee->sec.flags & (1 << 4) ? '1' : '0',
5624 priv->ieee->sec.flags & (1 << 3) ? '1' : '0',
5625 priv->ieee->sec.flags & (1 << 2) ? '1' : '0',
5626 priv->ieee->sec.flags & (1 << 1) ? '1' : '0',
5627 priv->ieee->sec.flags & (1 << 0) ? '1' : '0');
5629 /* As a temporary work around to enable WPA until we figure out why
5630 * wpa_supplicant toggles the security capability of the driver, which
5631 * forces a disassocation with force_update...
5633 * if (force_update || !(priv->status & STATUS_ASSOCIATED))*/
5634 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
5635 ipw2100_configure_security(priv, 0);
5637 mutex_unlock(&priv->action_mutex);
5640 static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5646 IPW_DEBUG_INFO("enter\n");
5648 err = ipw2100_disable_adapter(priv);
5651 #ifdef CONFIG_IPW2100_MONITOR
5652 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
5653 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5657 IPW_DEBUG_INFO("exit\n");
5661 #endif /* CONFIG_IPW2100_MONITOR */
5663 err = ipw2100_read_mac_address(priv);
5667 err = ipw2100_set_mac_address(priv, batch_mode);
5671 err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode);
5675 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5676 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5681 err = ipw2100_system_config(priv, batch_mode);
5685 err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode);
5689 /* Default to power mode OFF */
5690 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
5694 err = ipw2100_set_rts_threshold(priv, priv->rts_threshold);
5698 if (priv->config & CFG_STATIC_BSSID)
5699 bssid = priv->bssid;
5702 err = ipw2100_set_mandatory_bssid(priv, bssid, batch_mode);
5706 if (priv->config & CFG_STATIC_ESSID)
5707 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len,
5710 err = ipw2100_set_essid(priv, NULL, 0, batch_mode);
5714 err = ipw2100_configure_security(priv, batch_mode);
5718 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5720 ipw2100_set_ibss_beacon_interval(priv,
5721 priv->beacon_interval,
5726 err = ipw2100_set_tx_power(priv, priv->tx_power);
5732 err = ipw2100_set_fragmentation_threshold(
5733 priv, priv->frag_threshold, batch_mode);
5738 IPW_DEBUG_INFO("exit\n");
5743 /*************************************************************************
5745 * EXTERNALLY CALLED METHODS
5747 *************************************************************************/
5749 /* This method is called by the network layer -- not to be confused with
5750 * ipw2100_set_mac_address() declared above called by this driver (and this
5751 * method as well) to talk to the firmware */
5752 static int ipw2100_set_address(struct net_device *dev, void *p)
5754 struct ipw2100_priv *priv = ieee80211_priv(dev);
5755 struct sockaddr *addr = p;
5758 if (!is_valid_ether_addr(addr->sa_data))
5759 return -EADDRNOTAVAIL;
5761 mutex_lock(&priv->action_mutex);
5763 priv->config |= CFG_CUSTOM_MAC;
5764 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
5766 err = ipw2100_set_mac_address(priv, 0);
5770 priv->reset_backoff = 0;
5771 mutex_unlock(&priv->action_mutex);
5772 ipw2100_reset_adapter(&priv->reset_work.work);
5776 mutex_unlock(&priv->action_mutex);
5780 static int ipw2100_open(struct net_device *dev)
5782 struct ipw2100_priv *priv = ieee80211_priv(dev);
5783 unsigned long flags;
5784 IPW_DEBUG_INFO("dev->open\n");
5786 spin_lock_irqsave(&priv->low_lock, flags);
5787 if (priv->status & STATUS_ASSOCIATED) {
5788 netif_carrier_on(dev);
5789 netif_start_queue(dev);
5791 spin_unlock_irqrestore(&priv->low_lock, flags);
5796 static int ipw2100_close(struct net_device *dev)
5798 struct ipw2100_priv *priv = ieee80211_priv(dev);
5799 unsigned long flags;
5800 struct list_head *element;
5801 struct ipw2100_tx_packet *packet;
5803 IPW_DEBUG_INFO("enter\n");
5805 spin_lock_irqsave(&priv->low_lock, flags);
5807 if (priv->status & STATUS_ASSOCIATED)
5808 netif_carrier_off(dev);
5809 netif_stop_queue(dev);
5811 /* Flush the TX queue ... */
5812 while (!list_empty(&priv->tx_pend_list)) {
5813 element = priv->tx_pend_list.next;
5814 packet = list_entry(element, struct ipw2100_tx_packet, list);
5817 DEC_STAT(&priv->tx_pend_stat);
5819 ieee80211_txb_free(packet->info.d_struct.txb);
5820 packet->info.d_struct.txb = NULL;
5822 list_add_tail(element, &priv->tx_free_list);
5823 INC_STAT(&priv->tx_free_stat);
5825 spin_unlock_irqrestore(&priv->low_lock, flags);
5827 IPW_DEBUG_INFO("exit\n");
5833 * TODO: Fix this function... its just wrong
5835 static void ipw2100_tx_timeout(struct net_device *dev)
5837 struct ipw2100_priv *priv = ieee80211_priv(dev);
5839 priv->ieee->stats.tx_errors++;
5841 #ifdef CONFIG_IPW2100_MONITOR
5842 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
5846 IPW_DEBUG_INFO("%s: TX timed out. Scheduling firmware restart.\n",
5848 schedule_reset(priv);
5851 static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value)
5853 /* This is called when wpa_supplicant loads and closes the driver
5855 priv->ieee->wpa_enabled = value;
5859 static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
5862 struct ieee80211_device *ieee = priv->ieee;
5863 struct ieee80211_security sec = {
5864 .flags = SEC_AUTH_MODE,
5868 if (value & IW_AUTH_ALG_SHARED_KEY) {
5869 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
5871 } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
5872 sec.auth_mode = WLAN_AUTH_OPEN;
5874 } else if (value & IW_AUTH_ALG_LEAP) {
5875 sec.auth_mode = WLAN_AUTH_LEAP;
5880 if (ieee->set_security)
5881 ieee->set_security(ieee->dev, &sec);
5888 static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
5889 char *wpa_ie, int wpa_ie_len)
5892 struct ipw2100_wpa_assoc_frame frame;
5894 frame.fixed_ie_mask = 0;
5897 memcpy(frame.var_ie, wpa_ie, wpa_ie_len);
5898 frame.var_ie_len = wpa_ie_len;
5900 /* make sure WPA is enabled */
5901 ipw2100_wpa_enable(priv, 1);
5902 ipw2100_set_wpa_ie(priv, &frame, 0);
5905 static void ipw_ethtool_get_drvinfo(struct net_device *dev,
5906 struct ethtool_drvinfo *info)
5908 struct ipw2100_priv *priv = ieee80211_priv(dev);
5909 char fw_ver[64], ucode_ver[64];
5911 strcpy(info->driver, DRV_NAME);
5912 strcpy(info->version, DRV_VERSION);
5914 ipw2100_get_fwversion(priv, fw_ver, sizeof(fw_ver));
5915 ipw2100_get_ucodeversion(priv, ucode_ver, sizeof(ucode_ver));
5917 snprintf(info->fw_version, sizeof(info->fw_version), "%s:%d:%s",
5918 fw_ver, priv->eeprom_version, ucode_ver);
5920 strcpy(info->bus_info, pci_name(priv->pci_dev));
5923 static u32 ipw2100_ethtool_get_link(struct net_device *dev)
5925 struct ipw2100_priv *priv = ieee80211_priv(dev);
5926 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0;
5929 static const struct ethtool_ops ipw2100_ethtool_ops = {
5930 .get_link = ipw2100_ethtool_get_link,
5931 .get_drvinfo = ipw_ethtool_get_drvinfo,
5934 static void ipw2100_hang_check(struct work_struct *work)
5936 struct ipw2100_priv *priv =
5937 container_of(work, struct ipw2100_priv, hang_check.work);
5938 unsigned long flags;
5939 u32 rtc = 0xa5a5a5a5;
5940 u32 len = sizeof(rtc);
5943 spin_lock_irqsave(&priv->low_lock, flags);
5945 if (priv->fatal_error != 0) {
5946 /* If fatal_error is set then we need to restart */
5947 IPW_DEBUG_INFO("%s: Hardware fatal error detected.\n",
5948 priv->net_dev->name);
5951 } else if (ipw2100_get_ordinal(priv, IPW_ORD_RTC_TIME, &rtc, &len) ||
5952 (rtc == priv->last_rtc)) {
5953 /* Check if firmware is hung */
5954 IPW_DEBUG_INFO("%s: Firmware RTC stalled.\n",
5955 priv->net_dev->name);
5962 priv->stop_hang_check = 1;
5965 /* Restart the NIC */
5966 schedule_reset(priv);
5969 priv->last_rtc = rtc;
5971 if (!priv->stop_hang_check)
5972 queue_delayed_work(priv->workqueue, &priv->hang_check, HZ / 2);
5974 spin_unlock_irqrestore(&priv->low_lock, flags);
5977 static void ipw2100_rf_kill(struct work_struct *work)
5979 struct ipw2100_priv *priv =
5980 container_of(work, struct ipw2100_priv, rf_kill.work);
5981 unsigned long flags;
5983 spin_lock_irqsave(&priv->low_lock, flags);
5985 if (rf_kill_active(priv)) {
5986 IPW_DEBUG_RF_KILL("RF Kill active, rescheduling GPIO check\n");
5987 if (!priv->stop_rf_kill)
5988 queue_delayed_work(priv->workqueue, &priv->rf_kill,
5989 round_jiffies_relative(HZ));
5993 /* RF Kill is now disabled, so bring the device back up */
5995 if (!(priv->status & STATUS_RF_KILL_MASK)) {
5996 IPW_DEBUG_RF_KILL("HW RF Kill no longer active, restarting "
5998 schedule_reset(priv);
6000 IPW_DEBUG_RF_KILL("HW RF Kill deactivated. SW RF Kill still "
6004 spin_unlock_irqrestore(&priv->low_lock, flags);
6007 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv);
6009 /* Look into using netdev destructor to shutdown ieee80211? */
6011 static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
6012 void __iomem * base_addr,
6013 unsigned long mem_start,
6014 unsigned long mem_len)
6016 struct ipw2100_priv *priv;
6017 struct net_device *dev;
6019 dev = alloc_ieee80211(sizeof(struct ipw2100_priv));
6022 priv = ieee80211_priv(dev);
6023 priv->ieee = netdev_priv(dev);
6024 priv->pci_dev = pci_dev;
6025 priv->net_dev = dev;
6027 priv->ieee->hard_start_xmit = ipw2100_tx;
6028 priv->ieee->set_security = shim__set_security;
6030 priv->ieee->perfect_rssi = -20;
6031 priv->ieee->worst_rssi = -85;
6033 dev->open = ipw2100_open;
6034 dev->stop = ipw2100_close;
6035 dev->init = ipw2100_net_init;
6036 dev->ethtool_ops = &ipw2100_ethtool_ops;
6037 dev->tx_timeout = ipw2100_tx_timeout;
6038 dev->wireless_handlers = &ipw2100_wx_handler_def;
6039 priv->wireless_data.ieee80211 = priv->ieee;
6040 dev->wireless_data = &priv->wireless_data;
6041 dev->set_mac_address = ipw2100_set_address;
6042 dev->watchdog_timeo = 3 * HZ;
6045 dev->base_addr = (unsigned long)base_addr;
6046 dev->mem_start = mem_start;
6047 dev->mem_end = dev->mem_start + mem_len - 1;
6049 /* NOTE: We don't use the wireless_handlers hook
6050 * in dev as the system will start throwing WX requests
6051 * to us before we're actually initialized and it just
6052 * ends up causing problems. So, we just handle
6053 * the WX extensions through the ipw2100_ioctl interface */
6055 /* memset() puts everything to 0, so we only have explicitly set
6056 * those values that need to be something else */
6058 /* If power management is turned on, default to AUTO mode */
6059 priv->power_mode = IPW_POWER_AUTO;
6061 #ifdef CONFIG_IPW2100_MONITOR
6062 priv->config |= CFG_CRC_CHECK;
6064 priv->ieee->wpa_enabled = 0;
6065 priv->ieee->drop_unencrypted = 0;
6066 priv->ieee->privacy_invoked = 0;
6067 priv->ieee->ieee802_1x = 1;
6069 /* Set module parameters */
6072 priv->ieee->iw_mode = IW_MODE_ADHOC;
6074 #ifdef CONFIG_IPW2100_MONITOR
6076 priv->ieee->iw_mode = IW_MODE_MONITOR;
6081 priv->ieee->iw_mode = IW_MODE_INFRA;
6086 priv->status |= STATUS_RF_KILL_SW;
6089 ((channel >= REG_MIN_CHANNEL) && (channel <= REG_MAX_CHANNEL))) {
6090 priv->config |= CFG_STATIC_CHANNEL;
6091 priv->channel = channel;
6095 priv->config |= CFG_ASSOCIATE;
6097 priv->beacon_interval = DEFAULT_BEACON_INTERVAL;
6098 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT;
6099 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT;
6100 priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED;
6101 priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED;
6102 priv->tx_power = IPW_TX_POWER_DEFAULT;
6103 priv->tx_rates = DEFAULT_TX_RATES;
6105 strcpy(priv->nick, "ipw2100");
6107 spin_lock_init(&priv->low_lock);
6108 mutex_init(&priv->action_mutex);
6109 mutex_init(&priv->adapter_mutex);
6111 init_waitqueue_head(&priv->wait_command_queue);
6113 netif_carrier_off(dev);
6115 INIT_LIST_HEAD(&priv->msg_free_list);
6116 INIT_LIST_HEAD(&priv->msg_pend_list);
6117 INIT_STAT(&priv->msg_free_stat);
6118 INIT_STAT(&priv->msg_pend_stat);
6120 INIT_LIST_HEAD(&priv->tx_free_list);
6121 INIT_LIST_HEAD(&priv->tx_pend_list);
6122 INIT_STAT(&priv->tx_free_stat);
6123 INIT_STAT(&priv->tx_pend_stat);
6125 INIT_LIST_HEAD(&priv->fw_pend_list);
6126 INIT_STAT(&priv->fw_pend_stat);
6128 priv->workqueue = create_workqueue(DRV_NAME);
6130 INIT_DELAYED_WORK(&priv->reset_work, ipw2100_reset_adapter);
6131 INIT_DELAYED_WORK(&priv->security_work, ipw2100_security_work);
6132 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work);
6133 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check);
6134 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill);
6135 INIT_WORK(&priv->scan_event_now, ipw2100_scan_event_now);
6136 INIT_DELAYED_WORK(&priv->scan_event_later, ipw2100_scan_event_later);
6138 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
6139 ipw2100_irq_tasklet, (unsigned long)priv);
6141 /* NOTE: We do not start the deferred work for status checks yet */
6142 priv->stop_rf_kill = 1;
6143 priv->stop_hang_check = 1;
6148 static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6149 const struct pci_device_id *ent)
6151 unsigned long mem_start, mem_len, mem_flags;
6152 void __iomem *base_addr = NULL;
6153 struct net_device *dev = NULL;
6154 struct ipw2100_priv *priv = NULL;
6159 IPW_DEBUG_INFO("enter\n");
6161 mem_start = pci_resource_start(pci_dev, 0);
6162 mem_len = pci_resource_len(pci_dev, 0);
6163 mem_flags = pci_resource_flags(pci_dev, 0);
6165 if ((mem_flags & IORESOURCE_MEM) != IORESOURCE_MEM) {
6166 IPW_DEBUG_INFO("weird - resource type is not memory\n");
6171 base_addr = ioremap_nocache(mem_start, mem_len);
6173 printk(KERN_WARNING DRV_NAME
6174 "Error calling ioremap_nocache.\n");
6179 /* allocate and initialize our net_device */
6180 dev = ipw2100_alloc_device(pci_dev, base_addr, mem_start, mem_len);
6182 printk(KERN_WARNING DRV_NAME
6183 "Error calling ipw2100_alloc_device.\n");
6188 /* set up PCI mappings for device */
6189 err = pci_enable_device(pci_dev);
6191 printk(KERN_WARNING DRV_NAME
6192 "Error calling pci_enable_device.\n");
6196 priv = ieee80211_priv(dev);
6198 pci_set_master(pci_dev);
6199 pci_set_drvdata(pci_dev, priv);
6201 err = pci_set_dma_mask(pci_dev, DMA_32BIT_MASK);
6203 printk(KERN_WARNING DRV_NAME
6204 "Error calling pci_set_dma_mask.\n");
6205 pci_disable_device(pci_dev);
6209 err = pci_request_regions(pci_dev, DRV_NAME);
6211 printk(KERN_WARNING DRV_NAME
6212 "Error calling pci_request_regions.\n");
6213 pci_disable_device(pci_dev);
6217 /* We disable the RETRY_TIMEOUT register (0x41) to keep
6218 * PCI Tx retries from interfering with C3 CPU state */
6219 pci_read_config_dword(pci_dev, 0x40, &val);
6220 if ((val & 0x0000ff00) != 0)
6221 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6223 pci_set_power_state(pci_dev, PCI_D0);
6225 if (!ipw2100_hw_is_adapter_in_system(dev)) {
6226 printk(KERN_WARNING DRV_NAME
6227 "Device not found via register read.\n");
6232 SET_NETDEV_DEV(dev, &pci_dev->dev);
6234 /* Force interrupts to be shut off on the device */
6235 priv->status |= STATUS_INT_ENABLED;
6236 ipw2100_disable_interrupts(priv);
6238 /* Allocate and initialize the Tx/Rx queues and lists */
6239 if (ipw2100_queues_allocate(priv)) {
6240 printk(KERN_WARNING DRV_NAME
6241 "Error calling ipw2100_queues_allocate.\n");
6245 ipw2100_queues_initialize(priv);
6247 err = request_irq(pci_dev->irq,
6248 ipw2100_interrupt, IRQF_SHARED, dev->name, priv);
6250 printk(KERN_WARNING DRV_NAME
6251 "Error calling request_irq: %d.\n", pci_dev->irq);
6254 dev->irq = pci_dev->irq;
6256 IPW_DEBUG_INFO("Attempting to register device...\n");
6258 printk(KERN_INFO DRV_NAME
6259 ": Detected Intel PRO/Wireless 2100 Network Connection\n");
6261 /* Bring up the interface. Pre 0.46, after we registered the
6262 * network device we would call ipw2100_up. This introduced a race
6263 * condition with newer hotplug configurations (network was coming
6264 * up and making calls before the device was initialized).
6266 * If we called ipw2100_up before we registered the device, then the
6267 * device name wasn't registered. So, we instead use the net_dev->init
6268 * member to call a function that then just turns and calls ipw2100_up.
6269 * net_dev->init is called after name allocation but before the
6270 * notifier chain is called */
6271 err = register_netdev(dev);
6273 printk(KERN_WARNING DRV_NAME
6274 "Error calling register_netdev.\n");
6278 mutex_lock(&priv->action_mutex);
6281 IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev));
6283 /* perform this after register_netdev so that dev->name is set */
6284 err = sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6288 /* If the RF Kill switch is disabled, go ahead and complete the
6289 * startup sequence */
6290 if (!(priv->status & STATUS_RF_KILL_MASK)) {
6291 /* Enable the adapter - sends HOST_COMPLETE */
6292 if (ipw2100_enable_adapter(priv)) {
6293 printk(KERN_WARNING DRV_NAME
6294 ": %s: failed in call to enable adapter.\n",
6295 priv->net_dev->name);
6296 ipw2100_hw_stop_adapter(priv);
6301 /* Start a scan . . . */
6302 ipw2100_set_scan_options(priv);
6303 ipw2100_start_scan(priv);
6306 IPW_DEBUG_INFO("exit\n");
6308 priv->status |= STATUS_INITIALIZED;
6310 mutex_unlock(&priv->action_mutex);
6315 mutex_unlock(&priv->action_mutex);
6320 unregister_netdev(dev);
6322 ipw2100_hw_stop_adapter(priv);
6324 ipw2100_disable_interrupts(priv);
6327 free_irq(dev->irq, priv);
6329 ipw2100_kill_workqueue(priv);
6331 /* These are safe to call even if they weren't allocated */
6332 ipw2100_queues_free(priv);
6333 sysfs_remove_group(&pci_dev->dev.kobj,
6334 &ipw2100_attribute_group);
6336 free_ieee80211(dev);
6337 pci_set_drvdata(pci_dev, NULL);
6343 pci_release_regions(pci_dev);
6344 pci_disable_device(pci_dev);
6349 static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6351 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6352 struct net_device *dev;
6355 mutex_lock(&priv->action_mutex);
6357 priv->status &= ~STATUS_INITIALIZED;
6359 dev = priv->net_dev;
6360 sysfs_remove_group(&pci_dev->dev.kobj,
6361 &ipw2100_attribute_group);
6364 if (ipw2100_firmware.version)
6365 ipw2100_release_firmware(priv, &ipw2100_firmware);
6367 /* Take down the hardware */
6370 /* Release the mutex so that the network subsystem can
6371 * complete any needed calls into the driver... */
6372 mutex_unlock(&priv->action_mutex);
6374 /* Unregister the device first - this results in close()
6375 * being called if the device is open. If we free storage
6376 * first, then close() will crash. */
6377 unregister_netdev(dev);
6379 /* ipw2100_down will ensure that there is no more pending work
6380 * in the workqueue's, so we can safely remove them now. */
6381 ipw2100_kill_workqueue(priv);
6383 ipw2100_queues_free(priv);
6385 /* Free potential debugging firmware snapshot */
6386 ipw2100_snapshot_free(priv);
6389 free_irq(dev->irq, priv);
6392 iounmap((void __iomem *)dev->base_addr);
6394 free_ieee80211(dev);
6397 pci_release_regions(pci_dev);
6398 pci_disable_device(pci_dev);
6400 IPW_DEBUG_INFO("exit\n");
6404 static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6406 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6407 struct net_device *dev = priv->net_dev;
6409 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name);
6411 mutex_lock(&priv->action_mutex);
6412 if (priv->status & STATUS_INITIALIZED) {
6413 /* Take down the device; powers it off, etc. */
6417 /* Remove the PRESENT state of the device */
6418 netif_device_detach(dev);
6420 pci_save_state(pci_dev);
6421 pci_disable_device(pci_dev);
6422 pci_set_power_state(pci_dev, PCI_D3hot);
6424 priv->suspend_at = get_seconds();
6426 mutex_unlock(&priv->action_mutex);
6431 static int ipw2100_resume(struct pci_dev *pci_dev)
6433 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6434 struct net_device *dev = priv->net_dev;
6438 if (IPW2100_PM_DISABLED)
6441 mutex_lock(&priv->action_mutex);
6443 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name);
6445 pci_set_power_state(pci_dev, PCI_D0);
6446 err = pci_enable_device(pci_dev);
6448 printk(KERN_ERR "%s: pci_enable_device failed on resume\n",
6450 mutex_unlock(&priv->action_mutex);
6453 pci_restore_state(pci_dev);
6456 * Suspend/Resume resets the PCI configuration space, so we have to
6457 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
6458 * from interfering with C3 CPU state. pci_restore_state won't help
6459 * here since it only restores the first 64 bytes pci config header.
6461 pci_read_config_dword(pci_dev, 0x40, &val);
6462 if ((val & 0x0000ff00) != 0)
6463 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6465 /* Set the device back into the PRESENT state; this will also wake
6466 * the queue of needed */
6467 netif_device_attach(dev);
6469 priv->suspend_time = get_seconds() - priv->suspend_at;
6471 /* Bring the device back up */
6472 if (!(priv->status & STATUS_RF_KILL_SW))
6473 ipw2100_up(priv, 0);
6475 mutex_unlock(&priv->action_mutex);
6481 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
6483 static struct pci_device_id ipw2100_pci_id_table[] __devinitdata = {
6484 IPW2100_DEV_ID(0x2520), /* IN 2100A mPCI 3A */
6485 IPW2100_DEV_ID(0x2521), /* IN 2100A mPCI 3B */
6486 IPW2100_DEV_ID(0x2524), /* IN 2100A mPCI 3B */
6487 IPW2100_DEV_ID(0x2525), /* IN 2100A mPCI 3B */
6488 IPW2100_DEV_ID(0x2526), /* IN 2100A mPCI Gen A3 */
6489 IPW2100_DEV_ID(0x2522), /* IN 2100 mPCI 3B */
6490 IPW2100_DEV_ID(0x2523), /* IN 2100 mPCI 3A */
6491 IPW2100_DEV_ID(0x2527), /* IN 2100 mPCI 3B */
6492 IPW2100_DEV_ID(0x2528), /* IN 2100 mPCI 3B */
6493 IPW2100_DEV_ID(0x2529), /* IN 2100 mPCI 3B */
6494 IPW2100_DEV_ID(0x252B), /* IN 2100 mPCI 3A */
6495 IPW2100_DEV_ID(0x252C), /* IN 2100 mPCI 3A */
6496 IPW2100_DEV_ID(0x252D), /* IN 2100 mPCI 3A */
6498 IPW2100_DEV_ID(0x2550), /* IB 2100A mPCI 3B */
6499 IPW2100_DEV_ID(0x2551), /* IB 2100 mPCI 3B */
6500 IPW2100_DEV_ID(0x2553), /* IB 2100 mPCI 3B */
6501 IPW2100_DEV_ID(0x2554), /* IB 2100 mPCI 3B */
6502 IPW2100_DEV_ID(0x2555), /* IB 2100 mPCI 3B */
6504 IPW2100_DEV_ID(0x2560), /* DE 2100A mPCI 3A */
6505 IPW2100_DEV_ID(0x2562), /* DE 2100A mPCI 3A */
6506 IPW2100_DEV_ID(0x2563), /* DE 2100A mPCI 3A */
6507 IPW2100_DEV_ID(0x2561), /* DE 2100 mPCI 3A */
6508 IPW2100_DEV_ID(0x2565), /* DE 2100 mPCI 3A */
6509 IPW2100_DEV_ID(0x2566), /* DE 2100 mPCI 3A */
6510 IPW2100_DEV_ID(0x2567), /* DE 2100 mPCI 3A */
6512 IPW2100_DEV_ID(0x2570), /* GA 2100 mPCI 3B */
6514 IPW2100_DEV_ID(0x2580), /* TO 2100A mPCI 3B */
6515 IPW2100_DEV_ID(0x2582), /* TO 2100A mPCI 3B */
6516 IPW2100_DEV_ID(0x2583), /* TO 2100A mPCI 3B */
6517 IPW2100_DEV_ID(0x2581), /* TO 2100 mPCI 3B */
6518 IPW2100_DEV_ID(0x2585), /* TO 2100 mPCI 3B */
6519 IPW2100_DEV_ID(0x2586), /* TO 2100 mPCI 3B */
6520 IPW2100_DEV_ID(0x2587), /* TO 2100 mPCI 3B */
6522 IPW2100_DEV_ID(0x2590), /* SO 2100A mPCI 3B */
6523 IPW2100_DEV_ID(0x2592), /* SO 2100A mPCI 3B */
6524 IPW2100_DEV_ID(0x2591), /* SO 2100 mPCI 3B */
6525 IPW2100_DEV_ID(0x2593), /* SO 2100 mPCI 3B */
6526 IPW2100_DEV_ID(0x2596), /* SO 2100 mPCI 3B */
6527 IPW2100_DEV_ID(0x2598), /* SO 2100 mPCI 3B */
6529 IPW2100_DEV_ID(0x25A0), /* HP 2100 mPCI 3B */
6533 MODULE_DEVICE_TABLE(pci, ipw2100_pci_id_table);
6535 static struct pci_driver ipw2100_pci_driver = {
6537 .id_table = ipw2100_pci_id_table,
6538 .probe = ipw2100_pci_init_one,
6539 .remove = __devexit_p(ipw2100_pci_remove_one),
6541 .suspend = ipw2100_suspend,
6542 .resume = ipw2100_resume,
6547 * Initialize the ipw2100 driver/module
6549 * @returns 0 if ok, < 0 errno node con error.
6551 * Note: we cannot init the /proc stuff until the PCI driver is there,
6552 * or we risk an unlikely race condition on someone accessing
6553 * uninitialized data in the PCI dev struct through /proc.
6555 static int __init ipw2100_init(void)
6559 printk(KERN_INFO DRV_NAME ": %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
6560 printk(KERN_INFO DRV_NAME ": %s\n", DRV_COPYRIGHT);
6562 ret = pci_register_driver(&ipw2100_pci_driver);
6566 pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100",
6567 PM_QOS_DEFAULT_VALUE);
6568 #ifdef CONFIG_IPW2100_DEBUG
6569 ipw2100_debug_level = debug;
6570 ret = driver_create_file(&ipw2100_pci_driver.driver,
6571 &driver_attr_debug_level);
6579 * Cleanup ipw2100 driver registration
6581 static void __exit ipw2100_exit(void)
6583 /* FIXME: IPG: check that we have no instances of the devices open */
6584 #ifdef CONFIG_IPW2100_DEBUG
6585 driver_remove_file(&ipw2100_pci_driver.driver,
6586 &driver_attr_debug_level);
6588 pci_unregister_driver(&ipw2100_pci_driver);
6589 pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100");
6592 module_init(ipw2100_init);
6593 module_exit(ipw2100_exit);
6595 #define WEXT_USECHANNELS 1
6597 static const long ipw2100_frequencies[] = {
6598 2412, 2417, 2422, 2427,
6599 2432, 2437, 2442, 2447,
6600 2452, 2457, 2462, 2467,
6604 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
6606 static const long ipw2100_rates_11b[] = {
6613 #define RATE_COUNT ARRAY_SIZE(ipw2100_rates_11b)
6615 static int ipw2100_wx_get_name(struct net_device *dev,
6616 struct iw_request_info *info,
6617 union iwreq_data *wrqu, char *extra)
6620 * This can be called at any time. No action lock required
6623 struct ipw2100_priv *priv = ieee80211_priv(dev);
6624 if (!(priv->status & STATUS_ASSOCIATED))
6625 strcpy(wrqu->name, "unassociated");
6627 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b");
6629 IPW_DEBUG_WX("Name: %s\n", wrqu->name);
6633 static int ipw2100_wx_set_freq(struct net_device *dev,
6634 struct iw_request_info *info,
6635 union iwreq_data *wrqu, char *extra)
6637 struct ipw2100_priv *priv = ieee80211_priv(dev);
6638 struct iw_freq *fwrq = &wrqu->freq;
6641 if (priv->ieee->iw_mode == IW_MODE_INFRA)
6644 mutex_lock(&priv->action_mutex);
6645 if (!(priv->status & STATUS_INITIALIZED)) {
6650 /* if setting by freq convert to channel */
6652 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) {
6653 int f = fwrq->m / 100000;
6656 while ((c < REG_MAX_CHANNEL) &&
6657 (f != ipw2100_frequencies[c]))
6660 /* hack to fall through */
6666 if (fwrq->e > 0 || fwrq->m > 1000) {
6669 } else { /* Set the channel */
6670 IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m);
6671 err = ipw2100_set_channel(priv, fwrq->m, 0);
6675 mutex_unlock(&priv->action_mutex);
6679 static int ipw2100_wx_get_freq(struct net_device *dev,
6680 struct iw_request_info *info,
6681 union iwreq_data *wrqu, char *extra)
6684 * This can be called at any time. No action lock required
6687 struct ipw2100_priv *priv = ieee80211_priv(dev);
6691 /* If we are associated, trying to associate, or have a statically
6692 * configured CHANNEL then return that; otherwise return ANY */
6693 if (priv->config & CFG_STATIC_CHANNEL ||
6694 priv->status & STATUS_ASSOCIATED)
6695 wrqu->freq.m = priv->channel;
6699 IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel);
6704 static int ipw2100_wx_set_mode(struct net_device *dev,
6705 struct iw_request_info *info,
6706 union iwreq_data *wrqu, char *extra)
6708 struct ipw2100_priv *priv = ieee80211_priv(dev);
6711 IPW_DEBUG_WX("SET Mode -> %d \n", wrqu->mode);
6713 if (wrqu->mode == priv->ieee->iw_mode)
6716 mutex_lock(&priv->action_mutex);
6717 if (!(priv->status & STATUS_INITIALIZED)) {
6722 switch (wrqu->mode) {
6723 #ifdef CONFIG_IPW2100_MONITOR
6724 case IW_MODE_MONITOR:
6725 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
6727 #endif /* CONFIG_IPW2100_MONITOR */
6729 err = ipw2100_switch_mode(priv, IW_MODE_ADHOC);
6734 err = ipw2100_switch_mode(priv, IW_MODE_INFRA);
6739 mutex_unlock(&priv->action_mutex);
6743 static int ipw2100_wx_get_mode(struct net_device *dev,
6744 struct iw_request_info *info,
6745 union iwreq_data *wrqu, char *extra)
6748 * This can be called at any time. No action lock required
6751 struct ipw2100_priv *priv = ieee80211_priv(dev);
6753 wrqu->mode = priv->ieee->iw_mode;
6754 IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode);
6759 #define POWER_MODES 5
6761 /* Values are in microsecond */
6762 static const s32 timeout_duration[POWER_MODES] = {
6770 static const s32 period_duration[POWER_MODES] = {
6778 static int ipw2100_wx_get_range(struct net_device *dev,
6779 struct iw_request_info *info,
6780 union iwreq_data *wrqu, char *extra)
6783 * This can be called at any time. No action lock required
6786 struct ipw2100_priv *priv = ieee80211_priv(dev);
6787 struct iw_range *range = (struct iw_range *)extra;
6791 wrqu->data.length = sizeof(*range);
6792 memset(range, 0, sizeof(*range));
6794 /* Let's try to keep this struct in the same order as in
6795 * linux/include/wireless.h
6798 /* TODO: See what values we can set, and remove the ones we can't
6799 * set, or fill them with some default data.
6802 /* ~5 Mb/s real (802.11b) */
6803 range->throughput = 5 * 1000 * 1000;
6805 // range->sensitivity; /* signal level threshold range */
6807 range->max_qual.qual = 100;
6808 /* TODO: Find real max RSSI and stick here */
6809 range->max_qual.level = 0;
6810 range->max_qual.noise = 0;
6811 range->max_qual.updated = 7; /* Updated all three */
6813 range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */
6814 /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
6815 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM;
6816 range->avg_qual.noise = 0;
6817 range->avg_qual.updated = 7; /* Updated all three */
6819 range->num_bitrates = RATE_COUNT;
6821 for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
6822 range->bitrate[i] = ipw2100_rates_11b[i];
6825 range->min_rts = MIN_RTS_THRESHOLD;
6826 range->max_rts = MAX_RTS_THRESHOLD;
6827 range->min_frag = MIN_FRAG_THRESHOLD;
6828 range->max_frag = MAX_FRAG_THRESHOLD;
6830 range->min_pmp = period_duration[0]; /* Minimal PM period */
6831 range->max_pmp = period_duration[POWER_MODES - 1]; /* Maximal PM period */
6832 range->min_pmt = timeout_duration[POWER_MODES - 1]; /* Minimal PM timeout */
6833 range->max_pmt = timeout_duration[0]; /* Maximal PM timeout */
6835 /* How to decode max/min PM period */
6836 range->pmp_flags = IW_POWER_PERIOD;
6837 /* How to decode max/min PM period */
6838 range->pmt_flags = IW_POWER_TIMEOUT;
6839 /* What PM options are supported */
6840 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD;
6842 range->encoding_size[0] = 5;
6843 range->encoding_size[1] = 13; /* Different token sizes */
6844 range->num_encoding_sizes = 2; /* Number of entry in the list */
6845 range->max_encoding_tokens = WEP_KEYS; /* Max number of tokens */
6846 // range->encoding_login_index; /* token index for login token */
6848 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
6849 range->txpower_capa = IW_TXPOW_DBM;
6850 range->num_txpower = IW_MAX_TXPOWER;
6851 for (i = 0, level = (IPW_TX_POWER_MAX_DBM * 16);
6854 ((IPW_TX_POWER_MAX_DBM -
6855 IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1))
6856 range->txpower[i] = level / 16;
6858 range->txpower_capa = 0;
6859 range->num_txpower = 0;
6862 /* Set the Wireless Extension versions */
6863 range->we_version_compiled = WIRELESS_EXT;
6864 range->we_version_source = 18;
6866 // range->retry_capa; /* What retry options are supported */
6867 // range->retry_flags; /* How to decode max/min retry limit */
6868 // range->r_time_flags; /* How to decode max/min retry life */
6869 // range->min_retry; /* Minimal number of retries */
6870 // range->max_retry; /* Maximal number of retries */
6871 // range->min_r_time; /* Minimal retry lifetime */
6872 // range->max_r_time; /* Maximal retry lifetime */
6874 range->num_channels = FREQ_COUNT;
6877 for (i = 0; i < FREQ_COUNT; i++) {
6878 // TODO: Include only legal frequencies for some countries
6879 // if (local->channel_mask & (1 << i)) {
6880 range->freq[val].i = i + 1;
6881 range->freq[val].m = ipw2100_frequencies[i] * 100000;
6882 range->freq[val].e = 1;
6885 if (val == IW_MAX_FREQUENCIES)
6888 range->num_frequency = val;
6890 /* Event capability (kernel + driver) */
6891 range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
6892 IW_EVENT_CAPA_MASK(SIOCGIWAP));
6893 range->event_capa[1] = IW_EVENT_CAPA_K_1;
6895 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
6896 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
6898 IPW_DEBUG_WX("GET Range\n");
6903 static int ipw2100_wx_set_wap(struct net_device *dev,
6904 struct iw_request_info *info,
6905 union iwreq_data *wrqu, char *extra)
6907 struct ipw2100_priv *priv = ieee80211_priv(dev);
6910 static const unsigned char any[] = {
6911 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
6913 static const unsigned char off[] = {
6914 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
6918 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
6921 mutex_lock(&priv->action_mutex);
6922 if (!(priv->status & STATUS_INITIALIZED)) {
6927 if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) ||
6928 !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) {
6929 /* we disable mandatory BSSID association */
6930 IPW_DEBUG_WX("exit - disable mandatory BSSID\n");
6931 priv->config &= ~CFG_STATIC_BSSID;
6932 err = ipw2100_set_mandatory_bssid(priv, NULL, 0);
6936 priv->config |= CFG_STATIC_BSSID;
6937 memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN);
6939 err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0);
6941 IPW_DEBUG_WX("SET BSSID -> %pM\n", wrqu->ap_addr.sa_data);
6944 mutex_unlock(&priv->action_mutex);
6948 static int ipw2100_wx_get_wap(struct net_device *dev,
6949 struct iw_request_info *info,
6950 union iwreq_data *wrqu, char *extra)
6953 * This can be called at any time. No action lock required
6956 struct ipw2100_priv *priv = ieee80211_priv(dev);
6958 /* If we are associated, trying to associate, or have a statically
6959 * configured BSSID then return that; otherwise return ANY */
6960 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) {
6961 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
6962 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
6964 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
6966 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data);
6970 static int ipw2100_wx_set_essid(struct net_device *dev,
6971 struct iw_request_info *info,
6972 union iwreq_data *wrqu, char *extra)
6974 struct ipw2100_priv *priv = ieee80211_priv(dev);
6975 char *essid = ""; /* ANY */
6978 DECLARE_SSID_BUF(ssid);
6980 mutex_lock(&priv->action_mutex);
6981 if (!(priv->status & STATUS_INITIALIZED)) {
6986 if (wrqu->essid.flags && wrqu->essid.length) {
6987 length = wrqu->essid.length;
6992 IPW_DEBUG_WX("Setting ESSID to ANY\n");
6993 priv->config &= ~CFG_STATIC_ESSID;
6994 err = ipw2100_set_essid(priv, NULL, 0, 0);
6998 length = min(length, IW_ESSID_MAX_SIZE);
7000 priv->config |= CFG_STATIC_ESSID;
7002 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) {
7003 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
7008 IPW_DEBUG_WX("Setting ESSID: '%s' (%d)\n",
7009 print_ssid(ssid, essid, length), length);
7011 priv->essid_len = length;
7012 memcpy(priv->essid, essid, priv->essid_len);
7014 err = ipw2100_set_essid(priv, essid, length, 0);
7017 mutex_unlock(&priv->action_mutex);
7021 static int ipw2100_wx_get_essid(struct net_device *dev,
7022 struct iw_request_info *info,
7023 union iwreq_data *wrqu, char *extra)
7026 * This can be called at any time. No action lock required
7029 struct ipw2100_priv *priv = ieee80211_priv(dev);
7030 DECLARE_SSID_BUF(ssid);
7032 /* If we are associated, trying to associate, or have a statically
7033 * configured ESSID then return that; otherwise return ANY */
7034 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) {
7035 IPW_DEBUG_WX("Getting essid: '%s'\n",
7036 print_ssid(ssid, priv->essid, priv->essid_len));
7037 memcpy(extra, priv->essid, priv->essid_len);
7038 wrqu->essid.length = priv->essid_len;
7039 wrqu->essid.flags = 1; /* active */
7041 IPW_DEBUG_WX("Getting essid: ANY\n");
7042 wrqu->essid.length = 0;
7043 wrqu->essid.flags = 0; /* active */
7049 static int ipw2100_wx_set_nick(struct net_device *dev,
7050 struct iw_request_info *info,
7051 union iwreq_data *wrqu, char *extra)
7054 * This can be called at any time. No action lock required
7057 struct ipw2100_priv *priv = ieee80211_priv(dev);
7059 if (wrqu->data.length > IW_ESSID_MAX_SIZE)
7062 wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
7063 memset(priv->nick, 0, sizeof(priv->nick));
7064 memcpy(priv->nick, extra, wrqu->data.length);
7066 IPW_DEBUG_WX("SET Nickname -> %s \n", priv->nick);
7071 static int ipw2100_wx_get_nick(struct net_device *dev,
7072 struct iw_request_info *info,
7073 union iwreq_data *wrqu, char *extra)
7076 * This can be called at any time. No action lock required
7079 struct ipw2100_priv *priv = ieee80211_priv(dev);
7081 wrqu->data.length = strlen(priv->nick);
7082 memcpy(extra, priv->nick, wrqu->data.length);
7083 wrqu->data.flags = 1; /* active */
7085 IPW_DEBUG_WX("GET Nickname -> %s \n", extra);
7090 static int ipw2100_wx_set_rate(struct net_device *dev,
7091 struct iw_request_info *info,
7092 union iwreq_data *wrqu, char *extra)
7094 struct ipw2100_priv *priv = ieee80211_priv(dev);
7095 u32 target_rate = wrqu->bitrate.value;
7099 mutex_lock(&priv->action_mutex);
7100 if (!(priv->status & STATUS_INITIALIZED)) {
7107 if (target_rate == 1000000 ||
7108 (!wrqu->bitrate.fixed && target_rate > 1000000))
7109 rate |= TX_RATE_1_MBIT;
7110 if (target_rate == 2000000 ||
7111 (!wrqu->bitrate.fixed && target_rate > 2000000))
7112 rate |= TX_RATE_2_MBIT;
7113 if (target_rate == 5500000 ||
7114 (!wrqu->bitrate.fixed && target_rate > 5500000))
7115 rate |= TX_RATE_5_5_MBIT;
7116 if (target_rate == 11000000 ||
7117 (!wrqu->bitrate.fixed && target_rate > 11000000))
7118 rate |= TX_RATE_11_MBIT;
7120 rate = DEFAULT_TX_RATES;
7122 err = ipw2100_set_tx_rates(priv, rate, 0);
7124 IPW_DEBUG_WX("SET Rate -> %04X \n", rate);
7126 mutex_unlock(&priv->action_mutex);
7130 static int ipw2100_wx_get_rate(struct net_device *dev,
7131 struct iw_request_info *info,
7132 union iwreq_data *wrqu, char *extra)
7134 struct ipw2100_priv *priv = ieee80211_priv(dev);
7136 unsigned int len = sizeof(val);
7139 if (!(priv->status & STATUS_ENABLED) ||
7140 priv->status & STATUS_RF_KILL_MASK ||
7141 !(priv->status & STATUS_ASSOCIATED)) {
7142 wrqu->bitrate.value = 0;
7146 mutex_lock(&priv->action_mutex);
7147 if (!(priv->status & STATUS_INITIALIZED)) {
7152 err = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &val, &len);
7154 IPW_DEBUG_WX("failed querying ordinals.\n");
7158 switch (val & TX_RATE_MASK) {
7159 case TX_RATE_1_MBIT:
7160 wrqu->bitrate.value = 1000000;
7162 case TX_RATE_2_MBIT:
7163 wrqu->bitrate.value = 2000000;
7165 case TX_RATE_5_5_MBIT:
7166 wrqu->bitrate.value = 5500000;
7168 case TX_RATE_11_MBIT:
7169 wrqu->bitrate.value = 11000000;
7172 wrqu->bitrate.value = 0;
7175 IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value);
7178 mutex_unlock(&priv->action_mutex);
7182 static int ipw2100_wx_set_rts(struct net_device *dev,
7183 struct iw_request_info *info,
7184 union iwreq_data *wrqu, char *extra)
7186 struct ipw2100_priv *priv = ieee80211_priv(dev);
7189 /* Auto RTS not yet supported */
7190 if (wrqu->rts.fixed == 0)
7193 mutex_lock(&priv->action_mutex);
7194 if (!(priv->status & STATUS_INITIALIZED)) {
7199 if (wrqu->rts.disabled)
7200 value = priv->rts_threshold | RTS_DISABLED;
7202 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) {
7206 value = wrqu->rts.value;
7209 err = ipw2100_set_rts_threshold(priv, value);
7211 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value);
7213 mutex_unlock(&priv->action_mutex);
7217 static int ipw2100_wx_get_rts(struct net_device *dev,
7218 struct iw_request_info *info,
7219 union iwreq_data *wrqu, char *extra)
7222 * This can be called at any time. No action lock required
7225 struct ipw2100_priv *priv = ieee80211_priv(dev);
7227 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED;
7228 wrqu->rts.fixed = 1; /* no auto select */
7230 /* If RTS is set to the default value, then it is disabled */
7231 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0;
7233 IPW_DEBUG_WX("GET RTS Threshold -> 0x%08X \n", wrqu->rts.value);
7238 static int ipw2100_wx_set_txpow(struct net_device *dev,
7239 struct iw_request_info *info,
7240 union iwreq_data *wrqu, char *extra)
7242 struct ipw2100_priv *priv = ieee80211_priv(dev);
7245 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled))
7246 return -EINPROGRESS;
7248 if (priv->ieee->iw_mode != IW_MODE_ADHOC)
7251 if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
7254 if (wrqu->txpower.fixed == 0)
7255 value = IPW_TX_POWER_DEFAULT;
7257 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
7258 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM)
7261 value = wrqu->txpower.value;
7264 mutex_lock(&priv->action_mutex);
7265 if (!(priv->status & STATUS_INITIALIZED)) {
7270 err = ipw2100_set_tx_power(priv, value);
7272 IPW_DEBUG_WX("SET TX Power -> %d \n", value);
7275 mutex_unlock(&priv->action_mutex);
7279 static int ipw2100_wx_get_txpow(struct net_device *dev,
7280 struct iw_request_info *info,
7281 union iwreq_data *wrqu, char *extra)
7284 * This can be called at any time. No action lock required
7287 struct ipw2100_priv *priv = ieee80211_priv(dev);
7289 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
7291 if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
7292 wrqu->txpower.fixed = 0;
7293 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM;
7295 wrqu->txpower.fixed = 1;
7296 wrqu->txpower.value = priv->tx_power;
7299 wrqu->txpower.flags = IW_TXPOW_DBM;
7301 IPW_DEBUG_WX("GET TX Power -> %d \n", wrqu->txpower.value);
7306 static int ipw2100_wx_set_frag(struct net_device *dev,
7307 struct iw_request_info *info,
7308 union iwreq_data *wrqu, char *extra)
7311 * This can be called at any time. No action lock required
7314 struct ipw2100_priv *priv = ieee80211_priv(dev);
7316 if (!wrqu->frag.fixed)
7319 if (wrqu->frag.disabled) {
7320 priv->frag_threshold |= FRAG_DISABLED;
7321 priv->ieee->fts = DEFAULT_FTS;
7323 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
7324 wrqu->frag.value > MAX_FRAG_THRESHOLD)
7327 priv->ieee->fts = wrqu->frag.value & ~0x1;
7328 priv->frag_threshold = priv->ieee->fts;
7331 IPW_DEBUG_WX("SET Frag Threshold -> %d \n", priv->ieee->fts);
7336 static int ipw2100_wx_get_frag(struct net_device *dev,
7337 struct iw_request_info *info,
7338 union iwreq_data *wrqu, char *extra)
7341 * This can be called at any time. No action lock required
7344 struct ipw2100_priv *priv = ieee80211_priv(dev);
7345 wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED;
7346 wrqu->frag.fixed = 0; /* no auto select */
7347 wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0;
7349 IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value);
7354 static int ipw2100_wx_set_retry(struct net_device *dev,
7355 struct iw_request_info *info,
7356 union iwreq_data *wrqu, char *extra)
7358 struct ipw2100_priv *priv = ieee80211_priv(dev);
7361 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
7364 if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
7367 mutex_lock(&priv->action_mutex);
7368 if (!(priv->status & STATUS_INITIALIZED)) {
7373 if (wrqu->retry.flags & IW_RETRY_SHORT) {
7374 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7375 IPW_DEBUG_WX("SET Short Retry Limit -> %d \n",
7380 if (wrqu->retry.flags & IW_RETRY_LONG) {
7381 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7382 IPW_DEBUG_WX("SET Long Retry Limit -> %d \n",
7387 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7389 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7391 IPW_DEBUG_WX("SET Both Retry Limits -> %d \n", wrqu->retry.value);
7394 mutex_unlock(&priv->action_mutex);
7398 static int ipw2100_wx_get_retry(struct net_device *dev,
7399 struct iw_request_info *info,
7400 union iwreq_data *wrqu, char *extra)
7403 * This can be called at any time. No action lock required
7406 struct ipw2100_priv *priv = ieee80211_priv(dev);
7408 wrqu->retry.disabled = 0; /* can't be disabled */
7410 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME)
7413 if (wrqu->retry.flags & IW_RETRY_LONG) {
7414 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
7415 wrqu->retry.value = priv->long_retry_limit;
7418 (priv->short_retry_limit !=
7419 priv->long_retry_limit) ?
7420 IW_RETRY_LIMIT | IW_RETRY_SHORT : IW_RETRY_LIMIT;
7422 wrqu->retry.value = priv->short_retry_limit;
7425 IPW_DEBUG_WX("GET Retry -> %d \n", wrqu->retry.value);
7430 static int ipw2100_wx_set_scan(struct net_device *dev,
7431 struct iw_request_info *info,
7432 union iwreq_data *wrqu, char *extra)
7434 struct ipw2100_priv *priv = ieee80211_priv(dev);
7437 mutex_lock(&priv->action_mutex);
7438 if (!(priv->status & STATUS_INITIALIZED)) {
7443 IPW_DEBUG_WX("Initiating scan...\n");
7445 priv->user_requested_scan = 1;
7446 if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) {
7447 IPW_DEBUG_WX("Start scan failed.\n");
7449 /* TODO: Mark a scan as pending so when hardware initialized
7454 mutex_unlock(&priv->action_mutex);
7458 static int ipw2100_wx_get_scan(struct net_device *dev,
7459 struct iw_request_info *info,
7460 union iwreq_data *wrqu, char *extra)
7463 * This can be called at any time. No action lock required
7466 struct ipw2100_priv *priv = ieee80211_priv(dev);
7467 return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra);
7471 * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c
7473 static int ipw2100_wx_set_encode(struct net_device *dev,
7474 struct iw_request_info *info,
7475 union iwreq_data *wrqu, char *key)
7478 * No check of STATUS_INITIALIZED required
7481 struct ipw2100_priv *priv = ieee80211_priv(dev);
7482 return ieee80211_wx_set_encode(priv->ieee, info, wrqu, key);
7485 static int ipw2100_wx_get_encode(struct net_device *dev,
7486 struct iw_request_info *info,
7487 union iwreq_data *wrqu, char *key)
7490 * This can be called at any time. No action lock required
7493 struct ipw2100_priv *priv = ieee80211_priv(dev);
7494 return ieee80211_wx_get_encode(priv->ieee, info, wrqu, key);
7497 static int ipw2100_wx_set_power(struct net_device *dev,
7498 struct iw_request_info *info,
7499 union iwreq_data *wrqu, char *extra)
7501 struct ipw2100_priv *priv = ieee80211_priv(dev);
7504 mutex_lock(&priv->action_mutex);
7505 if (!(priv->status & STATUS_INITIALIZED)) {
7510 if (wrqu->power.disabled) {
7511 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
7512 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
7513 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
7517 switch (wrqu->power.flags & IW_POWER_MODE) {
7518 case IW_POWER_ON: /* If not specified */
7519 case IW_POWER_MODE: /* If set all mask */
7520 case IW_POWER_ALL_R: /* If explicitly state all */
7522 default: /* Otherwise we don't support it */
7523 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
7529 /* If the user hasn't specified a power management mode yet, default
7531 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
7532 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
7534 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
7537 mutex_unlock(&priv->action_mutex);
7542 static int ipw2100_wx_get_power(struct net_device *dev,
7543 struct iw_request_info *info,
7544 union iwreq_data *wrqu, char *extra)
7547 * This can be called at any time. No action lock required
7550 struct ipw2100_priv *priv = ieee80211_priv(dev);
7552 if (!(priv->power_mode & IPW_POWER_ENABLED))
7553 wrqu->power.disabled = 1;
7555 wrqu->power.disabled = 0;
7556 wrqu->power.flags = 0;
7559 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode);
7569 static int ipw2100_wx_set_genie(struct net_device *dev,
7570 struct iw_request_info *info,
7571 union iwreq_data *wrqu, char *extra)
7574 struct ipw2100_priv *priv = ieee80211_priv(dev);
7575 struct ieee80211_device *ieee = priv->ieee;
7578 if (!ieee->wpa_enabled)
7581 if (wrqu->data.length > MAX_WPA_IE_LEN ||
7582 (wrqu->data.length && extra == NULL))
7585 if (wrqu->data.length) {
7586 buf = kmemdup(extra, wrqu->data.length, GFP_KERNEL);
7590 kfree(ieee->wpa_ie);
7592 ieee->wpa_ie_len = wrqu->data.length;
7594 kfree(ieee->wpa_ie);
7595 ieee->wpa_ie = NULL;
7596 ieee->wpa_ie_len = 0;
7599 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
7605 static int ipw2100_wx_get_genie(struct net_device *dev,
7606 struct iw_request_info *info,
7607 union iwreq_data *wrqu, char *extra)
7609 struct ipw2100_priv *priv = ieee80211_priv(dev);
7610 struct ieee80211_device *ieee = priv->ieee;
7612 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
7613 wrqu->data.length = 0;
7617 if (wrqu->data.length < ieee->wpa_ie_len)
7620 wrqu->data.length = ieee->wpa_ie_len;
7621 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
7627 static int ipw2100_wx_set_auth(struct net_device *dev,
7628 struct iw_request_info *info,
7629 union iwreq_data *wrqu, char *extra)
7631 struct ipw2100_priv *priv = ieee80211_priv(dev);
7632 struct ieee80211_device *ieee = priv->ieee;
7633 struct iw_param *param = &wrqu->param;
7634 struct lib80211_crypt_data *crypt;
7635 unsigned long flags;
7638 switch (param->flags & IW_AUTH_INDEX) {
7639 case IW_AUTH_WPA_VERSION:
7640 case IW_AUTH_CIPHER_PAIRWISE:
7641 case IW_AUTH_CIPHER_GROUP:
7642 case IW_AUTH_KEY_MGMT:
7644 * ipw2200 does not use these parameters
7648 case IW_AUTH_TKIP_COUNTERMEASURES:
7649 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7650 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags)
7653 flags = crypt->ops->get_flags(crypt->priv);
7656 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7658 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7660 crypt->ops->set_flags(flags, crypt->priv);
7664 case IW_AUTH_DROP_UNENCRYPTED:{
7667 * wpa_supplicant calls set_wpa_enabled when the driver
7668 * is loaded and unloaded, regardless of if WPA is being
7669 * used. No other calls are made which can be used to
7670 * determine if encryption will be used or not prior to
7671 * association being expected. If encryption is not being
7672 * used, drop_unencrypted is set to false, else true -- we
7673 * can use this to determine if the CAP_PRIVACY_ON bit should
7676 struct ieee80211_security sec = {
7677 .flags = SEC_ENABLED,
7678 .enabled = param->value,
7680 priv->ieee->drop_unencrypted = param->value;
7681 /* We only change SEC_LEVEL for open mode. Others
7682 * are set by ipw_wpa_set_encryption.
7684 if (!param->value) {
7685 sec.flags |= SEC_LEVEL;
7686 sec.level = SEC_LEVEL_0;
7688 sec.flags |= SEC_LEVEL;
7689 sec.level = SEC_LEVEL_1;
7691 if (priv->ieee->set_security)
7692 priv->ieee->set_security(priv->ieee->dev, &sec);
7696 case IW_AUTH_80211_AUTH_ALG:
7697 ret = ipw2100_wpa_set_auth_algs(priv, param->value);
7700 case IW_AUTH_WPA_ENABLED:
7701 ret = ipw2100_wpa_enable(priv, param->value);
7704 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7705 ieee->ieee802_1x = param->value;
7708 //case IW_AUTH_ROAMING_CONTROL:
7709 case IW_AUTH_PRIVACY_INVOKED:
7710 ieee->privacy_invoked = param->value;
7720 static int ipw2100_wx_get_auth(struct net_device *dev,
7721 struct iw_request_info *info,
7722 union iwreq_data *wrqu, char *extra)
7724 struct ipw2100_priv *priv = ieee80211_priv(dev);
7725 struct ieee80211_device *ieee = priv->ieee;
7726 struct lib80211_crypt_data *crypt;
7727 struct iw_param *param = &wrqu->param;
7730 switch (param->flags & IW_AUTH_INDEX) {
7731 case IW_AUTH_WPA_VERSION:
7732 case IW_AUTH_CIPHER_PAIRWISE:
7733 case IW_AUTH_CIPHER_GROUP:
7734 case IW_AUTH_KEY_MGMT:
7736 * wpa_supplicant will control these internally
7741 case IW_AUTH_TKIP_COUNTERMEASURES:
7742 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7743 if (!crypt || !crypt->ops->get_flags) {
7744 IPW_DEBUG_WARNING("Can't get TKIP countermeasures: "
7745 "crypt not set!\n");
7749 param->value = (crypt->ops->get_flags(crypt->priv) &
7750 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
7754 case IW_AUTH_DROP_UNENCRYPTED:
7755 param->value = ieee->drop_unencrypted;
7758 case IW_AUTH_80211_AUTH_ALG:
7759 param->value = priv->ieee->sec.auth_mode;
7762 case IW_AUTH_WPA_ENABLED:
7763 param->value = ieee->wpa_enabled;
7766 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7767 param->value = ieee->ieee802_1x;
7770 case IW_AUTH_ROAMING_CONTROL:
7771 case IW_AUTH_PRIVACY_INVOKED:
7772 param->value = ieee->privacy_invoked;
7781 /* SIOCSIWENCODEEXT */
7782 static int ipw2100_wx_set_encodeext(struct net_device *dev,
7783 struct iw_request_info *info,
7784 union iwreq_data *wrqu, char *extra)
7786 struct ipw2100_priv *priv = ieee80211_priv(dev);
7787 return ieee80211_wx_set_encodeext(priv->ieee, info, wrqu, extra);
7790 /* SIOCGIWENCODEEXT */
7791 static int ipw2100_wx_get_encodeext(struct net_device *dev,
7792 struct iw_request_info *info,
7793 union iwreq_data *wrqu, char *extra)
7795 struct ipw2100_priv *priv = ieee80211_priv(dev);
7796 return ieee80211_wx_get_encodeext(priv->ieee, info, wrqu, extra);
7800 static int ipw2100_wx_set_mlme(struct net_device *dev,
7801 struct iw_request_info *info,
7802 union iwreq_data *wrqu, char *extra)
7804 struct ipw2100_priv *priv = ieee80211_priv(dev);
7805 struct iw_mlme *mlme = (struct iw_mlme *)extra;
7808 reason = cpu_to_le16(mlme->reason_code);
7810 switch (mlme->cmd) {
7811 case IW_MLME_DEAUTH:
7815 case IW_MLME_DISASSOC:
7816 ipw2100_disassociate_bssid(priv);
7830 #ifdef CONFIG_IPW2100_MONITOR
7831 static int ipw2100_wx_set_promisc(struct net_device *dev,
7832 struct iw_request_info *info,
7833 union iwreq_data *wrqu, char *extra)
7835 struct ipw2100_priv *priv = ieee80211_priv(dev);
7836 int *parms = (int *)extra;
7837 int enable = (parms[0] > 0);
7840 mutex_lock(&priv->action_mutex);
7841 if (!(priv->status & STATUS_INITIALIZED)) {
7847 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7848 err = ipw2100_set_channel(priv, parms[1], 0);
7851 priv->channel = parms[1];
7852 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
7854 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
7855 err = ipw2100_switch_mode(priv, priv->last_mode);
7858 mutex_unlock(&priv->action_mutex);
7862 static int ipw2100_wx_reset(struct net_device *dev,
7863 struct iw_request_info *info,
7864 union iwreq_data *wrqu, char *extra)
7866 struct ipw2100_priv *priv = ieee80211_priv(dev);
7867 if (priv->status & STATUS_INITIALIZED)
7868 schedule_reset(priv);
7874 static int ipw2100_wx_set_powermode(struct net_device *dev,
7875 struct iw_request_info *info,
7876 union iwreq_data *wrqu, char *extra)
7878 struct ipw2100_priv *priv = ieee80211_priv(dev);
7879 int err = 0, mode = *(int *)extra;
7881 mutex_lock(&priv->action_mutex);
7882 if (!(priv->status & STATUS_INITIALIZED)) {
7887 if ((mode < 0) || (mode > POWER_MODES))
7888 mode = IPW_POWER_AUTO;
7890 if (IPW_POWER_LEVEL(priv->power_mode) != mode)
7891 err = ipw2100_set_power_mode(priv, mode);
7893 mutex_unlock(&priv->action_mutex);
7897 #define MAX_POWER_STRING 80
7898 static int ipw2100_wx_get_powermode(struct net_device *dev,
7899 struct iw_request_info *info,
7900 union iwreq_data *wrqu, char *extra)
7903 * This can be called at any time. No action lock required
7906 struct ipw2100_priv *priv = ieee80211_priv(dev);
7907 int level = IPW_POWER_LEVEL(priv->power_mode);
7908 s32 timeout, period;
7910 if (!(priv->power_mode & IPW_POWER_ENABLED)) {
7911 snprintf(extra, MAX_POWER_STRING,
7912 "Power save level: %d (Off)", level);
7915 case IPW_POWER_MODE_CAM:
7916 snprintf(extra, MAX_POWER_STRING,
7917 "Power save level: %d (None)", level);
7919 case IPW_POWER_AUTO:
7920 snprintf(extra, MAX_POWER_STRING,
7921 "Power save level: %d (Auto)", level);
7924 timeout = timeout_duration[level - 1] / 1000;
7925 period = period_duration[level - 1] / 1000;
7926 snprintf(extra, MAX_POWER_STRING,
7927 "Power save level: %d "
7928 "(Timeout %dms, Period %dms)",
7929 level, timeout, period);
7933 wrqu->data.length = strlen(extra) + 1;
7938 static int ipw2100_wx_set_preamble(struct net_device *dev,
7939 struct iw_request_info *info,
7940 union iwreq_data *wrqu, char *extra)
7942 struct ipw2100_priv *priv = ieee80211_priv(dev);
7943 int err, mode = *(int *)extra;
7945 mutex_lock(&priv->action_mutex);
7946 if (!(priv->status & STATUS_INITIALIZED)) {
7952 priv->config |= CFG_LONG_PREAMBLE;
7954 priv->config &= ~CFG_LONG_PREAMBLE;
7960 err = ipw2100_system_config(priv, 0);
7963 mutex_unlock(&priv->action_mutex);
7967 static int ipw2100_wx_get_preamble(struct net_device *dev,
7968 struct iw_request_info *info,
7969 union iwreq_data *wrqu, char *extra)
7972 * This can be called at any time. No action lock required
7975 struct ipw2100_priv *priv = ieee80211_priv(dev);
7977 if (priv->config & CFG_LONG_PREAMBLE)
7978 snprintf(wrqu->name, IFNAMSIZ, "long (1)");
7980 snprintf(wrqu->name, IFNAMSIZ, "auto (0)");
7985 #ifdef CONFIG_IPW2100_MONITOR
7986 static int ipw2100_wx_set_crc_check(struct net_device *dev,
7987 struct iw_request_info *info,
7988 union iwreq_data *wrqu, char *extra)
7990 struct ipw2100_priv *priv = ieee80211_priv(dev);
7991 int err, mode = *(int *)extra;
7993 mutex_lock(&priv->action_mutex);
7994 if (!(priv->status & STATUS_INITIALIZED)) {
8000 priv->config |= CFG_CRC_CHECK;
8002 priv->config &= ~CFG_CRC_CHECK;
8010 mutex_unlock(&priv->action_mutex);
8014 static int ipw2100_wx_get_crc_check(struct net_device *dev,
8015 struct iw_request_info *info,
8016 union iwreq_data *wrqu, char *extra)
8019 * This can be called at any time. No action lock required
8022 struct ipw2100_priv *priv = ieee80211_priv(dev);
8024 if (priv->config & CFG_CRC_CHECK)
8025 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)");
8027 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)");
8031 #endif /* CONFIG_IPW2100_MONITOR */
8033 static iw_handler ipw2100_wx_handlers[] = {
8034 NULL, /* SIOCSIWCOMMIT */
8035 ipw2100_wx_get_name, /* SIOCGIWNAME */
8036 NULL, /* SIOCSIWNWID */
8037 NULL, /* SIOCGIWNWID */
8038 ipw2100_wx_set_freq, /* SIOCSIWFREQ */
8039 ipw2100_wx_get_freq, /* SIOCGIWFREQ */
8040 ipw2100_wx_set_mode, /* SIOCSIWMODE */
8041 ipw2100_wx_get_mode, /* SIOCGIWMODE */
8042 NULL, /* SIOCSIWSENS */
8043 NULL, /* SIOCGIWSENS */
8044 NULL, /* SIOCSIWRANGE */
8045 ipw2100_wx_get_range, /* SIOCGIWRANGE */
8046 NULL, /* SIOCSIWPRIV */
8047 NULL, /* SIOCGIWPRIV */
8048 NULL, /* SIOCSIWSTATS */
8049 NULL, /* SIOCGIWSTATS */
8050 NULL, /* SIOCSIWSPY */
8051 NULL, /* SIOCGIWSPY */
8052 NULL, /* SIOCGIWTHRSPY */
8053 NULL, /* SIOCWIWTHRSPY */
8054 ipw2100_wx_set_wap, /* SIOCSIWAP */
8055 ipw2100_wx_get_wap, /* SIOCGIWAP */
8056 ipw2100_wx_set_mlme, /* SIOCSIWMLME */
8057 NULL, /* SIOCGIWAPLIST -- deprecated */
8058 ipw2100_wx_set_scan, /* SIOCSIWSCAN */
8059 ipw2100_wx_get_scan, /* SIOCGIWSCAN */
8060 ipw2100_wx_set_essid, /* SIOCSIWESSID */
8061 ipw2100_wx_get_essid, /* SIOCGIWESSID */
8062 ipw2100_wx_set_nick, /* SIOCSIWNICKN */
8063 ipw2100_wx_get_nick, /* SIOCGIWNICKN */
8064 NULL, /* -- hole -- */
8065 NULL, /* -- hole -- */
8066 ipw2100_wx_set_rate, /* SIOCSIWRATE */
8067 ipw2100_wx_get_rate, /* SIOCGIWRATE */
8068 ipw2100_wx_set_rts, /* SIOCSIWRTS */
8069 ipw2100_wx_get_rts, /* SIOCGIWRTS */
8070 ipw2100_wx_set_frag, /* SIOCSIWFRAG */
8071 ipw2100_wx_get_frag, /* SIOCGIWFRAG */
8072 ipw2100_wx_set_txpow, /* SIOCSIWTXPOW */
8073 ipw2100_wx_get_txpow, /* SIOCGIWTXPOW */
8074 ipw2100_wx_set_retry, /* SIOCSIWRETRY */
8075 ipw2100_wx_get_retry, /* SIOCGIWRETRY */
8076 ipw2100_wx_set_encode, /* SIOCSIWENCODE */
8077 ipw2100_wx_get_encode, /* SIOCGIWENCODE */
8078 ipw2100_wx_set_power, /* SIOCSIWPOWER */
8079 ipw2100_wx_get_power, /* SIOCGIWPOWER */
8080 NULL, /* -- hole -- */
8081 NULL, /* -- hole -- */
8082 ipw2100_wx_set_genie, /* SIOCSIWGENIE */
8083 ipw2100_wx_get_genie, /* SIOCGIWGENIE */
8084 ipw2100_wx_set_auth, /* SIOCSIWAUTH */
8085 ipw2100_wx_get_auth, /* SIOCGIWAUTH */
8086 ipw2100_wx_set_encodeext, /* SIOCSIWENCODEEXT */
8087 ipw2100_wx_get_encodeext, /* SIOCGIWENCODEEXT */
8088 NULL, /* SIOCSIWPMKSA */
8091 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
8092 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
8093 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
8094 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
8095 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
8096 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
8097 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
8098 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
8100 static const struct iw_priv_args ipw2100_private_args[] = {
8102 #ifdef CONFIG_IPW2100_MONITOR
8104 IPW2100_PRIV_SET_MONITOR,
8105 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
8108 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
8109 #endif /* CONFIG_IPW2100_MONITOR */
8112 IPW2100_PRIV_SET_POWER,
8113 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_power"},
8115 IPW2100_PRIV_GET_POWER,
8116 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_POWER_STRING,
8119 IPW2100_PRIV_SET_LONGPREAMBLE,
8120 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble"},
8122 IPW2100_PRIV_GET_LONGPREAMBLE,
8123 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_preamble"},
8124 #ifdef CONFIG_IPW2100_MONITOR
8126 IPW2100_PRIV_SET_CRC_CHECK,
8127 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_crc_check"},
8129 IPW2100_PRIV_GET_CRC_CHECK,
8130 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_crc_check"},
8131 #endif /* CONFIG_IPW2100_MONITOR */
8134 static iw_handler ipw2100_private_handler[] = {
8135 #ifdef CONFIG_IPW2100_MONITOR
8136 ipw2100_wx_set_promisc,
8138 #else /* CONFIG_IPW2100_MONITOR */
8141 #endif /* CONFIG_IPW2100_MONITOR */
8142 ipw2100_wx_set_powermode,
8143 ipw2100_wx_get_powermode,
8144 ipw2100_wx_set_preamble,
8145 ipw2100_wx_get_preamble,
8146 #ifdef CONFIG_IPW2100_MONITOR
8147 ipw2100_wx_set_crc_check,
8148 ipw2100_wx_get_crc_check,
8149 #else /* CONFIG_IPW2100_MONITOR */
8152 #endif /* CONFIG_IPW2100_MONITOR */
8156 * Get wireless statistics.
8157 * Called by /proc/net/wireless
8158 * Also called by SIOCGIWSTATS
8160 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
8174 struct ipw2100_priv *priv = ieee80211_priv(dev);
8175 struct iw_statistics *wstats;
8176 u32 rssi, quality, tx_retries, missed_beacons, tx_failures;
8177 u32 ord_len = sizeof(u32);
8180 return (struct iw_statistics *)NULL;
8182 wstats = &priv->wstats;
8184 /* if hw is disabled, then ipw2100_get_ordinal() can't be called.
8185 * ipw2100_wx_wireless_stats seems to be called before fw is
8186 * initialized. STATUS_ASSOCIATED will only be set if the hw is up
8187 * and associated; if not associcated, the values are all meaningless
8188 * anyway, so set them all to NULL and INVALID */
8189 if (!(priv->status & STATUS_ASSOCIATED)) {
8190 wstats->miss.beacon = 0;
8191 wstats->discard.retries = 0;
8192 wstats->qual.qual = 0;
8193 wstats->qual.level = 0;
8194 wstats->qual.noise = 0;
8195 wstats->qual.updated = 7;
8196 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
8197 IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
8201 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_MISSED_BCNS,
8202 &missed_beacons, &ord_len))
8203 goto fail_get_ordinal;
8205 /* If we don't have a connection the quality and level is 0 */
8206 if (!(priv->status & STATUS_ASSOCIATED)) {
8207 wstats->qual.qual = 0;
8208 wstats->qual.level = 0;
8210 if (ipw2100_get_ordinal(priv, IPW_ORD_RSSI_AVG_CURR,
8212 goto fail_get_ordinal;
8213 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8215 rssi_qual = rssi * POOR / 10;
8217 rssi_qual = (rssi - 10) * (FAIR - POOR) / 5 + POOR;
8219 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR;
8221 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) /
8224 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) /
8227 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_RETRIES,
8228 &tx_retries, &ord_len))
8229 goto fail_get_ordinal;
8231 if (tx_retries > 75)
8232 tx_qual = (90 - tx_retries) * POOR / 15;
8233 else if (tx_retries > 70)
8234 tx_qual = (75 - tx_retries) * (FAIR - POOR) / 5 + POOR;
8235 else if (tx_retries > 65)
8236 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR;
8237 else if (tx_retries > 50)
8238 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) /
8241 tx_qual = (50 - tx_retries) *
8242 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD;
8244 if (missed_beacons > 50)
8245 beacon_qual = (60 - missed_beacons) * POOR / 10;
8246 else if (missed_beacons > 40)
8247 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) /
8249 else if (missed_beacons > 32)
8250 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) /
8252 else if (missed_beacons > 20)
8253 beacon_qual = (32 - missed_beacons) *
8254 (VERY_GOOD - GOOD) / 20 + GOOD;
8256 beacon_qual = (20 - missed_beacons) *
8257 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD;
8259 quality = min(beacon_qual, min(tx_qual, rssi_qual));
8261 #ifdef CONFIG_IPW2100_DEBUG
8262 if (beacon_qual == quality)
8263 IPW_DEBUG_WX("Quality clamped by Missed Beacons\n");
8264 else if (tx_qual == quality)
8265 IPW_DEBUG_WX("Quality clamped by Tx Retries\n");
8266 else if (quality != 100)
8267 IPW_DEBUG_WX("Quality clamped by Signal Strength\n");
8269 IPW_DEBUG_WX("Quality not clamped.\n");
8272 wstats->qual.qual = quality;
8273 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8276 wstats->qual.noise = 0;
8277 wstats->qual.updated = 7;
8278 wstats->qual.updated |= IW_QUAL_NOISE_INVALID;
8280 /* FIXME: this is percent and not a # */
8281 wstats->miss.beacon = missed_beacons;
8283 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURES,
8284 &tx_failures, &ord_len))
8285 goto fail_get_ordinal;
8286 wstats->discard.retries = tx_failures;
8291 IPW_DEBUG_WX("failed querying ordinals.\n");
8293 return (struct iw_statistics *)NULL;
8296 static struct iw_handler_def ipw2100_wx_handler_def = {
8297 .standard = ipw2100_wx_handlers,
8298 .num_standard = ARRAY_SIZE(ipw2100_wx_handlers),
8299 .num_private = ARRAY_SIZE(ipw2100_private_handler),
8300 .num_private_args = ARRAY_SIZE(ipw2100_private_args),
8301 .private = (iw_handler *) ipw2100_private_handler,
8302 .private_args = (struct iw_priv_args *)ipw2100_private_args,
8303 .get_wireless_stats = ipw2100_wx_wireless_stats,
8306 static void ipw2100_wx_event_work(struct work_struct *work)
8308 struct ipw2100_priv *priv =
8309 container_of(work, struct ipw2100_priv, wx_event_work.work);
8310 union iwreq_data wrqu;
8311 unsigned int len = ETH_ALEN;
8313 if (priv->status & STATUS_STOPPING)
8316 mutex_lock(&priv->action_mutex);
8318 IPW_DEBUG_WX("enter\n");
8320 mutex_unlock(&priv->action_mutex);
8322 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
8324 /* Fetch BSSID from the hardware */
8325 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) ||
8326 priv->status & STATUS_RF_KILL_MASK ||
8327 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
8328 &priv->bssid, &len)) {
8329 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
8331 /* We now have the BSSID, so can finish setting to the full
8332 * associated state */
8333 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
8334 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN);
8335 priv->status &= ~STATUS_ASSOCIATING;
8336 priv->status |= STATUS_ASSOCIATED;
8337 netif_carrier_on(priv->net_dev);
8338 netif_wake_queue(priv->net_dev);
8341 if (!(priv->status & STATUS_ASSOCIATED)) {
8342 IPW_DEBUG_WX("Configuring ESSID\n");
8343 mutex_lock(&priv->action_mutex);
8344 /* This is a disassociation event, so kick the firmware to
8345 * look for another AP */
8346 if (priv->config & CFG_STATIC_ESSID)
8347 ipw2100_set_essid(priv, priv->essid, priv->essid_len,
8350 ipw2100_set_essid(priv, NULL, 0, 0);
8351 mutex_unlock(&priv->action_mutex);
8354 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
8357 #define IPW2100_FW_MAJOR_VERSION 1
8358 #define IPW2100_FW_MINOR_VERSION 3
8360 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
8361 #define IPW2100_FW_MAJOR(x) (x & 0xff)
8363 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
8364 IPW2100_FW_MAJOR_VERSION)
8366 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8367 "." __stringify(IPW2100_FW_MINOR_VERSION)
8369 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
8373 BINARY FIRMWARE HEADER FORMAT
8377 2 2 mode == 0:BSS,1:IBSS,2:MONITOR
8380 C fw_len firmware data
8381 12 + fw_len uc_len microcode data
8385 struct ipw2100_fw_header {
8388 unsigned int fw_size;
8389 unsigned int uc_size;
8390 } __attribute__ ((packed));
8392 static int ipw2100_mod_firmware_load(struct ipw2100_fw *fw)
8394 struct ipw2100_fw_header *h =
8395 (struct ipw2100_fw_header *)fw->fw_entry->data;
8397 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) {
8398 printk(KERN_WARNING DRV_NAME ": Firmware image not compatible "
8399 "(detected version id of %u). "
8400 "See Documentation/networking/README.ipw2100\n",
8405 fw->version = h->version;
8406 fw->fw.data = fw->fw_entry->data + sizeof(struct ipw2100_fw_header);
8407 fw->fw.size = h->fw_size;
8408 fw->uc.data = fw->fw.data + h->fw_size;
8409 fw->uc.size = h->uc_size;
8414 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
8415 struct ipw2100_fw *fw)
8420 IPW_DEBUG_INFO("%s: Using hotplug firmware load.\n",
8421 priv->net_dev->name);
8423 switch (priv->ieee->iw_mode) {
8425 fw_name = IPW2100_FW_NAME("-i");
8427 #ifdef CONFIG_IPW2100_MONITOR
8428 case IW_MODE_MONITOR:
8429 fw_name = IPW2100_FW_NAME("-p");
8434 fw_name = IPW2100_FW_NAME("");
8438 rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev);
8441 printk(KERN_ERR DRV_NAME ": "
8442 "%s: Firmware '%s' not available or load failed.\n",
8443 priv->net_dev->name, fw_name);
8446 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data,
8447 fw->fw_entry->size);
8449 ipw2100_mod_firmware_load(fw);
8454 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
8455 struct ipw2100_fw *fw)
8459 release_firmware(fw->fw_entry);
8460 fw->fw_entry = NULL;
8463 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
8466 char ver[MAX_FW_VERSION_LEN];
8467 u32 len = MAX_FW_VERSION_LEN;
8470 /* firmware version is an ascii string (max len of 14) */
8471 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM, ver, &len))
8476 for (i = 0; i < len; i++)
8482 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
8486 u32 len = sizeof(ver);
8487 /* microcode version is a 32 bit integer */
8488 if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION, &ver, &len))
8490 return snprintf(buf, max, "%08X", ver);
8494 * On exit, the firmware will have been freed from the fw list
8496 static int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
8498 /* firmware is constructed of N contiguous entries, each entry is
8502 * 0 4 address to write to
8503 * 4 2 length of data run
8509 const unsigned char *firmware_data = fw->fw.data;
8510 unsigned int firmware_data_left = fw->fw.size;
8512 while (firmware_data_left > 0) {
8513 addr = *(u32 *) (firmware_data);
8515 firmware_data_left -= 4;
8517 len = *(u16 *) (firmware_data);
8519 firmware_data_left -= 2;
8522 printk(KERN_ERR DRV_NAME ": "
8523 "Invalid firmware run-length of %d bytes\n",
8528 write_nic_memory(priv->net_dev, addr, len, firmware_data);
8529 firmware_data += len;
8530 firmware_data_left -= len;
8536 struct symbol_alive_response {
8545 u16 clock_settle_time; // 1us LSB
8546 u16 powerup_settle_time; // 1us LSB
8547 u16 hop_settle_time; // 1us LSB
8548 u8 date[3]; // month, day, year
8549 u8 time[2]; // hours, minutes
8553 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
8554 struct ipw2100_fw *fw)
8556 struct net_device *dev = priv->net_dev;
8557 const unsigned char *microcode_data = fw->uc.data;
8558 unsigned int microcode_data_left = fw->uc.size;
8559 void __iomem *reg = (void __iomem *)dev->base_addr;
8561 struct symbol_alive_response response;
8565 /* Symbol control */
8566 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8568 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8572 write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
8574 write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
8577 /* EN_CS_ACCESS bit to reset control store pointer */
8578 write_nic_byte(dev, 0x210000, 0x40);
8580 write_nic_byte(dev, 0x210000, 0x0);
8582 write_nic_byte(dev, 0x210000, 0x40);
8585 /* copy microcode from buffer into Symbol */
8587 while (microcode_data_left > 0) {
8588 write_nic_byte(dev, 0x210010, *microcode_data++);
8589 write_nic_byte(dev, 0x210010, *microcode_data++);
8590 microcode_data_left -= 2;
8593 /* EN_CS_ACCESS bit to reset the control store pointer */
8594 write_nic_byte(dev, 0x210000, 0x0);
8597 /* Enable System (Reg 0)
8598 * first enable causes garbage in RX FIFO */
8599 write_nic_byte(dev, 0x210000, 0x0);
8601 write_nic_byte(dev, 0x210000, 0x80);
8604 /* Reset External Baseband Reg */
8605 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8607 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8610 /* HW Config (Reg 5) */
8611 write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
8613 write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
8616 /* Enable System (Reg 0)
8617 * second enable should be OK */
8618 write_nic_byte(dev, 0x210000, 0x00); // clear enable system
8620 write_nic_byte(dev, 0x210000, 0x80); // set enable system
8622 /* check Symbol is enabled - upped this from 5 as it wasn't always
8623 * catching the update */
8624 for (i = 0; i < 10; i++) {
8627 /* check Dino is enabled bit */
8628 read_nic_byte(dev, 0x210000, &data);
8634 printk(KERN_ERR DRV_NAME ": %s: Error initializing Symbol\n",
8639 /* Get Symbol alive response */
8640 for (i = 0; i < 30; i++) {
8641 /* Read alive response structure */
8643 j < (sizeof(struct symbol_alive_response) >> 1); j++)
8644 read_nic_word(dev, 0x210004, ((u16 *) & response) + j);
8646 if ((response.cmd_id == 1) && (response.ucode_valid == 0x1))
8652 printk(KERN_ERR DRV_NAME
8653 ": %s: No response from Symbol - hw not alive\n",
8655 printk_buf(IPW_DL_ERROR, (u8 *) & response, sizeof(response));