OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [wireless/] [ipw2100.c] - Blame information for rev 62

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.