Linux Audio

Check our new training course

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