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 /* Quite if manually disabled. */
1696 if (priv->status & STATUS_RF_KILL_SW) {
1697 IPW_DEBUG_INFO("%s: Radio is disabled by Manual Disable "
1698 "switch\n", priv->net_dev->name);
1702 /* the ipw2100 hardware really doesn't want power management delays
1703 * longer than 175usec
1705 pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100", 175);
1707 /* If the interrupt is enabled, turn it off... */
1708 spin_lock_irqsave(&priv->low_lock, flags);
1709 ipw2100_disable_interrupts(priv);
1711 /* Reset any fatal_error conditions */
1712 ipw2100_reset_fatalerror(priv);
1713 spin_unlock_irqrestore(&priv->low_lock, flags);
1715 if (priv->status & STATUS_POWERED ||
1716 (priv->status & STATUS_RESET_PENDING)) {
1717 /* Power cycle the card ... */
1718 if (ipw2100_power_cycle_adapter(priv)) {
1719 printk(KERN_WARNING DRV_NAME
1720 ": %s: Could not cycle adapter.\n",
1721 priv->net_dev->name);
1726 priv->status |= STATUS_POWERED;
1728 /* Load the firmware, start the clocks, etc. */
1729 if (ipw2100_start_adapter(priv)) {
1730 printk(KERN_ERR DRV_NAME
1731 ": %s: Failed to start the firmware.\n",
1732 priv->net_dev->name);
1737 ipw2100_initialize_ordinals(priv);
1739 /* Determine capabilities of this particular HW configuration */
1740 if (ipw2100_get_hw_features(priv)) {
1741 printk(KERN_ERR DRV_NAME
1742 ": %s: Failed to determine HW features.\n",
1743 priv->net_dev->name);
1748 /* Initialize the geo */
1749 if (ieee80211_set_geo(priv->ieee, &ipw_geos[0])) {
1750 printk(KERN_WARNING DRV_NAME "Could not set geo\n");
1753 priv->ieee->freq_band = IEEE80211_24GHZ_BAND;
1756 if (ipw2100_set_ordinal(priv, IPW_ORD_PERS_DB_LOCK, &lock, &ord_len)) {
1757 printk(KERN_ERR DRV_NAME
1758 ": %s: Failed to clear ordinal lock.\n",
1759 priv->net_dev->name);
1764 priv->status &= ~STATUS_SCANNING;
1766 if (rf_kill_active(priv)) {
1767 printk(KERN_INFO "%s: Radio is disabled by RF switch.\n",
1768 priv->net_dev->name);
1770 if (priv->stop_rf_kill) {
1771 priv->stop_rf_kill = 0;
1772 queue_delayed_work(priv->workqueue, &priv->rf_kill,
1773 round_jiffies_relative(HZ));
1779 /* Turn on the interrupt so that commands can be processed */
1780 ipw2100_enable_interrupts(priv);
1782 /* Send all of the commands that must be sent prior to
1784 if (ipw2100_adapter_setup(priv)) {
1785 printk(KERN_ERR DRV_NAME ": %s: Failed to start the card.\n",
1786 priv->net_dev->name);
1792 /* Enable the adapter - sends HOST_COMPLETE */
1793 if (ipw2100_enable_adapter(priv)) {
1794 printk(KERN_ERR DRV_NAME ": "
1795 "%s: failed in call to enable adapter.\n",
1796 priv->net_dev->name);
1797 ipw2100_hw_stop_adapter(priv);
1802 /* Start a scan . . . */
1803 ipw2100_set_scan_options(priv);
1804 ipw2100_start_scan(priv);
1811 /* Called by register_netdev() */
1812 static int ipw2100_net_init(struct net_device *dev)
1814 struct ipw2100_priv *priv = ieee80211_priv(dev);
1815 return ipw2100_up(priv, 1);
1818 static void ipw2100_down(struct ipw2100_priv *priv)
1820 unsigned long flags;
1821 union iwreq_data wrqu = {
1823 .sa_family = ARPHRD_ETHER}
1825 int associated = priv->status & STATUS_ASSOCIATED;
1827 /* Kill the RF switch timer */
1828 if (!priv->stop_rf_kill) {
1829 priv->stop_rf_kill = 1;
1830 cancel_delayed_work(&priv->rf_kill);
1833 /* Kill the firmware hang check timer */
1834 if (!priv->stop_hang_check) {
1835 priv->stop_hang_check = 1;
1836 cancel_delayed_work(&priv->hang_check);
1839 /* Kill any pending resets */
1840 if (priv->status & STATUS_RESET_PENDING)
1841 cancel_delayed_work(&priv->reset_work);
1843 /* Make sure the interrupt is on so that FW commands will be
1844 * processed correctly */
1845 spin_lock_irqsave(&priv->low_lock, flags);
1846 ipw2100_enable_interrupts(priv);
1847 spin_unlock_irqrestore(&priv->low_lock, flags);
1849 if (ipw2100_hw_stop_adapter(priv))
1850 printk(KERN_ERR DRV_NAME ": %s: Error stopping adapter.\n",
1851 priv->net_dev->name);
1853 /* Do not disable the interrupt until _after_ we disable
1854 * the adaptor. Otherwise the CARD_DISABLE command will never
1855 * be ack'd by the firmware */
1856 spin_lock_irqsave(&priv->low_lock, flags);
1857 ipw2100_disable_interrupts(priv);
1858 spin_unlock_irqrestore(&priv->low_lock, flags);
1860 pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100",
1861 PM_QOS_DEFAULT_VALUE);
1863 /* We have to signal any supplicant if we are disassociating */
1865 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1867 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1868 netif_carrier_off(priv->net_dev);
1869 netif_stop_queue(priv->net_dev);
1872 static void ipw2100_reset_adapter(struct work_struct *work)
1874 struct ipw2100_priv *priv =
1875 container_of(work, struct ipw2100_priv, reset_work.work);
1876 unsigned long flags;
1877 union iwreq_data wrqu = {
1879 .sa_family = ARPHRD_ETHER}
1881 int associated = priv->status & STATUS_ASSOCIATED;
1883 spin_lock_irqsave(&priv->low_lock, flags);
1884 IPW_DEBUG_INFO(": %s: Restarting adapter.\n", priv->net_dev->name);
1886 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
1887 priv->status |= STATUS_SECURITY_UPDATED;
1889 /* Force a power cycle even if interface hasn't been opened
1891 cancel_delayed_work(&priv->reset_work);
1892 priv->status |= STATUS_RESET_PENDING;
1893 spin_unlock_irqrestore(&priv->low_lock, flags);
1895 mutex_lock(&priv->action_mutex);
1896 /* stop timed checks so that they don't interfere with reset */
1897 priv->stop_hang_check = 1;
1898 cancel_delayed_work(&priv->hang_check);
1900 /* We have to signal any supplicant if we are disassociating */
1902 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1904 ipw2100_up(priv, 0);
1905 mutex_unlock(&priv->action_mutex);
1909 static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
1912 #define MAC_ASSOCIATION_READ_DELAY (HZ)
1914 unsigned int len, essid_len;
1915 char essid[IW_ESSID_MAX_SIZE];
1920 DECLARE_SSID_BUF(ssid);
1923 * TBD: BSSID is usually 00:00:00:00:00:00 here and not
1924 * an actual MAC of the AP. Seems like FW sets this
1925 * address too late. Read it later and expose through
1926 * /proc or schedule a later task to query and update
1929 essid_len = IW_ESSID_MAX_SIZE;
1930 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID,
1933 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1939 ret = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &txrate, &len);
1941 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1947 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &len);
1949 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1954 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, &bssid, &len);
1956 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
1960 memcpy(priv->ieee->bssid, bssid, ETH_ALEN);
1963 case TX_RATE_1_MBIT:
1964 txratename = "1Mbps";
1966 case TX_RATE_2_MBIT:
1967 txratename = "2Mbsp";
1969 case TX_RATE_5_5_MBIT:
1970 txratename = "5.5Mbps";
1972 case TX_RATE_11_MBIT:
1973 txratename = "11Mbps";
1976 IPW_DEBUG_INFO("Unknown rate: %d\n", txrate);
1977 txratename = "unknown rate";
1981 IPW_DEBUG_INFO("%s: Associated with '%s' at %s, channel %d (BSSID=%pM)\n",
1982 priv->net_dev->name, print_ssid(ssid, essid, essid_len),
1983 txratename, chan, bssid);
1985 /* now we copy read ssid into dev */
1986 if (!(priv->config & CFG_STATIC_ESSID)) {
1987 priv->essid_len = min((u8) essid_len, (u8) IW_ESSID_MAX_SIZE);
1988 memcpy(priv->essid, essid, priv->essid_len);
1990 priv->channel = chan;
1991 memcpy(priv->bssid, bssid, ETH_ALEN);
1993 priv->status |= STATUS_ASSOCIATING;
1994 priv->connect_start = get_seconds();
1996 queue_delayed_work(priv->workqueue, &priv->wx_event_work, HZ / 10);
1999 static int ipw2100_set_essid(struct ipw2100_priv *priv, char *essid,
2000 int length, int batch_mode)
2002 int ssid_len = min(length, IW_ESSID_MAX_SIZE);
2003 struct host_command cmd = {
2004 .host_command = SSID,
2005 .host_command_sequence = 0,
2006 .host_command_length = ssid_len
2009 DECLARE_SSID_BUF(ssid);
2011 IPW_DEBUG_HC("SSID: '%s'\n", print_ssid(ssid, essid, ssid_len));
2014 memcpy(cmd.host_command_parameters, essid, ssid_len);
2017 err = ipw2100_disable_adapter(priv);
2022 /* Bug in FW currently doesn't honor bit 0 in SET_SCAN_OPTIONS to
2023 * disable auto association -- so we cheat by setting a bogus SSID */
2024 if (!ssid_len && !(priv->config & CFG_ASSOCIATE)) {
2026 u8 *bogus = (u8 *) cmd.host_command_parameters;
2027 for (i = 0; i < IW_ESSID_MAX_SIZE; i++)
2028 bogus[i] = 0x18 + i;
2029 cmd.host_command_length = IW_ESSID_MAX_SIZE;
2032 /* NOTE: We always send the SSID command even if the provided ESSID is
2033 * the same as what we currently think is set. */
2035 err = ipw2100_hw_send_command(priv, &cmd);
2037 memset(priv->essid + ssid_len, 0, IW_ESSID_MAX_SIZE - ssid_len);
2038 memcpy(priv->essid, essid, ssid_len);
2039 priv->essid_len = ssid_len;
2043 if (ipw2100_enable_adapter(priv))
2050 static void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status)
2052 DECLARE_SSID_BUF(ssid);
2054 IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE | IPW_DL_ASSOC,
2055 "disassociated: '%s' %pM \n",
2056 print_ssid(ssid, priv->essid, priv->essid_len),
2059 priv->status &= ~(STATUS_ASSOCIATED | STATUS_ASSOCIATING);
2061 if (priv->status & STATUS_STOPPING) {
2062 IPW_DEBUG_INFO("Card is stopping itself, discard ASSN_LOST.\n");
2066 memset(priv->bssid, 0, ETH_ALEN);
2067 memset(priv->ieee->bssid, 0, ETH_ALEN);
2069 netif_carrier_off(priv->net_dev);
2070 netif_stop_queue(priv->net_dev);
2072 if (!(priv->status & STATUS_RUNNING))
2075 if (priv->status & STATUS_SECURITY_UPDATED)
2076 queue_delayed_work(priv->workqueue, &priv->security_work, 0);
2078 queue_delayed_work(priv->workqueue, &priv->wx_event_work, 0);
2081 static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
2083 IPW_DEBUG_INFO("%s: RF Kill state changed to radio OFF.\n",
2084 priv->net_dev->name);
2086 /* RF_KILL is now enabled (else we wouldn't be here) */
2087 priv->status |= STATUS_RF_KILL_HW;
2089 /* Make sure the RF Kill check timer is running */
2090 priv->stop_rf_kill = 0;
2091 cancel_delayed_work(&priv->rf_kill);
2092 queue_delayed_work(priv->workqueue, &priv->rf_kill,
2093 round_jiffies_relative(HZ));
2096 static void send_scan_event(void *data)
2098 struct ipw2100_priv *priv = data;
2099 union iwreq_data wrqu;
2101 wrqu.data.length = 0;
2102 wrqu.data.flags = 0;
2103 wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
2106 static void ipw2100_scan_event_later(struct work_struct *work)
2108 send_scan_event(container_of(work, struct ipw2100_priv,
2109 scan_event_later.work));
2112 static void ipw2100_scan_event_now(struct work_struct *work)
2114 send_scan_event(container_of(work, struct ipw2100_priv,
2118 static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
2120 IPW_DEBUG_SCAN("scan complete\n");
2121 /* Age the scan results... */
2122 priv->ieee->scans++;
2123 priv->status &= ~STATUS_SCANNING;
2125 /* Only userspace-requested scan completion events go out immediately */
2126 if (!priv->user_requested_scan) {
2127 if (!delayed_work_pending(&priv->scan_event_later))
2128 queue_delayed_work(priv->workqueue,
2129 &priv->scan_event_later,
2130 round_jiffies_relative(msecs_to_jiffies(4000)));
2132 priv->user_requested_scan = 0;
2133 cancel_delayed_work(&priv->scan_event_later);
2134 queue_work(priv->workqueue, &priv->scan_event_now);
2138 #ifdef CONFIG_IPW2100_DEBUG
2139 #define IPW2100_HANDLER(v, f) { v, f, # v }
2140 struct ipw2100_status_indicator {
2142 void (*cb) (struct ipw2100_priv * priv, u32 status);
2146 #define IPW2100_HANDLER(v, f) { v, f }
2147 struct ipw2100_status_indicator {
2149 void (*cb) (struct ipw2100_priv * priv, u32 status);
2151 #endif /* CONFIG_IPW2100_DEBUG */
2153 static void isr_indicate_scanning(struct ipw2100_priv *priv, u32 status)
2155 IPW_DEBUG_SCAN("Scanning...\n");
2156 priv->status |= STATUS_SCANNING;
2159 static const struct ipw2100_status_indicator status_handlers[] = {
2160 IPW2100_HANDLER(IPW_STATE_INITIALIZED, NULL),
2161 IPW2100_HANDLER(IPW_STATE_COUNTRY_FOUND, NULL),
2162 IPW2100_HANDLER(IPW_STATE_ASSOCIATED, isr_indicate_associated),
2163 IPW2100_HANDLER(IPW_STATE_ASSN_LOST, isr_indicate_association_lost),
2164 IPW2100_HANDLER(IPW_STATE_ASSN_CHANGED, NULL),
2165 IPW2100_HANDLER(IPW_STATE_SCAN_COMPLETE, isr_scan_complete),
2166 IPW2100_HANDLER(IPW_STATE_ENTERED_PSP, NULL),
2167 IPW2100_HANDLER(IPW_STATE_LEFT_PSP, NULL),
2168 IPW2100_HANDLER(IPW_STATE_RF_KILL, isr_indicate_rf_kill),
2169 IPW2100_HANDLER(IPW_STATE_DISABLED, NULL),
2170 IPW2100_HANDLER(IPW_STATE_POWER_DOWN, NULL),
2171 IPW2100_HANDLER(IPW_STATE_SCANNING, isr_indicate_scanning),
2172 IPW2100_HANDLER(-1, NULL)
2175 static void isr_status_change(struct ipw2100_priv *priv, int status)
2179 if (status == IPW_STATE_SCANNING &&
2180 priv->status & STATUS_ASSOCIATED &&
2181 !(priv->status & STATUS_SCANNING)) {
2182 IPW_DEBUG_INFO("Scan detected while associated, with "
2183 "no scan request. Restarting firmware.\n");
2185 /* Wake up any sleeping jobs */
2186 schedule_reset(priv);
2189 for (i = 0; status_handlers[i].status != -1; i++) {
2190 if (status == status_handlers[i].status) {
2191 IPW_DEBUG_NOTIF("Status change: %s\n",
2192 status_handlers[i].name);
2193 if (status_handlers[i].cb)
2194 status_handlers[i].cb(priv, status);
2195 priv->wstats.status = status;
2200 IPW_DEBUG_NOTIF("unknown status received: %04x\n", status);
2203 static void isr_rx_complete_command(struct ipw2100_priv *priv,
2204 struct ipw2100_cmd_header *cmd)
2206 #ifdef CONFIG_IPW2100_DEBUG
2207 if (cmd->host_command_reg < ARRAY_SIZE(command_types)) {
2208 IPW_DEBUG_HC("Command completed '%s (%d)'\n",
2209 command_types[cmd->host_command_reg],
2210 cmd->host_command_reg);
2213 if (cmd->host_command_reg == HOST_COMPLETE)
2214 priv->status |= STATUS_ENABLED;
2216 if (cmd->host_command_reg == CARD_DISABLE)
2217 priv->status &= ~STATUS_ENABLED;
2219 priv->status &= ~STATUS_CMD_ACTIVE;
2221 wake_up_interruptible(&priv->wait_command_queue);
2224 #ifdef CONFIG_IPW2100_DEBUG
2225 static const char *frame_types[] = {
2226 "COMMAND_STATUS_VAL",
2227 "STATUS_CHANGE_VAL",
2230 "HOST_NOTIFICATION_VAL"
2234 static int ipw2100_alloc_skb(struct ipw2100_priv *priv,
2235 struct ipw2100_rx_packet *packet)
2237 packet->skb = dev_alloc_skb(sizeof(struct ipw2100_rx));
2241 packet->rxp = (struct ipw2100_rx *)packet->skb->data;
2242 packet->dma_addr = pci_map_single(priv->pci_dev, packet->skb->data,
2243 sizeof(struct ipw2100_rx),
2244 PCI_DMA_FROMDEVICE);
2245 /* NOTE: pci_map_single does not return an error code, and 0 is a valid
2251 #define SEARCH_ERROR 0xffffffff
2252 #define SEARCH_FAIL 0xfffffffe
2253 #define SEARCH_SUCCESS 0xfffffff0
2254 #define SEARCH_DISCARD 0
2255 #define SEARCH_SNAPSHOT 1
2257 #define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2258 static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
2261 if (!priv->snapshot[0])
2263 for (i = 0; i < 0x30; i++)
2264 kfree(priv->snapshot[i]);
2265 priv->snapshot[0] = NULL;
2268 #ifdef IPW2100_DEBUG_C3
2269 static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
2272 if (priv->snapshot[0])
2274 for (i = 0; i < 0x30; i++) {
2275 priv->snapshot[i] = kmalloc(0x1000, GFP_ATOMIC);
2276 if (!priv->snapshot[i]) {
2277 IPW_DEBUG_INFO("%s: Error allocating snapshot "
2278 "buffer %d\n", priv->net_dev->name, i);
2280 kfree(priv->snapshot[--i]);
2281 priv->snapshot[0] = NULL;
2289 static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
2290 size_t len, int mode)
2298 if (mode == SEARCH_SNAPSHOT) {
2299 if (!ipw2100_snapshot_alloc(priv))
2300 mode = SEARCH_DISCARD;
2303 for (ret = SEARCH_FAIL, i = 0; i < 0x30000; i += 4) {
2304 read_nic_dword(priv->net_dev, i, &tmp);
2305 if (mode == SEARCH_SNAPSHOT)
2306 *(u32 *) SNAPSHOT_ADDR(i) = tmp;
2307 if (ret == SEARCH_FAIL) {
2309 for (j = 0; j < 4; j++) {
2318 if ((s - in_buf) == len)
2319 ret = (i + j) - len + 1;
2321 } else if (mode == SEARCH_DISCARD)
2331 * 0) Disconnect the SKB from the firmware (just unmap)
2332 * 1) Pack the ETH header into the SKB
2333 * 2) Pass the SKB to the network stack
2335 * When packet is provided by the firmware, it contains the following:
2338 * . ieee80211_snap_hdr
2340 * The size of the constructed ethernet
2343 #ifdef IPW2100_RX_DEBUG
2344 static u8 packet_data[IPW_RX_NIC_BUFFER_LENGTH];
2347 static void ipw2100_corruption_detected(struct ipw2100_priv *priv, int i)
2349 #ifdef IPW2100_DEBUG_C3
2350 struct ipw2100_status *status = &priv->status_queue.drv[i];
2355 IPW_DEBUG_INFO(": PCI latency error detected at 0x%04zX.\n",
2356 i * sizeof(struct ipw2100_status));
2358 #ifdef IPW2100_DEBUG_C3
2359 /* Halt the fimrware so we can get a good image */
2360 write_register(priv->net_dev, IPW_REG_RESET_REG,
2361 IPW_AUX_HOST_RESET_REG_STOP_MASTER);
2364 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
2365 read_register(priv->net_dev, IPW_REG_RESET_REG, ®);
2367 if (reg & IPW_AUX_HOST_RESET_REG_MASTER_DISABLED)
2371 match = ipw2100_match_buf(priv, (u8 *) status,
2372 sizeof(struct ipw2100_status),
2374 if (match < SEARCH_SUCCESS)
2375 IPW_DEBUG_INFO("%s: DMA status match in Firmware at "
2376 "offset 0x%06X, length %d:\n",
2377 priv->net_dev->name, match,
2378 sizeof(struct ipw2100_status));
2380 IPW_DEBUG_INFO("%s: No DMA status match in "
2381 "Firmware.\n", priv->net_dev->name);
2383 printk_buf((u8 *) priv->status_queue.drv,
2384 sizeof(struct ipw2100_status) * RX_QUEUE_LENGTH);
2387 priv->fatal_error = IPW2100_ERR_C3_CORRUPTION;
2388 priv->ieee->stats.rx_errors++;
2389 schedule_reset(priv);
2392 static void isr_rx(struct ipw2100_priv *priv, int i,
2393 struct ieee80211_rx_stats *stats)
2395 struct ipw2100_status *status = &priv->status_queue.drv[i];
2396 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2398 IPW_DEBUG_RX("Handler...\n");
2400 if (unlikely(status->frame_size > skb_tailroom(packet->skb))) {
2401 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2403 priv->net_dev->name,
2404 status->frame_size, skb_tailroom(packet->skb));
2405 priv->ieee->stats.rx_errors++;
2409 if (unlikely(!netif_running(priv->net_dev))) {
2410 priv->ieee->stats.rx_errors++;
2411 priv->wstats.discard.misc++;
2412 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2416 if (unlikely(priv->ieee->iw_mode != IW_MODE_MONITOR &&
2417 !(priv->status & STATUS_ASSOCIATED))) {
2418 IPW_DEBUG_DROP("Dropping packet while not associated.\n");
2419 priv->wstats.discard.misc++;
2423 pci_unmap_single(priv->pci_dev,
2425 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2427 skb_put(packet->skb, status->frame_size);
2429 #ifdef IPW2100_RX_DEBUG
2430 /* Make a copy of the frame so we can dump it to the logs if
2431 * ieee80211_rx fails */
2432 skb_copy_from_linear_data(packet->skb, packet_data,
2433 min_t(u32, status->frame_size,
2434 IPW_RX_NIC_BUFFER_LENGTH));
2437 if (!ieee80211_rx(priv->ieee, packet->skb, stats)) {
2438 #ifdef IPW2100_RX_DEBUG
2439 IPW_DEBUG_DROP("%s: Non consumed packet:\n",
2440 priv->net_dev->name);
2441 printk_buf(IPW_DL_DROP, packet_data, status->frame_size);
2443 priv->ieee->stats.rx_errors++;
2445 /* ieee80211_rx failed, so it didn't free the SKB */
2446 dev_kfree_skb_any(packet->skb);
2450 /* We need to allocate a new SKB and attach it to the RDB. */
2451 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2452 printk(KERN_WARNING DRV_NAME ": "
2453 "%s: Unable to allocate SKB onto RBD ring - disabling "
2454 "adapter.\n", priv->net_dev->name);
2455 /* TODO: schedule adapter shutdown */
2456 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2459 /* Update the RDB entry */
2460 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2463 #ifdef CONFIG_IPW2100_MONITOR
2465 static void isr_rx_monitor(struct ipw2100_priv *priv, int i,
2466 struct ieee80211_rx_stats *stats)
2468 struct ipw2100_status *status = &priv->status_queue.drv[i];
2469 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
2471 /* Magic struct that slots into the radiotap header -- no reason
2472 * to build this manually element by element, we can write it much
2473 * more efficiently than we can parse it. ORDER MATTERS HERE */
2475 struct ieee80211_radiotap_header rt_hdr;
2476 s8 rt_dbmsignal; /* signal in dbM, kluged to signed */
2479 IPW_DEBUG_RX("Handler...\n");
2481 if (unlikely(status->frame_size > skb_tailroom(packet->skb) -
2482 sizeof(struct ipw_rt_hdr))) {
2483 IPW_DEBUG_INFO("%s: frame_size (%u) > skb_tailroom (%u)!"
2485 priv->net_dev->name,
2487 skb_tailroom(packet->skb));
2488 priv->ieee->stats.rx_errors++;
2492 if (unlikely(!netif_running(priv->net_dev))) {
2493 priv->ieee->stats.rx_errors++;
2494 priv->wstats.discard.misc++;
2495 IPW_DEBUG_DROP("Dropping packet while interface is not up.\n");
2499 if (unlikely(priv->config & CFG_CRC_CHECK &&
2500 status->flags & IPW_STATUS_FLAG_CRC_ERROR)) {
2501 IPW_DEBUG_RX("CRC error in packet. Dropping.\n");
2502 priv->ieee->stats.rx_errors++;
2506 pci_unmap_single(priv->pci_dev, packet->dma_addr,
2507 sizeof(struct ipw2100_rx), PCI_DMA_FROMDEVICE);
2508 memmove(packet->skb->data + sizeof(struct ipw_rt_hdr),
2509 packet->skb->data, status->frame_size);
2511 ipw_rt = (struct ipw_rt_hdr *) packet->skb->data;
2513 ipw_rt->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION;
2514 ipw_rt->rt_hdr.it_pad = 0; /* always good to zero */
2515 ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr)); /* total hdr+data */
2517 ipw_rt->rt_hdr.it_present = cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL);
2519 ipw_rt->rt_dbmsignal = status->rssi + IPW2100_RSSI_TO_DBM;
2521 skb_put(packet->skb, status->frame_size + sizeof(struct ipw_rt_hdr));
2523 if (!ieee80211_rx(priv->ieee, packet->skb, stats)) {
2524 priv->ieee->stats.rx_errors++;
2526 /* ieee80211_rx failed, so it didn't free the SKB */
2527 dev_kfree_skb_any(packet->skb);
2531 /* We need to allocate a new SKB and attach it to the RDB. */
2532 if (unlikely(ipw2100_alloc_skb(priv, packet))) {
2534 "%s: Unable to allocate SKB onto RBD ring - disabling "
2535 "adapter.\n", priv->net_dev->name);
2536 /* TODO: schedule adapter shutdown */
2537 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2540 /* Update the RDB entry */
2541 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
2546 static int ipw2100_corruption_check(struct ipw2100_priv *priv, int i)
2548 struct ipw2100_status *status = &priv->status_queue.drv[i];
2549 struct ipw2100_rx *u = priv->rx_buffers[i].rxp;
2550 u16 frame_type = status->status_fields & STATUS_TYPE_MASK;
2552 switch (frame_type) {
2553 case COMMAND_STATUS_VAL:
2554 return (status->frame_size != sizeof(u->rx_data.command));
2555 case STATUS_CHANGE_VAL:
2556 return (status->frame_size != sizeof(u->rx_data.status));
2557 case HOST_NOTIFICATION_VAL:
2558 return (status->frame_size < sizeof(u->rx_data.notification));
2559 case P80211_DATA_VAL:
2560 case P8023_DATA_VAL:
2561 #ifdef CONFIG_IPW2100_MONITOR
2564 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2565 case IEEE80211_FTYPE_MGMT:
2566 case IEEE80211_FTYPE_CTL:
2568 case IEEE80211_FTYPE_DATA:
2569 return (status->frame_size >
2570 IPW_MAX_802_11_PAYLOAD_LENGTH);
2579 * ipw2100 interrupts are disabled at this point, and the ISR
2580 * is the only code that calls this method. So, we do not need
2581 * to play with any locks.
2583 * RX Queue works as follows:
2585 * Read index - firmware places packet in entry identified by the
2586 * Read index and advances Read index. In this manner,
2587 * Read index will always point to the next packet to
2588 * be filled--but not yet valid.
2590 * Write index - driver fills this entry with an unused RBD entry.
2591 * This entry has not filled by the firmware yet.
2593 * In between the W and R indexes are the RBDs that have been received
2594 * but not yet processed.
2596 * The process of handling packets will start at WRITE + 1 and advance
2597 * until it reaches the READ index.
2599 * The WRITE index is cached in the variable 'priv->rx_queue.next'.
2602 static void __ipw2100_rx_process(struct ipw2100_priv *priv)
2604 struct ipw2100_bd_queue *rxq = &priv->rx_queue;
2605 struct ipw2100_status_queue *sq = &priv->status_queue;
2606 struct ipw2100_rx_packet *packet;
2609 struct ipw2100_rx *u;
2610 struct ieee80211_rx_stats stats = {
2611 .mac_time = jiffies,
2614 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_READ_INDEX, &r);
2615 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, &w);
2617 if (r >= rxq->entries) {
2618 IPW_DEBUG_RX("exit - bad read index\n");
2622 i = (rxq->next + 1) % rxq->entries;
2625 /* IPW_DEBUG_RX("r = %d : w = %d : processing = %d\n",
2626 r, rxq->next, i); */
2628 packet = &priv->rx_buffers[i];
2630 /* Sync the DMA for the STATUS buffer so CPU is sure to get
2631 * the correct values */
2632 pci_dma_sync_single_for_cpu(priv->pci_dev,
2634 sizeof(struct ipw2100_status) * i,
2635 sizeof(struct ipw2100_status),
2636 PCI_DMA_FROMDEVICE);
2638 /* Sync the DMA for the RX buffer so CPU is sure to get
2639 * the correct values */
2640 pci_dma_sync_single_for_cpu(priv->pci_dev, packet->dma_addr,
2641 sizeof(struct ipw2100_rx),
2642 PCI_DMA_FROMDEVICE);
2644 if (unlikely(ipw2100_corruption_check(priv, i))) {
2645 ipw2100_corruption_detected(priv, i);
2650 frame_type = sq->drv[i].status_fields & STATUS_TYPE_MASK;
2651 stats.rssi = sq->drv[i].rssi + IPW2100_RSSI_TO_DBM;
2652 stats.len = sq->drv[i].frame_size;
2655 if (stats.rssi != 0)
2656 stats.mask |= IEEE80211_STATMASK_RSSI;
2657 stats.freq = IEEE80211_24GHZ_BAND;
2659 IPW_DEBUG_RX("%s: '%s' frame type received (%d).\n",
2660 priv->net_dev->name, frame_types[frame_type],
2663 switch (frame_type) {
2664 case COMMAND_STATUS_VAL:
2665 /* Reset Rx watchdog */
2666 isr_rx_complete_command(priv, &u->rx_data.command);
2669 case STATUS_CHANGE_VAL:
2670 isr_status_change(priv, u->rx_data.status);
2673 case P80211_DATA_VAL:
2674 case P8023_DATA_VAL:
2675 #ifdef CONFIG_IPW2100_MONITOR
2676 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
2677 isr_rx_monitor(priv, i, &stats);
2681 if (stats.len < sizeof(struct ieee80211_hdr_3addr))
2683 switch (WLAN_FC_GET_TYPE(le16_to_cpu(u->rx_data.header.frame_ctl))) {
2684 case IEEE80211_FTYPE_MGMT:
2685 ieee80211_rx_mgt(priv->ieee,
2686 &u->rx_data.header, &stats);
2689 case IEEE80211_FTYPE_CTL:
2692 case IEEE80211_FTYPE_DATA:
2693 isr_rx(priv, i, &stats);
2701 /* clear status field associated with this RBD */
2702 rxq->drv[i].status.info.field = 0;
2704 i = (i + 1) % rxq->entries;
2708 /* backtrack one entry, wrapping to end if at 0 */
2709 rxq->next = (i ? i : rxq->entries) - 1;
2711 write_register(priv->net_dev,
2712 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX, rxq->next);
2717 * __ipw2100_tx_process
2719 * This routine will determine whether the next packet on
2720 * the fw_pend_list has been processed by the firmware yet.
2722 * If not, then it does nothing and returns.
2724 * If so, then it removes the item from the fw_pend_list, frees
2725 * any associated storage, and places the item back on the
2726 * free list of its source (either msg_free_list or tx_free_list)
2728 * TX Queue works as follows:
2730 * Read index - points to the next TBD that the firmware will
2731 * process. The firmware will read the data, and once
2732 * done processing, it will advance the Read index.
2734 * Write index - driver fills this entry with an constructed TBD
2735 * entry. The Write index is not advanced until the
2736 * packet has been configured.
2738 * In between the W and R indexes are the TBDs that have NOT been
2739 * processed. Lagging behind the R index are packets that have
2740 * been processed but have not been freed by the driver.
2742 * In order to free old storage, an internal index will be maintained
2743 * that points to the next packet to be freed. When all used
2744 * packets have been freed, the oldest index will be the same as the
2745 * firmware's read index.
2747 * The OLDEST index is cached in the variable 'priv->tx_queue.oldest'
2749 * Because the TBD structure can not contain arbitrary data, the
2750 * driver must keep an internal queue of cached allocations such that
2751 * it can put that data back into the tx_free_list and msg_free_list
2752 * for use by future command and data packets.
2755 static int __ipw2100_tx_process(struct ipw2100_priv *priv)
2757 struct ipw2100_bd_queue *txq = &priv->tx_queue;
2758 struct ipw2100_bd *tbd;
2759 struct list_head *element;
2760 struct ipw2100_tx_packet *packet;
2761 int descriptors_used;
2763 u32 r, w, frag_num = 0;
2765 if (list_empty(&priv->fw_pend_list))
2768 element = priv->fw_pend_list.next;
2770 packet = list_entry(element, struct ipw2100_tx_packet, list);
2771 tbd = &txq->drv[packet->index];
2773 /* Determine how many TBD entries must be finished... */
2774 switch (packet->type) {
2776 /* COMMAND uses only one slot; don't advance */
2777 descriptors_used = 1;
2782 /* DATA uses two slots; advance and loop position. */
2783 descriptors_used = tbd->num_fragments;
2784 frag_num = tbd->num_fragments - 1;
2785 e = txq->oldest + frag_num;
2790 printk(KERN_WARNING DRV_NAME ": %s: Bad fw_pend_list entry!\n",
2791 priv->net_dev->name);
2795 /* if the last TBD is not done by NIC yet, then packet is
2796 * not ready to be released.
2799 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
2801 read_register(priv->net_dev, IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
2804 printk(KERN_WARNING DRV_NAME ": %s: write index mismatch\n",
2805 priv->net_dev->name);
2808 * txq->next is the index of the last packet written txq->oldest is
2809 * the index of the r is the index of the next packet to be read by
2814 * Quick graphic to help you visualize the following
2815 * if / else statement
2817 * ===>| s---->|===============
2819 * | a | b | c | d | e | f | g | h | i | j | k | l
2823 * w - updated by driver
2824 * r - updated by firmware
2825 * s - start of oldest BD entry (txq->oldest)
2826 * e - end of oldest BD entry
2829 if (!((r <= w && (e < r || e >= w)) || (e < r && e >= w))) {
2830 IPW_DEBUG_TX("exit - no processed packets ready to release.\n");
2835 DEC_STAT(&priv->fw_pend_stat);
2837 #ifdef CONFIG_IPW2100_DEBUG
2839 int i = txq->oldest;
2840 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2842 (u32) (txq->nic + i * sizeof(struct ipw2100_bd)),
2843 txq->drv[i].host_addr, txq->drv[i].buf_length);
2845 if (packet->type == DATA) {
2846 i = (i + 1) % txq->entries;
2848 IPW_DEBUG_TX("TX%d V=%p P=%04X T=%04X L=%d\n", i,
2850 (u32) (txq->nic + i *
2851 sizeof(struct ipw2100_bd)),
2852 (u32) txq->drv[i].host_addr,
2853 txq->drv[i].buf_length);
2858 switch (packet->type) {
2860 if (txq->drv[txq->oldest].status.info.fields.txType != 0)
2861 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2862 "Expecting DATA TBD but pulled "
2863 "something else: ids %d=%d.\n",
2864 priv->net_dev->name, txq->oldest, packet->index);
2866 /* DATA packet; we have to unmap and free the SKB */
2867 for (i = 0; i < frag_num; i++) {
2868 tbd = &txq->drv[(packet->index + 1 + i) % txq->entries];
2870 IPW_DEBUG_TX("TX%d P=%08x L=%d\n",
2871 (packet->index + 1 + i) % txq->entries,
2872 tbd->host_addr, tbd->buf_length);
2874 pci_unmap_single(priv->pci_dev,
2876 tbd->buf_length, PCI_DMA_TODEVICE);
2879 ieee80211_txb_free(packet->info.d_struct.txb);
2880 packet->info.d_struct.txb = NULL;
2882 list_add_tail(element, &priv->tx_free_list);
2883 INC_STAT(&priv->tx_free_stat);
2885 /* We have a free slot in the Tx queue, so wake up the
2886 * transmit layer if it is stopped. */
2887 if (priv->status & STATUS_ASSOCIATED)
2888 netif_wake_queue(priv->net_dev);
2890 /* A packet was processed by the hardware, so update the
2892 priv->net_dev->trans_start = jiffies;
2897 if (txq->drv[txq->oldest].status.info.fields.txType != 1)
2898 printk(KERN_WARNING DRV_NAME ": %s: Queue mismatch. "
2899 "Expecting COMMAND TBD but pulled "
2900 "something else: ids %d=%d.\n",
2901 priv->net_dev->name, txq->oldest, packet->index);
2903 #ifdef CONFIG_IPW2100_DEBUG
2904 if (packet->info.c_struct.cmd->host_command_reg <
2905 ARRAY_SIZE(command_types))
2906 IPW_DEBUG_TX("Command '%s (%d)' processed: %d.\n",
2907 command_types[packet->info.c_struct.cmd->
2909 packet->info.c_struct.cmd->
2911 packet->info.c_struct.cmd->cmd_status_reg);
2914 list_add_tail(element, &priv->msg_free_list);
2915 INC_STAT(&priv->msg_free_stat);
2919 /* advance oldest used TBD pointer to start of next entry */
2920 txq->oldest = (e + 1) % txq->entries;
2921 /* increase available TBDs number */
2922 txq->available += descriptors_used;
2923 SET_STAT(&priv->txq_stat, txq->available);
2925 IPW_DEBUG_TX("packet latency (send to process) %ld jiffies\n",
2926 jiffies - packet->jiffy_start);
2928 return (!list_empty(&priv->fw_pend_list));
2931 static inline void __ipw2100_tx_complete(struct ipw2100_priv *priv)
2935 while (__ipw2100_tx_process(priv) && i < 200)
2939 printk(KERN_WARNING DRV_NAME ": "
2940 "%s: Driver is running slow (%d iters).\n",
2941 priv->net_dev->name, i);
2945 static void ipw2100_tx_send_commands(struct ipw2100_priv *priv)
2947 struct list_head *element;
2948 struct ipw2100_tx_packet *packet;
2949 struct ipw2100_bd_queue *txq = &priv->tx_queue;
2950 struct ipw2100_bd *tbd;
2951 int next = txq->next;
2953 while (!list_empty(&priv->msg_pend_list)) {
2954 /* if there isn't enough space in TBD queue, then
2955 * don't stuff a new one in.
2956 * NOTE: 3 are needed as a command will take one,
2957 * and there is a minimum of 2 that must be
2958 * maintained between the r and w indexes
2960 if (txq->available <= 3) {
2961 IPW_DEBUG_TX("no room in tx_queue\n");
2965 element = priv->msg_pend_list.next;
2967 DEC_STAT(&priv->msg_pend_stat);
2969 packet = list_entry(element, struct ipw2100_tx_packet, list);
2971 IPW_DEBUG_TX("using TBD at virt=%p, phys=%p\n",
2972 &txq->drv[txq->next],
2973 (void *)(txq->nic + txq->next *
2974 sizeof(struct ipw2100_bd)));
2976 packet->index = txq->next;
2978 tbd = &txq->drv[txq->next];
2980 /* initialize TBD */
2981 tbd->host_addr = packet->info.c_struct.cmd_phys;
2982 tbd->buf_length = sizeof(struct ipw2100_cmd_header);
2983 /* not marking number of fragments causes problems
2984 * with f/w debug version */
2985 tbd->num_fragments = 1;
2986 tbd->status.info.field =
2987 IPW_BD_STATUS_TX_FRAME_COMMAND |
2988 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
2990 /* update TBD queue counters */
2992 txq->next %= txq->entries;
2994 DEC_STAT(&priv->txq_stat);
2996 list_add_tail(element, &priv->fw_pend_list);
2997 INC_STAT(&priv->fw_pend_stat);
3000 if (txq->next != next) {
3001 /* kick off the DMA by notifying firmware the
3002 * write index has moved; make sure TBD stores are sync'd */
3004 write_register(priv->net_dev,
3005 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3011 * ipw2100_tx_send_data
3014 static void ipw2100_tx_send_data(struct ipw2100_priv *priv)
3016 struct list_head *element;
3017 struct ipw2100_tx_packet *packet;
3018 struct ipw2100_bd_queue *txq = &priv->tx_queue;
3019 struct ipw2100_bd *tbd;
3020 int next = txq->next;
3022 struct ipw2100_data_header *ipw_hdr;
3023 struct ieee80211_hdr_3addr *hdr;
3025 while (!list_empty(&priv->tx_pend_list)) {
3026 /* if there isn't enough space in TBD queue, then
3027 * don't stuff a new one in.
3028 * NOTE: 4 are needed as a data will take two,
3029 * and there is a minimum of 2 that must be
3030 * maintained between the r and w indexes
3032 element = priv->tx_pend_list.next;
3033 packet = list_entry(element, struct ipw2100_tx_packet, list);
3035 if (unlikely(1 + packet->info.d_struct.txb->nr_frags >
3037 /* TODO: Support merging buffers if more than
3038 * IPW_MAX_BDS are used */
3039 IPW_DEBUG_INFO("%s: Maximum BD theshold exceeded. "
3040 "Increase fragmentation level.\n",
3041 priv->net_dev->name);
3044 if (txq->available <= 3 + packet->info.d_struct.txb->nr_frags) {
3045 IPW_DEBUG_TX("no room in tx_queue\n");
3050 DEC_STAT(&priv->tx_pend_stat);
3052 tbd = &txq->drv[txq->next];
3054 packet->index = txq->next;
3056 ipw_hdr = packet->info.d_struct.data;
3057 hdr = (struct ieee80211_hdr_3addr *)packet->info.d_struct.txb->
3060 if (priv->ieee->iw_mode == IW_MODE_INFRA) {
3061 /* To DS: Addr1 = BSSID, Addr2 = SA,
3063 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3064 memcpy(ipw_hdr->dst_addr, hdr->addr3, ETH_ALEN);
3065 } else if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
3066 /* not From/To DS: Addr1 = DA, Addr2 = SA,
3068 memcpy(ipw_hdr->src_addr, hdr->addr2, ETH_ALEN);
3069 memcpy(ipw_hdr->dst_addr, hdr->addr1, ETH_ALEN);
3072 ipw_hdr->host_command_reg = SEND;
3073 ipw_hdr->host_command_reg1 = 0;
3075 /* For now we only support host based encryption */
3076 ipw_hdr->needs_encryption = 0;
3077 ipw_hdr->encrypted = packet->info.d_struct.txb->encrypted;
3078 if (packet->info.d_struct.txb->nr_frags > 1)
3079 ipw_hdr->fragment_size =
3080 packet->info.d_struct.txb->frag_size -
3081 IEEE80211_3ADDR_LEN;
3083 ipw_hdr->fragment_size = 0;
3085 tbd->host_addr = packet->info.d_struct.data_phys;
3086 tbd->buf_length = sizeof(struct ipw2100_data_header);
3087 tbd->num_fragments = 1 + packet->info.d_struct.txb->nr_frags;
3088 tbd->status.info.field =
3089 IPW_BD_STATUS_TX_FRAME_802_3 |
3090 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3092 txq->next %= txq->entries;
3094 IPW_DEBUG_TX("data header tbd TX%d P=%08x L=%d\n",
3095 packet->index, tbd->host_addr, tbd->buf_length);
3096 #ifdef CONFIG_IPW2100_DEBUG
3097 if (packet->info.d_struct.txb->nr_frags > 1)
3098 IPW_DEBUG_FRAG("fragment Tx: %d frames\n",
3099 packet->info.d_struct.txb->nr_frags);
3102 for (i = 0; i < packet->info.d_struct.txb->nr_frags; i++) {
3103 tbd = &txq->drv[txq->next];
3104 if (i == packet->info.d_struct.txb->nr_frags - 1)
3105 tbd->status.info.field =
3106 IPW_BD_STATUS_TX_FRAME_802_3 |
3107 IPW_BD_STATUS_TX_INTERRUPT_ENABLE;
3109 tbd->status.info.field =
3110 IPW_BD_STATUS_TX_FRAME_802_3 |
3111 IPW_BD_STATUS_TX_FRAME_NOT_LAST_FRAGMENT;
3113 tbd->buf_length = packet->info.d_struct.txb->
3114 fragments[i]->len - IEEE80211_3ADDR_LEN;
3116 tbd->host_addr = pci_map_single(priv->pci_dev,
3117 packet->info.d_struct.
3120 IEEE80211_3ADDR_LEN,
3124 IPW_DEBUG_TX("data frag tbd TX%d P=%08x L=%d\n",
3125 txq->next, tbd->host_addr,
3128 pci_dma_sync_single_for_device(priv->pci_dev,
3134 txq->next %= txq->entries;
3137 txq->available -= 1 + packet->info.d_struct.txb->nr_frags;
3138 SET_STAT(&priv->txq_stat, txq->available);
3140 list_add_tail(element, &priv->fw_pend_list);
3141 INC_STAT(&priv->fw_pend_stat);
3144 if (txq->next != next) {
3145 /* kick off the DMA by notifying firmware the
3146 * write index has moved; make sure TBD stores are sync'd */
3147 write_register(priv->net_dev,
3148 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX,
3154 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv)
3156 struct net_device *dev = priv->net_dev;
3157 unsigned long flags;
3160 spin_lock_irqsave(&priv->low_lock, flags);
3161 ipw2100_disable_interrupts(priv);
3163 read_register(dev, IPW_REG_INTA, &inta);
3165 IPW_DEBUG_ISR("enter - INTA: 0x%08lX\n",
3166 (unsigned long)inta & IPW_INTERRUPT_MASK);
3171 /* We do not loop and keep polling for more interrupts as this
3172 * is frowned upon and doesn't play nicely with other potentially
3174 IPW_DEBUG_ISR("INTA: 0x%08lX\n",
3175 (unsigned long)inta & IPW_INTERRUPT_MASK);
3177 if (inta & IPW2100_INTA_FATAL_ERROR) {
3178 printk(KERN_WARNING DRV_NAME
3179 ": Fatal interrupt. Scheduling firmware restart.\n");
3181 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FATAL_ERROR);
3183 read_nic_dword(dev, IPW_NIC_FATAL_ERROR, &priv->fatal_error);
3184 IPW_DEBUG_INFO("%s: Fatal error value: 0x%08X\n",
3185 priv->net_dev->name, priv->fatal_error);
3187 read_nic_dword(dev, IPW_ERROR_ADDR(priv->fatal_error), &tmp);
3188 IPW_DEBUG_INFO("%s: Fatal error address value: 0x%08X\n",
3189 priv->net_dev->name, tmp);
3191 /* Wake up any sleeping jobs */
3192 schedule_reset(priv);
3195 if (inta & IPW2100_INTA_PARITY_ERROR) {
3196 printk(KERN_ERR DRV_NAME
3197 ": ***** PARITY ERROR INTERRUPT !!!! \n");
3199 write_register(dev, IPW_REG_INTA, IPW2100_INTA_PARITY_ERROR);
3202 if (inta & IPW2100_INTA_RX_TRANSFER) {
3203 IPW_DEBUG_ISR("RX interrupt\n");
3205 priv->rx_interrupts++;
3207 write_register(dev, IPW_REG_INTA, IPW2100_INTA_RX_TRANSFER);
3209 __ipw2100_rx_process(priv);
3210 __ipw2100_tx_complete(priv);
3213 if (inta & IPW2100_INTA_TX_TRANSFER) {
3214 IPW_DEBUG_ISR("TX interrupt\n");
3216 priv->tx_interrupts++;
3218 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_TRANSFER);
3220 __ipw2100_tx_complete(priv);
3221 ipw2100_tx_send_commands(priv);
3222 ipw2100_tx_send_data(priv);
3225 if (inta & IPW2100_INTA_TX_COMPLETE) {
3226 IPW_DEBUG_ISR("TX complete\n");
3228 write_register(dev, IPW_REG_INTA, IPW2100_INTA_TX_COMPLETE);
3230 __ipw2100_tx_complete(priv);
3233 if (inta & IPW2100_INTA_EVENT_INTERRUPT) {
3234 /* ipw2100_handle_event(dev); */
3236 write_register(dev, IPW_REG_INTA, IPW2100_INTA_EVENT_INTERRUPT);
3239 if (inta & IPW2100_INTA_FW_INIT_DONE) {
3240 IPW_DEBUG_ISR("FW init done interrupt\n");
3243 read_register(dev, IPW_REG_INTA, &tmp);
3244 if (tmp & (IPW2100_INTA_FATAL_ERROR |
3245 IPW2100_INTA_PARITY_ERROR)) {
3246 write_register(dev, IPW_REG_INTA,
3247 IPW2100_INTA_FATAL_ERROR |
3248 IPW2100_INTA_PARITY_ERROR);
3251 write_register(dev, IPW_REG_INTA, IPW2100_INTA_FW_INIT_DONE);
3254 if (inta & IPW2100_INTA_STATUS_CHANGE) {
3255 IPW_DEBUG_ISR("Status change interrupt\n");
3257 write_register(dev, IPW_REG_INTA, IPW2100_INTA_STATUS_CHANGE);
3260 if (inta & IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE) {
3261 IPW_DEBUG_ISR("slave host mode interrupt\n");
3263 write_register(dev, IPW_REG_INTA,
3264 IPW2100_INTA_SLAVE_MODE_HOST_COMMAND_DONE);
3268 ipw2100_enable_interrupts(priv);
3270 spin_unlock_irqrestore(&priv->low_lock, flags);
3272 IPW_DEBUG_ISR("exit\n");
3275 static irqreturn_t ipw2100_interrupt(int irq, void *data)
3277 struct ipw2100_priv *priv = data;
3278 u32 inta, inta_mask;
3283 spin_lock(&priv->low_lock);
3285 /* We check to see if we should be ignoring interrupts before
3286 * we touch the hardware. During ucode load if we try and handle
3287 * an interrupt we can cause keyboard problems as well as cause
3288 * the ucode to fail to initialize */
3289 if (!(priv->status & STATUS_INT_ENABLED)) {
3294 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask);
3295 read_register(priv->net_dev, IPW_REG_INTA, &inta);
3297 if (inta == 0xFFFFFFFF) {
3298 /* Hardware disappeared */
3299 printk(KERN_WARNING DRV_NAME ": IRQ INTA == 0xFFFFFFFF\n");
3303 inta &= IPW_INTERRUPT_MASK;
3305 if (!(inta & inta_mask)) {
3306 /* Shared interrupt */
3310 /* We disable the hardware interrupt here just to prevent unneeded
3311 * calls to be made. We disable this again within the actual
3312 * work tasklet, so if another part of the code re-enables the
3313 * interrupt, that is fine */
3314 ipw2100_disable_interrupts(priv);
3316 tasklet_schedule(&priv->irq_tasklet);
3317 spin_unlock(&priv->low_lock);
3321 spin_unlock(&priv->low_lock);
3325 static int ipw2100_tx(struct ieee80211_txb *txb, struct net_device *dev,
3328 struct ipw2100_priv *priv = ieee80211_priv(dev);
3329 struct list_head *element;
3330 struct ipw2100_tx_packet *packet;
3331 unsigned long flags;
3333 spin_lock_irqsave(&priv->low_lock, flags);
3335 if (!(priv->status & STATUS_ASSOCIATED)) {
3336 IPW_DEBUG_INFO("Can not transmit when not connected.\n");
3337 priv->ieee->stats.tx_carrier_errors++;
3338 netif_stop_queue(dev);
3342 if (list_empty(&priv->tx_free_list))
3345 element = priv->tx_free_list.next;
3346 packet = list_entry(element, struct ipw2100_tx_packet, list);
3348 packet->info.d_struct.txb = txb;
3350 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len);
3351 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len);
3353 packet->jiffy_start = jiffies;
3356 DEC_STAT(&priv->tx_free_stat);
3358 list_add_tail(element, &priv->tx_pend_list);
3359 INC_STAT(&priv->tx_pend_stat);
3361 ipw2100_tx_send_data(priv);
3363 spin_unlock_irqrestore(&priv->low_lock, flags);
3367 netif_stop_queue(dev);
3368 spin_unlock_irqrestore(&priv->low_lock, flags);
3372 static int ipw2100_msg_allocate(struct ipw2100_priv *priv)
3374 int i, j, err = -EINVAL;
3379 (struct ipw2100_tx_packet *)kmalloc(IPW_COMMAND_POOL_SIZE *
3383 if (!priv->msg_buffers) {
3384 printk(KERN_ERR DRV_NAME ": %s: PCI alloc failed for msg "
3385 "buffers.\n", priv->net_dev->name);
3389 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3390 v = pci_alloc_consistent(priv->pci_dev,
3391 sizeof(struct ipw2100_cmd_header), &p);
3393 printk(KERN_ERR DRV_NAME ": "
3394 "%s: PCI alloc failed for msg "
3395 "buffers.\n", priv->net_dev->name);
3400 memset(v, 0, sizeof(struct ipw2100_cmd_header));
3402 priv->msg_buffers[i].type = COMMAND;
3403 priv->msg_buffers[i].info.c_struct.cmd =
3404 (struct ipw2100_cmd_header *)v;
3405 priv->msg_buffers[i].info.c_struct.cmd_phys = p;
3408 if (i == IPW_COMMAND_POOL_SIZE)
3411 for (j = 0; j < i; j++) {
3412 pci_free_consistent(priv->pci_dev,
3413 sizeof(struct ipw2100_cmd_header),
3414 priv->msg_buffers[j].info.c_struct.cmd,
3415 priv->msg_buffers[j].info.c_struct.
3419 kfree(priv->msg_buffers);
3420 priv->msg_buffers = NULL;
3425 static int ipw2100_msg_initialize(struct ipw2100_priv *priv)
3429 INIT_LIST_HEAD(&priv->msg_free_list);
3430 INIT_LIST_HEAD(&priv->msg_pend_list);
3432 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++)
3433 list_add_tail(&priv->msg_buffers[i].list, &priv->msg_free_list);
3434 SET_STAT(&priv->msg_free_stat, i);
3439 static void ipw2100_msg_free(struct ipw2100_priv *priv)
3443 if (!priv->msg_buffers)
3446 for (i = 0; i < IPW_COMMAND_POOL_SIZE; i++) {
3447 pci_free_consistent(priv->pci_dev,
3448 sizeof(struct ipw2100_cmd_header),
3449 priv->msg_buffers[i].info.c_struct.cmd,
3450 priv->msg_buffers[i].info.c_struct.
3454 kfree(priv->msg_buffers);
3455 priv->msg_buffers = NULL;
3458 static ssize_t show_pci(struct device *d, struct device_attribute *attr,
3461 struct pci_dev *pci_dev = container_of(d, struct pci_dev, dev);
3466 for (i = 0; i < 16; i++) {
3467 out += sprintf(out, "[%08X] ", i * 16);
3468 for (j = 0; j < 16; j += 4) {
3469 pci_read_config_dword(pci_dev, i * 16 + j, &val);
3470 out += sprintf(out, "%08X ", val);
3472 out += sprintf(out, "\n");
3478 static DEVICE_ATTR(pci, S_IRUGO, show_pci, NULL);
3480 static ssize_t show_cfg(struct device *d, struct device_attribute *attr,
3483 struct ipw2100_priv *p = d->driver_data;
3484 return sprintf(buf, "0x%08x\n", (int)p->config);
3487 static DEVICE_ATTR(cfg, S_IRUGO, show_cfg, NULL);
3489 static ssize_t show_status(struct device *d, struct device_attribute *attr,
3492 struct ipw2100_priv *p = d->driver_data;
3493 return sprintf(buf, "0x%08x\n", (int)p->status);
3496 static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
3498 static ssize_t show_capability(struct device *d, struct device_attribute *attr,
3501 struct ipw2100_priv *p = d->driver_data;
3502 return sprintf(buf, "0x%08x\n", (int)p->capability);
3505 static DEVICE_ATTR(capability, S_IRUGO, show_capability, NULL);
3507 #define IPW2100_REG(x) { IPW_ ##x, #x }
3508 static const struct {
3512 IPW2100_REG(REG_GP_CNTRL),
3513 IPW2100_REG(REG_GPIO),
3514 IPW2100_REG(REG_INTA),
3515 IPW2100_REG(REG_INTA_MASK), IPW2100_REG(REG_RESET_REG),};
3516 #define IPW2100_NIC(x, s) { x, #x, s }
3517 static const struct {
3522 IPW2100_NIC(IPW2100_CONTROL_REG, 2),
3523 IPW2100_NIC(0x210014, 1), IPW2100_NIC(0x210000, 1),};
3524 #define IPW2100_ORD(x, d) { IPW_ORD_ ##x, #x, d }
3525 static const struct {
3530 IPW2100_ORD(STAT_TX_HOST_REQUESTS, "requested Host Tx's (MSDU)"),
3531 IPW2100_ORD(STAT_TX_HOST_COMPLETE,
3532 "successful Host Tx's (MSDU)"),
3533 IPW2100_ORD(STAT_TX_DIR_DATA,
3534 "successful Directed Tx's (MSDU)"),
3535 IPW2100_ORD(STAT_TX_DIR_DATA1,
3536 "successful Directed Tx's (MSDU) @ 1MB"),
3537 IPW2100_ORD(STAT_TX_DIR_DATA2,
3538 "successful Directed Tx's (MSDU) @ 2MB"),
3539 IPW2100_ORD(STAT_TX_DIR_DATA5_5,
3540 "successful Directed Tx's (MSDU) @ 5_5MB"),
3541 IPW2100_ORD(STAT_TX_DIR_DATA11,
3542 "successful Directed Tx's (MSDU) @ 11MB"),
3543 IPW2100_ORD(STAT_TX_NODIR_DATA1,
3544 "successful Non_Directed Tx's (MSDU) @ 1MB"),
3545 IPW2100_ORD(STAT_TX_NODIR_DATA2,
3546 "successful Non_Directed Tx's (MSDU) @ 2MB"),
3547 IPW2100_ORD(STAT_TX_NODIR_DATA5_5,
3548 "successful Non_Directed Tx's (MSDU) @ 5.5MB"),
3549 IPW2100_ORD(STAT_TX_NODIR_DATA11,
3550 "successful Non_Directed Tx's (MSDU) @ 11MB"),
3551 IPW2100_ORD(STAT_NULL_DATA, "successful NULL data Tx's"),
3552 IPW2100_ORD(STAT_TX_RTS, "successful Tx RTS"),
3553 IPW2100_ORD(STAT_TX_CTS, "successful Tx CTS"),
3554 IPW2100_ORD(STAT_TX_ACK, "successful Tx ACK"),
3555 IPW2100_ORD(STAT_TX_ASSN, "successful Association Tx's"),
3556 IPW2100_ORD(STAT_TX_ASSN_RESP,
3557 "successful Association response Tx's"),
3558 IPW2100_ORD(STAT_TX_REASSN,
3559 "successful Reassociation Tx's"),
3560 IPW2100_ORD(STAT_TX_REASSN_RESP,
3561 "successful Reassociation response Tx's"),
3562 IPW2100_ORD(STAT_TX_PROBE,
3563 "probes successfully transmitted"),
3564 IPW2100_ORD(STAT_TX_PROBE_RESP,
3565 "probe responses successfully transmitted"),
3566 IPW2100_ORD(STAT_TX_BEACON, "tx beacon"),
3567 IPW2100_ORD(STAT_TX_ATIM, "Tx ATIM"),
3568 IPW2100_ORD(STAT_TX_DISASSN,
3569 "successful Disassociation TX"),
3570 IPW2100_ORD(STAT_TX_AUTH, "successful Authentication Tx"),
3571 IPW2100_ORD(STAT_TX_DEAUTH,
3572 "successful Deauthentication TX"),
3573 IPW2100_ORD(STAT_TX_TOTAL_BYTES,
3574 "Total successful Tx data bytes"),
3575 IPW2100_ORD(STAT_TX_RETRIES, "Tx retries"),
3576 IPW2100_ORD(STAT_TX_RETRY1, "Tx retries at 1MBPS"),
3577 IPW2100_ORD(STAT_TX_RETRY2, "Tx retries at 2MBPS"),
3578 IPW2100_ORD(STAT_TX_RETRY5_5, "Tx retries at 5.5MBPS"),
3579 IPW2100_ORD(STAT_TX_RETRY11, "Tx retries at 11MBPS"),
3580 IPW2100_ORD(STAT_TX_FAILURES, "Tx Failures"),
3581 IPW2100_ORD(STAT_TX_MAX_TRIES_IN_HOP,
3582 "times max tries in a hop failed"),
3583 IPW2100_ORD(STAT_TX_DISASSN_FAIL,
3584 "times disassociation failed"),
3585 IPW2100_ORD(STAT_TX_ERR_CTS, "missed/bad CTS frames"),
3586 IPW2100_ORD(STAT_TX_ERR_ACK, "tx err due to acks"),
3587 IPW2100_ORD(STAT_RX_HOST, "packets passed to host"),
3588 IPW2100_ORD(STAT_RX_DIR_DATA, "directed packets"),
3589 IPW2100_ORD(STAT_RX_DIR_DATA1, "directed packets at 1MB"),
3590 IPW2100_ORD(STAT_RX_DIR_DATA2, "directed packets at 2MB"),
3591 IPW2100_ORD(STAT_RX_DIR_DATA5_5,
3592 "directed packets at 5.5MB"),
3593 IPW2100_ORD(STAT_RX_DIR_DATA11, "directed packets at 11MB"),
3594 IPW2100_ORD(STAT_RX_NODIR_DATA, "nondirected packets"),
3595 IPW2100_ORD(STAT_RX_NODIR_DATA1,
3596 "nondirected packets at 1MB"),
3597 IPW2100_ORD(STAT_RX_NODIR_DATA2,
3598 "nondirected packets at 2MB"),
3599 IPW2100_ORD(STAT_RX_NODIR_DATA5_5,
3600 "nondirected packets at 5.5MB"),
3601 IPW2100_ORD(STAT_RX_NODIR_DATA11,
3602 "nondirected packets at 11MB"),
3603 IPW2100_ORD(STAT_RX_NULL_DATA, "null data rx's"),
3604 IPW2100_ORD(STAT_RX_RTS, "Rx RTS"), IPW2100_ORD(STAT_RX_CTS,
3606 IPW2100_ORD(STAT_RX_ACK, "Rx ACK"),
3607 IPW2100_ORD(STAT_RX_CFEND, "Rx CF End"),
3608 IPW2100_ORD(STAT_RX_CFEND_ACK, "Rx CF End + CF Ack"),
3609 IPW2100_ORD(STAT_RX_ASSN, "Association Rx's"),
3610 IPW2100_ORD(STAT_RX_ASSN_RESP, "Association response Rx's"),
3611 IPW2100_ORD(STAT_RX_REASSN, "Reassociation Rx's"),
3612 IPW2100_ORD(STAT_RX_REASSN_RESP,
3613 "Reassociation response Rx's"),
3614 IPW2100_ORD(STAT_RX_PROBE, "probe Rx's"),
3615 IPW2100_ORD(STAT_RX_PROBE_RESP, "probe response Rx's"),
3616 IPW2100_ORD(STAT_RX_BEACON, "Rx beacon"),
3617 IPW2100_ORD(STAT_RX_ATIM, "Rx ATIM"),
3618 IPW2100_ORD(STAT_RX_DISASSN, "disassociation Rx"),
3619 IPW2100_ORD(STAT_RX_AUTH, "authentication Rx"),
3620 IPW2100_ORD(STAT_RX_DEAUTH, "deauthentication Rx"),
3621 IPW2100_ORD(STAT_RX_TOTAL_BYTES,
3622 "Total rx data bytes received"),
3623 IPW2100_ORD(STAT_RX_ERR_CRC, "packets with Rx CRC error"),
3624 IPW2100_ORD(STAT_RX_ERR_CRC1, "Rx CRC errors at 1MB"),
3625 IPW2100_ORD(STAT_RX_ERR_CRC2, "Rx CRC errors at 2MB"),
3626 IPW2100_ORD(STAT_RX_ERR_CRC5_5, "Rx CRC errors at 5.5MB"),
3627 IPW2100_ORD(STAT_RX_ERR_CRC11, "Rx CRC errors at 11MB"),
3628 IPW2100_ORD(STAT_RX_DUPLICATE1,
3629 "duplicate rx packets at 1MB"),
3630 IPW2100_ORD(STAT_RX_DUPLICATE2,
3631 "duplicate rx packets at 2MB"),
3632 IPW2100_ORD(STAT_RX_DUPLICATE5_5,
3633 "duplicate rx packets at 5.5MB"),
3634 IPW2100_ORD(STAT_RX_DUPLICATE11,
3635 "duplicate rx packets at 11MB"),
3636 IPW2100_ORD(STAT_RX_DUPLICATE, "duplicate rx packets"),
3637 IPW2100_ORD(PERS_DB_LOCK, "locking fw permanent db"),
3638 IPW2100_ORD(PERS_DB_SIZE, "size of fw permanent db"),
3639 IPW2100_ORD(PERS_DB_ADDR, "address of fw permanent db"),
3640 IPW2100_ORD(STAT_RX_INVALID_PROTOCOL,
3641 "rx frames with invalid protocol"),
3642 IPW2100_ORD(SYS_BOOT_TIME, "Boot time"),
3643 IPW2100_ORD(STAT_RX_NO_BUFFER,
3644 "rx frames rejected due to no buffer"),
3645 IPW2100_ORD(STAT_RX_MISSING_FRAG,
3646 "rx frames dropped due to missing fragment"),
3647 IPW2100_ORD(STAT_RX_ORPHAN_FRAG,
3648 "rx frames dropped due to non-sequential fragment"),
3649 IPW2100_ORD(STAT_RX_ORPHAN_FRAME,
3650 "rx frames dropped due to unmatched 1st frame"),
3651 IPW2100_ORD(STAT_RX_FRAG_AGEOUT,
3652 "rx frames dropped due to uncompleted frame"),
3653 IPW2100_ORD(STAT_RX_ICV_ERRORS,
3654 "ICV errors during decryption"),
3655 IPW2100_ORD(STAT_PSP_SUSPENSION, "times adapter suspended"),
3656 IPW2100_ORD(STAT_PSP_BCN_TIMEOUT, "beacon timeout"),
3657 IPW2100_ORD(STAT_PSP_POLL_TIMEOUT,
3658 "poll response timeouts"),
3659 IPW2100_ORD(STAT_PSP_NONDIR_TIMEOUT,
3660 "timeouts waiting for last {broad,multi}cast pkt"),
3661 IPW2100_ORD(STAT_PSP_RX_DTIMS, "PSP DTIMs received"),
3662 IPW2100_ORD(STAT_PSP_RX_TIMS, "PSP TIMs received"),
3663 IPW2100_ORD(STAT_PSP_STATION_ID, "PSP Station ID"),
3664 IPW2100_ORD(LAST_ASSN_TIME, "RTC time of last association"),
3665 IPW2100_ORD(STAT_PERCENT_MISSED_BCNS,
3666 "current calculation of % missed beacons"),
3667 IPW2100_ORD(STAT_PERCENT_RETRIES,
3668 "current calculation of % missed tx retries"),
3669 IPW2100_ORD(ASSOCIATED_AP_PTR,
3670 "0 if not associated, else pointer to AP table entry"),
3671 IPW2100_ORD(AVAILABLE_AP_CNT,
3672 "AP's decsribed in the AP table"),
3673 IPW2100_ORD(AP_LIST_PTR, "Ptr to list of available APs"),
3674 IPW2100_ORD(STAT_AP_ASSNS, "associations"),
3675 IPW2100_ORD(STAT_ASSN_FAIL, "association failures"),
3676 IPW2100_ORD(STAT_ASSN_RESP_FAIL,
3677 "failures due to response fail"),
3678 IPW2100_ORD(STAT_FULL_SCANS, "full scans"),
3679 IPW2100_ORD(CARD_DISABLED, "Card Disabled"),
3680 IPW2100_ORD(STAT_ROAM_INHIBIT,
3681 "times roaming was inhibited due to activity"),
3682 IPW2100_ORD(RSSI_AT_ASSN,
3683 "RSSI of associated AP at time of association"),
3684 IPW2100_ORD(STAT_ASSN_CAUSE1,
3685 "reassociation: no probe response or TX on hop"),
3686 IPW2100_ORD(STAT_ASSN_CAUSE2,
3687 "reassociation: poor tx/rx quality"),
3688 IPW2100_ORD(STAT_ASSN_CAUSE3,
3689 "reassociation: tx/rx quality (excessive AP load"),
3690 IPW2100_ORD(STAT_ASSN_CAUSE4,
3691 "reassociation: AP RSSI level"),
3692 IPW2100_ORD(STAT_ASSN_CAUSE5,
3693 "reassociations due to load leveling"),
3694 IPW2100_ORD(STAT_AUTH_FAIL, "times authentication failed"),
3695 IPW2100_ORD(STAT_AUTH_RESP_FAIL,
3696 "times authentication response failed"),
3697 IPW2100_ORD(STATION_TABLE_CNT,
3698 "entries in association table"),
3699 IPW2100_ORD(RSSI_AVG_CURR, "Current avg RSSI"),
3700 IPW2100_ORD(POWER_MGMT_MODE, "Power mode - 0=CAM, 1=PSP"),
3701 IPW2100_ORD(COUNTRY_CODE,
3702 "IEEE country code as recv'd from beacon"),
3703 IPW2100_ORD(COUNTRY_CHANNELS,
3704 "channels suported by country"),
3705 IPW2100_ORD(RESET_CNT, "adapter resets (warm)"),
3706 IPW2100_ORD(BEACON_INTERVAL, "Beacon interval"),
3707 IPW2100_ORD(ANTENNA_DIVERSITY,
3708 "TRUE if antenna diversity is disabled"),
3709 IPW2100_ORD(DTIM_PERIOD, "beacon intervals between DTIMs"),
3710 IPW2100_ORD(OUR_FREQ,
3711 "current radio freq lower digits - channel ID"),
3712 IPW2100_ORD(RTC_TIME, "current RTC time"),
3713 IPW2100_ORD(PORT_TYPE, "operating mode"),
3714 IPW2100_ORD(CURRENT_TX_RATE, "current tx rate"),
3715 IPW2100_ORD(SUPPORTED_RATES, "supported tx rates"),
3716 IPW2100_ORD(ATIM_WINDOW, "current ATIM Window"),
3717 IPW2100_ORD(BASIC_RATES, "basic tx rates"),
3718 IPW2100_ORD(NIC_HIGHEST_RATE, "NIC highest tx rate"),
3719 IPW2100_ORD(AP_HIGHEST_RATE, "AP highest tx rate"),
3720 IPW2100_ORD(CAPABILITIES,
3721 "Management frame capability field"),
3722 IPW2100_ORD(AUTH_TYPE, "Type of authentication"),
3723 IPW2100_ORD(RADIO_TYPE, "Adapter card platform type"),
3724 IPW2100_ORD(RTS_THRESHOLD,
3725 "Min packet length for RTS handshaking"),
3726 IPW2100_ORD(INT_MODE, "International mode"),
3727 IPW2100_ORD(FRAGMENTATION_THRESHOLD,
3728 "protocol frag threshold"),
3729 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_START_ADDRESS,
3730 "EEPROM offset in SRAM"),
3731 IPW2100_ORD(EEPROM_SRAM_DB_BLOCK_SIZE,
3732 "EEPROM size in SRAM"),
3733 IPW2100_ORD(EEPROM_SKU_CAPABILITY, "EEPROM SKU Capability"),
3734 IPW2100_ORD(EEPROM_IBSS_11B_CHANNELS,
3735 "EEPROM IBSS 11b channel set"),
3736 IPW2100_ORD(MAC_VERSION, "MAC Version"),
3737 IPW2100_ORD(MAC_REVISION, "MAC Revision"),
3738 IPW2100_ORD(RADIO_VERSION, "Radio Version"),
3739 IPW2100_ORD(NIC_MANF_DATE_TIME, "MANF Date/Time STAMP"),
3740 IPW2100_ORD(UCODE_VERSION, "Ucode Version"),};
3742 static ssize_t show_registers(struct device *d, struct device_attribute *attr,
3746 struct ipw2100_priv *priv = dev_get_drvdata(d);
3747 struct net_device *dev = priv->net_dev;
3751 out += sprintf(out, "%30s [Address ] : Hex\n", "Register");
3753 for (i = 0; i < ARRAY_SIZE(hw_data); i++) {
3754 read_register(dev, hw_data[i].addr, &val);
3755 out += sprintf(out, "%30s [%08X] : %08X\n",
3756 hw_data[i].name, hw_data[i].addr, val);
3762 static DEVICE_ATTR(registers, S_IRUGO, show_registers, NULL);
3764 static ssize_t show_hardware(struct device *d, struct device_attribute *attr,
3767 struct ipw2100_priv *priv = dev_get_drvdata(d);
3768 struct net_device *dev = priv->net_dev;
3772 out += sprintf(out, "%30s [Address ] : Hex\n", "NIC entry");
3774 for (i = 0; i < ARRAY_SIZE(nic_data); i++) {
3779 switch (nic_data[i].size) {
3781 read_nic_byte(dev, nic_data[i].addr, &tmp8);
3782 out += sprintf(out, "%30s [%08X] : %02X\n",
3783 nic_data[i].name, nic_data[i].addr,
3787 read_nic_word(dev, nic_data[i].addr, &tmp16);
3788 out += sprintf(out, "%30s [%08X] : %04X\n",
3789 nic_data[i].name, nic_data[i].addr,
3793 read_nic_dword(dev, nic_data[i].addr, &tmp32);
3794 out += sprintf(out, "%30s [%08X] : %08X\n",
3795 nic_data[i].name, nic_data[i].addr,
3803 static DEVICE_ATTR(hardware, S_IRUGO, show_hardware, NULL);
3805 static ssize_t show_memory(struct device *d, struct device_attribute *attr,
3808 struct ipw2100_priv *priv = dev_get_drvdata(d);
3809 struct net_device *dev = priv->net_dev;
3810 static unsigned long loop = 0;
3816 if (loop >= 0x30000)
3819 /* sysfs provides us PAGE_SIZE buffer */
3820 while (len < PAGE_SIZE - 128 && loop < 0x30000) {
3822 if (priv->snapshot[0])
3823 for (i = 0; i < 4; i++)
3825 *(u32 *) SNAPSHOT_ADDR(loop + i * 4);
3827 for (i = 0; i < 4; i++)
3828 read_nic_dword(dev, loop + i * 4, &buffer[i]);
3831 len += sprintf(buf + len,
3836 ((u8 *) buffer)[0x0],
3837 ((u8 *) buffer)[0x1],
3838 ((u8 *) buffer)[0x2],
3839 ((u8 *) buffer)[0x3],
3840 ((u8 *) buffer)[0x4],
3841 ((u8 *) buffer)[0x5],
3842 ((u8 *) buffer)[0x6],
3843 ((u8 *) buffer)[0x7],
3844 ((u8 *) buffer)[0x8],
3845 ((u8 *) buffer)[0x9],
3846 ((u8 *) buffer)[0xa],
3847 ((u8 *) buffer)[0xb],
3848 ((u8 *) buffer)[0xc],
3849 ((u8 *) buffer)[0xd],
3850 ((u8 *) buffer)[0xe],
3851 ((u8 *) buffer)[0xf]);
3853 len += sprintf(buf + len, "%s\n",
3854 snprint_line(line, sizeof(line),
3855 (u8 *) buffer, 16, loop));
3862 static ssize_t store_memory(struct device *d, struct device_attribute *attr,
3863 const char *buf, size_t count)
3865 struct ipw2100_priv *priv = dev_get_drvdata(d);
3866 struct net_device *dev = priv->net_dev;
3867 const char *p = buf;
3869 (void)dev; /* kill unused-var warning for debug-only code */
3875 (count >= 2 && tolower(p[0]) == 'o' && tolower(p[1]) == 'n')) {
3876 IPW_DEBUG_INFO("%s: Setting memory dump to RAW mode.\n",
3880 } else if (p[0] == '0' || (count >= 2 && tolower(p[0]) == 'o' &&
3881 tolower(p[1]) == 'f')) {
3882 IPW_DEBUG_INFO("%s: Setting memory dump to HEX mode.\n",
3886 } else if (tolower(p[0]) == 'r') {
3887 IPW_DEBUG_INFO("%s: Resetting firmware snapshot.\n", dev->name);
3888 ipw2100_snapshot_free(priv);
3891 IPW_DEBUG_INFO("%s: Usage: 0|on = HEX, 1|off = RAW, "
3892 "reset = clear memory snapshot\n", dev->name);
3897 static DEVICE_ATTR(memory, S_IWUSR | S_IRUGO, show_memory, store_memory);
3899 static ssize_t show_ordinals(struct device *d, struct device_attribute *attr,
3902 struct ipw2100_priv *priv = dev_get_drvdata(d);
3906 static int loop = 0;
3908 if (priv->status & STATUS_RF_KILL_MASK)
3911 if (loop >= ARRAY_SIZE(ord_data))
3914 /* sysfs provides us PAGE_SIZE buffer */
3915 while (len < PAGE_SIZE - 128 && loop < ARRAY_SIZE(ord_data)) {
3916 val_len = sizeof(u32);
3918 if (ipw2100_get_ordinal(priv, ord_data[loop].index, &val,
3920 len += sprintf(buf + len, "[0x%02X] = ERROR %s\n",
3921 ord_data[loop].index,
3922 ord_data[loop].desc);
3924 len += sprintf(buf + len, "[0x%02X] = 0x%08X %s\n",
3925 ord_data[loop].index, val,
3926 ord_data[loop].desc);
3933 static DEVICE_ATTR(ordinals, S_IRUGO, show_ordinals, NULL);
3935 static ssize_t show_stats(struct device *d, struct device_attribute *attr,
3938 struct ipw2100_priv *priv = dev_get_drvdata(d);
3941 out += sprintf(out, "interrupts: %d {tx: %d, rx: %d, other: %d}\n",
3942 priv->interrupts, priv->tx_interrupts,
3943 priv->rx_interrupts, priv->inta_other);
3944 out += sprintf(out, "firmware resets: %d\n", priv->resets);
3945 out += sprintf(out, "firmware hangs: %d\n", priv->hangs);
3946 #ifdef CONFIG_IPW2100_DEBUG
3947 out += sprintf(out, "packet mismatch image: %s\n",
3948 priv->snapshot[0] ? "YES" : "NO");
3954 static DEVICE_ATTR(stats, S_IRUGO, show_stats, NULL);
3956 static int ipw2100_switch_mode(struct ipw2100_priv *priv, u32 mode)
3960 if (mode == priv->ieee->iw_mode)
3963 err = ipw2100_disable_adapter(priv);
3965 printk(KERN_ERR DRV_NAME ": %s: Could not disable adapter %d\n",
3966 priv->net_dev->name, err);
3972 priv->net_dev->type = ARPHRD_ETHER;
3975 priv->net_dev->type = ARPHRD_ETHER;
3977 #ifdef CONFIG_IPW2100_MONITOR
3978 case IW_MODE_MONITOR:
3979 priv->last_mode = priv->ieee->iw_mode;
3980 priv->net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
3982 #endif /* CONFIG_IPW2100_MONITOR */
3985 priv->ieee->iw_mode = mode;
3988 /* Indicate ipw2100_download_firmware download firmware
3989 * from disk instead of memory. */
3990 ipw2100_firmware.version = 0;
3993 printk(KERN_INFO "%s: Reseting on mode change.\n", priv->net_dev->name);
3994 priv->reset_backoff = 0;
3995 schedule_reset(priv);
4000 static ssize_t show_internals(struct device *d, struct device_attribute *attr,
4003 struct ipw2100_priv *priv = dev_get_drvdata(d);
4006 #define DUMP_VAR(x,y) len += sprintf(buf + len, # x ": %" y "\n", priv-> x)
4008 if (priv->status & STATUS_ASSOCIATED)
4009 len += sprintf(buf + len, "connected: %lu\n",
4010 get_seconds() - priv->connect_start);
4012 len += sprintf(buf + len, "not connected\n");
4014 DUMP_VAR(ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx], "p");
4015 DUMP_VAR(status, "08lx");
4016 DUMP_VAR(config, "08lx");
4017 DUMP_VAR(capability, "08lx");
4020 sprintf(buf + len, "last_rtc: %lu\n",
4021 (unsigned long)priv->last_rtc);
4023 DUMP_VAR(fatal_error, "d");
4024 DUMP_VAR(stop_hang_check, "d");
4025 DUMP_VAR(stop_rf_kill, "d");
4026 DUMP_VAR(messages_sent, "d");
4028 DUMP_VAR(tx_pend_stat.value, "d");
4029 DUMP_VAR(tx_pend_stat.hi, "d");
4031 DUMP_VAR(tx_free_stat.value, "d");
4032 DUMP_VAR(tx_free_stat.lo, "d");
4034 DUMP_VAR(msg_free_stat.value, "d");
4035 DUMP_VAR(msg_free_stat.lo, "d");
4037 DUMP_VAR(msg_pend_stat.value, "d");
4038 DUMP_VAR(msg_pend_stat.hi, "d");
4040 DUMP_VAR(fw_pend_stat.value, "d");
4041 DUMP_VAR(fw_pend_stat.hi, "d");
4043 DUMP_VAR(txq_stat.value, "d");
4044 DUMP_VAR(txq_stat.lo, "d");
4046 DUMP_VAR(ieee->scans, "d");
4047 DUMP_VAR(reset_backoff, "d");
4052 static DEVICE_ATTR(internals, S_IRUGO, show_internals, NULL);
4054 static ssize_t show_bssinfo(struct device *d, struct device_attribute *attr,
4057 struct ipw2100_priv *priv = dev_get_drvdata(d);
4058 char essid[IW_ESSID_MAX_SIZE + 1];
4062 unsigned int length;
4065 if (priv->status & STATUS_RF_KILL_MASK)
4068 memset(essid, 0, sizeof(essid));
4069 memset(bssid, 0, sizeof(bssid));
4071 length = IW_ESSID_MAX_SIZE;
4072 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_SSID, essid, &length);
4074 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4077 length = sizeof(bssid);
4078 ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
4081 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4084 length = sizeof(u32);
4085 ret = ipw2100_get_ordinal(priv, IPW_ORD_OUR_FREQ, &chan, &length);
4087 IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
4090 out += sprintf(out, "ESSID: %s\n", essid);
4091 out += sprintf(out, "BSSID: %pM\n", bssid);
4092 out += sprintf(out, "Channel: %d\n", chan);
4097 static DEVICE_ATTR(bssinfo, S_IRUGO, show_bssinfo, NULL);
4099 #ifdef CONFIG_IPW2100_DEBUG
4100 static ssize_t show_debug_level(struct device_driver *d, char *buf)
4102 return sprintf(buf, "0x%08X\n", ipw2100_debug_level);
4105 static ssize_t store_debug_level(struct device_driver *d,
4106 const char *buf, size_t count)
4108 char *p = (char *)buf;
4111 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
4113 if (p[0] == 'x' || p[0] == 'X')
4115 val = simple_strtoul(p, &p, 16);
4117 val = simple_strtoul(p, &p, 10);
4119 IPW_DEBUG_INFO(": %s is not in hex or decimal form.\n", buf);
4121 ipw2100_debug_level = val;
4123 return strnlen(buf, count);
4126 static DRIVER_ATTR(debug_level, S_IWUSR | S_IRUGO, show_debug_level,
4128 #endif /* CONFIG_IPW2100_DEBUG */
4130 static ssize_t show_fatal_error(struct device *d,
4131 struct device_attribute *attr, char *buf)
4133 struct ipw2100_priv *priv = dev_get_drvdata(d);
4137 if (priv->fatal_error)
4138 out += sprintf(out, "0x%08X\n", priv->fatal_error);
4140 out += sprintf(out, "0\n");
4142 for (i = 1; i <= IPW2100_ERROR_QUEUE; i++) {
4143 if (!priv->fatal_errors[(priv->fatal_index - i) %
4144 IPW2100_ERROR_QUEUE])
4147 out += sprintf(out, "%d. 0x%08X\n", i,
4148 priv->fatal_errors[(priv->fatal_index - i) %
4149 IPW2100_ERROR_QUEUE]);
4155 static ssize_t store_fatal_error(struct device *d,
4156 struct device_attribute *attr, const char *buf,
4159 struct ipw2100_priv *priv = dev_get_drvdata(d);
4160 schedule_reset(priv);
4164 static DEVICE_ATTR(fatal_error, S_IWUSR | S_IRUGO, show_fatal_error,
4167 static ssize_t show_scan_age(struct device *d, struct device_attribute *attr,
4170 struct ipw2100_priv *priv = dev_get_drvdata(d);
4171 return sprintf(buf, "%d\n", priv->ieee->scan_age);
4174 static ssize_t store_scan_age(struct device *d, struct device_attribute *attr,
4175 const char *buf, size_t count)
4177 struct ipw2100_priv *priv = dev_get_drvdata(d);
4178 struct net_device *dev = priv->net_dev;
4179 char buffer[] = "00000000";
4181 (sizeof(buffer) - 1) > count ? count : sizeof(buffer) - 1;
4185 (void)dev; /* kill unused-var warning for debug-only code */
4187 IPW_DEBUG_INFO("enter\n");
4189 strncpy(buffer, buf, len);
4192 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
4194 if (p[0] == 'x' || p[0] == 'X')
4196 val = simple_strtoul(p, &p, 16);
4198 val = simple_strtoul(p, &p, 10);
4200 IPW_DEBUG_INFO("%s: user supplied invalid value.\n", dev->name);
4202 priv->ieee->scan_age = val;
4203 IPW_DEBUG_INFO("set scan_age = %u\n", priv->ieee->scan_age);
4206 IPW_DEBUG_INFO("exit\n");
4210 static DEVICE_ATTR(scan_age, S_IWUSR | S_IRUGO, show_scan_age, store_scan_age);
4212 static ssize_t show_rf_kill(struct device *d, struct device_attribute *attr,
4215 /* 0 - RF kill not enabled
4216 1 - SW based RF kill active (sysfs)
4217 2 - HW based RF kill active
4218 3 - Both HW and SW baed RF kill active */
4219 struct ipw2100_priv *priv = (struct ipw2100_priv *)d->driver_data;
4220 int val = ((priv->status & STATUS_RF_KILL_SW) ? 0x1 : 0x0) |
4221 (rf_kill_active(priv) ? 0x2 : 0x0);
4222 return sprintf(buf, "%i\n", val);
4225 static int ipw_radio_kill_sw(struct ipw2100_priv *priv, int disable_radio)
4227 if ((disable_radio ? 1 : 0) ==
4228 (priv->status & STATUS_RF_KILL_SW ? 1 : 0))
4231 IPW_DEBUG_RF_KILL("Manual SW RF Kill set to: RADIO %s\n",
4232 disable_radio ? "OFF" : "ON");
4234 mutex_lock(&priv->action_mutex);
4236 if (disable_radio) {
4237 priv->status |= STATUS_RF_KILL_SW;
4240 priv->status &= ~STATUS_RF_KILL_SW;
4241 if (rf_kill_active(priv)) {
4242 IPW_DEBUG_RF_KILL("Can not turn radio back on - "
4243 "disabled by HW switch\n");
4244 /* Make sure the RF_KILL check timer is running */
4245 priv->stop_rf_kill = 0;
4246 cancel_delayed_work(&priv->rf_kill);
4247 queue_delayed_work(priv->workqueue, &priv->rf_kill,
4248 round_jiffies_relative(HZ));
4250 schedule_reset(priv);
4253 mutex_unlock(&priv->action_mutex);
4257 static ssize_t store_rf_kill(struct device *d, struct device_attribute *attr,
4258 const char *buf, size_t count)
4260 struct ipw2100_priv *priv = dev_get_drvdata(d);
4261 ipw_radio_kill_sw(priv, buf[0] == '1');
4265 static DEVICE_ATTR(rf_kill, S_IWUSR | S_IRUGO, show_rf_kill, store_rf_kill);
4267 static struct attribute *ipw2100_sysfs_entries[] = {
4268 &dev_attr_hardware.attr,
4269 &dev_attr_registers.attr,
4270 &dev_attr_ordinals.attr,
4272 &dev_attr_stats.attr,
4273 &dev_attr_internals.attr,
4274 &dev_attr_bssinfo.attr,
4275 &dev_attr_memory.attr,
4276 &dev_attr_scan_age.attr,
4277 &dev_attr_fatal_error.attr,
4278 &dev_attr_rf_kill.attr,
4280 &dev_attr_status.attr,
4281 &dev_attr_capability.attr,
4285 static struct attribute_group ipw2100_attribute_group = {
4286 .attrs = ipw2100_sysfs_entries,
4289 static int status_queue_allocate(struct ipw2100_priv *priv, int entries)
4291 struct ipw2100_status_queue *q = &priv->status_queue;
4293 IPW_DEBUG_INFO("enter\n");
4295 q->size = entries * sizeof(struct ipw2100_status);
4297 (struct ipw2100_status *)pci_alloc_consistent(priv->pci_dev,
4300 IPW_DEBUG_WARNING("Can not allocate status queue.\n");
4304 memset(q->drv, 0, q->size);
4306 IPW_DEBUG_INFO("exit\n");
4311 static void status_queue_free(struct ipw2100_priv *priv)
4313 IPW_DEBUG_INFO("enter\n");
4315 if (priv->status_queue.drv) {
4316 pci_free_consistent(priv->pci_dev, priv->status_queue.size,
4317 priv->status_queue.drv,
4318 priv->status_queue.nic);
4319 priv->status_queue.drv = NULL;
4322 IPW_DEBUG_INFO("exit\n");
4325 static int bd_queue_allocate(struct ipw2100_priv *priv,
4326 struct ipw2100_bd_queue *q, int entries)
4328 IPW_DEBUG_INFO("enter\n");
4330 memset(q, 0, sizeof(struct ipw2100_bd_queue));
4332 q->entries = entries;
4333 q->size = entries * sizeof(struct ipw2100_bd);
4334 q->drv = pci_alloc_consistent(priv->pci_dev, q->size, &q->nic);
4337 ("can't allocate shared memory for buffer descriptors\n");
4340 memset(q->drv, 0, q->size);
4342 IPW_DEBUG_INFO("exit\n");
4347 static void bd_queue_free(struct ipw2100_priv *priv, struct ipw2100_bd_queue *q)
4349 IPW_DEBUG_INFO("enter\n");
4355 pci_free_consistent(priv->pci_dev, q->size, q->drv, q->nic);
4359 IPW_DEBUG_INFO("exit\n");
4362 static void bd_queue_initialize(struct ipw2100_priv *priv,
4363 struct ipw2100_bd_queue *q, u32 base, u32 size,
4366 IPW_DEBUG_INFO("enter\n");
4368 IPW_DEBUG_INFO("initializing bd queue at virt=%p, phys=%08x\n", q->drv,
4371 write_register(priv->net_dev, base, q->nic);
4372 write_register(priv->net_dev, size, q->entries);
4373 write_register(priv->net_dev, r, q->oldest);
4374 write_register(priv->net_dev, w, q->next);
4376 IPW_DEBUG_INFO("exit\n");
4379 static void ipw2100_kill_workqueue(struct ipw2100_priv *priv)
4381 if (priv->workqueue) {
4382 priv->stop_rf_kill = 1;
4383 priv->stop_hang_check = 1;
4384 cancel_delayed_work(&priv->reset_work);
4385 cancel_delayed_work(&priv->security_work);
4386 cancel_delayed_work(&priv->wx_event_work);
4387 cancel_delayed_work(&priv->hang_check);
4388 cancel_delayed_work(&priv->rf_kill);
4389 cancel_delayed_work(&priv->scan_event_later);
4390 destroy_workqueue(priv->workqueue);
4391 priv->workqueue = NULL;
4395 static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
4397 int i, j, err = -EINVAL;
4401 IPW_DEBUG_INFO("enter\n");
4403 err = bd_queue_allocate(priv, &priv->tx_queue, TX_QUEUE_LENGTH);
4405 IPW_DEBUG_ERROR("%s: failed bd_queue_allocate\n",
4406 priv->net_dev->name);
4411 (struct ipw2100_tx_packet *)kmalloc(TX_PENDED_QUEUE_LENGTH *
4415 if (!priv->tx_buffers) {
4416 printk(KERN_ERR DRV_NAME
4417 ": %s: alloc failed form tx buffers.\n",
4418 priv->net_dev->name);
4419 bd_queue_free(priv, &priv->tx_queue);
4423 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4424 v = pci_alloc_consistent(priv->pci_dev,
4425 sizeof(struct ipw2100_data_header),
4428 printk(KERN_ERR DRV_NAME
4429 ": %s: PCI alloc failed for tx " "buffers.\n",
4430 priv->net_dev->name);
4435 priv->tx_buffers[i].type = DATA;
4436 priv->tx_buffers[i].info.d_struct.data =
4437 (struct ipw2100_data_header *)v;
4438 priv->tx_buffers[i].info.d_struct.data_phys = p;
4439 priv->tx_buffers[i].info.d_struct.txb = NULL;
4442 if (i == TX_PENDED_QUEUE_LENGTH)
4445 for (j = 0; j < i; j++) {
4446 pci_free_consistent(priv->pci_dev,
4447 sizeof(struct ipw2100_data_header),
4448 priv->tx_buffers[j].info.d_struct.data,
4449 priv->tx_buffers[j].info.d_struct.
4453 kfree(priv->tx_buffers);
4454 priv->tx_buffers = NULL;
4459 static void ipw2100_tx_initialize(struct ipw2100_priv *priv)
4463 IPW_DEBUG_INFO("enter\n");
4466 * reinitialize packet info lists
4468 INIT_LIST_HEAD(&priv->fw_pend_list);
4469 INIT_STAT(&priv->fw_pend_stat);
4472 * reinitialize lists
4474 INIT_LIST_HEAD(&priv->tx_pend_list);
4475 INIT_LIST_HEAD(&priv->tx_free_list);
4476 INIT_STAT(&priv->tx_pend_stat);
4477 INIT_STAT(&priv->tx_free_stat);
4479 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4480 /* We simply drop any SKBs that have been queued for
4482 if (priv->tx_buffers[i].info.d_struct.txb) {
4483 ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.
4485 priv->tx_buffers[i].info.d_struct.txb = NULL;
4488 list_add_tail(&priv->tx_buffers[i].list, &priv->tx_free_list);
4491 SET_STAT(&priv->tx_free_stat, i);
4493 priv->tx_queue.oldest = 0;
4494 priv->tx_queue.available = priv->tx_queue.entries;
4495 priv->tx_queue.next = 0;
4496 INIT_STAT(&priv->txq_stat);
4497 SET_STAT(&priv->txq_stat, priv->tx_queue.available);
4499 bd_queue_initialize(priv, &priv->tx_queue,
4500 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_BASE,
4501 IPW_MEM_HOST_SHARED_TX_QUEUE_BD_SIZE,
4502 IPW_MEM_HOST_SHARED_TX_QUEUE_READ_INDEX,
4503 IPW_MEM_HOST_SHARED_TX_QUEUE_WRITE_INDEX);
4505 IPW_DEBUG_INFO("exit\n");
4509 static void ipw2100_tx_free(struct ipw2100_priv *priv)
4513 IPW_DEBUG_INFO("enter\n");
4515 bd_queue_free(priv, &priv->tx_queue);
4517 if (!priv->tx_buffers)
4520 for (i = 0; i < TX_PENDED_QUEUE_LENGTH; i++) {
4521 if (priv->tx_buffers[i].info.d_struct.txb) {
4522 ieee80211_txb_free(priv->tx_buffers[i].info.d_struct.
4524 priv->tx_buffers[i].info.d_struct.txb = NULL;
4526 if (priv->tx_buffers[i].info.d_struct.data)
4527 pci_free_consistent(priv->pci_dev,
4528 sizeof(struct ipw2100_data_header),
4529 priv->tx_buffers[i].info.d_struct.
4531 priv->tx_buffers[i].info.d_struct.
4535 kfree(priv->tx_buffers);
4536 priv->tx_buffers = NULL;
4538 IPW_DEBUG_INFO("exit\n");
4541 static int ipw2100_rx_allocate(struct ipw2100_priv *priv)
4543 int i, j, err = -EINVAL;
4545 IPW_DEBUG_INFO("enter\n");
4547 err = bd_queue_allocate(priv, &priv->rx_queue, RX_QUEUE_LENGTH);
4549 IPW_DEBUG_INFO("failed bd_queue_allocate\n");
4553 err = status_queue_allocate(priv, RX_QUEUE_LENGTH);
4555 IPW_DEBUG_INFO("failed status_queue_allocate\n");
4556 bd_queue_free(priv, &priv->rx_queue);
4563 priv->rx_buffers = (struct ipw2100_rx_packet *)
4564 kmalloc(RX_QUEUE_LENGTH * sizeof(struct ipw2100_rx_packet),
4566 if (!priv->rx_buffers) {
4567 IPW_DEBUG_INFO("can't allocate rx packet buffer table\n");
4569 bd_queue_free(priv, &priv->rx_queue);
4571 status_queue_free(priv);
4576 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4577 struct ipw2100_rx_packet *packet = &priv->rx_buffers[i];
4579 err = ipw2100_alloc_skb(priv, packet);
4580 if (unlikely(err)) {
4585 /* The BD holds the cache aligned address */
4586 priv->rx_queue.drv[i].host_addr = packet->dma_addr;
4587 priv->rx_queue.drv[i].buf_length = IPW_RX_NIC_BUFFER_LENGTH;
4588 priv->status_queue.drv[i].status_fields = 0;
4591 if (i == RX_QUEUE_LENGTH)
4594 for (j = 0; j < i; j++) {
4595 pci_unmap_single(priv->pci_dev, priv->rx_buffers[j].dma_addr,
4596 sizeof(struct ipw2100_rx_packet),
4597 PCI_DMA_FROMDEVICE);
4598 dev_kfree_skb(priv->rx_buffers[j].skb);
4601 kfree(priv->rx_buffers);
4602 priv->rx_buffers = NULL;
4604 bd_queue_free(priv, &priv->rx_queue);
4606 status_queue_free(priv);
4611 static void ipw2100_rx_initialize(struct ipw2100_priv *priv)
4613 IPW_DEBUG_INFO("enter\n");
4615 priv->rx_queue.oldest = 0;
4616 priv->rx_queue.available = priv->rx_queue.entries - 1;
4617 priv->rx_queue.next = priv->rx_queue.entries - 1;
4619 INIT_STAT(&priv->rxq_stat);
4620 SET_STAT(&priv->rxq_stat, priv->rx_queue.available);
4622 bd_queue_initialize(priv, &priv->rx_queue,
4623 IPW_MEM_HOST_SHARED_RX_BD_BASE,
4624 IPW_MEM_HOST_SHARED_RX_BD_SIZE,
4625 IPW_MEM_HOST_SHARED_RX_READ_INDEX,
4626 IPW_MEM_HOST_SHARED_RX_WRITE_INDEX);
4628 /* set up the status queue */
4629 write_register(priv->net_dev, IPW_MEM_HOST_SHARED_RX_STATUS_BASE,
4630 priv->status_queue.nic);
4632 IPW_DEBUG_INFO("exit\n");
4635 static void ipw2100_rx_free(struct ipw2100_priv *priv)
4639 IPW_DEBUG_INFO("enter\n");
4641 bd_queue_free(priv, &priv->rx_queue);
4642 status_queue_free(priv);
4644 if (!priv->rx_buffers)
4647 for (i = 0; i < RX_QUEUE_LENGTH; i++) {
4648 if (priv->rx_buffers[i].rxp) {
4649 pci_unmap_single(priv->pci_dev,
4650 priv->rx_buffers[i].dma_addr,
4651 sizeof(struct ipw2100_rx),
4652 PCI_DMA_FROMDEVICE);
4653 dev_kfree_skb(priv->rx_buffers[i].skb);
4657 kfree(priv->rx_buffers);
4658 priv->rx_buffers = NULL;
4660 IPW_DEBUG_INFO("exit\n");
4663 static int ipw2100_read_mac_address(struct ipw2100_priv *priv)
4665 u32 length = ETH_ALEN;
4670 err = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ADAPTER_MAC, addr, &length);
4672 IPW_DEBUG_INFO("MAC address read failed\n");
4676 memcpy(priv->net_dev->dev_addr, addr, ETH_ALEN);
4677 IPW_DEBUG_INFO("card MAC is %pM\n", priv->net_dev->dev_addr);
4682 /********************************************************************
4686 ********************************************************************/
4688 static int ipw2100_set_mac_address(struct ipw2100_priv *priv, int batch_mode)
4690 struct host_command cmd = {
4691 .host_command = ADAPTER_ADDRESS,
4692 .host_command_sequence = 0,
4693 .host_command_length = ETH_ALEN
4697 IPW_DEBUG_HC("SET_MAC_ADDRESS\n");
4699 IPW_DEBUG_INFO("enter\n");
4701 if (priv->config & CFG_CUSTOM_MAC) {
4702 memcpy(cmd.host_command_parameters, priv->mac_addr, ETH_ALEN);
4703 memcpy(priv->net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
4705 memcpy(cmd.host_command_parameters, priv->net_dev->dev_addr,
4708 err = ipw2100_hw_send_command(priv, &cmd);
4710 IPW_DEBUG_INFO("exit\n");
4714 static int ipw2100_set_port_type(struct ipw2100_priv *priv, u32 port_type,
4717 struct host_command cmd = {
4718 .host_command = PORT_TYPE,
4719 .host_command_sequence = 0,
4720 .host_command_length = sizeof(u32)
4724 switch (port_type) {
4726 cmd.host_command_parameters[0] = IPW_BSS;
4729 cmd.host_command_parameters[0] = IPW_IBSS;
4733 IPW_DEBUG_HC("PORT_TYPE: %s\n",
4734 port_type == IPW_IBSS ? "Ad-Hoc" : "Managed");
4737 err = ipw2100_disable_adapter(priv);
4739 printk(KERN_ERR DRV_NAME
4740 ": %s: Could not disable adapter %d\n",
4741 priv->net_dev->name, err);
4746 /* send cmd to firmware */
4747 err = ipw2100_hw_send_command(priv, &cmd);
4750 ipw2100_enable_adapter(priv);
4755 static int ipw2100_set_channel(struct ipw2100_priv *priv, u32 channel,
4758 struct host_command cmd = {
4759 .host_command = CHANNEL,
4760 .host_command_sequence = 0,
4761 .host_command_length = sizeof(u32)
4765 cmd.host_command_parameters[0] = channel;
4767 IPW_DEBUG_HC("CHANNEL: %d\n", channel);
4769 /* If BSS then we don't support channel selection */
4770 if (priv->ieee->iw_mode == IW_MODE_INFRA)
4773 if ((channel != 0) &&
4774 ((channel < REG_MIN_CHANNEL) || (channel > REG_MAX_CHANNEL)))
4778 err = ipw2100_disable_adapter(priv);
4783 err = ipw2100_hw_send_command(priv, &cmd);
4785 IPW_DEBUG_INFO("Failed to set channel to %d", channel);
4790 priv->config |= CFG_STATIC_CHANNEL;
4792 priv->config &= ~CFG_STATIC_CHANNEL;
4794 priv->channel = channel;
4797 err = ipw2100_enable_adapter(priv);
4805 static int ipw2100_system_config(struct ipw2100_priv *priv, int batch_mode)
4807 struct host_command cmd = {
4808 .host_command = SYSTEM_CONFIG,
4809 .host_command_sequence = 0,
4810 .host_command_length = 12,
4812 u32 ibss_mask, len = sizeof(u32);
4815 /* Set system configuration */
4818 err = ipw2100_disable_adapter(priv);
4823 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
4824 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_AUTO_START;
4826 cmd.host_command_parameters[0] |= IPW_CFG_IBSS_MASK |
4827 IPW_CFG_BSS_MASK | IPW_CFG_802_1x_ENABLE;
4829 if (!(priv->config & CFG_LONG_PREAMBLE))
4830 cmd.host_command_parameters[0] |= IPW_CFG_PREAMBLE_AUTO;
4832 err = ipw2100_get_ordinal(priv,
4833 IPW_ORD_EEPROM_IBSS_11B_CHANNELS,
4836 ibss_mask = IPW_IBSS_11B_DEFAULT_MASK;
4838 cmd.host_command_parameters[1] = REG_CHANNEL_MASK;
4839 cmd.host_command_parameters[2] = REG_CHANNEL_MASK & ibss_mask;
4842 /*cmd.host_command_parameters[0] |= DIVERSITY_ANTENNA_A; */
4844 err = ipw2100_hw_send_command(priv, &cmd);
4848 /* If IPv6 is configured in the kernel then we don't want to filter out all
4849 * of the multicast packets as IPv6 needs some. */
4850 #if !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE)
4851 cmd.host_command = ADD_MULTICAST;
4852 cmd.host_command_sequence = 0;
4853 cmd.host_command_length = 0;
4855 ipw2100_hw_send_command(priv, &cmd);
4858 err = ipw2100_enable_adapter(priv);
4866 static int ipw2100_set_tx_rates(struct ipw2100_priv *priv, u32 rate,
4869 struct host_command cmd = {
4870 .host_command = BASIC_TX_RATES,
4871 .host_command_sequence = 0,
4872 .host_command_length = 4
4876 cmd.host_command_parameters[0] = rate & TX_RATE_MASK;
4879 err = ipw2100_disable_adapter(priv);
4884 /* Set BASIC TX Rate first */
4885 ipw2100_hw_send_command(priv, &cmd);
4888 cmd.host_command = TX_RATES;
4889 ipw2100_hw_send_command(priv, &cmd);
4891 /* Set MSDU TX Rate */
4892 cmd.host_command = MSDU_TX_RATES;
4893 ipw2100_hw_send_command(priv, &cmd);
4896 err = ipw2100_enable_adapter(priv);
4901 priv->tx_rates = rate;
4906 static int ipw2100_set_power_mode(struct ipw2100_priv *priv, int power_level)
4908 struct host_command cmd = {
4909 .host_command = POWER_MODE,
4910 .host_command_sequence = 0,
4911 .host_command_length = 4
4915 cmd.host_command_parameters[0] = power_level;
4917 err = ipw2100_hw_send_command(priv, &cmd);
4921 if (power_level == IPW_POWER_MODE_CAM)
4922 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
4924 priv->power_mode = IPW_POWER_ENABLED | power_level;
4926 #ifdef IPW2100_TX_POWER
4927 if (priv->port_type == IBSS && priv->adhoc_power != DFTL_IBSS_TX_POWER) {
4928 /* Set beacon interval */
4929 cmd.host_command = TX_POWER_INDEX;
4930 cmd.host_command_parameters[0] = (u32) priv->adhoc_power;
4932 err = ipw2100_hw_send_command(priv, &cmd);
4941 static int ipw2100_set_rts_threshold(struct ipw2100_priv *priv, u32 threshold)
4943 struct host_command cmd = {
4944 .host_command = RTS_THRESHOLD,
4945 .host_command_sequence = 0,
4946 .host_command_length = 4
4950 if (threshold & RTS_DISABLED)
4951 cmd.host_command_parameters[0] = MAX_RTS_THRESHOLD;
4953 cmd.host_command_parameters[0] = threshold & ~RTS_DISABLED;
4955 err = ipw2100_hw_send_command(priv, &cmd);
4959 priv->rts_threshold = threshold;
4965 int ipw2100_set_fragmentation_threshold(struct ipw2100_priv *priv,
4966 u32 threshold, int batch_mode)
4968 struct host_command cmd = {
4969 .host_command = FRAG_THRESHOLD,
4970 .host_command_sequence = 0,
4971 .host_command_length = 4,
4972 .host_command_parameters[0] = 0,
4977 err = ipw2100_disable_adapter(priv);
4983 threshold = DEFAULT_FRAG_THRESHOLD;
4985 threshold = max(threshold, MIN_FRAG_THRESHOLD);
4986 threshold = min(threshold, MAX_FRAG_THRESHOLD);
4989 cmd.host_command_parameters[0] = threshold;
4991 IPW_DEBUG_HC("FRAG_THRESHOLD: %u\n", threshold);
4993 err = ipw2100_hw_send_command(priv, &cmd);
4996 ipw2100_enable_adapter(priv);
4999 priv->frag_threshold = threshold;
5005 static int ipw2100_set_short_retry(struct ipw2100_priv *priv, u32 retry)
5007 struct host_command cmd = {
5008 .host_command = SHORT_RETRY_LIMIT,
5009 .host_command_sequence = 0,
5010 .host_command_length = 4
5014 cmd.host_command_parameters[0] = retry;
5016 err = ipw2100_hw_send_command(priv, &cmd);
5020 priv->short_retry_limit = retry;
5025 static int ipw2100_set_long_retry(struct ipw2100_priv *priv, u32 retry)
5027 struct host_command cmd = {
5028 .host_command = LONG_RETRY_LIMIT,
5029 .host_command_sequence = 0,
5030 .host_command_length = 4
5034 cmd.host_command_parameters[0] = retry;
5036 err = ipw2100_hw_send_command(priv, &cmd);
5040 priv->long_retry_limit = retry;
5045 static int ipw2100_set_mandatory_bssid(struct ipw2100_priv *priv, u8 * bssid,
5048 struct host_command cmd = {
5049 .host_command = MANDATORY_BSSID,
5050 .host_command_sequence = 0,
5051 .host_command_length = (bssid == NULL) ? 0 : ETH_ALEN
5055 #ifdef CONFIG_IPW2100_DEBUG
5057 IPW_DEBUG_HC("MANDATORY_BSSID: %pM\n", bssid);
5059 IPW_DEBUG_HC("MANDATORY_BSSID: <clear>\n");
5061 /* if BSSID is empty then we disable mandatory bssid mode */
5063 memcpy(cmd.host_command_parameters, bssid, ETH_ALEN);
5066 err = ipw2100_disable_adapter(priv);
5071 err = ipw2100_hw_send_command(priv, &cmd);
5074 ipw2100_enable_adapter(priv);
5079 static int ipw2100_disassociate_bssid(struct ipw2100_priv *priv)
5081 struct host_command cmd = {
5082 .host_command = DISASSOCIATION_BSSID,
5083 .host_command_sequence = 0,
5084 .host_command_length = ETH_ALEN
5089 IPW_DEBUG_HC("DISASSOCIATION_BSSID\n");
5092 /* The Firmware currently ignores the BSSID and just disassociates from
5093 * the currently associated AP -- but in the off chance that a future
5094 * firmware does use the BSSID provided here, we go ahead and try and
5095 * set it to the currently associated AP's BSSID */
5096 memcpy(cmd.host_command_parameters, priv->bssid, ETH_ALEN);
5098 err = ipw2100_hw_send_command(priv, &cmd);
5103 static int ipw2100_set_wpa_ie(struct ipw2100_priv *,
5104 struct ipw2100_wpa_assoc_frame *, int)
5105 __attribute__ ((unused));
5107 static int ipw2100_set_wpa_ie(struct ipw2100_priv *priv,
5108 struct ipw2100_wpa_assoc_frame *wpa_frame,
5111 struct host_command cmd = {
5112 .host_command = SET_WPA_IE,
5113 .host_command_sequence = 0,
5114 .host_command_length = sizeof(struct ipw2100_wpa_assoc_frame),
5118 IPW_DEBUG_HC("SET_WPA_IE\n");
5121 err = ipw2100_disable_adapter(priv);
5126 memcpy(cmd.host_command_parameters, wpa_frame,
5127 sizeof(struct ipw2100_wpa_assoc_frame));
5129 err = ipw2100_hw_send_command(priv, &cmd);
5132 if (ipw2100_enable_adapter(priv))
5139 struct security_info_params {
5140 u32 allowed_ciphers;
5143 u8 replay_counters_number;
5144 u8 unicast_using_group;
5145 } __attribute__ ((packed));
5147 static int ipw2100_set_security_information(struct ipw2100_priv *priv,
5150 int unicast_using_group,
5153 struct host_command cmd = {
5154 .host_command = SET_SECURITY_INFORMATION,
5155 .host_command_sequence = 0,
5156 .host_command_length = sizeof(struct security_info_params)
5158 struct security_info_params *security =
5159 (struct security_info_params *)&cmd.host_command_parameters;
5161 memset(security, 0, sizeof(*security));
5163 /* If shared key AP authentication is turned on, then we need to
5164 * configure the firmware to try and use it.
5166 * Actual data encryption/decryption is handled by the host. */
5167 security->auth_mode = auth_mode;
5168 security->unicast_using_group = unicast_using_group;
5170 switch (security_level) {
5173 security->allowed_ciphers = IPW_NONE_CIPHER;
5176 security->allowed_ciphers = IPW_WEP40_CIPHER |
5180 security->allowed_ciphers = IPW_WEP40_CIPHER |
5181 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER;
5183 case SEC_LEVEL_2_CKIP:
5184 security->allowed_ciphers = IPW_WEP40_CIPHER |
5185 IPW_WEP104_CIPHER | IPW_CKIP_CIPHER;
5188 security->allowed_ciphers = IPW_WEP40_CIPHER |
5189 IPW_WEP104_CIPHER | IPW_TKIP_CIPHER | IPW_CCMP_CIPHER;
5194 ("SET_SECURITY_INFORMATION: auth:%d cipher:0x%02X (level %d)\n",
5195 security->auth_mode, security->allowed_ciphers, security_level);
5197 security->replay_counters_number = 0;
5200 err = ipw2100_disable_adapter(priv);
5205 err = ipw2100_hw_send_command(priv, &cmd);
5208 ipw2100_enable_adapter(priv);
5213 static int ipw2100_set_tx_power(struct ipw2100_priv *priv, u32 tx_power)
5215 struct host_command cmd = {
5216 .host_command = TX_POWER_INDEX,
5217 .host_command_sequence = 0,
5218 .host_command_length = 4
5223 if (tx_power != IPW_TX_POWER_DEFAULT)
5224 tmp = (tx_power - IPW_TX_POWER_MIN_DBM) * 16 /
5225 (IPW_TX_POWER_MAX_DBM - IPW_TX_POWER_MIN_DBM);
5227 cmd.host_command_parameters[0] = tmp;
5229 if (priv->ieee->iw_mode == IW_MODE_ADHOC)
5230 err = ipw2100_hw_send_command(priv, &cmd);
5232 priv->tx_power = tx_power;
5237 static int ipw2100_set_ibss_beacon_interval(struct ipw2100_priv *priv,
5238 u32 interval, int batch_mode)
5240 struct host_command cmd = {
5241 .host_command = BEACON_INTERVAL,
5242 .host_command_sequence = 0,
5243 .host_command_length = 4
5247 cmd.host_command_parameters[0] = interval;
5249 IPW_DEBUG_INFO("enter\n");
5251 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5253 err = ipw2100_disable_adapter(priv);
5258 ipw2100_hw_send_command(priv, &cmd);
5261 err = ipw2100_enable_adapter(priv);
5267 IPW_DEBUG_INFO("exit\n");
5272 static void ipw2100_queues_initialize(struct ipw2100_priv *priv)
5274 ipw2100_tx_initialize(priv);
5275 ipw2100_rx_initialize(priv);
5276 ipw2100_msg_initialize(priv);
5279 static void ipw2100_queues_free(struct ipw2100_priv *priv)
5281 ipw2100_tx_free(priv);
5282 ipw2100_rx_free(priv);
5283 ipw2100_msg_free(priv);
5286 static int ipw2100_queues_allocate(struct ipw2100_priv *priv)
5288 if (ipw2100_tx_allocate(priv) ||
5289 ipw2100_rx_allocate(priv) || ipw2100_msg_allocate(priv))
5295 ipw2100_tx_free(priv);
5296 ipw2100_rx_free(priv);
5297 ipw2100_msg_free(priv);
5301 #define IPW_PRIVACY_CAPABLE 0x0008
5303 static int ipw2100_set_wep_flags(struct ipw2100_priv *priv, u32 flags,
5306 struct host_command cmd = {
5307 .host_command = WEP_FLAGS,
5308 .host_command_sequence = 0,
5309 .host_command_length = 4
5313 cmd.host_command_parameters[0] = flags;
5315 IPW_DEBUG_HC("WEP_FLAGS: flags = 0x%08X\n", flags);
5318 err = ipw2100_disable_adapter(priv);
5320 printk(KERN_ERR DRV_NAME
5321 ": %s: Could not disable adapter %d\n",
5322 priv->net_dev->name, err);
5327 /* send cmd to firmware */
5328 err = ipw2100_hw_send_command(priv, &cmd);
5331 ipw2100_enable_adapter(priv);
5336 struct ipw2100_wep_key {
5342 /* Macros to ease up priting WEP keys */
5343 #define WEP_FMT_64 "%02X%02X%02X%02X-%02X"
5344 #define WEP_FMT_128 "%02X%02X%02X%02X-%02X%02X%02X%02X-%02X%02X%02X"
5345 #define WEP_STR_64(x) x[0],x[1],x[2],x[3],x[4]
5346 #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]
5351 * @priv: struct to work on
5352 * @idx: index of the key we want to set
5353 * @key: ptr to the key data to set
5354 * @len: length of the buffer at @key
5355 * @batch_mode: FIXME perform the operation in batch mode, not
5356 * disabling the device.
5358 * @returns 0 if OK, < 0 errno code on error.
5360 * Fill out a command structure with the new wep key, length an
5361 * index and send it down the wire.
5363 static int ipw2100_set_key(struct ipw2100_priv *priv,
5364 int idx, char *key, int len, int batch_mode)
5366 int keylen = len ? (len <= 5 ? 5 : 13) : 0;
5367 struct host_command cmd = {
5368 .host_command = WEP_KEY_INFO,
5369 .host_command_sequence = 0,
5370 .host_command_length = sizeof(struct ipw2100_wep_key),
5372 struct ipw2100_wep_key *wep_key = (void *)cmd.host_command_parameters;
5375 IPW_DEBUG_HC("WEP_KEY_INFO: index = %d, len = %d/%d\n",
5378 /* NOTE: We don't check cached values in case the firmware was reset
5379 * or some other problem is occurring. If the user is setting the key,
5380 * then we push the change */
5383 wep_key->len = keylen;
5386 memcpy(wep_key->key, key, len);
5387 memset(wep_key->key + len, 0, keylen - len);
5390 /* Will be optimized out on debug not being configured in */
5392 IPW_DEBUG_WEP("%s: Clearing key %d\n",
5393 priv->net_dev->name, wep_key->idx);
5394 else if (keylen == 5)
5395 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_64 "\n",
5396 priv->net_dev->name, wep_key->idx, wep_key->len,
5397 WEP_STR_64(wep_key->key));
5399 IPW_DEBUG_WEP("%s: idx: %d, len: %d key: " WEP_FMT_128
5401 priv->net_dev->name, wep_key->idx, wep_key->len,
5402 WEP_STR_128(wep_key->key));
5405 err = ipw2100_disable_adapter(priv);
5406 /* FIXME: IPG: shouldn't this prink be in _disable_adapter()? */
5408 printk(KERN_ERR DRV_NAME
5409 ": %s: Could not disable adapter %d\n",
5410 priv->net_dev->name, err);
5415 /* send cmd to firmware */
5416 err = ipw2100_hw_send_command(priv, &cmd);
5419 int err2 = ipw2100_enable_adapter(priv);
5426 static int ipw2100_set_key_index(struct ipw2100_priv *priv,
5427 int idx, int batch_mode)
5429 struct host_command cmd = {
5430 .host_command = WEP_KEY_INDEX,
5431 .host_command_sequence = 0,
5432 .host_command_length = 4,
5433 .host_command_parameters = {idx},
5437 IPW_DEBUG_HC("WEP_KEY_INDEX: index = %d\n", idx);
5439 if (idx < 0 || idx > 3)
5443 err = ipw2100_disable_adapter(priv);
5445 printk(KERN_ERR DRV_NAME
5446 ": %s: Could not disable adapter %d\n",
5447 priv->net_dev->name, err);
5452 /* send cmd to firmware */
5453 err = ipw2100_hw_send_command(priv, &cmd);
5456 ipw2100_enable_adapter(priv);
5461 static int ipw2100_configure_security(struct ipw2100_priv *priv, int batch_mode)
5463 int i, err, auth_mode, sec_level, use_group;
5465 if (!(priv->status & STATUS_RUNNING))
5469 err = ipw2100_disable_adapter(priv);
5474 if (!priv->ieee->sec.enabled) {
5476 ipw2100_set_security_information(priv, IPW_AUTH_OPEN,
5479 auth_mode = IPW_AUTH_OPEN;
5480 if (priv->ieee->sec.flags & SEC_AUTH_MODE) {
5481 if (priv->ieee->sec.auth_mode == WLAN_AUTH_SHARED_KEY)
5482 auth_mode = IPW_AUTH_SHARED;
5483 else if (priv->ieee->sec.auth_mode == WLAN_AUTH_LEAP)
5484 auth_mode = IPW_AUTH_LEAP_CISCO_ID;
5487 sec_level = SEC_LEVEL_0;
5488 if (priv->ieee->sec.flags & SEC_LEVEL)
5489 sec_level = priv->ieee->sec.level;
5492 if (priv->ieee->sec.flags & SEC_UNICAST_GROUP)
5493 use_group = priv->ieee->sec.unicast_uses_group;
5496 ipw2100_set_security_information(priv, auth_mode, sec_level,
5503 if (priv->ieee->sec.enabled) {
5504 for (i = 0; i < 4; i++) {
5505 if (!(priv->ieee->sec.flags & (1 << i))) {
5506 memset(priv->ieee->sec.keys[i], 0, WEP_KEY_LEN);
5507 priv->ieee->sec.key_sizes[i] = 0;
5509 err = ipw2100_set_key(priv, i,
5510 priv->ieee->sec.keys[i],
5518 ipw2100_set_key_index(priv, priv->ieee->crypt_info.tx_keyidx, 1);
5521 /* Always enable privacy so the Host can filter WEP packets if
5522 * encrypted data is sent up */
5524 ipw2100_set_wep_flags(priv,
5526 enabled ? IPW_PRIVACY_CAPABLE : 0, 1);
5530 priv->status &= ~STATUS_SECURITY_UPDATED;
5534 ipw2100_enable_adapter(priv);
5539 static void ipw2100_security_work(struct work_struct *work)
5541 struct ipw2100_priv *priv =
5542 container_of(work, struct ipw2100_priv, security_work.work);
5544 /* If we happen to have reconnected before we get a chance to
5545 * process this, then update the security settings--which causes
5546 * a disassociation to occur */
5547 if (!(priv->status & STATUS_ASSOCIATED) &&
5548 priv->status & STATUS_SECURITY_UPDATED)
5549 ipw2100_configure_security(priv, 0);
5552 static void shim__set_security(struct net_device *dev,
5553 struct ieee80211_security *sec)
5555 struct ipw2100_priv *priv = ieee80211_priv(dev);
5556 int i, force_update = 0;
5558 mutex_lock(&priv->action_mutex);
5559 if (!(priv->status & STATUS_INITIALIZED))
5562 for (i = 0; i < 4; i++) {
5563 if (sec->flags & (1 << i)) {
5564 priv->ieee->sec.key_sizes[i] = sec->key_sizes[i];
5565 if (sec->key_sizes[i] == 0)
5566 priv->ieee->sec.flags &= ~(1 << i);
5568 memcpy(priv->ieee->sec.keys[i], sec->keys[i],
5570 if (sec->level == SEC_LEVEL_1) {
5571 priv->ieee->sec.flags |= (1 << i);
5572 priv->status |= STATUS_SECURITY_UPDATED;
5574 priv->ieee->sec.flags &= ~(1 << i);
5578 if ((sec->flags & SEC_ACTIVE_KEY) &&
5579 priv->ieee->sec.active_key != sec->active_key) {
5580 if (sec->active_key <= 3) {
5581 priv->ieee->sec.active_key = sec->active_key;
5582 priv->ieee->sec.flags |= SEC_ACTIVE_KEY;
5584 priv->ieee->sec.flags &= ~SEC_ACTIVE_KEY;
5586 priv->status |= STATUS_SECURITY_UPDATED;
5589 if ((sec->flags & SEC_AUTH_MODE) &&
5590 (priv->ieee->sec.auth_mode != sec->auth_mode)) {
5591 priv->ieee->sec.auth_mode = sec->auth_mode;
5592 priv->ieee->sec.flags |= SEC_AUTH_MODE;
5593 priv->status |= STATUS_SECURITY_UPDATED;
5596 if (sec->flags & SEC_ENABLED && priv->ieee->sec.enabled != sec->enabled) {
5597 priv->ieee->sec.flags |= SEC_ENABLED;
5598 priv->ieee->sec.enabled = sec->enabled;
5599 priv->status |= STATUS_SECURITY_UPDATED;
5603 if (sec->flags & SEC_ENCRYPT)
5604 priv->ieee->sec.encrypt = sec->encrypt;
5606 if (sec->flags & SEC_LEVEL && priv->ieee->sec.level != sec->level) {
5607 priv->ieee->sec.level = sec->level;
5608 priv->ieee->sec.flags |= SEC_LEVEL;
5609 priv->status |= STATUS_SECURITY_UPDATED;
5612 IPW_DEBUG_WEP("Security flags: %c %c%c%c%c %c%c%c%c\n",
5613 priv->ieee->sec.flags & (1 << 8) ? '1' : '0',
5614 priv->ieee->sec.flags & (1 << 7) ? '1' : '0',
5615 priv->ieee->sec.flags & (1 << 6) ? '1' : '0',
5616 priv->ieee->sec.flags & (1 << 5) ? '1' : '0',
5617 priv->ieee->sec.flags & (1 << 4) ? '1' : '0',
5618 priv->ieee->sec.flags & (1 << 3) ? '1' : '0',
5619 priv->ieee->sec.flags & (1 << 2) ? '1' : '0',
5620 priv->ieee->sec.flags & (1 << 1) ? '1' : '0',
5621 priv->ieee->sec.flags & (1 << 0) ? '1' : '0');
5623 /* As a temporary work around to enable WPA until we figure out why
5624 * wpa_supplicant toggles the security capability of the driver, which
5625 * forces a disassocation with force_update...
5627 * if (force_update || !(priv->status & STATUS_ASSOCIATED))*/
5628 if (!(priv->status & (STATUS_ASSOCIATED | STATUS_ASSOCIATING)))
5629 ipw2100_configure_security(priv, 0);
5631 mutex_unlock(&priv->action_mutex);
5634 static int ipw2100_adapter_setup(struct ipw2100_priv *priv)
5640 IPW_DEBUG_INFO("enter\n");
5642 err = ipw2100_disable_adapter(priv);
5645 #ifdef CONFIG_IPW2100_MONITOR
5646 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
5647 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5651 IPW_DEBUG_INFO("exit\n");
5655 #endif /* CONFIG_IPW2100_MONITOR */
5657 err = ipw2100_read_mac_address(priv);
5661 err = ipw2100_set_mac_address(priv, batch_mode);
5665 err = ipw2100_set_port_type(priv, priv->ieee->iw_mode, batch_mode);
5669 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5670 err = ipw2100_set_channel(priv, priv->channel, batch_mode);
5675 err = ipw2100_system_config(priv, batch_mode);
5679 err = ipw2100_set_tx_rates(priv, priv->tx_rates, batch_mode);
5683 /* Default to power mode OFF */
5684 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
5688 err = ipw2100_set_rts_threshold(priv, priv->rts_threshold);
5692 if (priv->config & CFG_STATIC_BSSID)
5693 bssid = priv->bssid;
5696 err = ipw2100_set_mandatory_bssid(priv, bssid, batch_mode);
5700 if (priv->config & CFG_STATIC_ESSID)
5701 err = ipw2100_set_essid(priv, priv->essid, priv->essid_len,
5704 err = ipw2100_set_essid(priv, NULL, 0, batch_mode);
5708 err = ipw2100_configure_security(priv, batch_mode);
5712 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
5714 ipw2100_set_ibss_beacon_interval(priv,
5715 priv->beacon_interval,
5720 err = ipw2100_set_tx_power(priv, priv->tx_power);
5726 err = ipw2100_set_fragmentation_threshold(
5727 priv, priv->frag_threshold, batch_mode);
5732 IPW_DEBUG_INFO("exit\n");
5737 /*************************************************************************
5739 * EXTERNALLY CALLED METHODS
5741 *************************************************************************/
5743 /* This method is called by the network layer -- not to be confused with
5744 * ipw2100_set_mac_address() declared above called by this driver (and this
5745 * method as well) to talk to the firmware */
5746 static int ipw2100_set_address(struct net_device *dev, void *p)
5748 struct ipw2100_priv *priv = ieee80211_priv(dev);
5749 struct sockaddr *addr = p;
5752 if (!is_valid_ether_addr(addr->sa_data))
5753 return -EADDRNOTAVAIL;
5755 mutex_lock(&priv->action_mutex);
5757 priv->config |= CFG_CUSTOM_MAC;
5758 memcpy(priv->mac_addr, addr->sa_data, ETH_ALEN);
5760 err = ipw2100_set_mac_address(priv, 0);
5764 priv->reset_backoff = 0;
5765 mutex_unlock(&priv->action_mutex);
5766 ipw2100_reset_adapter(&priv->reset_work.work);
5770 mutex_unlock(&priv->action_mutex);
5774 static int ipw2100_open(struct net_device *dev)
5776 struct ipw2100_priv *priv = ieee80211_priv(dev);
5777 unsigned long flags;
5778 IPW_DEBUG_INFO("dev->open\n");
5780 spin_lock_irqsave(&priv->low_lock, flags);
5781 if (priv->status & STATUS_ASSOCIATED) {
5782 netif_carrier_on(dev);
5783 netif_start_queue(dev);
5785 spin_unlock_irqrestore(&priv->low_lock, flags);
5790 static int ipw2100_close(struct net_device *dev)
5792 struct ipw2100_priv *priv = ieee80211_priv(dev);
5793 unsigned long flags;
5794 struct list_head *element;
5795 struct ipw2100_tx_packet *packet;
5797 IPW_DEBUG_INFO("enter\n");
5799 spin_lock_irqsave(&priv->low_lock, flags);
5801 if (priv->status & STATUS_ASSOCIATED)
5802 netif_carrier_off(dev);
5803 netif_stop_queue(dev);
5805 /* Flush the TX queue ... */
5806 while (!list_empty(&priv->tx_pend_list)) {
5807 element = priv->tx_pend_list.next;
5808 packet = list_entry(element, struct ipw2100_tx_packet, list);
5811 DEC_STAT(&priv->tx_pend_stat);
5813 ieee80211_txb_free(packet->info.d_struct.txb);
5814 packet->info.d_struct.txb = NULL;
5816 list_add_tail(element, &priv->tx_free_list);
5817 INC_STAT(&priv->tx_free_stat);
5819 spin_unlock_irqrestore(&priv->low_lock, flags);
5821 IPW_DEBUG_INFO("exit\n");
5827 * TODO: Fix this function... its just wrong
5829 static void ipw2100_tx_timeout(struct net_device *dev)
5831 struct ipw2100_priv *priv = ieee80211_priv(dev);
5833 priv->ieee->stats.tx_errors++;
5835 #ifdef CONFIG_IPW2100_MONITOR
5836 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
5840 IPW_DEBUG_INFO("%s: TX timed out. Scheduling firmware restart.\n",
5842 schedule_reset(priv);
5845 static int ipw2100_wpa_enable(struct ipw2100_priv *priv, int value)
5847 /* This is called when wpa_supplicant loads and closes the driver
5849 priv->ieee->wpa_enabled = value;
5853 static int ipw2100_wpa_set_auth_algs(struct ipw2100_priv *priv, int value)
5856 struct ieee80211_device *ieee = priv->ieee;
5857 struct ieee80211_security sec = {
5858 .flags = SEC_AUTH_MODE,
5862 if (value & IW_AUTH_ALG_SHARED_KEY) {
5863 sec.auth_mode = WLAN_AUTH_SHARED_KEY;
5865 } else if (value & IW_AUTH_ALG_OPEN_SYSTEM) {
5866 sec.auth_mode = WLAN_AUTH_OPEN;
5868 } else if (value & IW_AUTH_ALG_LEAP) {
5869 sec.auth_mode = WLAN_AUTH_LEAP;
5874 if (ieee->set_security)
5875 ieee->set_security(ieee->dev, &sec);
5882 static void ipw2100_wpa_assoc_frame(struct ipw2100_priv *priv,
5883 char *wpa_ie, int wpa_ie_len)
5886 struct ipw2100_wpa_assoc_frame frame;
5888 frame.fixed_ie_mask = 0;
5891 memcpy(frame.var_ie, wpa_ie, wpa_ie_len);
5892 frame.var_ie_len = wpa_ie_len;
5894 /* make sure WPA is enabled */
5895 ipw2100_wpa_enable(priv, 1);
5896 ipw2100_set_wpa_ie(priv, &frame, 0);
5899 static void ipw_ethtool_get_drvinfo(struct net_device *dev,
5900 struct ethtool_drvinfo *info)
5902 struct ipw2100_priv *priv = ieee80211_priv(dev);
5903 char fw_ver[64], ucode_ver[64];
5905 strcpy(info->driver, DRV_NAME);
5906 strcpy(info->version, DRV_VERSION);
5908 ipw2100_get_fwversion(priv, fw_ver, sizeof(fw_ver));
5909 ipw2100_get_ucodeversion(priv, ucode_ver, sizeof(ucode_ver));
5911 snprintf(info->fw_version, sizeof(info->fw_version), "%s:%d:%s",
5912 fw_ver, priv->eeprom_version, ucode_ver);
5914 strcpy(info->bus_info, pci_name(priv->pci_dev));
5917 static u32 ipw2100_ethtool_get_link(struct net_device *dev)
5919 struct ipw2100_priv *priv = ieee80211_priv(dev);
5920 return (priv->status & STATUS_ASSOCIATED) ? 1 : 0;
5923 static const struct ethtool_ops ipw2100_ethtool_ops = {
5924 .get_link = ipw2100_ethtool_get_link,
5925 .get_drvinfo = ipw_ethtool_get_drvinfo,
5928 static void ipw2100_hang_check(struct work_struct *work)
5930 struct ipw2100_priv *priv =
5931 container_of(work, struct ipw2100_priv, hang_check.work);
5932 unsigned long flags;
5933 u32 rtc = 0xa5a5a5a5;
5934 u32 len = sizeof(rtc);
5937 spin_lock_irqsave(&priv->low_lock, flags);
5939 if (priv->fatal_error != 0) {
5940 /* If fatal_error is set then we need to restart */
5941 IPW_DEBUG_INFO("%s: Hardware fatal error detected.\n",
5942 priv->net_dev->name);
5945 } else if (ipw2100_get_ordinal(priv, IPW_ORD_RTC_TIME, &rtc, &len) ||
5946 (rtc == priv->last_rtc)) {
5947 /* Check if firmware is hung */
5948 IPW_DEBUG_INFO("%s: Firmware RTC stalled.\n",
5949 priv->net_dev->name);
5956 priv->stop_hang_check = 1;
5959 /* Restart the NIC */
5960 schedule_reset(priv);
5963 priv->last_rtc = rtc;
5965 if (!priv->stop_hang_check)
5966 queue_delayed_work(priv->workqueue, &priv->hang_check, HZ / 2);
5968 spin_unlock_irqrestore(&priv->low_lock, flags);
5971 static void ipw2100_rf_kill(struct work_struct *work)
5973 struct ipw2100_priv *priv =
5974 container_of(work, struct ipw2100_priv, rf_kill.work);
5975 unsigned long flags;
5977 spin_lock_irqsave(&priv->low_lock, flags);
5979 if (rf_kill_active(priv)) {
5980 IPW_DEBUG_RF_KILL("RF Kill active, rescheduling GPIO check\n");
5981 if (!priv->stop_rf_kill)
5982 queue_delayed_work(priv->workqueue, &priv->rf_kill,
5983 round_jiffies_relative(HZ));
5987 /* RF Kill is now disabled, so bring the device back up */
5989 if (!(priv->status & STATUS_RF_KILL_MASK)) {
5990 IPW_DEBUG_RF_KILL("HW RF Kill no longer active, restarting "
5992 schedule_reset(priv);
5994 IPW_DEBUG_RF_KILL("HW RF Kill deactivated. SW RF Kill still "
5998 spin_unlock_irqrestore(&priv->low_lock, flags);
6001 static void ipw2100_irq_tasklet(struct ipw2100_priv *priv);
6003 /* Look into using netdev destructor to shutdown ieee80211? */
6005 static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
6006 void __iomem * base_addr,
6007 unsigned long mem_start,
6008 unsigned long mem_len)
6010 struct ipw2100_priv *priv;
6011 struct net_device *dev;
6013 dev = alloc_ieee80211(sizeof(struct ipw2100_priv));
6016 priv = ieee80211_priv(dev);
6017 priv->ieee = netdev_priv(dev);
6018 priv->pci_dev = pci_dev;
6019 priv->net_dev = dev;
6021 priv->ieee->hard_start_xmit = ipw2100_tx;
6022 priv->ieee->set_security = shim__set_security;
6024 priv->ieee->perfect_rssi = -20;
6025 priv->ieee->worst_rssi = -85;
6027 dev->open = ipw2100_open;
6028 dev->stop = ipw2100_close;
6029 dev->init = ipw2100_net_init;
6030 dev->ethtool_ops = &ipw2100_ethtool_ops;
6031 dev->tx_timeout = ipw2100_tx_timeout;
6032 dev->wireless_handlers = &ipw2100_wx_handler_def;
6033 priv->wireless_data.ieee80211 = priv->ieee;
6034 dev->wireless_data = &priv->wireless_data;
6035 dev->set_mac_address = ipw2100_set_address;
6036 dev->watchdog_timeo = 3 * HZ;
6039 dev->base_addr = (unsigned long)base_addr;
6040 dev->mem_start = mem_start;
6041 dev->mem_end = dev->mem_start + mem_len - 1;
6043 /* NOTE: We don't use the wireless_handlers hook
6044 * in dev as the system will start throwing WX requests
6045 * to us before we're actually initialized and it just
6046 * ends up causing problems. So, we just handle
6047 * the WX extensions through the ipw2100_ioctl interface */
6049 /* memset() puts everything to 0, so we only have explicitly set
6050 * those values that need to be something else */
6052 /* If power management is turned on, default to AUTO mode */
6053 priv->power_mode = IPW_POWER_AUTO;
6055 #ifdef CONFIG_IPW2100_MONITOR
6056 priv->config |= CFG_CRC_CHECK;
6058 priv->ieee->wpa_enabled = 0;
6059 priv->ieee->drop_unencrypted = 0;
6060 priv->ieee->privacy_invoked = 0;
6061 priv->ieee->ieee802_1x = 1;
6063 /* Set module parameters */
6066 priv->ieee->iw_mode = IW_MODE_ADHOC;
6068 #ifdef CONFIG_IPW2100_MONITOR
6070 priv->ieee->iw_mode = IW_MODE_MONITOR;
6075 priv->ieee->iw_mode = IW_MODE_INFRA;
6080 priv->status |= STATUS_RF_KILL_SW;
6083 ((channel >= REG_MIN_CHANNEL) && (channel <= REG_MAX_CHANNEL))) {
6084 priv->config |= CFG_STATIC_CHANNEL;
6085 priv->channel = channel;
6089 priv->config |= CFG_ASSOCIATE;
6091 priv->beacon_interval = DEFAULT_BEACON_INTERVAL;
6092 priv->short_retry_limit = DEFAULT_SHORT_RETRY_LIMIT;
6093 priv->long_retry_limit = DEFAULT_LONG_RETRY_LIMIT;
6094 priv->rts_threshold = DEFAULT_RTS_THRESHOLD | RTS_DISABLED;
6095 priv->frag_threshold = DEFAULT_FTS | FRAG_DISABLED;
6096 priv->tx_power = IPW_TX_POWER_DEFAULT;
6097 priv->tx_rates = DEFAULT_TX_RATES;
6099 strcpy(priv->nick, "ipw2100");
6101 spin_lock_init(&priv->low_lock);
6102 mutex_init(&priv->action_mutex);
6103 mutex_init(&priv->adapter_mutex);
6105 init_waitqueue_head(&priv->wait_command_queue);
6107 netif_carrier_off(dev);
6109 INIT_LIST_HEAD(&priv->msg_free_list);
6110 INIT_LIST_HEAD(&priv->msg_pend_list);
6111 INIT_STAT(&priv->msg_free_stat);
6112 INIT_STAT(&priv->msg_pend_stat);
6114 INIT_LIST_HEAD(&priv->tx_free_list);
6115 INIT_LIST_HEAD(&priv->tx_pend_list);
6116 INIT_STAT(&priv->tx_free_stat);
6117 INIT_STAT(&priv->tx_pend_stat);
6119 INIT_LIST_HEAD(&priv->fw_pend_list);
6120 INIT_STAT(&priv->fw_pend_stat);
6122 priv->workqueue = create_workqueue(DRV_NAME);
6124 INIT_DELAYED_WORK(&priv->reset_work, ipw2100_reset_adapter);
6125 INIT_DELAYED_WORK(&priv->security_work, ipw2100_security_work);
6126 INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work);
6127 INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check);
6128 INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill);
6129 INIT_WORK(&priv->scan_event_now, ipw2100_scan_event_now);
6130 INIT_DELAYED_WORK(&priv->scan_event_later, ipw2100_scan_event_later);
6132 tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
6133 ipw2100_irq_tasklet, (unsigned long)priv);
6135 /* NOTE: We do not start the deferred work for status checks yet */
6136 priv->stop_rf_kill = 1;
6137 priv->stop_hang_check = 1;
6142 static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
6143 const struct pci_device_id *ent)
6145 unsigned long mem_start, mem_len, mem_flags;
6146 void __iomem *base_addr = NULL;
6147 struct net_device *dev = NULL;
6148 struct ipw2100_priv *priv = NULL;
6153 IPW_DEBUG_INFO("enter\n");
6155 mem_start = pci_resource_start(pci_dev, 0);
6156 mem_len = pci_resource_len(pci_dev, 0);
6157 mem_flags = pci_resource_flags(pci_dev, 0);
6159 if ((mem_flags & IORESOURCE_MEM) != IORESOURCE_MEM) {
6160 IPW_DEBUG_INFO("weird - resource type is not memory\n");
6165 base_addr = ioremap_nocache(mem_start, mem_len);
6167 printk(KERN_WARNING DRV_NAME
6168 "Error calling ioremap_nocache.\n");
6173 /* allocate and initialize our net_device */
6174 dev = ipw2100_alloc_device(pci_dev, base_addr, mem_start, mem_len);
6176 printk(KERN_WARNING DRV_NAME
6177 "Error calling ipw2100_alloc_device.\n");
6182 /* set up PCI mappings for device */
6183 err = pci_enable_device(pci_dev);
6185 printk(KERN_WARNING DRV_NAME
6186 "Error calling pci_enable_device.\n");
6190 priv = ieee80211_priv(dev);
6192 pci_set_master(pci_dev);
6193 pci_set_drvdata(pci_dev, priv);
6195 err = pci_set_dma_mask(pci_dev, DMA_32BIT_MASK);
6197 printk(KERN_WARNING DRV_NAME
6198 "Error calling pci_set_dma_mask.\n");
6199 pci_disable_device(pci_dev);
6203 err = pci_request_regions(pci_dev, DRV_NAME);
6205 printk(KERN_WARNING DRV_NAME
6206 "Error calling pci_request_regions.\n");
6207 pci_disable_device(pci_dev);
6211 /* We disable the RETRY_TIMEOUT register (0x41) to keep
6212 * PCI Tx retries from interfering with C3 CPU state */
6213 pci_read_config_dword(pci_dev, 0x40, &val);
6214 if ((val & 0x0000ff00) != 0)
6215 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6217 pci_set_power_state(pci_dev, PCI_D0);
6219 if (!ipw2100_hw_is_adapter_in_system(dev)) {
6220 printk(KERN_WARNING DRV_NAME
6221 "Device not found via register read.\n");
6226 SET_NETDEV_DEV(dev, &pci_dev->dev);
6228 /* Force interrupts to be shut off on the device */
6229 priv->status |= STATUS_INT_ENABLED;
6230 ipw2100_disable_interrupts(priv);
6232 /* Allocate and initialize the Tx/Rx queues and lists */
6233 if (ipw2100_queues_allocate(priv)) {
6234 printk(KERN_WARNING DRV_NAME
6235 "Error calling ipw2100_queues_allocate.\n");
6239 ipw2100_queues_initialize(priv);
6241 err = request_irq(pci_dev->irq,
6242 ipw2100_interrupt, IRQF_SHARED, dev->name, priv);
6244 printk(KERN_WARNING DRV_NAME
6245 "Error calling request_irq: %d.\n", pci_dev->irq);
6248 dev->irq = pci_dev->irq;
6250 IPW_DEBUG_INFO("Attempting to register device...\n");
6252 printk(KERN_INFO DRV_NAME
6253 ": Detected Intel PRO/Wireless 2100 Network Connection\n");
6255 /* Bring up the interface. Pre 0.46, after we registered the
6256 * network device we would call ipw2100_up. This introduced a race
6257 * condition with newer hotplug configurations (network was coming
6258 * up and making calls before the device was initialized).
6260 * If we called ipw2100_up before we registered the device, then the
6261 * device name wasn't registered. So, we instead use the net_dev->init
6262 * member to call a function that then just turns and calls ipw2100_up.
6263 * net_dev->init is called after name allocation but before the
6264 * notifier chain is called */
6265 err = register_netdev(dev);
6267 printk(KERN_WARNING DRV_NAME
6268 "Error calling register_netdev.\n");
6272 mutex_lock(&priv->action_mutex);
6275 IPW_DEBUG_INFO("%s: Bound to %s\n", dev->name, pci_name(pci_dev));
6277 /* perform this after register_netdev so that dev->name is set */
6278 err = sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6282 /* If the RF Kill switch is disabled, go ahead and complete the
6283 * startup sequence */
6284 if (!(priv->status & STATUS_RF_KILL_MASK)) {
6285 /* Enable the adapter - sends HOST_COMPLETE */
6286 if (ipw2100_enable_adapter(priv)) {
6287 printk(KERN_WARNING DRV_NAME
6288 ": %s: failed in call to enable adapter.\n",
6289 priv->net_dev->name);
6290 ipw2100_hw_stop_adapter(priv);
6295 /* Start a scan . . . */
6296 ipw2100_set_scan_options(priv);
6297 ipw2100_start_scan(priv);
6300 IPW_DEBUG_INFO("exit\n");
6302 priv->status |= STATUS_INITIALIZED;
6304 mutex_unlock(&priv->action_mutex);
6309 mutex_unlock(&priv->action_mutex);
6314 unregister_netdev(dev);
6316 ipw2100_hw_stop_adapter(priv);
6318 ipw2100_disable_interrupts(priv);
6321 free_irq(dev->irq, priv);
6323 ipw2100_kill_workqueue(priv);
6325 /* These are safe to call even if they weren't allocated */
6326 ipw2100_queues_free(priv);
6327 sysfs_remove_group(&pci_dev->dev.kobj,
6328 &ipw2100_attribute_group);
6330 free_ieee80211(dev);
6331 pci_set_drvdata(pci_dev, NULL);
6337 pci_release_regions(pci_dev);
6338 pci_disable_device(pci_dev);
6343 static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
6345 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6346 struct net_device *dev;
6349 mutex_lock(&priv->action_mutex);
6351 priv->status &= ~STATUS_INITIALIZED;
6353 dev = priv->net_dev;
6354 sysfs_remove_group(&pci_dev->dev.kobj,
6355 &ipw2100_attribute_group);
6358 if (ipw2100_firmware.version)
6359 ipw2100_release_firmware(priv, &ipw2100_firmware);
6361 /* Take down the hardware */
6364 /* Release the mutex so that the network subsystem can
6365 * complete any needed calls into the driver... */
6366 mutex_unlock(&priv->action_mutex);
6368 /* Unregister the device first - this results in close()
6369 * being called if the device is open. If we free storage
6370 * first, then close() will crash. */
6371 unregister_netdev(dev);
6373 /* ipw2100_down will ensure that there is no more pending work
6374 * in the workqueue's, so we can safely remove them now. */
6375 ipw2100_kill_workqueue(priv);
6377 ipw2100_queues_free(priv);
6379 /* Free potential debugging firmware snapshot */
6380 ipw2100_snapshot_free(priv);
6383 free_irq(dev->irq, priv);
6386 iounmap((void __iomem *)dev->base_addr);
6388 free_ieee80211(dev);
6391 pci_release_regions(pci_dev);
6392 pci_disable_device(pci_dev);
6394 IPW_DEBUG_INFO("exit\n");
6398 static int ipw2100_suspend(struct pci_dev *pci_dev, pm_message_t state)
6400 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6401 struct net_device *dev = priv->net_dev;
6403 IPW_DEBUG_INFO("%s: Going into suspend...\n", dev->name);
6405 mutex_lock(&priv->action_mutex);
6406 if (priv->status & STATUS_INITIALIZED) {
6407 /* Take down the device; powers it off, etc. */
6411 /* Remove the PRESENT state of the device */
6412 netif_device_detach(dev);
6414 pci_save_state(pci_dev);
6415 pci_disable_device(pci_dev);
6416 pci_set_power_state(pci_dev, PCI_D3hot);
6418 mutex_unlock(&priv->action_mutex);
6423 static int ipw2100_resume(struct pci_dev *pci_dev)
6425 struct ipw2100_priv *priv = pci_get_drvdata(pci_dev);
6426 struct net_device *dev = priv->net_dev;
6430 if (IPW2100_PM_DISABLED)
6433 mutex_lock(&priv->action_mutex);
6435 IPW_DEBUG_INFO("%s: Coming out of suspend...\n", dev->name);
6437 pci_set_power_state(pci_dev, PCI_D0);
6438 err = pci_enable_device(pci_dev);
6440 printk(KERN_ERR "%s: pci_enable_device failed on resume\n",
6442 mutex_unlock(&priv->action_mutex);
6445 pci_restore_state(pci_dev);
6448 * Suspend/Resume resets the PCI configuration space, so we have to
6449 * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
6450 * from interfering with C3 CPU state. pci_restore_state won't help
6451 * here since it only restores the first 64 bytes pci config header.
6453 pci_read_config_dword(pci_dev, 0x40, &val);
6454 if ((val & 0x0000ff00) != 0)
6455 pci_write_config_dword(pci_dev, 0x40, val & 0xffff00ff);
6457 /* Set the device back into the PRESENT state; this will also wake
6458 * the queue of needed */
6459 netif_device_attach(dev);
6461 /* Bring the device back up */
6462 if (!(priv->status & STATUS_RF_KILL_SW))
6463 ipw2100_up(priv, 0);
6465 mutex_unlock(&priv->action_mutex);
6471 #define IPW2100_DEV_ID(x) { PCI_VENDOR_ID_INTEL, 0x1043, 0x8086, x }
6473 static struct pci_device_id ipw2100_pci_id_table[] __devinitdata = {
6474 IPW2100_DEV_ID(0x2520), /* IN 2100A mPCI 3A */
6475 IPW2100_DEV_ID(0x2521), /* IN 2100A mPCI 3B */
6476 IPW2100_DEV_ID(0x2524), /* IN 2100A mPCI 3B */
6477 IPW2100_DEV_ID(0x2525), /* IN 2100A mPCI 3B */
6478 IPW2100_DEV_ID(0x2526), /* IN 2100A mPCI Gen A3 */
6479 IPW2100_DEV_ID(0x2522), /* IN 2100 mPCI 3B */
6480 IPW2100_DEV_ID(0x2523), /* IN 2100 mPCI 3A */
6481 IPW2100_DEV_ID(0x2527), /* IN 2100 mPCI 3B */
6482 IPW2100_DEV_ID(0x2528), /* IN 2100 mPCI 3B */
6483 IPW2100_DEV_ID(0x2529), /* IN 2100 mPCI 3B */
6484 IPW2100_DEV_ID(0x252B), /* IN 2100 mPCI 3A */
6485 IPW2100_DEV_ID(0x252C), /* IN 2100 mPCI 3A */
6486 IPW2100_DEV_ID(0x252D), /* IN 2100 mPCI 3A */
6488 IPW2100_DEV_ID(0x2550), /* IB 2100A mPCI 3B */
6489 IPW2100_DEV_ID(0x2551), /* IB 2100 mPCI 3B */
6490 IPW2100_DEV_ID(0x2553), /* IB 2100 mPCI 3B */
6491 IPW2100_DEV_ID(0x2554), /* IB 2100 mPCI 3B */
6492 IPW2100_DEV_ID(0x2555), /* IB 2100 mPCI 3B */
6494 IPW2100_DEV_ID(0x2560), /* DE 2100A mPCI 3A */
6495 IPW2100_DEV_ID(0x2562), /* DE 2100A mPCI 3A */
6496 IPW2100_DEV_ID(0x2563), /* DE 2100A mPCI 3A */
6497 IPW2100_DEV_ID(0x2561), /* DE 2100 mPCI 3A */
6498 IPW2100_DEV_ID(0x2565), /* DE 2100 mPCI 3A */
6499 IPW2100_DEV_ID(0x2566), /* DE 2100 mPCI 3A */
6500 IPW2100_DEV_ID(0x2567), /* DE 2100 mPCI 3A */
6502 IPW2100_DEV_ID(0x2570), /* GA 2100 mPCI 3B */
6504 IPW2100_DEV_ID(0x2580), /* TO 2100A mPCI 3B */
6505 IPW2100_DEV_ID(0x2582), /* TO 2100A mPCI 3B */
6506 IPW2100_DEV_ID(0x2583), /* TO 2100A mPCI 3B */
6507 IPW2100_DEV_ID(0x2581), /* TO 2100 mPCI 3B */
6508 IPW2100_DEV_ID(0x2585), /* TO 2100 mPCI 3B */
6509 IPW2100_DEV_ID(0x2586), /* TO 2100 mPCI 3B */
6510 IPW2100_DEV_ID(0x2587), /* TO 2100 mPCI 3B */
6512 IPW2100_DEV_ID(0x2590), /* SO 2100A mPCI 3B */
6513 IPW2100_DEV_ID(0x2592), /* SO 2100A mPCI 3B */
6514 IPW2100_DEV_ID(0x2591), /* SO 2100 mPCI 3B */
6515 IPW2100_DEV_ID(0x2593), /* SO 2100 mPCI 3B */
6516 IPW2100_DEV_ID(0x2596), /* SO 2100 mPCI 3B */
6517 IPW2100_DEV_ID(0x2598), /* SO 2100 mPCI 3B */
6519 IPW2100_DEV_ID(0x25A0), /* HP 2100 mPCI 3B */
6523 MODULE_DEVICE_TABLE(pci, ipw2100_pci_id_table);
6525 static struct pci_driver ipw2100_pci_driver = {
6527 .id_table = ipw2100_pci_id_table,
6528 .probe = ipw2100_pci_init_one,
6529 .remove = __devexit_p(ipw2100_pci_remove_one),
6531 .suspend = ipw2100_suspend,
6532 .resume = ipw2100_resume,
6537 * Initialize the ipw2100 driver/module
6539 * @returns 0 if ok, < 0 errno node con error.
6541 * Note: we cannot init the /proc stuff until the PCI driver is there,
6542 * or we risk an unlikely race condition on someone accessing
6543 * uninitialized data in the PCI dev struct through /proc.
6545 static int __init ipw2100_init(void)
6549 printk(KERN_INFO DRV_NAME ": %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
6550 printk(KERN_INFO DRV_NAME ": %s\n", DRV_COPYRIGHT);
6552 ret = pci_register_driver(&ipw2100_pci_driver);
6556 pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100",
6557 PM_QOS_DEFAULT_VALUE);
6558 #ifdef CONFIG_IPW2100_DEBUG
6559 ipw2100_debug_level = debug;
6560 ret = driver_create_file(&ipw2100_pci_driver.driver,
6561 &driver_attr_debug_level);
6569 * Cleanup ipw2100 driver registration
6571 static void __exit ipw2100_exit(void)
6573 /* FIXME: IPG: check that we have no instances of the devices open */
6574 #ifdef CONFIG_IPW2100_DEBUG
6575 driver_remove_file(&ipw2100_pci_driver.driver,
6576 &driver_attr_debug_level);
6578 pci_unregister_driver(&ipw2100_pci_driver);
6579 pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, "ipw2100");
6582 module_init(ipw2100_init);
6583 module_exit(ipw2100_exit);
6585 #define WEXT_USECHANNELS 1
6587 static const long ipw2100_frequencies[] = {
6588 2412, 2417, 2422, 2427,
6589 2432, 2437, 2442, 2447,
6590 2452, 2457, 2462, 2467,
6594 #define FREQ_COUNT ARRAY_SIZE(ipw2100_frequencies)
6596 static const long ipw2100_rates_11b[] = {
6603 #define RATE_COUNT ARRAY_SIZE(ipw2100_rates_11b)
6605 static int ipw2100_wx_get_name(struct net_device *dev,
6606 struct iw_request_info *info,
6607 union iwreq_data *wrqu, char *extra)
6610 * This can be called at any time. No action lock required
6613 struct ipw2100_priv *priv = ieee80211_priv(dev);
6614 if (!(priv->status & STATUS_ASSOCIATED))
6615 strcpy(wrqu->name, "unassociated");
6617 snprintf(wrqu->name, IFNAMSIZ, "IEEE 802.11b");
6619 IPW_DEBUG_WX("Name: %s\n", wrqu->name);
6623 static int ipw2100_wx_set_freq(struct net_device *dev,
6624 struct iw_request_info *info,
6625 union iwreq_data *wrqu, char *extra)
6627 struct ipw2100_priv *priv = ieee80211_priv(dev);
6628 struct iw_freq *fwrq = &wrqu->freq;
6631 if (priv->ieee->iw_mode == IW_MODE_INFRA)
6634 mutex_lock(&priv->action_mutex);
6635 if (!(priv->status & STATUS_INITIALIZED)) {
6640 /* if setting by freq convert to channel */
6642 if ((fwrq->m >= (int)2.412e8 && fwrq->m <= (int)2.487e8)) {
6643 int f = fwrq->m / 100000;
6646 while ((c < REG_MAX_CHANNEL) &&
6647 (f != ipw2100_frequencies[c]))
6650 /* hack to fall through */
6656 if (fwrq->e > 0 || fwrq->m > 1000) {
6659 } else { /* Set the channel */
6660 IPW_DEBUG_WX("SET Freq/Channel -> %d \n", fwrq->m);
6661 err = ipw2100_set_channel(priv, fwrq->m, 0);
6665 mutex_unlock(&priv->action_mutex);
6669 static int ipw2100_wx_get_freq(struct net_device *dev,
6670 struct iw_request_info *info,
6671 union iwreq_data *wrqu, char *extra)
6674 * This can be called at any time. No action lock required
6677 struct ipw2100_priv *priv = ieee80211_priv(dev);
6681 /* If we are associated, trying to associate, or have a statically
6682 * configured CHANNEL then return that; otherwise return ANY */
6683 if (priv->config & CFG_STATIC_CHANNEL ||
6684 priv->status & STATUS_ASSOCIATED)
6685 wrqu->freq.m = priv->channel;
6689 IPW_DEBUG_WX("GET Freq/Channel -> %d \n", priv->channel);
6694 static int ipw2100_wx_set_mode(struct net_device *dev,
6695 struct iw_request_info *info,
6696 union iwreq_data *wrqu, char *extra)
6698 struct ipw2100_priv *priv = ieee80211_priv(dev);
6701 IPW_DEBUG_WX("SET Mode -> %d \n", wrqu->mode);
6703 if (wrqu->mode == priv->ieee->iw_mode)
6706 mutex_lock(&priv->action_mutex);
6707 if (!(priv->status & STATUS_INITIALIZED)) {
6712 switch (wrqu->mode) {
6713 #ifdef CONFIG_IPW2100_MONITOR
6714 case IW_MODE_MONITOR:
6715 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
6717 #endif /* CONFIG_IPW2100_MONITOR */
6719 err = ipw2100_switch_mode(priv, IW_MODE_ADHOC);
6724 err = ipw2100_switch_mode(priv, IW_MODE_INFRA);
6729 mutex_unlock(&priv->action_mutex);
6733 static int ipw2100_wx_get_mode(struct net_device *dev,
6734 struct iw_request_info *info,
6735 union iwreq_data *wrqu, char *extra)
6738 * This can be called at any time. No action lock required
6741 struct ipw2100_priv *priv = ieee80211_priv(dev);
6743 wrqu->mode = priv->ieee->iw_mode;
6744 IPW_DEBUG_WX("GET Mode -> %d\n", wrqu->mode);
6749 #define POWER_MODES 5
6751 /* Values are in microsecond */
6752 static const s32 timeout_duration[POWER_MODES] = {
6760 static const s32 period_duration[POWER_MODES] = {
6768 static int ipw2100_wx_get_range(struct net_device *dev,
6769 struct iw_request_info *info,
6770 union iwreq_data *wrqu, char *extra)
6773 * This can be called at any time. No action lock required
6776 struct ipw2100_priv *priv = ieee80211_priv(dev);
6777 struct iw_range *range = (struct iw_range *)extra;
6781 wrqu->data.length = sizeof(*range);
6782 memset(range, 0, sizeof(*range));
6784 /* Let's try to keep this struct in the same order as in
6785 * linux/include/wireless.h
6788 /* TODO: See what values we can set, and remove the ones we can't
6789 * set, or fill them with some default data.
6792 /* ~5 Mb/s real (802.11b) */
6793 range->throughput = 5 * 1000 * 1000;
6795 // range->sensitivity; /* signal level threshold range */
6797 range->max_qual.qual = 100;
6798 /* TODO: Find real max RSSI and stick here */
6799 range->max_qual.level = 0;
6800 range->max_qual.noise = 0;
6801 range->max_qual.updated = 7; /* Updated all three */
6803 range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */
6804 /* TODO: Find real 'good' to 'bad' threshol value for RSSI */
6805 range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM;
6806 range->avg_qual.noise = 0;
6807 range->avg_qual.updated = 7; /* Updated all three */
6809 range->num_bitrates = RATE_COUNT;
6811 for (i = 0; i < RATE_COUNT && i < IW_MAX_BITRATES; i++) {
6812 range->bitrate[i] = ipw2100_rates_11b[i];
6815 range->min_rts = MIN_RTS_THRESHOLD;
6816 range->max_rts = MAX_RTS_THRESHOLD;
6817 range->min_frag = MIN_FRAG_THRESHOLD;
6818 range->max_frag = MAX_FRAG_THRESHOLD;
6820 range->min_pmp = period_duration[0]; /* Minimal PM period */
6821 range->max_pmp = period_duration[POWER_MODES - 1]; /* Maximal PM period */
6822 range->min_pmt = timeout_duration[POWER_MODES - 1]; /* Minimal PM timeout */
6823 range->max_pmt = timeout_duration[0]; /* Maximal PM timeout */
6825 /* How to decode max/min PM period */
6826 range->pmp_flags = IW_POWER_PERIOD;
6827 /* How to decode max/min PM period */
6828 range->pmt_flags = IW_POWER_TIMEOUT;
6829 /* What PM options are supported */
6830 range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD;
6832 range->encoding_size[0] = 5;
6833 range->encoding_size[1] = 13; /* Different token sizes */
6834 range->num_encoding_sizes = 2; /* Number of entry in the list */
6835 range->max_encoding_tokens = WEP_KEYS; /* Max number of tokens */
6836 // range->encoding_login_index; /* token index for login token */
6838 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
6839 range->txpower_capa = IW_TXPOW_DBM;
6840 range->num_txpower = IW_MAX_TXPOWER;
6841 for (i = 0, level = (IPW_TX_POWER_MAX_DBM * 16);
6844 ((IPW_TX_POWER_MAX_DBM -
6845 IPW_TX_POWER_MIN_DBM) * 16) / (IW_MAX_TXPOWER - 1))
6846 range->txpower[i] = level / 16;
6848 range->txpower_capa = 0;
6849 range->num_txpower = 0;
6852 /* Set the Wireless Extension versions */
6853 range->we_version_compiled = WIRELESS_EXT;
6854 range->we_version_source = 18;
6856 // range->retry_capa; /* What retry options are supported */
6857 // range->retry_flags; /* How to decode max/min retry limit */
6858 // range->r_time_flags; /* How to decode max/min retry life */
6859 // range->min_retry; /* Minimal number of retries */
6860 // range->max_retry; /* Maximal number of retries */
6861 // range->min_r_time; /* Minimal retry lifetime */
6862 // range->max_r_time; /* Maximal retry lifetime */
6864 range->num_channels = FREQ_COUNT;
6867 for (i = 0; i < FREQ_COUNT; i++) {
6868 // TODO: Include only legal frequencies for some countries
6869 // if (local->channel_mask & (1 << i)) {
6870 range->freq[val].i = i + 1;
6871 range->freq[val].m = ipw2100_frequencies[i] * 100000;
6872 range->freq[val].e = 1;
6875 if (val == IW_MAX_FREQUENCIES)
6878 range->num_frequency = val;
6880 /* Event capability (kernel + driver) */
6881 range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
6882 IW_EVENT_CAPA_MASK(SIOCGIWAP));
6883 range->event_capa[1] = IW_EVENT_CAPA_K_1;
6885 range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
6886 IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;
6888 IPW_DEBUG_WX("GET Range\n");
6893 static int ipw2100_wx_set_wap(struct net_device *dev,
6894 struct iw_request_info *info,
6895 union iwreq_data *wrqu, char *extra)
6897 struct ipw2100_priv *priv = ieee80211_priv(dev);
6900 static const unsigned char any[] = {
6901 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
6903 static const unsigned char off[] = {
6904 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
6908 if (wrqu->ap_addr.sa_family != ARPHRD_ETHER)
6911 mutex_lock(&priv->action_mutex);
6912 if (!(priv->status & STATUS_INITIALIZED)) {
6917 if (!memcmp(any, wrqu->ap_addr.sa_data, ETH_ALEN) ||
6918 !memcmp(off, wrqu->ap_addr.sa_data, ETH_ALEN)) {
6919 /* we disable mandatory BSSID association */
6920 IPW_DEBUG_WX("exit - disable mandatory BSSID\n");
6921 priv->config &= ~CFG_STATIC_BSSID;
6922 err = ipw2100_set_mandatory_bssid(priv, NULL, 0);
6926 priv->config |= CFG_STATIC_BSSID;
6927 memcpy(priv->mandatory_bssid_mac, wrqu->ap_addr.sa_data, ETH_ALEN);
6929 err = ipw2100_set_mandatory_bssid(priv, wrqu->ap_addr.sa_data, 0);
6931 IPW_DEBUG_WX("SET BSSID -> %pM\n", wrqu->ap_addr.sa_data);
6934 mutex_unlock(&priv->action_mutex);
6938 static int ipw2100_wx_get_wap(struct net_device *dev,
6939 struct iw_request_info *info,
6940 union iwreq_data *wrqu, char *extra)
6943 * This can be called at any time. No action lock required
6946 struct ipw2100_priv *priv = ieee80211_priv(dev);
6948 /* If we are associated, trying to associate, or have a statically
6949 * configured BSSID then return that; otherwise return ANY */
6950 if (priv->config & CFG_STATIC_BSSID || priv->status & STATUS_ASSOCIATED) {
6951 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
6952 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
6954 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
6956 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data);
6960 static int ipw2100_wx_set_essid(struct net_device *dev,
6961 struct iw_request_info *info,
6962 union iwreq_data *wrqu, char *extra)
6964 struct ipw2100_priv *priv = ieee80211_priv(dev);
6965 char *essid = ""; /* ANY */
6968 DECLARE_SSID_BUF(ssid);
6970 mutex_lock(&priv->action_mutex);
6971 if (!(priv->status & STATUS_INITIALIZED)) {
6976 if (wrqu->essid.flags && wrqu->essid.length) {
6977 length = wrqu->essid.length;
6982 IPW_DEBUG_WX("Setting ESSID to ANY\n");
6983 priv->config &= ~CFG_STATIC_ESSID;
6984 err = ipw2100_set_essid(priv, NULL, 0, 0);
6988 length = min(length, IW_ESSID_MAX_SIZE);
6990 priv->config |= CFG_STATIC_ESSID;
6992 if (priv->essid_len == length && !memcmp(priv->essid, extra, length)) {
6993 IPW_DEBUG_WX("ESSID set to current ESSID.\n");
6998 IPW_DEBUG_WX("Setting ESSID: '%s' (%d)\n",
6999 print_ssid(ssid, essid, length), length);
7001 priv->essid_len = length;
7002 memcpy(priv->essid, essid, priv->essid_len);
7004 err = ipw2100_set_essid(priv, essid, length, 0);
7007 mutex_unlock(&priv->action_mutex);
7011 static int ipw2100_wx_get_essid(struct net_device *dev,
7012 struct iw_request_info *info,
7013 union iwreq_data *wrqu, char *extra)
7016 * This can be called at any time. No action lock required
7019 struct ipw2100_priv *priv = ieee80211_priv(dev);
7020 DECLARE_SSID_BUF(ssid);
7022 /* If we are associated, trying to associate, or have a statically
7023 * configured ESSID then return that; otherwise return ANY */
7024 if (priv->config & CFG_STATIC_ESSID || priv->status & STATUS_ASSOCIATED) {
7025 IPW_DEBUG_WX("Getting essid: '%s'\n",
7026 print_ssid(ssid, priv->essid, priv->essid_len));
7027 memcpy(extra, priv->essid, priv->essid_len);
7028 wrqu->essid.length = priv->essid_len;
7029 wrqu->essid.flags = 1; /* active */
7031 IPW_DEBUG_WX("Getting essid: ANY\n");
7032 wrqu->essid.length = 0;
7033 wrqu->essid.flags = 0; /* active */
7039 static int ipw2100_wx_set_nick(struct net_device *dev,
7040 struct iw_request_info *info,
7041 union iwreq_data *wrqu, char *extra)
7044 * This can be called at any time. No action lock required
7047 struct ipw2100_priv *priv = ieee80211_priv(dev);
7049 if (wrqu->data.length > IW_ESSID_MAX_SIZE)
7052 wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
7053 memset(priv->nick, 0, sizeof(priv->nick));
7054 memcpy(priv->nick, extra, wrqu->data.length);
7056 IPW_DEBUG_WX("SET Nickname -> %s \n", priv->nick);
7061 static int ipw2100_wx_get_nick(struct net_device *dev,
7062 struct iw_request_info *info,
7063 union iwreq_data *wrqu, char *extra)
7066 * This can be called at any time. No action lock required
7069 struct ipw2100_priv *priv = ieee80211_priv(dev);
7071 wrqu->data.length = strlen(priv->nick);
7072 memcpy(extra, priv->nick, wrqu->data.length);
7073 wrqu->data.flags = 1; /* active */
7075 IPW_DEBUG_WX("GET Nickname -> %s \n", extra);
7080 static int ipw2100_wx_set_rate(struct net_device *dev,
7081 struct iw_request_info *info,
7082 union iwreq_data *wrqu, char *extra)
7084 struct ipw2100_priv *priv = ieee80211_priv(dev);
7085 u32 target_rate = wrqu->bitrate.value;
7089 mutex_lock(&priv->action_mutex);
7090 if (!(priv->status & STATUS_INITIALIZED)) {
7097 if (target_rate == 1000000 ||
7098 (!wrqu->bitrate.fixed && target_rate > 1000000))
7099 rate |= TX_RATE_1_MBIT;
7100 if (target_rate == 2000000 ||
7101 (!wrqu->bitrate.fixed && target_rate > 2000000))
7102 rate |= TX_RATE_2_MBIT;
7103 if (target_rate == 5500000 ||
7104 (!wrqu->bitrate.fixed && target_rate > 5500000))
7105 rate |= TX_RATE_5_5_MBIT;
7106 if (target_rate == 11000000 ||
7107 (!wrqu->bitrate.fixed && target_rate > 11000000))
7108 rate |= TX_RATE_11_MBIT;
7110 rate = DEFAULT_TX_RATES;
7112 err = ipw2100_set_tx_rates(priv, rate, 0);
7114 IPW_DEBUG_WX("SET Rate -> %04X \n", rate);
7116 mutex_unlock(&priv->action_mutex);
7120 static int ipw2100_wx_get_rate(struct net_device *dev,
7121 struct iw_request_info *info,
7122 union iwreq_data *wrqu, char *extra)
7124 struct ipw2100_priv *priv = ieee80211_priv(dev);
7126 unsigned int len = sizeof(val);
7129 if (!(priv->status & STATUS_ENABLED) ||
7130 priv->status & STATUS_RF_KILL_MASK ||
7131 !(priv->status & STATUS_ASSOCIATED)) {
7132 wrqu->bitrate.value = 0;
7136 mutex_lock(&priv->action_mutex);
7137 if (!(priv->status & STATUS_INITIALIZED)) {
7142 err = ipw2100_get_ordinal(priv, IPW_ORD_CURRENT_TX_RATE, &val, &len);
7144 IPW_DEBUG_WX("failed querying ordinals.\n");
7148 switch (val & TX_RATE_MASK) {
7149 case TX_RATE_1_MBIT:
7150 wrqu->bitrate.value = 1000000;
7152 case TX_RATE_2_MBIT:
7153 wrqu->bitrate.value = 2000000;
7155 case TX_RATE_5_5_MBIT:
7156 wrqu->bitrate.value = 5500000;
7158 case TX_RATE_11_MBIT:
7159 wrqu->bitrate.value = 11000000;
7162 wrqu->bitrate.value = 0;
7165 IPW_DEBUG_WX("GET Rate -> %d \n", wrqu->bitrate.value);
7168 mutex_unlock(&priv->action_mutex);
7172 static int ipw2100_wx_set_rts(struct net_device *dev,
7173 struct iw_request_info *info,
7174 union iwreq_data *wrqu, char *extra)
7176 struct ipw2100_priv *priv = ieee80211_priv(dev);
7179 /* Auto RTS not yet supported */
7180 if (wrqu->rts.fixed == 0)
7183 mutex_lock(&priv->action_mutex);
7184 if (!(priv->status & STATUS_INITIALIZED)) {
7189 if (wrqu->rts.disabled)
7190 value = priv->rts_threshold | RTS_DISABLED;
7192 if (wrqu->rts.value < 1 || wrqu->rts.value > 2304) {
7196 value = wrqu->rts.value;
7199 err = ipw2100_set_rts_threshold(priv, value);
7201 IPW_DEBUG_WX("SET RTS Threshold -> 0x%08X \n", value);
7203 mutex_unlock(&priv->action_mutex);
7207 static int ipw2100_wx_get_rts(struct net_device *dev,
7208 struct iw_request_info *info,
7209 union iwreq_data *wrqu, char *extra)
7212 * This can be called at any time. No action lock required
7215 struct ipw2100_priv *priv = ieee80211_priv(dev);
7217 wrqu->rts.value = priv->rts_threshold & ~RTS_DISABLED;
7218 wrqu->rts.fixed = 1; /* no auto select */
7220 /* If RTS is set to the default value, then it is disabled */
7221 wrqu->rts.disabled = (priv->rts_threshold & RTS_DISABLED) ? 1 : 0;
7223 IPW_DEBUG_WX("GET RTS Threshold -> 0x%08X \n", wrqu->rts.value);
7228 static int ipw2100_wx_set_txpow(struct net_device *dev,
7229 struct iw_request_info *info,
7230 union iwreq_data *wrqu, char *extra)
7232 struct ipw2100_priv *priv = ieee80211_priv(dev);
7235 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled))
7236 return -EINPROGRESS;
7238 if (priv->ieee->iw_mode != IW_MODE_ADHOC)
7241 if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
7244 if (wrqu->txpower.fixed == 0)
7245 value = IPW_TX_POWER_DEFAULT;
7247 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
7248 wrqu->txpower.value > IPW_TX_POWER_MAX_DBM)
7251 value = wrqu->txpower.value;
7254 mutex_lock(&priv->action_mutex);
7255 if (!(priv->status & STATUS_INITIALIZED)) {
7260 err = ipw2100_set_tx_power(priv, value);
7262 IPW_DEBUG_WX("SET TX Power -> %d \n", value);
7265 mutex_unlock(&priv->action_mutex);
7269 static int ipw2100_wx_get_txpow(struct net_device *dev,
7270 struct iw_request_info *info,
7271 union iwreq_data *wrqu, char *extra)
7274 * This can be called at any time. No action lock required
7277 struct ipw2100_priv *priv = ieee80211_priv(dev);
7279 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
7281 if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
7282 wrqu->txpower.fixed = 0;
7283 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM;
7285 wrqu->txpower.fixed = 1;
7286 wrqu->txpower.value = priv->tx_power;
7289 wrqu->txpower.flags = IW_TXPOW_DBM;
7291 IPW_DEBUG_WX("GET TX Power -> %d \n", wrqu->txpower.value);
7296 static int ipw2100_wx_set_frag(struct net_device *dev,
7297 struct iw_request_info *info,
7298 union iwreq_data *wrqu, char *extra)
7301 * This can be called at any time. No action lock required
7304 struct ipw2100_priv *priv = ieee80211_priv(dev);
7306 if (!wrqu->frag.fixed)
7309 if (wrqu->frag.disabled) {
7310 priv->frag_threshold |= FRAG_DISABLED;
7311 priv->ieee->fts = DEFAULT_FTS;
7313 if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
7314 wrqu->frag.value > MAX_FRAG_THRESHOLD)
7317 priv->ieee->fts = wrqu->frag.value & ~0x1;
7318 priv->frag_threshold = priv->ieee->fts;
7321 IPW_DEBUG_WX("SET Frag Threshold -> %d \n", priv->ieee->fts);
7326 static int ipw2100_wx_get_frag(struct net_device *dev,
7327 struct iw_request_info *info,
7328 union iwreq_data *wrqu, char *extra)
7331 * This can be called at any time. No action lock required
7334 struct ipw2100_priv *priv = ieee80211_priv(dev);
7335 wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED;
7336 wrqu->frag.fixed = 0; /* no auto select */
7337 wrqu->frag.disabled = (priv->frag_threshold & FRAG_DISABLED) ? 1 : 0;
7339 IPW_DEBUG_WX("GET Frag Threshold -> %d \n", wrqu->frag.value);
7344 static int ipw2100_wx_set_retry(struct net_device *dev,
7345 struct iw_request_info *info,
7346 union iwreq_data *wrqu, char *extra)
7348 struct ipw2100_priv *priv = ieee80211_priv(dev);
7351 if (wrqu->retry.flags & IW_RETRY_LIFETIME || wrqu->retry.disabled)
7354 if (!(wrqu->retry.flags & IW_RETRY_LIMIT))
7357 mutex_lock(&priv->action_mutex);
7358 if (!(priv->status & STATUS_INITIALIZED)) {
7363 if (wrqu->retry.flags & IW_RETRY_SHORT) {
7364 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7365 IPW_DEBUG_WX("SET Short Retry Limit -> %d \n",
7370 if (wrqu->retry.flags & IW_RETRY_LONG) {
7371 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7372 IPW_DEBUG_WX("SET Long Retry Limit -> %d \n",
7377 err = ipw2100_set_short_retry(priv, wrqu->retry.value);
7379 err = ipw2100_set_long_retry(priv, wrqu->retry.value);
7381 IPW_DEBUG_WX("SET Both Retry Limits -> %d \n", wrqu->retry.value);
7384 mutex_unlock(&priv->action_mutex);
7388 static int ipw2100_wx_get_retry(struct net_device *dev,
7389 struct iw_request_info *info,
7390 union iwreq_data *wrqu, char *extra)
7393 * This can be called at any time. No action lock required
7396 struct ipw2100_priv *priv = ieee80211_priv(dev);
7398 wrqu->retry.disabled = 0; /* can't be disabled */
7400 if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME)
7403 if (wrqu->retry.flags & IW_RETRY_LONG) {
7404 wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
7405 wrqu->retry.value = priv->long_retry_limit;
7408 (priv->short_retry_limit !=
7409 priv->long_retry_limit) ?
7410 IW_RETRY_LIMIT | IW_RETRY_SHORT : IW_RETRY_LIMIT;
7412 wrqu->retry.value = priv->short_retry_limit;
7415 IPW_DEBUG_WX("GET Retry -> %d \n", wrqu->retry.value);
7420 static int ipw2100_wx_set_scan(struct net_device *dev,
7421 struct iw_request_info *info,
7422 union iwreq_data *wrqu, char *extra)
7424 struct ipw2100_priv *priv = ieee80211_priv(dev);
7427 mutex_lock(&priv->action_mutex);
7428 if (!(priv->status & STATUS_INITIALIZED)) {
7433 IPW_DEBUG_WX("Initiating scan...\n");
7435 priv->user_requested_scan = 1;
7436 if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) {
7437 IPW_DEBUG_WX("Start scan failed.\n");
7439 /* TODO: Mark a scan as pending so when hardware initialized
7444 mutex_unlock(&priv->action_mutex);
7448 static int ipw2100_wx_get_scan(struct net_device *dev,
7449 struct iw_request_info *info,
7450 union iwreq_data *wrqu, char *extra)
7453 * This can be called at any time. No action lock required
7456 struct ipw2100_priv *priv = ieee80211_priv(dev);
7457 return ieee80211_wx_get_scan(priv->ieee, info, wrqu, extra);
7461 * Implementation based on code in hostap-driver v0.1.3 hostap_ioctl.c
7463 static int ipw2100_wx_set_encode(struct net_device *dev,
7464 struct iw_request_info *info,
7465 union iwreq_data *wrqu, char *key)
7468 * No check of STATUS_INITIALIZED required
7471 struct ipw2100_priv *priv = ieee80211_priv(dev);
7472 return ieee80211_wx_set_encode(priv->ieee, info, wrqu, key);
7475 static int ipw2100_wx_get_encode(struct net_device *dev,
7476 struct iw_request_info *info,
7477 union iwreq_data *wrqu, char *key)
7480 * This can be called at any time. No action lock required
7483 struct ipw2100_priv *priv = ieee80211_priv(dev);
7484 return ieee80211_wx_get_encode(priv->ieee, info, wrqu, key);
7487 static int ipw2100_wx_set_power(struct net_device *dev,
7488 struct iw_request_info *info,
7489 union iwreq_data *wrqu, char *extra)
7491 struct ipw2100_priv *priv = ieee80211_priv(dev);
7494 mutex_lock(&priv->action_mutex);
7495 if (!(priv->status & STATUS_INITIALIZED)) {
7500 if (wrqu->power.disabled) {
7501 priv->power_mode = IPW_POWER_LEVEL(priv->power_mode);
7502 err = ipw2100_set_power_mode(priv, IPW_POWER_MODE_CAM);
7503 IPW_DEBUG_WX("SET Power Management Mode -> off\n");
7507 switch (wrqu->power.flags & IW_POWER_MODE) {
7508 case IW_POWER_ON: /* If not specified */
7509 case IW_POWER_MODE: /* If set all mask */
7510 case IW_POWER_ALL_R: /* If explicitly state all */
7512 default: /* Otherwise we don't support it */
7513 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
7519 /* If the user hasn't specified a power management mode yet, default
7521 priv->power_mode = IPW_POWER_ENABLED | priv->power_mode;
7522 err = ipw2100_set_power_mode(priv, IPW_POWER_LEVEL(priv->power_mode));
7524 IPW_DEBUG_WX("SET Power Management Mode -> 0x%02X\n", priv->power_mode);
7527 mutex_unlock(&priv->action_mutex);
7532 static int ipw2100_wx_get_power(struct net_device *dev,
7533 struct iw_request_info *info,
7534 union iwreq_data *wrqu, char *extra)
7537 * This can be called at any time. No action lock required
7540 struct ipw2100_priv *priv = ieee80211_priv(dev);
7542 if (!(priv->power_mode & IPW_POWER_ENABLED))
7543 wrqu->power.disabled = 1;
7545 wrqu->power.disabled = 0;
7546 wrqu->power.flags = 0;
7549 IPW_DEBUG_WX("GET Power Management Mode -> %02X\n", priv->power_mode);
7559 static int ipw2100_wx_set_genie(struct net_device *dev,
7560 struct iw_request_info *info,
7561 union iwreq_data *wrqu, char *extra)
7564 struct ipw2100_priv *priv = ieee80211_priv(dev);
7565 struct ieee80211_device *ieee = priv->ieee;
7568 if (!ieee->wpa_enabled)
7571 if (wrqu->data.length > MAX_WPA_IE_LEN ||
7572 (wrqu->data.length && extra == NULL))
7575 if (wrqu->data.length) {
7576 buf = kmemdup(extra, wrqu->data.length, GFP_KERNEL);
7580 kfree(ieee->wpa_ie);
7582 ieee->wpa_ie_len = wrqu->data.length;
7584 kfree(ieee->wpa_ie);
7585 ieee->wpa_ie = NULL;
7586 ieee->wpa_ie_len = 0;
7589 ipw2100_wpa_assoc_frame(priv, ieee->wpa_ie, ieee->wpa_ie_len);
7595 static int ipw2100_wx_get_genie(struct net_device *dev,
7596 struct iw_request_info *info,
7597 union iwreq_data *wrqu, char *extra)
7599 struct ipw2100_priv *priv = ieee80211_priv(dev);
7600 struct ieee80211_device *ieee = priv->ieee;
7602 if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
7603 wrqu->data.length = 0;
7607 if (wrqu->data.length < ieee->wpa_ie_len)
7610 wrqu->data.length = ieee->wpa_ie_len;
7611 memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
7617 static int ipw2100_wx_set_auth(struct net_device *dev,
7618 struct iw_request_info *info,
7619 union iwreq_data *wrqu, char *extra)
7621 struct ipw2100_priv *priv = ieee80211_priv(dev);
7622 struct ieee80211_device *ieee = priv->ieee;
7623 struct iw_param *param = &wrqu->param;
7624 struct lib80211_crypt_data *crypt;
7625 unsigned long flags;
7628 switch (param->flags & IW_AUTH_INDEX) {
7629 case IW_AUTH_WPA_VERSION:
7630 case IW_AUTH_CIPHER_PAIRWISE:
7631 case IW_AUTH_CIPHER_GROUP:
7632 case IW_AUTH_KEY_MGMT:
7634 * ipw2200 does not use these parameters
7638 case IW_AUTH_TKIP_COUNTERMEASURES:
7639 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7640 if (!crypt || !crypt->ops->set_flags || !crypt->ops->get_flags)
7643 flags = crypt->ops->get_flags(crypt->priv);
7646 flags |= IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7648 flags &= ~IEEE80211_CRYPTO_TKIP_COUNTERMEASURES;
7650 crypt->ops->set_flags(flags, crypt->priv);
7654 case IW_AUTH_DROP_UNENCRYPTED:{
7657 * wpa_supplicant calls set_wpa_enabled when the driver
7658 * is loaded and unloaded, regardless of if WPA is being
7659 * used. No other calls are made which can be used to
7660 * determine if encryption will be used or not prior to
7661 * association being expected. If encryption is not being
7662 * used, drop_unencrypted is set to false, else true -- we
7663 * can use this to determine if the CAP_PRIVACY_ON bit should
7666 struct ieee80211_security sec = {
7667 .flags = SEC_ENABLED,
7668 .enabled = param->value,
7670 priv->ieee->drop_unencrypted = param->value;
7671 /* We only change SEC_LEVEL for open mode. Others
7672 * are set by ipw_wpa_set_encryption.
7674 if (!param->value) {
7675 sec.flags |= SEC_LEVEL;
7676 sec.level = SEC_LEVEL_0;
7678 sec.flags |= SEC_LEVEL;
7679 sec.level = SEC_LEVEL_1;
7681 if (priv->ieee->set_security)
7682 priv->ieee->set_security(priv->ieee->dev, &sec);
7686 case IW_AUTH_80211_AUTH_ALG:
7687 ret = ipw2100_wpa_set_auth_algs(priv, param->value);
7690 case IW_AUTH_WPA_ENABLED:
7691 ret = ipw2100_wpa_enable(priv, param->value);
7694 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7695 ieee->ieee802_1x = param->value;
7698 //case IW_AUTH_ROAMING_CONTROL:
7699 case IW_AUTH_PRIVACY_INVOKED:
7700 ieee->privacy_invoked = param->value;
7710 static int ipw2100_wx_get_auth(struct net_device *dev,
7711 struct iw_request_info *info,
7712 union iwreq_data *wrqu, char *extra)
7714 struct ipw2100_priv *priv = ieee80211_priv(dev);
7715 struct ieee80211_device *ieee = priv->ieee;
7716 struct lib80211_crypt_data *crypt;
7717 struct iw_param *param = &wrqu->param;
7720 switch (param->flags & IW_AUTH_INDEX) {
7721 case IW_AUTH_WPA_VERSION:
7722 case IW_AUTH_CIPHER_PAIRWISE:
7723 case IW_AUTH_CIPHER_GROUP:
7724 case IW_AUTH_KEY_MGMT:
7726 * wpa_supplicant will control these internally
7731 case IW_AUTH_TKIP_COUNTERMEASURES:
7732 crypt = priv->ieee->crypt_info.crypt[priv->ieee->crypt_info.tx_keyidx];
7733 if (!crypt || !crypt->ops->get_flags) {
7734 IPW_DEBUG_WARNING("Can't get TKIP countermeasures: "
7735 "crypt not set!\n");
7739 param->value = (crypt->ops->get_flags(crypt->priv) &
7740 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) ? 1 : 0;
7744 case IW_AUTH_DROP_UNENCRYPTED:
7745 param->value = ieee->drop_unencrypted;
7748 case IW_AUTH_80211_AUTH_ALG:
7749 param->value = priv->ieee->sec.auth_mode;
7752 case IW_AUTH_WPA_ENABLED:
7753 param->value = ieee->wpa_enabled;
7756 case IW_AUTH_RX_UNENCRYPTED_EAPOL:
7757 param->value = ieee->ieee802_1x;
7760 case IW_AUTH_ROAMING_CONTROL:
7761 case IW_AUTH_PRIVACY_INVOKED:
7762 param->value = ieee->privacy_invoked;
7771 /* SIOCSIWENCODEEXT */
7772 static int ipw2100_wx_set_encodeext(struct net_device *dev,
7773 struct iw_request_info *info,
7774 union iwreq_data *wrqu, char *extra)
7776 struct ipw2100_priv *priv = ieee80211_priv(dev);
7777 return ieee80211_wx_set_encodeext(priv->ieee, info, wrqu, extra);
7780 /* SIOCGIWENCODEEXT */
7781 static int ipw2100_wx_get_encodeext(struct net_device *dev,
7782 struct iw_request_info *info,
7783 union iwreq_data *wrqu, char *extra)
7785 struct ipw2100_priv *priv = ieee80211_priv(dev);
7786 return ieee80211_wx_get_encodeext(priv->ieee, info, wrqu, extra);
7790 static int ipw2100_wx_set_mlme(struct net_device *dev,
7791 struct iw_request_info *info,
7792 union iwreq_data *wrqu, char *extra)
7794 struct ipw2100_priv *priv = ieee80211_priv(dev);
7795 struct iw_mlme *mlme = (struct iw_mlme *)extra;
7798 reason = cpu_to_le16(mlme->reason_code);
7800 switch (mlme->cmd) {
7801 case IW_MLME_DEAUTH:
7805 case IW_MLME_DISASSOC:
7806 ipw2100_disassociate_bssid(priv);
7820 #ifdef CONFIG_IPW2100_MONITOR
7821 static int ipw2100_wx_set_promisc(struct net_device *dev,
7822 struct iw_request_info *info,
7823 union iwreq_data *wrqu, char *extra)
7825 struct ipw2100_priv *priv = ieee80211_priv(dev);
7826 int *parms = (int *)extra;
7827 int enable = (parms[0] > 0);
7830 mutex_lock(&priv->action_mutex);
7831 if (!(priv->status & STATUS_INITIALIZED)) {
7837 if (priv->ieee->iw_mode == IW_MODE_MONITOR) {
7838 err = ipw2100_set_channel(priv, parms[1], 0);
7841 priv->channel = parms[1];
7842 err = ipw2100_switch_mode(priv, IW_MODE_MONITOR);
7844 if (priv->ieee->iw_mode == IW_MODE_MONITOR)
7845 err = ipw2100_switch_mode(priv, priv->last_mode);
7848 mutex_unlock(&priv->action_mutex);
7852 static int ipw2100_wx_reset(struct net_device *dev,
7853 struct iw_request_info *info,
7854 union iwreq_data *wrqu, char *extra)
7856 struct ipw2100_priv *priv = ieee80211_priv(dev);
7857 if (priv->status & STATUS_INITIALIZED)
7858 schedule_reset(priv);
7864 static int ipw2100_wx_set_powermode(struct net_device *dev,
7865 struct iw_request_info *info,
7866 union iwreq_data *wrqu, char *extra)
7868 struct ipw2100_priv *priv = ieee80211_priv(dev);
7869 int err = 0, mode = *(int *)extra;
7871 mutex_lock(&priv->action_mutex);
7872 if (!(priv->status & STATUS_INITIALIZED)) {
7877 if ((mode < 0) || (mode > POWER_MODES))
7878 mode = IPW_POWER_AUTO;
7880 if (IPW_POWER_LEVEL(priv->power_mode) != mode)
7881 err = ipw2100_set_power_mode(priv, mode);
7883 mutex_unlock(&priv->action_mutex);
7887 #define MAX_POWER_STRING 80
7888 static int ipw2100_wx_get_powermode(struct net_device *dev,
7889 struct iw_request_info *info,
7890 union iwreq_data *wrqu, char *extra)
7893 * This can be called at any time. No action lock required
7896 struct ipw2100_priv *priv = ieee80211_priv(dev);
7897 int level = IPW_POWER_LEVEL(priv->power_mode);
7898 s32 timeout, period;
7900 if (!(priv->power_mode & IPW_POWER_ENABLED)) {
7901 snprintf(extra, MAX_POWER_STRING,
7902 "Power save level: %d (Off)", level);
7905 case IPW_POWER_MODE_CAM:
7906 snprintf(extra, MAX_POWER_STRING,
7907 "Power save level: %d (None)", level);
7909 case IPW_POWER_AUTO:
7910 snprintf(extra, MAX_POWER_STRING,
7911 "Power save level: %d (Auto)", level);
7914 timeout = timeout_duration[level - 1] / 1000;
7915 period = period_duration[level - 1] / 1000;
7916 snprintf(extra, MAX_POWER_STRING,
7917 "Power save level: %d "
7918 "(Timeout %dms, Period %dms)",
7919 level, timeout, period);
7923 wrqu->data.length = strlen(extra) + 1;
7928 static int ipw2100_wx_set_preamble(struct net_device *dev,
7929 struct iw_request_info *info,
7930 union iwreq_data *wrqu, char *extra)
7932 struct ipw2100_priv *priv = ieee80211_priv(dev);
7933 int err, mode = *(int *)extra;
7935 mutex_lock(&priv->action_mutex);
7936 if (!(priv->status & STATUS_INITIALIZED)) {
7942 priv->config |= CFG_LONG_PREAMBLE;
7944 priv->config &= ~CFG_LONG_PREAMBLE;
7950 err = ipw2100_system_config(priv, 0);
7953 mutex_unlock(&priv->action_mutex);
7957 static int ipw2100_wx_get_preamble(struct net_device *dev,
7958 struct iw_request_info *info,
7959 union iwreq_data *wrqu, char *extra)
7962 * This can be called at any time. No action lock required
7965 struct ipw2100_priv *priv = ieee80211_priv(dev);
7967 if (priv->config & CFG_LONG_PREAMBLE)
7968 snprintf(wrqu->name, IFNAMSIZ, "long (1)");
7970 snprintf(wrqu->name, IFNAMSIZ, "auto (0)");
7975 #ifdef CONFIG_IPW2100_MONITOR
7976 static int ipw2100_wx_set_crc_check(struct net_device *dev,
7977 struct iw_request_info *info,
7978 union iwreq_data *wrqu, char *extra)
7980 struct ipw2100_priv *priv = ieee80211_priv(dev);
7981 int err, mode = *(int *)extra;
7983 mutex_lock(&priv->action_mutex);
7984 if (!(priv->status & STATUS_INITIALIZED)) {
7990 priv->config |= CFG_CRC_CHECK;
7992 priv->config &= ~CFG_CRC_CHECK;
8000 mutex_unlock(&priv->action_mutex);
8004 static int ipw2100_wx_get_crc_check(struct net_device *dev,
8005 struct iw_request_info *info,
8006 union iwreq_data *wrqu, char *extra)
8009 * This can be called at any time. No action lock required
8012 struct ipw2100_priv *priv = ieee80211_priv(dev);
8014 if (priv->config & CFG_CRC_CHECK)
8015 snprintf(wrqu->name, IFNAMSIZ, "CRC checked (1)");
8017 snprintf(wrqu->name, IFNAMSIZ, "CRC ignored (0)");
8021 #endif /* CONFIG_IPW2100_MONITOR */
8023 static iw_handler ipw2100_wx_handlers[] = {
8024 NULL, /* SIOCSIWCOMMIT */
8025 ipw2100_wx_get_name, /* SIOCGIWNAME */
8026 NULL, /* SIOCSIWNWID */
8027 NULL, /* SIOCGIWNWID */
8028 ipw2100_wx_set_freq, /* SIOCSIWFREQ */
8029 ipw2100_wx_get_freq, /* SIOCGIWFREQ */
8030 ipw2100_wx_set_mode, /* SIOCSIWMODE */
8031 ipw2100_wx_get_mode, /* SIOCGIWMODE */
8032 NULL, /* SIOCSIWSENS */
8033 NULL, /* SIOCGIWSENS */
8034 NULL, /* SIOCSIWRANGE */
8035 ipw2100_wx_get_range, /* SIOCGIWRANGE */
8036 NULL, /* SIOCSIWPRIV */
8037 NULL, /* SIOCGIWPRIV */
8038 NULL, /* SIOCSIWSTATS */
8039 NULL, /* SIOCGIWSTATS */
8040 NULL, /* SIOCSIWSPY */
8041 NULL, /* SIOCGIWSPY */
8042 NULL, /* SIOCGIWTHRSPY */
8043 NULL, /* SIOCWIWTHRSPY */
8044 ipw2100_wx_set_wap, /* SIOCSIWAP */
8045 ipw2100_wx_get_wap, /* SIOCGIWAP */
8046 ipw2100_wx_set_mlme, /* SIOCSIWMLME */
8047 NULL, /* SIOCGIWAPLIST -- deprecated */
8048 ipw2100_wx_set_scan, /* SIOCSIWSCAN */
8049 ipw2100_wx_get_scan, /* SIOCGIWSCAN */
8050 ipw2100_wx_set_essid, /* SIOCSIWESSID */
8051 ipw2100_wx_get_essid, /* SIOCGIWESSID */
8052 ipw2100_wx_set_nick, /* SIOCSIWNICKN */
8053 ipw2100_wx_get_nick, /* SIOCGIWNICKN */
8054 NULL, /* -- hole -- */
8055 NULL, /* -- hole -- */
8056 ipw2100_wx_set_rate, /* SIOCSIWRATE */
8057 ipw2100_wx_get_rate, /* SIOCGIWRATE */
8058 ipw2100_wx_set_rts, /* SIOCSIWRTS */
8059 ipw2100_wx_get_rts, /* SIOCGIWRTS */
8060 ipw2100_wx_set_frag, /* SIOCSIWFRAG */
8061 ipw2100_wx_get_frag, /* SIOCGIWFRAG */
8062 ipw2100_wx_set_txpow, /* SIOCSIWTXPOW */
8063 ipw2100_wx_get_txpow, /* SIOCGIWTXPOW */
8064 ipw2100_wx_set_retry, /* SIOCSIWRETRY */
8065 ipw2100_wx_get_retry, /* SIOCGIWRETRY */
8066 ipw2100_wx_set_encode, /* SIOCSIWENCODE */
8067 ipw2100_wx_get_encode, /* SIOCGIWENCODE */
8068 ipw2100_wx_set_power, /* SIOCSIWPOWER */
8069 ipw2100_wx_get_power, /* SIOCGIWPOWER */
8070 NULL, /* -- hole -- */
8071 NULL, /* -- hole -- */
8072 ipw2100_wx_set_genie, /* SIOCSIWGENIE */
8073 ipw2100_wx_get_genie, /* SIOCGIWGENIE */
8074 ipw2100_wx_set_auth, /* SIOCSIWAUTH */
8075 ipw2100_wx_get_auth, /* SIOCGIWAUTH */
8076 ipw2100_wx_set_encodeext, /* SIOCSIWENCODEEXT */
8077 ipw2100_wx_get_encodeext, /* SIOCGIWENCODEEXT */
8078 NULL, /* SIOCSIWPMKSA */
8081 #define IPW2100_PRIV_SET_MONITOR SIOCIWFIRSTPRIV
8082 #define IPW2100_PRIV_RESET SIOCIWFIRSTPRIV+1
8083 #define IPW2100_PRIV_SET_POWER SIOCIWFIRSTPRIV+2
8084 #define IPW2100_PRIV_GET_POWER SIOCIWFIRSTPRIV+3
8085 #define IPW2100_PRIV_SET_LONGPREAMBLE SIOCIWFIRSTPRIV+4
8086 #define IPW2100_PRIV_GET_LONGPREAMBLE SIOCIWFIRSTPRIV+5
8087 #define IPW2100_PRIV_SET_CRC_CHECK SIOCIWFIRSTPRIV+6
8088 #define IPW2100_PRIV_GET_CRC_CHECK SIOCIWFIRSTPRIV+7
8090 static const struct iw_priv_args ipw2100_private_args[] = {
8092 #ifdef CONFIG_IPW2100_MONITOR
8094 IPW2100_PRIV_SET_MONITOR,
8095 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "monitor"},
8098 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 0, 0, "reset"},
8099 #endif /* CONFIG_IPW2100_MONITOR */
8102 IPW2100_PRIV_SET_POWER,
8103 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_power"},
8105 IPW2100_PRIV_GET_POWER,
8106 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | MAX_POWER_STRING,
8109 IPW2100_PRIV_SET_LONGPREAMBLE,
8110 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble"},
8112 IPW2100_PRIV_GET_LONGPREAMBLE,
8113 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_preamble"},
8114 #ifdef CONFIG_IPW2100_MONITOR
8116 IPW2100_PRIV_SET_CRC_CHECK,
8117 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_crc_check"},
8119 IPW2100_PRIV_GET_CRC_CHECK,
8120 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | IFNAMSIZ, "get_crc_check"},
8121 #endif /* CONFIG_IPW2100_MONITOR */
8124 static iw_handler ipw2100_private_handler[] = {
8125 #ifdef CONFIG_IPW2100_MONITOR
8126 ipw2100_wx_set_promisc,
8128 #else /* CONFIG_IPW2100_MONITOR */
8131 #endif /* CONFIG_IPW2100_MONITOR */
8132 ipw2100_wx_set_powermode,
8133 ipw2100_wx_get_powermode,
8134 ipw2100_wx_set_preamble,
8135 ipw2100_wx_get_preamble,
8136 #ifdef CONFIG_IPW2100_MONITOR
8137 ipw2100_wx_set_crc_check,
8138 ipw2100_wx_get_crc_check,
8139 #else /* CONFIG_IPW2100_MONITOR */
8142 #endif /* CONFIG_IPW2100_MONITOR */
8146 * Get wireless statistics.
8147 * Called by /proc/net/wireless
8148 * Also called by SIOCGIWSTATS
8150 static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev)
8164 struct ipw2100_priv *priv = ieee80211_priv(dev);
8165 struct iw_statistics *wstats;
8166 u32 rssi, quality, tx_retries, missed_beacons, tx_failures;
8167 u32 ord_len = sizeof(u32);
8170 return (struct iw_statistics *)NULL;
8172 wstats = &priv->wstats;
8174 /* if hw is disabled, then ipw2100_get_ordinal() can't be called.
8175 * ipw2100_wx_wireless_stats seems to be called before fw is
8176 * initialized. STATUS_ASSOCIATED will only be set if the hw is up
8177 * and associated; if not associcated, the values are all meaningless
8178 * anyway, so set them all to NULL and INVALID */
8179 if (!(priv->status & STATUS_ASSOCIATED)) {
8180 wstats->miss.beacon = 0;
8181 wstats->discard.retries = 0;
8182 wstats->qual.qual = 0;
8183 wstats->qual.level = 0;
8184 wstats->qual.noise = 0;
8185 wstats->qual.updated = 7;
8186 wstats->qual.updated |= IW_QUAL_NOISE_INVALID |
8187 IW_QUAL_QUAL_INVALID | IW_QUAL_LEVEL_INVALID;
8191 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_MISSED_BCNS,
8192 &missed_beacons, &ord_len))
8193 goto fail_get_ordinal;
8195 /* If we don't have a connection the quality and level is 0 */
8196 if (!(priv->status & STATUS_ASSOCIATED)) {
8197 wstats->qual.qual = 0;
8198 wstats->qual.level = 0;
8200 if (ipw2100_get_ordinal(priv, IPW_ORD_RSSI_AVG_CURR,
8202 goto fail_get_ordinal;
8203 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8205 rssi_qual = rssi * POOR / 10;
8207 rssi_qual = (rssi - 10) * (FAIR - POOR) / 5 + POOR;
8209 rssi_qual = (rssi - 15) * (GOOD - FAIR) / 5 + FAIR;
8211 rssi_qual = (rssi - 20) * (VERY_GOOD - GOOD) /
8214 rssi_qual = (rssi - 30) * (PERFECT - VERY_GOOD) /
8217 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_PERCENT_RETRIES,
8218 &tx_retries, &ord_len))
8219 goto fail_get_ordinal;
8221 if (tx_retries > 75)
8222 tx_qual = (90 - tx_retries) * POOR / 15;
8223 else if (tx_retries > 70)
8224 tx_qual = (75 - tx_retries) * (FAIR - POOR) / 5 + POOR;
8225 else if (tx_retries > 65)
8226 tx_qual = (70 - tx_retries) * (GOOD - FAIR) / 5 + FAIR;
8227 else if (tx_retries > 50)
8228 tx_qual = (65 - tx_retries) * (VERY_GOOD - GOOD) /
8231 tx_qual = (50 - tx_retries) *
8232 (PERFECT - VERY_GOOD) / 50 + VERY_GOOD;
8234 if (missed_beacons > 50)
8235 beacon_qual = (60 - missed_beacons) * POOR / 10;
8236 else if (missed_beacons > 40)
8237 beacon_qual = (50 - missed_beacons) * (FAIR - POOR) /
8239 else if (missed_beacons > 32)
8240 beacon_qual = (40 - missed_beacons) * (GOOD - FAIR) /
8242 else if (missed_beacons > 20)
8243 beacon_qual = (32 - missed_beacons) *
8244 (VERY_GOOD - GOOD) / 20 + GOOD;
8246 beacon_qual = (20 - missed_beacons) *
8247 (PERFECT - VERY_GOOD) / 20 + VERY_GOOD;
8249 quality = min(beacon_qual, min(tx_qual, rssi_qual));
8251 #ifdef CONFIG_IPW2100_DEBUG
8252 if (beacon_qual == quality)
8253 IPW_DEBUG_WX("Quality clamped by Missed Beacons\n");
8254 else if (tx_qual == quality)
8255 IPW_DEBUG_WX("Quality clamped by Tx Retries\n");
8256 else if (quality != 100)
8257 IPW_DEBUG_WX("Quality clamped by Signal Strength\n");
8259 IPW_DEBUG_WX("Quality not clamped.\n");
8262 wstats->qual.qual = quality;
8263 wstats->qual.level = rssi + IPW2100_RSSI_TO_DBM;
8266 wstats->qual.noise = 0;
8267 wstats->qual.updated = 7;
8268 wstats->qual.updated |= IW_QUAL_NOISE_INVALID;
8270 /* FIXME: this is percent and not a # */
8271 wstats->miss.beacon = missed_beacons;
8273 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_TX_FAILURES,
8274 &tx_failures, &ord_len))
8275 goto fail_get_ordinal;
8276 wstats->discard.retries = tx_failures;
8281 IPW_DEBUG_WX("failed querying ordinals.\n");
8283 return (struct iw_statistics *)NULL;
8286 static struct iw_handler_def ipw2100_wx_handler_def = {
8287 .standard = ipw2100_wx_handlers,
8288 .num_standard = ARRAY_SIZE(ipw2100_wx_handlers),
8289 .num_private = ARRAY_SIZE(ipw2100_private_handler),
8290 .num_private_args = ARRAY_SIZE(ipw2100_private_args),
8291 .private = (iw_handler *) ipw2100_private_handler,
8292 .private_args = (struct iw_priv_args *)ipw2100_private_args,
8293 .get_wireless_stats = ipw2100_wx_wireless_stats,
8296 static void ipw2100_wx_event_work(struct work_struct *work)
8298 struct ipw2100_priv *priv =
8299 container_of(work, struct ipw2100_priv, wx_event_work.work);
8300 union iwreq_data wrqu;
8301 unsigned int len = ETH_ALEN;
8303 if (priv->status & STATUS_STOPPING)
8306 mutex_lock(&priv->action_mutex);
8308 IPW_DEBUG_WX("enter\n");
8310 mutex_unlock(&priv->action_mutex);
8312 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
8314 /* Fetch BSSID from the hardware */
8315 if (!(priv->status & (STATUS_ASSOCIATING | STATUS_ASSOCIATED)) ||
8316 priv->status & STATUS_RF_KILL_MASK ||
8317 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
8318 &priv->bssid, &len)) {
8319 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
8321 /* We now have the BSSID, so can finish setting to the full
8322 * associated state */
8323 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
8324 memcpy(priv->ieee->bssid, priv->bssid, ETH_ALEN);
8325 priv->status &= ~STATUS_ASSOCIATING;
8326 priv->status |= STATUS_ASSOCIATED;
8327 netif_carrier_on(priv->net_dev);
8328 netif_wake_queue(priv->net_dev);
8331 if (!(priv->status & STATUS_ASSOCIATED)) {
8332 IPW_DEBUG_WX("Configuring ESSID\n");
8333 mutex_lock(&priv->action_mutex);
8334 /* This is a disassociation event, so kick the firmware to
8335 * look for another AP */
8336 if (priv->config & CFG_STATIC_ESSID)
8337 ipw2100_set_essid(priv, priv->essid, priv->essid_len,
8340 ipw2100_set_essid(priv, NULL, 0, 0);
8341 mutex_unlock(&priv->action_mutex);
8344 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
8347 #define IPW2100_FW_MAJOR_VERSION 1
8348 #define IPW2100_FW_MINOR_VERSION 3
8350 #define IPW2100_FW_MINOR(x) ((x & 0xff) >> 8)
8351 #define IPW2100_FW_MAJOR(x) (x & 0xff)
8353 #define IPW2100_FW_VERSION ((IPW2100_FW_MINOR_VERSION << 8) | \
8354 IPW2100_FW_MAJOR_VERSION)
8356 #define IPW2100_FW_PREFIX "ipw2100-" __stringify(IPW2100_FW_MAJOR_VERSION) \
8357 "." __stringify(IPW2100_FW_MINOR_VERSION)
8359 #define IPW2100_FW_NAME(x) IPW2100_FW_PREFIX "" x ".fw"
8363 BINARY FIRMWARE HEADER FORMAT
8367 2 2 mode == 0:BSS,1:IBSS,2:MONITOR
8370 C fw_len firmware data
8371 12 + fw_len uc_len microcode data
8375 struct ipw2100_fw_header {
8378 unsigned int fw_size;
8379 unsigned int uc_size;
8380 } __attribute__ ((packed));
8382 static int ipw2100_mod_firmware_load(struct ipw2100_fw *fw)
8384 struct ipw2100_fw_header *h =
8385 (struct ipw2100_fw_header *)fw->fw_entry->data;
8387 if (IPW2100_FW_MAJOR(h->version) != IPW2100_FW_MAJOR_VERSION) {
8388 printk(KERN_WARNING DRV_NAME ": Firmware image not compatible "
8389 "(detected version id of %u). "
8390 "See Documentation/networking/README.ipw2100\n",
8395 fw->version = h->version;
8396 fw->fw.data = fw->fw_entry->data + sizeof(struct ipw2100_fw_header);
8397 fw->fw.size = h->fw_size;
8398 fw->uc.data = fw->fw.data + h->fw_size;
8399 fw->uc.size = h->uc_size;
8404 static int ipw2100_get_firmware(struct ipw2100_priv *priv,
8405 struct ipw2100_fw *fw)
8410 IPW_DEBUG_INFO("%s: Using hotplug firmware load.\n",
8411 priv->net_dev->name);
8413 switch (priv->ieee->iw_mode) {
8415 fw_name = IPW2100_FW_NAME("-i");
8417 #ifdef CONFIG_IPW2100_MONITOR
8418 case IW_MODE_MONITOR:
8419 fw_name = IPW2100_FW_NAME("-p");
8424 fw_name = IPW2100_FW_NAME("");
8428 rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev);
8431 printk(KERN_ERR DRV_NAME ": "
8432 "%s: Firmware '%s' not available or load failed.\n",
8433 priv->net_dev->name, fw_name);
8436 IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data,
8437 fw->fw_entry->size);
8439 ipw2100_mod_firmware_load(fw);
8444 static void ipw2100_release_firmware(struct ipw2100_priv *priv,
8445 struct ipw2100_fw *fw)
8449 release_firmware(fw->fw_entry);
8450 fw->fw_entry = NULL;
8453 static int ipw2100_get_fwversion(struct ipw2100_priv *priv, char *buf,
8456 char ver[MAX_FW_VERSION_LEN];
8457 u32 len = MAX_FW_VERSION_LEN;
8460 /* firmware version is an ascii string (max len of 14) */
8461 if (ipw2100_get_ordinal(priv, IPW_ORD_STAT_FW_VER_NUM, ver, &len))
8466 for (i = 0; i < len; i++)
8472 static int ipw2100_get_ucodeversion(struct ipw2100_priv *priv, char *buf,
8476 u32 len = sizeof(ver);
8477 /* microcode version is a 32 bit integer */
8478 if (ipw2100_get_ordinal(priv, IPW_ORD_UCODE_VERSION, &ver, &len))
8480 return snprintf(buf, max, "%08X", ver);
8484 * On exit, the firmware will have been freed from the fw list
8486 static int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
8488 /* firmware is constructed of N contiguous entries, each entry is
8492 * 0 4 address to write to
8493 * 4 2 length of data run
8499 const unsigned char *firmware_data = fw->fw.data;
8500 unsigned int firmware_data_left = fw->fw.size;
8502 while (firmware_data_left > 0) {
8503 addr = *(u32 *) (firmware_data);
8505 firmware_data_left -= 4;
8507 len = *(u16 *) (firmware_data);
8509 firmware_data_left -= 2;
8512 printk(KERN_ERR DRV_NAME ": "
8513 "Invalid firmware run-length of %d bytes\n",
8518 write_nic_memory(priv->net_dev, addr, len, firmware_data);
8519 firmware_data += len;
8520 firmware_data_left -= len;
8526 struct symbol_alive_response {
8535 u16 clock_settle_time; // 1us LSB
8536 u16 powerup_settle_time; // 1us LSB
8537 u16 hop_settle_time; // 1us LSB
8538 u8 date[3]; // month, day, year
8539 u8 time[2]; // hours, minutes
8543 static int ipw2100_ucode_download(struct ipw2100_priv *priv,
8544 struct ipw2100_fw *fw)
8546 struct net_device *dev = priv->net_dev;
8547 const unsigned char *microcode_data = fw->uc.data;
8548 unsigned int microcode_data_left = fw->uc.size;
8549 void __iomem *reg = (void __iomem *)dev->base_addr;
8551 struct symbol_alive_response response;
8555 /* Symbol control */
8556 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8558 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8562 write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
8564 write_nic_byte(dev, 0x210014, 0x72); /* fifo width =16 */
8567 /* EN_CS_ACCESS bit to reset control store pointer */
8568 write_nic_byte(dev, 0x210000, 0x40);
8570 write_nic_byte(dev, 0x210000, 0x0);
8572 write_nic_byte(dev, 0x210000, 0x40);
8575 /* copy microcode from buffer into Symbol */
8577 while (microcode_data_left > 0) {
8578 write_nic_byte(dev, 0x210010, *microcode_data++);
8579 write_nic_byte(dev, 0x210010, *microcode_data++);
8580 microcode_data_left -= 2;
8583 /* EN_CS_ACCESS bit to reset the control store pointer */
8584 write_nic_byte(dev, 0x210000, 0x0);
8587 /* Enable System (Reg 0)
8588 * first enable causes garbage in RX FIFO */
8589 write_nic_byte(dev, 0x210000, 0x0);
8591 write_nic_byte(dev, 0x210000, 0x80);
8594 /* Reset External Baseband Reg */
8595 write_nic_word(dev, IPW2100_CONTROL_REG, 0x703);
8597 write_nic_word(dev, IPW2100_CONTROL_REG, 0x707);
8600 /* HW Config (Reg 5) */
8601 write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
8603 write_nic_byte(dev, 0x210014, 0x72); // fifo width =16
8606 /* Enable System (Reg 0)
8607 * second enable should be OK */
8608 write_nic_byte(dev, 0x210000, 0x00); // clear enable system
8610 write_nic_byte(dev, 0x210000, 0x80); // set enable system
8612 /* check Symbol is enabled - upped this from 5 as it wasn't always
8613 * catching the update */
8614 for (i = 0; i < 10; i++) {
8617 /* check Dino is enabled bit */
8618 read_nic_byte(dev, 0x210000, &data);
8624 printk(KERN_ERR DRV_NAME ": %s: Error initializing Symbol\n",
8629 /* Get Symbol alive response */
8630 for (i = 0; i < 30; i++) {
8631 /* Read alive response structure */
8633 j < (sizeof(struct symbol_alive_response) >> 1); j++)
8634 read_nic_word(dev, 0x210004, ((u16 *) & response) + j);
8636 if ((response.cmd_id == 1) && (response.ucode_valid == 0x1))
8642 printk(KERN_ERR DRV_NAME
8643 ": %s: No response from Symbol - hw not alive\n",
8645 printk_buf(IPW_DL_ERROR, (u8 *) & response, sizeof(response));