root/drivers/net/wireless/intel/ipw2x00/ipw2100.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. read_register
  2. write_register
  3. read_register_word
  4. read_register_byte
  5. write_register_word
  6. write_register_byte
  7. read_nic_dword
  8. write_nic_dword
  9. read_nic_word
  10. write_nic_word
  11. read_nic_byte
  12. write_nic_byte
  13. write_nic_auto_inc_address
  14. write_nic_dword_auto_inc
  15. write_nic_memory
  16. read_nic_memory
  17. ipw2100_hw_is_adapter_in_system
  18. ipw2100_get_ordinal
  19. ipw2100_set_ordinal
  20. snprint_line
  21. printk_buf
  22. schedule_reset
  23. ipw2100_hw_send_command
  24. ipw2100_verify
  25. ipw2100_wait_for_card_state
  26. sw_reset_and_clock
  27. ipw2100_download_firmware
  28. ipw2100_enable_interrupts
  29. ipw2100_disable_interrupts
  30. ipw2100_initialize_ordinals
  31. ipw2100_hw_set_gpio
  32. rf_kill_active
  33. ipw2100_get_hw_features
  34. ipw2100_start_adapter
  35. ipw2100_reset_fatalerror
  36. ipw2100_power_cycle_adapter
  37. ipw2100_hw_phy_off
  38. ipw2100_enable_adapter
  39. ipw2100_hw_stop_adapter
  40. ipw2100_disable_adapter
  41. ipw2100_set_scan_options
  42. ipw2100_start_scan
  43. ipw2100_up
  44. ipw2100_down
  45. ipw2100_wdev_init
  46. ipw2100_reset_adapter
  47. isr_indicate_associated
  48. ipw2100_set_essid
  49. isr_indicate_association_lost
  50. isr_indicate_rf_kill
  51. ipw2100_scan_event
  52. isr_scan_complete
  53. isr_indicate_scanning
  54. isr_status_change
  55. isr_rx_complete_command
  56. ipw2100_alloc_skb
  57. ipw2100_snapshot_free
  58. ipw2100_snapshot_alloc
  59. ipw2100_match_buf
  60. ipw2100_corruption_detected
  61. isr_rx
  62. isr_rx_monitor
  63. ipw2100_corruption_check
  64. __ipw2100_rx_process
  65. __ipw2100_tx_process
  66. __ipw2100_tx_complete
  67. ipw2100_tx_send_commands
  68. ipw2100_tx_send_data
  69. ipw2100_irq_tasklet
  70. ipw2100_interrupt
  71. ipw2100_tx
  72. ipw2100_msg_allocate
  73. ipw2100_msg_initialize
  74. ipw2100_msg_free
  75. show_pci
  76. show_cfg
  77. show_status
  78. show_capability
  79. show_registers
  80. show_hardware
  81. show_memory
  82. store_memory
  83. show_ordinals
  84. show_stats
  85. ipw2100_switch_mode
  86. show_internals
  87. show_bssinfo
  88. debug_level_show
  89. debug_level_store
  90. show_fatal_error
  91. store_fatal_error
  92. show_scan_age
  93. store_scan_age
  94. show_rf_kill
  95. ipw_radio_kill_sw
  96. store_rf_kill
  97. status_queue_allocate
  98. status_queue_free
  99. bd_queue_allocate
  100. bd_queue_free
  101. bd_queue_initialize
  102. ipw2100_kill_works
  103. ipw2100_tx_allocate
  104. ipw2100_tx_initialize
  105. ipw2100_tx_free
  106. ipw2100_rx_allocate
  107. ipw2100_rx_initialize
  108. ipw2100_rx_free
  109. ipw2100_read_mac_address
  110. ipw2100_set_mac_address
  111. ipw2100_set_port_type
  112. ipw2100_set_channel
  113. ipw2100_system_config
  114. ipw2100_set_tx_rates
  115. ipw2100_set_power_mode
  116. ipw2100_set_rts_threshold
  117. ipw2100_set_fragmentation_threshold
  118. ipw2100_set_short_retry
  119. ipw2100_set_long_retry
  120. ipw2100_set_mandatory_bssid
  121. ipw2100_disassociate_bssid
  122. ipw2100_set_wpa_ie
  123. ipw2100_set_security_information
  124. ipw2100_set_tx_power
  125. ipw2100_set_ibss_beacon_interval
  126. ipw2100_queues_initialize
  127. ipw2100_queues_free
  128. ipw2100_queues_allocate
  129. ipw2100_set_wep_flags
  130. ipw2100_set_key
  131. ipw2100_set_key_index
  132. ipw2100_configure_security
  133. ipw2100_security_work
  134. shim__set_security
  135. ipw2100_adapter_setup
  136. ipw2100_set_address
  137. ipw2100_open
  138. ipw2100_close
  139. ipw2100_tx_timeout
  140. ipw2100_wpa_enable
  141. ipw2100_wpa_set_auth_algs
  142. ipw2100_wpa_assoc_frame
  143. ipw_ethtool_get_drvinfo
  144. ipw2100_ethtool_get_link
  145. ipw2100_hang_check
  146. ipw2100_rf_kill
  147. ipw2100_alloc_device
  148. ipw2100_pci_init_one
  149. ipw2100_pci_remove_one
  150. ipw2100_suspend
  151. ipw2100_resume
  152. ipw2100_shutdown
  153. ipw2100_init
  154. ipw2100_exit
  155. ipw2100_wx_get_name
  156. ipw2100_wx_set_freq
  157. ipw2100_wx_get_freq
  158. ipw2100_wx_set_mode
  159. ipw2100_wx_get_mode
  160. ipw2100_wx_get_range
  161. ipw2100_wx_set_wap
  162. ipw2100_wx_get_wap
  163. ipw2100_wx_set_essid
  164. ipw2100_wx_get_essid
  165. ipw2100_wx_set_nick
  166. ipw2100_wx_get_nick
  167. ipw2100_wx_set_rate
  168. ipw2100_wx_get_rate
  169. ipw2100_wx_set_rts
  170. ipw2100_wx_get_rts
  171. ipw2100_wx_set_txpow
  172. ipw2100_wx_get_txpow
  173. ipw2100_wx_set_frag
  174. ipw2100_wx_get_frag
  175. ipw2100_wx_set_retry
  176. ipw2100_wx_get_retry
  177. ipw2100_wx_set_scan
  178. ipw2100_wx_get_scan
  179. ipw2100_wx_set_encode
  180. ipw2100_wx_get_encode
  181. ipw2100_wx_set_power
  182. ipw2100_wx_get_power
  183. ipw2100_wx_set_genie
  184. ipw2100_wx_get_genie
  185. ipw2100_wx_set_auth
  186. ipw2100_wx_get_auth
  187. ipw2100_wx_set_encodeext
  188. ipw2100_wx_get_encodeext
  189. ipw2100_wx_set_mlme
  190. ipw2100_wx_set_promisc
  191. ipw2100_wx_reset
  192. ipw2100_wx_set_powermode
  193. ipw2100_wx_get_powermode
  194. ipw2100_wx_set_preamble
  195. ipw2100_wx_get_preamble
  196. ipw2100_wx_set_crc_check
  197. ipw2100_wx_get_crc_check
  198. ipw2100_wx_wireless_stats
  199. ipw2100_wx_event_work
  200. ipw2100_mod_firmware_load
  201. ipw2100_get_firmware
  202. ipw2100_release_firmware
  203. ipw2100_get_fwversion
  204. ipw2100_get_ucodeversion
  205. ipw2100_fw_download
  206. ipw2100_ucode_download

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

/* [<][>][^][v][top][bottom][index][help] */