Linux Audio

Check our new training course

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