cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ipw2100.c (228789B)


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