This source file includes following definitions.
- read_register
- write_register
- read_register_word
- read_register_byte
- write_register_word
- write_register_byte
- read_nic_dword
- write_nic_dword
- read_nic_word
- write_nic_word
- read_nic_byte
- write_nic_byte
- write_nic_auto_inc_address
- write_nic_dword_auto_inc
- write_nic_memory
- read_nic_memory
- ipw2100_hw_is_adapter_in_system
- ipw2100_get_ordinal
- ipw2100_set_ordinal
- snprint_line
- printk_buf
- schedule_reset
- ipw2100_hw_send_command
- ipw2100_verify
- ipw2100_wait_for_card_state
- sw_reset_and_clock
- ipw2100_download_firmware
- ipw2100_enable_interrupts
- ipw2100_disable_interrupts
- ipw2100_initialize_ordinals
- ipw2100_hw_set_gpio
- rf_kill_active
- ipw2100_get_hw_features
- ipw2100_start_adapter
- ipw2100_reset_fatalerror
- ipw2100_power_cycle_adapter
- ipw2100_hw_phy_off
- ipw2100_enable_adapter
- ipw2100_hw_stop_adapter
- ipw2100_disable_adapter
- ipw2100_set_scan_options
- ipw2100_start_scan
- ipw2100_up
- ipw2100_down
- ipw2100_wdev_init
- ipw2100_reset_adapter
- isr_indicate_associated
- ipw2100_set_essid
- isr_indicate_association_lost
- isr_indicate_rf_kill
- ipw2100_scan_event
- isr_scan_complete
- isr_indicate_scanning
- isr_status_change
- isr_rx_complete_command
- ipw2100_alloc_skb
- ipw2100_snapshot_free
- ipw2100_snapshot_alloc
- ipw2100_match_buf
- ipw2100_corruption_detected
- isr_rx
- isr_rx_monitor
- ipw2100_corruption_check
- __ipw2100_rx_process
- __ipw2100_tx_process
- __ipw2100_tx_complete
- ipw2100_tx_send_commands
- ipw2100_tx_send_data
- ipw2100_irq_tasklet
- ipw2100_interrupt
- ipw2100_tx
- ipw2100_msg_allocate
- ipw2100_msg_initialize
- ipw2100_msg_free
- show_pci
- show_cfg
- show_status
- show_capability
- show_registers
- show_hardware
- show_memory
- store_memory
- show_ordinals
- show_stats
- ipw2100_switch_mode
- show_internals
- show_bssinfo
- debug_level_show
- debug_level_store
- show_fatal_error
- store_fatal_error
- show_scan_age
- store_scan_age
- show_rf_kill
- ipw_radio_kill_sw
- store_rf_kill
- status_queue_allocate
- status_queue_free
- bd_queue_allocate
- bd_queue_free
- bd_queue_initialize
- ipw2100_kill_works
- ipw2100_tx_allocate
- ipw2100_tx_initialize
- ipw2100_tx_free
- ipw2100_rx_allocate
- ipw2100_rx_initialize
- ipw2100_rx_free
- ipw2100_read_mac_address
- ipw2100_set_mac_address
- ipw2100_set_port_type
- ipw2100_set_channel
- ipw2100_system_config
- ipw2100_set_tx_rates
- ipw2100_set_power_mode
- ipw2100_set_rts_threshold
- ipw2100_set_fragmentation_threshold
- ipw2100_set_short_retry
- ipw2100_set_long_retry
- ipw2100_set_mandatory_bssid
- ipw2100_disassociate_bssid
- ipw2100_set_wpa_ie
- ipw2100_set_security_information
- ipw2100_set_tx_power
- ipw2100_set_ibss_beacon_interval
- ipw2100_queues_initialize
- ipw2100_queues_free
- ipw2100_queues_allocate
- ipw2100_set_wep_flags
- ipw2100_set_key
- ipw2100_set_key_index
- ipw2100_configure_security
- ipw2100_security_work
- shim__set_security
- ipw2100_adapter_setup
- ipw2100_set_address
- ipw2100_open
- ipw2100_close
- ipw2100_tx_timeout
- ipw2100_wpa_enable
- ipw2100_wpa_set_auth_algs
- ipw2100_wpa_assoc_frame
- ipw_ethtool_get_drvinfo
- ipw2100_ethtool_get_link
- ipw2100_hang_check
- ipw2100_rf_kill
- ipw2100_alloc_device
- ipw2100_pci_init_one
- ipw2100_pci_remove_one
- ipw2100_suspend
- ipw2100_resume
- ipw2100_shutdown
- ipw2100_init
- ipw2100_exit
- ipw2100_wx_get_name
- ipw2100_wx_set_freq
- ipw2100_wx_get_freq
- ipw2100_wx_set_mode
- ipw2100_wx_get_mode
- ipw2100_wx_get_range
- ipw2100_wx_set_wap
- ipw2100_wx_get_wap
- ipw2100_wx_set_essid
- ipw2100_wx_get_essid
- ipw2100_wx_set_nick
- ipw2100_wx_get_nick
- ipw2100_wx_set_rate
- ipw2100_wx_get_rate
- ipw2100_wx_set_rts
- ipw2100_wx_get_rts
- ipw2100_wx_set_txpow
- ipw2100_wx_get_txpow
- ipw2100_wx_set_frag
- ipw2100_wx_get_frag
- ipw2100_wx_set_retry
- ipw2100_wx_get_retry
- ipw2100_wx_set_scan
- ipw2100_wx_get_scan
- ipw2100_wx_set_encode
- ipw2100_wx_get_encode
- ipw2100_wx_set_power
- ipw2100_wx_get_power
- ipw2100_wx_set_genie
- ipw2100_wx_get_genie
- ipw2100_wx_set_auth
- ipw2100_wx_get_auth
- ipw2100_wx_set_encodeext
- ipw2100_wx_get_encodeext
- ipw2100_wx_set_mlme
- ipw2100_wx_set_promisc
- ipw2100_wx_reset
- ipw2100_wx_set_powermode
- ipw2100_wx_get_powermode
- ipw2100_wx_set_preamble
- ipw2100_wx_get_preamble
- ipw2100_wx_set_crc_check
- ipw2100_wx_get_crc_check
- ipw2100_wx_wireless_stats
- ipw2100_wx_event_work
- ipw2100_mod_firmware_load
- ipw2100_get_firmware
- ipw2100_release_firmware
- ipw2100_get_fwversion
- ipw2100_get_ucodeversion
- ipw2100_fw_download
- ipw2100_ucode_download
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 
  42 
  43 
  44 
  45 
  46 
  47 
  48 
  49 
  50 
  51 
  52 
  53 
  54 
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 
  73 
  74 
  75 
  76 
  77 
  78 
  79 
  80 
  81 
  82 
  83 
  84 
  85 
  86 
  87 
  88 
  89 
  90 
  91 
  92 
  93 
  94 
  95 
  96 
  97 
  98 
  99 
 100 
 101 
 102 
 103 
 104 
 105 
 106 
 107 
 108 
 109 
 110 
 111 
 112 
 113 
 114 
 115 
 116 
 117 
 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 
 167 #ifdef CONFIG_IPW2100_DEBUG
 168 #define IPW2100_RX_DEBUG        
 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                          
 212 
 213 #ifdef CONFIG_IPW2100_DEBUG
 214 static const char *command_types[] = {
 215         "undefined",
 216         "unused",               
 217         "HOST_COMPLETE",
 218         "unused",               
 219         "unused",               
 220         "unused",
 221         "SYSTEM_CONFIG",
 222         "unused",               
 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",               
 269         "unused",               
 270         "undefined",
 271         "undefined",
 272         "undefined",
 273         "HOST_PRE_POWER_DOWN",
 274         "unused",               
 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 
 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         
 442         aligned_addr = addr & (~0x3);
 443         dif_len = addr - aligned_addr;
 444         if (dif_len) {
 445                 
 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         
 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         
 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         
 480         aligned_addr = addr & (~0x3);
 481         dif_len = addr - aligned_addr;
 482         if (dif_len) {
 483                 
 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         
 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         
 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                 
 558                 read_nic_dword(priv->net_dev,
 559                                ordinals->table2_addr + (ord << 3), &addr);
 560 
 561                 
 562 
 563                 read_nic_dword(priv->net_dev,
 564                                ordinals->table2_addr + (ord << 3) + sizeof(u32),
 565                                &field_info);
 566 
 567                 
 568                 field_len = *((u16 *) & field_info);
 569 
 570                 
 571                 field_count = *(((u16 *) & field_info) + 1);
 572 
 573                 
 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                 
 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         
 684 
 685 
 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         
 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 
 789 
 790 
 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         
 815 
 816 
 817 
 818 
 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 
 831 
 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         
 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         
 850         for (address = 0; address < 5; address++) {
 851                 
 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 
 870 
 871 
 872 
 873 
 874 
 875 
 876 #define IPW_CARD_DISABLE_COMPLETE_WAIT              100 
 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                 
 894 
 895 
 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 
 917 
 918 
 919 
 920 static int sw_reset_and_clock(struct ipw2100_priv *priv)
 921 {
 922         int i;
 923         u32 r;
 924 
 925         
 926         write_register(priv->net_dev, IPW_REG_RESET_REG,
 927                        IPW_AUX_HOST_RESET_REG_SW_RESET);
 928 
 929         
 930         for (i = 0; i < 1000; i++) {
 931                 udelay(IPW_WAIT_RESET_ARC_COMPLETE_DELAY);
 932 
 933                 
 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;    
 941 
 942         
 943 
 944         write_register(priv->net_dev, IPW_REG_GP_CNTRL,
 945                        IPW_AUX_HOST_GP_CNTRL_BIT_INIT_DONE);
 946 
 947         
 948         for (i = 0; i < 10000; i++) {
 949                 udelay(IPW_WAIT_CLOCK_STABILIZATION_DELAY * 4);
 950 
 951                 
 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;    
 959 
 960         
 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 
 970 
 971 
 972 
 973 
 974 
 975 
 976 
 977 
 978 
 979 static int ipw2100_download_firmware(struct ipw2100_priv *priv)
 980 {
 981         u32 address;
 982         int err;
 983 
 984 #ifndef CONFIG_PM
 985         
 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         
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         
1032         write_nic_dword(priv->net_dev,
1033                         IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x80000000);
1034 
1035         
1036         write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1037 
1038         
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         
1047         write_nic_dword(priv->net_dev,
1048                         IPW_INTERNAL_REGISTER_HALT_AND_RESET, 0x00000000);
1049 
1050         
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         
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 
1069 
1070 
1071 
1072 
1073 
1074         
1075         ipw2100_release_firmware(priv, &ipw2100_firmware);
1076 #endif
1077 
1078         
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 
1145 
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, ®);
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 
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 
1204 
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 
1211 
1212 
1213 
1214 
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 
1228 
1229 
1230 
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 
1244 
1245 
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         
1255 
1256         ipw2100_queues_initialize(priv);
1257 
1258         ipw2100_hw_set_gpio(priv);
1259 
1260         
1261 
1262 
1263         
1264         write_register(priv->net_dev, IPW_REG_RESET_REG, 0);
1265 
1266         
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                 
1272 
1273                 read_register(priv->net_dev, IPW_REG_INTA, &inta);
1274 
1275                 
1276                 if (inta & IPW2100_INTA_FW_INIT_DONE) {
1277                         
1278                         write_register(priv->net_dev, IPW_REG_INTA,
1279                                        IPW2100_INTA_FW_INIT_DONE);
1280                         break;
1281                 }
1282 
1283                 
1284 
1285 
1286                 if (inta &
1287                     (IPW2100_INTA_FATAL_ERROR | IPW2100_INTA_PARITY_ERROR)) {
1288                         
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         
1296 
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         
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         
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         
1322         priv->status |= STATUS_RUNNING;
1323 
1324         
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 
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         
1353         write_register(priv->net_dev, IPW_REG_RESET_REG,
1354                        IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1355 
1356         
1357 
1358         i = 5;
1359         do {
1360                 udelay(IPW_WAIT_RESET_MASTER_ASSERT_COMPLETE_DELAY);
1361                 read_register(priv->net_dev, IPW_REG_RESET_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         
1379         ipw2100_reset_fatalerror(priv);
1380 
1381         
1382         priv->status &= ~(STATUS_RUNNING | STATUS_ASSOCIATING |
1383                           STATUS_ASSOCIATED | STATUS_ENABLED);
1384 
1385         return 0;
1386 }
1387 
1388 
1389 
1390 
1391 
1392 
1393 
1394 
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         
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         
1492 
1493 
1494         if (!priv->fatal_error) {
1495                 
1496 
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 
1506 
1507 
1508 
1509 
1510 
1511 
1512 
1513 
1514 
1515 
1516 
1517 
1518 
1519 
1520 
1521 
1522 
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 
1539 
1540 
1541         ipw2100_hw_set_gpio(priv);
1542 
1543         
1544 
1545 
1546 
1547 
1548 
1549 
1550         
1551         write_register(priv->net_dev, IPW_REG_RESET_REG,
1552                        IPW_AUX_HOST_RESET_REG_STOP_MASTER);
1553 
1554         
1555 
1556         for (i = 5; i > 0; i--) {
1557                 udelay(10);
1558 
1559                 
1560                 read_register(priv->net_dev, IPW_REG_RESET_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         
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         
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         
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         
1682 
1683 
1684 
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         {                       
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         
1718         if (priv->suspend_time) {
1719                 libipw_networks_age(priv->ieee, priv->suspend_time);
1720                 priv->suspend_time = 0;
1721         }
1722 
1723         
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         
1731 
1732 
1733         pm_qos_update_request(&ipw2100_pm_qos_req, 175);
1734 
1735         
1736         spin_lock_irqsave(&priv->low_lock, flags);
1737         ipw2100_disable_interrupts(priv);
1738 
1739         
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                 
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         
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         
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         
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         
1805         ipw2100_enable_interrupts(priv);
1806 
1807         
1808 
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                 
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                 
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         
1846         if (!priv->stop_rf_kill) {
1847                 priv->stop_rf_kill = 1;
1848                 cancel_delayed_work(&priv->rf_kill);
1849         }
1850 
1851         
1852         if (!priv->stop_hang_check) {
1853                 priv->stop_hang_check = 1;
1854                 cancel_delayed_work(&priv->hang_check);
1855         }
1856 
1857         
1858         if (priv->status & STATUS_RESET_PENDING)
1859                 cancel_delayed_work(&priv->reset_work);
1860 
1861         
1862 
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         
1872 
1873 
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         
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         
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                 
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                         
1927 
1928 
1929                 }
1930                 
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         
1964 
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         
1971         priv->stop_hang_check = 1;
1972         cancel_delayed_work(&priv->hang_check);
1973 
1974         
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 
1997 
1998 
1999 
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         
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         
2096 
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         
2106 
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         
2157         wiphy_rfkill_set_hw_state(priv->ieee->wdev.wiphy, true);
2158         priv->status |= STATUS_RF_KILL_HW;
2159 
2160         
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         
2180         priv->ieee->scans++;
2181         priv->status &= ~STATUS_SCANNING;
2182 
2183         
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                          
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                 
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 
2389 
2390 
2391 
2392 
2393 
2394 
2395 
2396 
2397 
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         
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, ®);
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         
2489 
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                 
2504                 dev_kfree_skb_any(packet->skb);
2505                 packet->skb = NULL;
2506         }
2507 
2508         
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                 
2514                 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2515         }
2516 
2517         
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         
2531 
2532 
2533         struct ipw_rt_hdr {
2534                 struct ieee80211_radiotap_header rt_hdr;
2535                 s8 rt_dbmsignal; 
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; 
2574         ipw_rt->rt_hdr.it_len = cpu_to_le16(sizeof(struct ipw_rt_hdr)); 
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                 
2586                 dev_kfree_skb_any(packet->skb);
2587                 packet->skb = NULL;
2588         }
2589 
2590         
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                 
2596                 IPW_DEBUG_INFO("TODO: Shutdown adapter...\n");
2597         }
2598 
2599         
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 
2639 
2640 
2641 
2642 
2643 
2644 
2645 
2646 
2647 
2648 
2649 
2650 
2651 
2652 
2653 
2654 
2655 
2656 
2657 
2658 
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                 
2685 
2686 
2687                 packet = &priv->rx_buffers[i];
2688 
2689                 
2690 
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                         
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                 
2753                 rxq->drv[i].status.info.field = 0;
2754 
2755                 i = (i + 1) % rxq->entries;
2756         }
2757 
2758         if (i != s) {
2759                 
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 
2769 
2770 
2771 
2772 
2773 
2774 
2775 
2776 
2777 
2778 
2779 
2780 
2781 
2782 
2783 
2784 
2785 
2786 
2787 
2788 
2789 
2790 
2791 
2792 
2793 
2794 
2795 
2796 
2797 
2798 
2799 
2800 
2801 
2802 
2803 
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         
2825         switch (packet->type) {
2826         case COMMAND:
2827                 
2828                 descriptors_used = 1;
2829                 e = txq->oldest;
2830                 break;
2831 
2832         case DATA:
2833                 
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         
2847 
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 
2860 
2861 
2862 
2863 
2864         
2865 
2866 
2867 
2868 
2869 
2870 
2871 
2872 
2873 
2874 
2875 
2876 
2877 
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                 
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                 
2937 
2938                 if (priv->status & STATUS_ASSOCIATED)
2939                         netif_wake_queue(priv->net_dev);
2940 
2941                 
2942 
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         
2971         txq->oldest = (e + 1) % txq->entries;
2972         
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                 
3006 
3007 
3008 
3009 
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                 
3032                 tbd->host_addr = packet->info.c_struct.cmd_phys;
3033                 tbd->buf_length = sizeof(struct ipw2100_cmd_header);
3034                 
3035 
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                 
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                 
3053 
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 
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                 
3078 
3079 
3080 
3081 
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                         
3089 
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                         
3113 
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                         
3118 
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                 
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                 
3202 
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         
3228 
3229 
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                 
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                 
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         
3342 
3343 
3344 
3345         if (!(priv->status & STATUS_INT_ENABLED)) {
3346                 
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                 
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                 
3363                 goto none;
3364         }
3365 
3366         
3367 
3368 
3369 
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         
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;              
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         
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                          
4034         }
4035 
4036         priv->ieee->iw_mode = mode;
4037 
4038 #ifdef CONFIG_PM
4039         
4040 
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                          
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;              
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         
4246 
4247 
4248 
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                         
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 
4482 
4483         INIT_LIST_HEAD(&priv->fw_pend_list);
4484         INIT_STAT(&priv->fw_pend_stat);
4485 
4486         
4487 
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                 
4496 
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 
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                 
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         
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 
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         
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         
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         
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         
4857         
4858 
4859         err = ipw2100_hw_send_command(priv, &cmd);
4860         if (err)
4861                 return err;
4862 
4863 
4864 
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         
4900         ipw2100_hw_send_command(priv, &cmd);
4901 
4902         
4903         cmd.host_command = TX_RATES;
4904         ipw2100_hw_send_command(priv, &cmd);
4905 
4906         
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                 
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         
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         
5106 
5107 
5108 
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         
5177 
5178 
5179 
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         
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 
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 
5363 
5364 
5365 
5366 
5367 
5368 
5369 
5370 
5371 
5372 
5373 
5374 
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         
5392 
5393 
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         
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                 
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         
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         
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         
5535 
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         
5558 
5559 
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 
5633 
5634 
5635 
5636 
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                          
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         
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 
5736 
5737 
5738 
5739 
5740 
5741         IPW_DEBUG_INFO("exit\n");
5742 
5743         return 0;
5744 }
5745 
5746 
5747 
5748 
5749 
5750 
5751 
5752 
5753 
5754 
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         
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 
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         
5857 
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         
5900         memcpy(frame.var_ie, wpa_ie, wpa_ie_len);
5901         frame.var_ie_len = wpa_ie_len;
5902 
5903         
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                 
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                 
5958                 IPW_DEBUG_INFO("%s: Firmware RTC stalled.\n",
5959                                priv->net_dev->name);
5960 
5961                 restart = 1;
5962         }
5963 
5964         if (restart) {
5965                 
5966                 priv->stop_hang_check = 1;
5967                 priv->hangs++;
5968 
5969                 
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         
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 
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         
6056 
6057 
6058 
6059 
6060 
6061         
6062 
6063 
6064         
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         
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         
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         
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         
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         
6216 
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         
6231         priv->status |= STATUS_INT_ENABLED;
6232         ipw2100_disable_interrupts(priv);
6233 
6234         
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         
6267 
6268 
6269 
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         
6284         err = sysfs_create_group(&pci_dev->dev.kobj, &ipw2100_attribute_group);
6285         if (err)
6286                 goto fail_unlock;
6287 
6288         
6289 
6290         if (!(priv->status & STATUS_RF_KILL_MASK)) {
6291                 
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                 
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                 
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         
6366         ipw2100_down(priv);
6367 
6368         
6369 
6370         mutex_unlock(&priv->action_mutex);
6371 
6372         
6373 
6374 
6375 
6376         unregister_netdev(dev);
6377 
6378         ipw2100_kill_works(priv);
6379 
6380         ipw2100_queues_free(priv);
6381 
6382         
6383         ipw2100_snapshot_free(priv);
6384 
6385         free_irq(dev->irq, priv);
6386 
6387         pci_iounmap(pci_dev, priv->ioaddr);
6388 
6389         
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                 
6411                 ipw2100_down(priv);
6412         }
6413 
6414         
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 
6454 
6455 
6456 
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         
6463 
6464         netif_device_attach(dev);
6465 
6466         priv->suspend_time = ktime_get_boottime_seconds() - priv->suspend_at;
6467 
6468         
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         
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), 
6492         IPW2100_DEV_ID(0x2521), 
6493         IPW2100_DEV_ID(0x2524), 
6494         IPW2100_DEV_ID(0x2525), 
6495         IPW2100_DEV_ID(0x2526), 
6496         IPW2100_DEV_ID(0x2522), 
6497         IPW2100_DEV_ID(0x2523), 
6498         IPW2100_DEV_ID(0x2527), 
6499         IPW2100_DEV_ID(0x2528), 
6500         IPW2100_DEV_ID(0x2529), 
6501         IPW2100_DEV_ID(0x252B), 
6502         IPW2100_DEV_ID(0x252C), 
6503         IPW2100_DEV_ID(0x252D), 
6504 
6505         IPW2100_DEV_ID(0x2550), 
6506         IPW2100_DEV_ID(0x2551), 
6507         IPW2100_DEV_ID(0x2553), 
6508         IPW2100_DEV_ID(0x2554), 
6509         IPW2100_DEV_ID(0x2555), 
6510 
6511         IPW2100_DEV_ID(0x2560), 
6512         IPW2100_DEV_ID(0x2562), 
6513         IPW2100_DEV_ID(0x2563), 
6514         IPW2100_DEV_ID(0x2561), 
6515         IPW2100_DEV_ID(0x2565), 
6516         IPW2100_DEV_ID(0x2566), 
6517         IPW2100_DEV_ID(0x2567), 
6518 
6519         IPW2100_DEV_ID(0x2570), 
6520 
6521         IPW2100_DEV_ID(0x2580), 
6522         IPW2100_DEV_ID(0x2582), 
6523         IPW2100_DEV_ID(0x2583), 
6524         IPW2100_DEV_ID(0x2581), 
6525         IPW2100_DEV_ID(0x2585), 
6526         IPW2100_DEV_ID(0x2586), 
6527         IPW2100_DEV_ID(0x2587), 
6528 
6529         IPW2100_DEV_ID(0x2590), 
6530         IPW2100_DEV_ID(0x2592), 
6531         IPW2100_DEV_ID(0x2591), 
6532         IPW2100_DEV_ID(0x2593), 
6533         IPW2100_DEV_ID(0x2596), 
6534         IPW2100_DEV_ID(0x2598), 
6535 
6536         IPW2100_DEV_ID(0x25A0), 
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 
6556 
6557 
6558 
6559 
6560 
6561 
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 
6589 
6590 static void __exit ipw2100_exit(void)
6591 {
6592         
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 
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         
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                         
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 {                
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 
6674 
6675 
6676         struct ipw2100_priv *priv = libipw_priv(dev);
6677 
6678         wrqu->freq.e = 0;
6679 
6680         
6681 
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                          
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 
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 
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 
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         
6784 
6785 
6786 
6787         
6788 
6789 
6790 
6791         
6792         range->throughput = 5 * 1000 * 1000;
6793 
6794 
6795 
6796         range->max_qual.qual = 100;
6797         
6798         range->max_qual.level = 0;
6799         range->max_qual.noise = 0;
6800         range->max_qual.updated = 7;    
6801 
6802         range->avg_qual.qual = 70;      
6803         
6804         range->avg_qual.level = 20 + IPW2100_RSSI_TO_DBM;
6805         range->avg_qual.noise = 0;
6806         range->avg_qual.updated = 7;    
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];    
6820         range->max_pmp = period_duration[POWER_MODES - 1];      
6821         range->min_pmt = timeout_duration[POWER_MODES - 1];     
6822         range->max_pmt = timeout_duration[0];   
6823 
6824         
6825         range->pmp_flags = IW_POWER_PERIOD;
6826         
6827         range->pmt_flags = IW_POWER_TIMEOUT;
6828         
6829         range->pm_capa = IW_POWER_TIMEOUT | IW_POWER_PERIOD;
6830 
6831         range->encoding_size[0] = 5;
6832         range->encoding_size[1] = 13;   
6833         range->num_encoding_sizes = 2;  
6834         range->max_encoding_tokens = WEP_KEYS;  
6835 
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         
6852         range->we_version_compiled = WIRELESS_EXT;
6853         range->we_version_source = 18;
6854 
6855 
6856 
6857 
6858 
6859 
6860 
6861 
6862 
6863         range->num_channels = FREQ_COUNT;
6864 
6865         val = 0;
6866         for (i = 0; i < FREQ_COUNT; i++) {
6867                 
6868 
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         
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         
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                 
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 
6936 
6937 
6938         struct ipw2100_priv *priv = libipw_priv(dev);
6939 
6940         
6941 
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 = "";       
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 
7007 
7008 
7009         struct ipw2100_priv *priv = libipw_priv(dev);
7010 
7011         
7012 
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;  
7019         } else {
7020                 IPW_DEBUG_WX("Getting essid: ANY\n");
7021                 wrqu->essid.length = 0;
7022                 wrqu->essid.flags = 0;  
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 
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 
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;   
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         
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 
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;    
7208 
7209         
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 
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 
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 
7321 
7322 
7323         struct ipw2100_priv *priv = libipw_priv(dev);
7324         wrqu->frag.value = priv->frag_threshold & ~FRAG_DISABLED;
7325         wrqu->frag.fixed = 0;   
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 
7383 
7384 
7385         struct ipw2100_priv *priv = libipw_priv(dev);
7386 
7387         wrqu->retry.disabled = 0;       
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                 
7429 
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 
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 
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 
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 
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:       
7498         case IW_POWER_MODE:     
7499         case IW_POWER_ALL_R:    
7500                 break;
7501         default:                
7502                 IPW_DEBUG_WX("SET PM Mode: %X not supported.\n",
7503                              wrqu->power.flags);
7504                 err = -EOPNOTSUPP;
7505                 goto done;
7506         }
7507 
7508         
7509 
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 
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 
7545 
7546 
7547 
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 
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 
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 
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                         
7645 
7646 
7647 
7648 
7649 
7650 
7651 
7652 
7653 
7654 
7655                         struct libipw_security sec = {
7656                                 .flags = SEC_ENABLED,
7657                                 .enabled = param->value,
7658                         };
7659                         priv->ieee->drop_unencrypted = param->value;
7660                         
7661 
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                 
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 
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 
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 
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 
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 
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                 
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 
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 
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 
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 
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                          
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                          
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                          
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                           
8093         NULL,
8094         NULL,
8095 #endif                          
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                           
8104         NULL,
8105         NULL,
8106 #endif                          
8107 };
8108 
8109 
8110 
8111 
8112 
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         
8140 
8141 
8142 
8143 
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         
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         
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         
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                 
8288 
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                 
8301 
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 
8330 
8331 
8332 
8333 
8334 
8335 
8336 
8337 
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         
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         
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 
8456 
8457 static int ipw2100_fw_download(struct ipw2100_priv *priv, struct ipw2100_fw *fw)
8458 {
8459         
8460 
8461 
8462 
8463 
8464 
8465 
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;  
8507         u16 powerup_settle_time;        
8508         u16 hop_settle_time;    
8509         u8 date[3];             
8510         u8 time[2];             
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         
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         
8533         write_nic_byte(dev, 0x210014, 0x72);    
8534         readl(reg);
8535         write_nic_byte(dev, 0x210014, 0x72);    
8536         readl(reg);
8537 
8538         
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         
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         
8555         write_nic_byte(dev, 0x210000, 0x0);
8556         readl(reg);
8557 
8558         
8559 
8560         write_nic_byte(dev, 0x210000, 0x0);
8561         readl(reg);
8562         write_nic_byte(dev, 0x210000, 0x80);
8563         readl(reg);
8564 
8565         
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         
8572         write_nic_byte(dev, 0x210014, 0x72);    
8573         readl(reg);
8574         write_nic_byte(dev, 0x210014, 0x72);    
8575         readl(reg);
8576 
8577         
8578 
8579         write_nic_byte(dev, 0x210000, 0x00);    
8580         readl(reg);
8581         write_nic_byte(dev, 0x210000, 0x80);    
8582 
8583         
8584 
8585         for (i = 0; i < 10; i++) {
8586                 udelay(10);
8587 
8588                 
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         
8601         for (i = 0; i < 30; i++) {
8602                 
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 }