Linux Audio

Check our new training course

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