1 /*======================================================================
2 
3     Aironet driver for 4500 and 4800 series cards
4 
5     This code is released under both the GPL version 2 and BSD licenses.
6     Either license may be used.  The respective licenses are found at
7     the end of this file.
8 
9     This code was developed by Benjamin Reed <breed@users.sourceforge.net>
10     including portions of which come from the Aironet PC4500
11     Developer's Reference Manual and used with permission.  Copyright
12     (C) 1999 Benjamin Reed.  All Rights Reserved.  Permission to use
13     code in the Developer's manual was granted for this driver by
14     Aironet.  Major code contributions were received from Javier Achirica
15     <achirica@users.sourceforge.net> and Jean Tourrilhes <jt@hpl.hp.com>.
16     Code was also integrated from the Cisco Aironet driver for Linux.
17     Support for MPI350 cards was added by Fabrice Bellet
18     <fabrice@bellet.info>.
19 
20 ======================================================================*/
21 
22 #include <linux/err.h>
23 #include <linux/init.h>
24 
25 #include <linux/kernel.h>
26 #include <linux/module.h>
27 #include <linux/proc_fs.h>
28 
29 #include <linux/sched.h>
30 #include <linux/ptrace.h>
31 #include <linux/slab.h>
32 #include <linux/string.h>
33 #include <linux/timer.h>
34 #include <linux/interrupt.h>
35 #include <linux/in.h>
36 #include <linux/bitops.h>
37 #include <linux/scatterlist.h>
38 #include <linux/crypto.h>
39 #include <asm/io.h>
40 #include <asm/system.h>
41 #include <asm/unaligned.h>
42 
43 #include <linux/netdevice.h>
44 #include <linux/etherdevice.h>
45 #include <linux/skbuff.h>
46 #include <linux/if_arp.h>
47 #include <linux/ioport.h>
48 #include <linux/pci.h>
49 #include <asm/uaccess.h>
50 #include <linux/kthread.h>
51 #include <linux/freezer.h>
52 
53 #include <linux/ieee80211.h>
54 #include <net/iw_handler.h>
55 
56 #include "airo.h"
57 
58 #define DRV_NAME "airo"
59 
60 #ifdef CONFIG_PCI
61 static DEFINE_PCI_DEVICE_TABLE(card_ids) = {
62 	{ 0x14b9, 1, PCI_ANY_ID, PCI_ANY_ID, },
63 	{ 0x14b9, 0x4500, PCI_ANY_ID, PCI_ANY_ID },
64 	{ 0x14b9, 0x4800, PCI_ANY_ID, PCI_ANY_ID, },
65 	{ 0x14b9, 0x0340, PCI_ANY_ID, PCI_ANY_ID, },
66 	{ 0x14b9, 0x0350, PCI_ANY_ID, PCI_ANY_ID, },
67 	{ 0x14b9, 0x5000, PCI_ANY_ID, PCI_ANY_ID, },
68 	{ 0x14b9, 0xa504, PCI_ANY_ID, PCI_ANY_ID, },
69 	{ 0, }
70 };
71 MODULE_DEVICE_TABLE(pci, card_ids);
72 
73 static int airo_pci_probe(struct pci_dev *, const struct pci_device_id *);
74 static void airo_pci_remove(struct pci_dev *);
75 static int airo_pci_suspend(struct pci_dev *pdev, pm_message_t state);
76 static int airo_pci_resume(struct pci_dev *pdev);
77 
78 static struct pci_driver airo_driver = {
79 	.name     = DRV_NAME,
80 	.id_table = card_ids,
81 	.probe    = airo_pci_probe,
82 	.remove   = __devexit_p(airo_pci_remove),
83 	.suspend  = airo_pci_suspend,
84 	.resume   = airo_pci_resume,
85 };
86 #endif /* CONFIG_PCI */
87 
88 /* Include Wireless Extension definition and check version - Jean II */
89 #include <linux/wireless.h>
90 #define WIRELESS_SPY		/* enable iwspy support */
91 #include <net/iw_handler.h>	/* New driver API */
92 
93 #define CISCO_EXT		/* enable Cisco extensions */
94 #ifdef CISCO_EXT
95 #include <linux/delay.h>
96 #endif
97 
98 /* Hack to do some power saving */
99 #define POWER_ON_DOWN
100 
101 /* As you can see this list is HUGH!
102    I really don't know what a lot of these counts are about, but they
103    are all here for completeness.  If the IGNLABEL macro is put in
104    infront of the label, that statistic will not be included in the list
105    of statistics in the /proc filesystem */
106 
107 #define IGNLABEL(comment) NULL
108 static const char *statsLabels[] = {
109 	"RxOverrun",
110 	IGNLABEL("RxPlcpCrcErr"),
111 	IGNLABEL("RxPlcpFormatErr"),
112 	IGNLABEL("RxPlcpLengthErr"),
113 	"RxMacCrcErr",
114 	"RxMacCrcOk",
115 	"RxWepErr",
116 	"RxWepOk",
117 	"RetryLong",
118 	"RetryShort",
119 	"MaxRetries",
120 	"NoAck",
121 	"NoCts",
122 	"RxAck",
123 	"RxCts",
124 	"TxAck",
125 	"TxRts",
126 	"TxCts",
127 	"TxMc",
128 	"TxBc",
129 	"TxUcFrags",
130 	"TxUcPackets",
131 	"TxBeacon",
132 	"RxBeacon",
133 	"TxSinColl",
134 	"TxMulColl",
135 	"DefersNo",
136 	"DefersProt",
137 	"DefersEngy",
138 	"DupFram",
139 	"RxFragDisc",
140 	"TxAged",
141 	"RxAged",
142 	"LostSync-MaxRetry",
143 	"LostSync-MissedBeacons",
144 	"LostSync-ArlExceeded",
145 	"LostSync-Deauth",
146 	"LostSync-Disassoced",
147 	"LostSync-TsfTiming",
148 	"HostTxMc",
149 	"HostTxBc",
150 	"HostTxUc",
151 	"HostTxFail",
152 	"HostRxMc",
153 	"HostRxBc",
154 	"HostRxUc",
155 	"HostRxDiscard",
156 	IGNLABEL("HmacTxMc"),
157 	IGNLABEL("HmacTxBc"),
158 	IGNLABEL("HmacTxUc"),
159 	IGNLABEL("HmacTxFail"),
160 	IGNLABEL("HmacRxMc"),
161 	IGNLABEL("HmacRxBc"),
162 	IGNLABEL("HmacRxUc"),
163 	IGNLABEL("HmacRxDiscard"),
164 	IGNLABEL("HmacRxAccepted"),
165 	"SsidMismatch",
166 	"ApMismatch",
167 	"RatesMismatch",
168 	"AuthReject",
169 	"AuthTimeout",
170 	"AssocReject",
171 	"AssocTimeout",
172 	IGNLABEL("ReasonOutsideTable"),
173 	IGNLABEL("ReasonStatus1"),
174 	IGNLABEL("ReasonStatus2"),
175 	IGNLABEL("ReasonStatus3"),
176 	IGNLABEL("ReasonStatus4"),
177 	IGNLABEL("ReasonStatus5"),
178 	IGNLABEL("ReasonStatus6"),
179 	IGNLABEL("ReasonStatus7"),
180 	IGNLABEL("ReasonStatus8"),
181 	IGNLABEL("ReasonStatus9"),
182 	IGNLABEL("ReasonStatus10"),
183 	IGNLABEL("ReasonStatus11"),
184 	IGNLABEL("ReasonStatus12"),
185 	IGNLABEL("ReasonStatus13"),
186 	IGNLABEL("ReasonStatus14"),
187 	IGNLABEL("ReasonStatus15"),
188 	IGNLABEL("ReasonStatus16"),
189 	IGNLABEL("ReasonStatus17"),
190 	IGNLABEL("ReasonStatus18"),
191 	IGNLABEL("ReasonStatus19"),
192 	"RxMan",
193 	"TxMan",
194 	"RxRefresh",
195 	"TxRefresh",
196 	"RxPoll",
197 	"TxPoll",
198 	"HostRetries",
199 	"LostSync-HostReq",
200 	"HostTxBytes",
201 	"HostRxBytes",
202 	"ElapsedUsec",
203 	"ElapsedSec",
204 	"LostSyncBetterAP",
205 	"PrivacyMismatch",
206 	"Jammed",
207 	"DiscRxNotWepped",
208 	"PhyEleMismatch",
209 	(char*)-1 };
210 #ifndef RUN_AT
211 #define RUN_AT(x) (jiffies+(x))
212 #endif
213 
214 
215 /* These variables are for insmod, since it seems that the rates
216    can only be set in setup_card.  Rates should be a comma separated
217    (no spaces) list of rates (up to 8). */
218 
219 static int rates[8];
220 static char *ssids[3];
221 
222 static int io[4];
223 static int irq[4];
224 
225 static
226 int maxencrypt /* = 0 */; /* The highest rate that the card can encrypt at.
227 		       0 means no limit.  For old cards this was 4 */
228 
229 static int auto_wep /* = 0 */; /* If set, it tries to figure out the wep mode */
230 static int aux_bap /* = 0 */; /* Checks to see if the aux ports are needed to read
231 		    the bap, needed on some older cards and buses. */
232 static int adhoc;
233 
234 static int probe = 1;
235 
236 static int proc_uid /* = 0 */;
237 
238 static int proc_gid /* = 0 */;
239 
240 static int airo_perm = 0555;
241 
242 static int proc_perm = 0644;
243 
244 MODULE_AUTHOR("Benjamin Reed");
245 MODULE_DESCRIPTION("Support for Cisco/Aironet 802.11 wireless ethernet cards.  "
246 		   "Direct support for ISA/PCI/MPI cards and support for PCMCIA when used with airo_cs.");
247 MODULE_LICENSE("Dual BSD/GPL");
248 MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340/350");
249 module_param_array(io, int, NULL, 0);
250 module_param_array(irq, int, NULL, 0);
251 module_param_array(rates, int, NULL, 0);
252 module_param_array(ssids, charp, NULL, 0);
253 module_param(auto_wep, int, 0);
254 MODULE_PARM_DESC(auto_wep,
255 		 "If non-zero, the driver will keep looping through the authentication options until an association is made.  "
256 		 "The value of auto_wep is number of the wep keys to check.  "
257 		 "A value of 2 will try using the key at index 0 and index 1.");
258 module_param(aux_bap, int, 0);
259 MODULE_PARM_DESC(aux_bap,
260 		 "If non-zero, the driver will switch into a mode that seems to work better for older cards with some older buses.  "
261 		 "Before switching it checks that the switch is needed.");
262 module_param(maxencrypt, int, 0);
263 MODULE_PARM_DESC(maxencrypt,
264 		 "The maximum speed that the card can do encryption.  "
265 		 "Units are in 512kbs.  "
266 		 "Zero (default) means there is no limit.  "
267 		 "Older cards used to be limited to 2mbs (4).");
268 module_param(adhoc, int, 0);
269 MODULE_PARM_DESC(adhoc, "If non-zero, the card will start in adhoc mode.");
270 module_param(probe, int, 0);
271 MODULE_PARM_DESC(probe, "If zero, the driver won't start the card.");
272 
273 module_param(proc_uid, int, 0);
274 MODULE_PARM_DESC(proc_uid, "The uid that the /proc files will belong to.");
275 module_param(proc_gid, int, 0);
276 MODULE_PARM_DESC(proc_gid, "The gid that the /proc files will belong to.");
277 module_param(airo_perm, int, 0);
278 MODULE_PARM_DESC(airo_perm, "The permission bits of /proc/[driver/]aironet.");
279 module_param(proc_perm, int, 0);
280 MODULE_PARM_DESC(proc_perm, "The permission bits of the files in /proc");
281 
282 /* This is a kind of sloppy hack to get this information to OUT4500 and
283    IN4500.  I would be extremely interested in the situation where this
284    doesn't work though!!! */
285 static int do8bitIO /* = 0 */;
286 
287 /* Return codes */
288 #define SUCCESS 0
289 #define ERROR -1
290 #define NO_PACKET -2
291 
292 /* Commands */
293 #define NOP2		0x0000
294 #define MAC_ENABLE	0x0001
295 #define MAC_DISABLE	0x0002
296 #define CMD_LOSE_SYNC	0x0003 /* Not sure what this does... */
297 #define CMD_SOFTRESET	0x0004
298 #define HOSTSLEEP	0x0005
299 #define CMD_MAGIC_PKT	0x0006
300 #define CMD_SETWAKEMASK	0x0007
301 #define CMD_READCFG	0x0008
302 #define CMD_SETMODE	0x0009
303 #define CMD_ALLOCATETX	0x000a
304 #define CMD_TRANSMIT	0x000b
305 #define CMD_DEALLOCATETX 0x000c
306 #define NOP		0x0010
307 #define CMD_WORKAROUND	0x0011
308 #define CMD_ALLOCATEAUX 0x0020
309 #define CMD_ACCESS	0x0021
310 #define CMD_PCIBAP	0x0022
311 #define CMD_PCIAUX	0x0023
312 #define CMD_ALLOCBUF	0x0028
313 #define CMD_GETTLV	0x0029
314 #define CMD_PUTTLV	0x002a
315 #define CMD_DELTLV	0x002b
316 #define CMD_FINDNEXTTLV	0x002c
317 #define CMD_PSPNODES	0x0030
318 #define CMD_SETCW	0x0031
319 #define CMD_SETPCF	0x0032
320 #define CMD_SETPHYREG	0x003e
321 #define CMD_TXTEST	0x003f
322 #define MAC_ENABLETX	0x0101
323 #define CMD_LISTBSS	0x0103
324 #define CMD_SAVECFG	0x0108
325 #define CMD_ENABLEAUX	0x0111
326 #define CMD_WRITERID	0x0121
327 #define CMD_USEPSPNODES	0x0130
328 #define MAC_ENABLERX	0x0201
329 
330 /* Command errors */
331 #define ERROR_QUALIF 0x00
332 #define ERROR_ILLCMD 0x01
333 #define ERROR_ILLFMT 0x02
334 #define ERROR_INVFID 0x03
335 #define ERROR_INVRID 0x04
336 #define ERROR_LARGE 0x05
337 #define ERROR_NDISABL 0x06
338 #define ERROR_ALLOCBSY 0x07
339 #define ERROR_NORD 0x0B
340 #define ERROR_NOWR 0x0C
341 #define ERROR_INVFIDTX 0x0D
342 #define ERROR_TESTACT 0x0E
343 #define ERROR_TAGNFND 0x12
344 #define ERROR_DECODE 0x20
345 #define ERROR_DESCUNAV 0x21
346 #define ERROR_BADLEN 0x22
347 #define ERROR_MODE 0x80
348 #define ERROR_HOP 0x81
349 #define ERROR_BINTER 0x82
350 #define ERROR_RXMODE 0x83
351 #define ERROR_MACADDR 0x84
352 #define ERROR_RATES 0x85
353 #define ERROR_ORDER 0x86
354 #define ERROR_SCAN 0x87
355 #define ERROR_AUTH 0x88
356 #define ERROR_PSMODE 0x89
357 #define ERROR_RTYPE 0x8A
358 #define ERROR_DIVER 0x8B
359 #define ERROR_SSID 0x8C
360 #define ERROR_APLIST 0x8D
361 #define ERROR_AUTOWAKE 0x8E
362 #define ERROR_LEAP 0x8F
363 
364 /* Registers */
365 #define COMMAND 0x00
366 #define PARAM0 0x02
367 #define PARAM1 0x04
368 #define PARAM2 0x06
369 #define STATUS 0x08
370 #define RESP0 0x0a
371 #define RESP1 0x0c
372 #define RESP2 0x0e
373 #define LINKSTAT 0x10
374 #define SELECT0 0x18
375 #define OFFSET0 0x1c
376 #define RXFID 0x20
377 #define TXALLOCFID 0x22
378 #define TXCOMPLFID 0x24
379 #define DATA0 0x36
380 #define EVSTAT 0x30
381 #define EVINTEN 0x32
382 #define EVACK 0x34
383 #define SWS0 0x28
384 #define SWS1 0x2a
385 #define SWS2 0x2c
386 #define SWS3 0x2e
387 #define AUXPAGE 0x3A
388 #define AUXOFF 0x3C
389 #define AUXDATA 0x3E
390 
391 #define FID_TX 1
392 #define FID_RX 2
393 /* Offset into aux memory for descriptors */
394 #define AUX_OFFSET 0x800
395 /* Size of allocated packets */
396 #define PKTSIZE 1840
397 #define RIDSIZE 2048
398 /* Size of the transmit queue */
399 #define MAXTXQ 64
400 
401 /* BAP selectors */
402 #define BAP0 0 /* Used for receiving packets */
403 #define BAP1 2 /* Used for xmiting packets and working with RIDS */
404 
405 /* Flags */
406 #define COMMAND_BUSY 0x8000
407 
408 #define BAP_BUSY 0x8000
409 #define BAP_ERR 0x4000
410 #define BAP_DONE 0x2000
411 
412 #define PROMISC 0xffff
413 #define NOPROMISC 0x0000
414 
415 #define EV_CMD 0x10
416 #define EV_CLEARCOMMANDBUSY 0x4000
417 #define EV_RX 0x01
418 #define EV_TX 0x02
419 #define EV_TXEXC 0x04
420 #define EV_ALLOC 0x08
421 #define EV_LINK 0x80
422 #define EV_AWAKE 0x100
423 #define EV_TXCPY 0x400
424 #define EV_UNKNOWN 0x800
425 #define EV_MIC 0x1000 /* Message Integrity Check Interrupt */
426 #define EV_AWAKEN 0x2000
427 #define STATUS_INTS (EV_AWAKE|EV_LINK|EV_TXEXC|EV_TX|EV_TXCPY|EV_RX|EV_MIC)
428 
429 #ifdef CHECK_UNKNOWN_INTS
430 #define IGNORE_INTS ( EV_CMD | EV_UNKNOWN)
431 #else
432 #define IGNORE_INTS (~STATUS_INTS)
433 #endif
434 
435 /* RID TYPES */
436 #define RID_RW 0x20
437 
438 /* The RIDs */
439 #define RID_CAPABILITIES 0xFF00
440 #define RID_APINFO     0xFF01
441 #define RID_RADIOINFO  0xFF02
442 #define RID_UNKNOWN3   0xFF03
443 #define RID_RSSI       0xFF04
444 #define RID_CONFIG     0xFF10
445 #define RID_SSID       0xFF11
446 #define RID_APLIST     0xFF12
447 #define RID_DRVNAME    0xFF13
448 #define RID_ETHERENCAP 0xFF14
449 #define RID_WEP_TEMP   0xFF15
450 #define RID_WEP_PERM   0xFF16
451 #define RID_MODULATION 0xFF17
452 #define RID_OPTIONS    0xFF18
453 #define RID_ACTUALCONFIG 0xFF20 /*readonly*/
454 #define RID_FACTORYCONFIG 0xFF21
455 #define RID_UNKNOWN22  0xFF22
456 #define RID_LEAPUSERNAME 0xFF23
457 #define RID_LEAPPASSWORD 0xFF24
458 #define RID_STATUS     0xFF50
459 #define RID_BEACON_HST 0xFF51
460 #define RID_BUSY_HST   0xFF52
461 #define RID_RETRIES_HST 0xFF53
462 #define RID_UNKNOWN54  0xFF54
463 #define RID_UNKNOWN55  0xFF55
464 #define RID_UNKNOWN56  0xFF56
465 #define RID_MIC        0xFF57
466 #define RID_STATS16    0xFF60
467 #define RID_STATS16DELTA 0xFF61
468 #define RID_STATS16DELTACLEAR 0xFF62
469 #define RID_STATS      0xFF68
470 #define RID_STATSDELTA 0xFF69
471 #define RID_STATSDELTACLEAR 0xFF6A
472 #define RID_ECHOTEST_RID 0xFF70
473 #define RID_ECHOTEST_RESULTS 0xFF71
474 #define RID_BSSLISTFIRST 0xFF72
475 #define RID_BSSLISTNEXT  0xFF73
476 #define RID_WPA_BSSLISTFIRST 0xFF74
477 #define RID_WPA_BSSLISTNEXT  0xFF75
478 
479 typedef struct {
480 	u16 cmd;
481 	u16 parm0;
482 	u16 parm1;
483 	u16 parm2;
484 } Cmd;
485 
486 typedef struct {
487 	u16 status;
488 	u16 rsp0;
489 	u16 rsp1;
490 	u16 rsp2;
491 } Resp;
492 
493 /*
494  * Rids and endian-ness:  The Rids will always be in cpu endian, since
495  * this all the patches from the big-endian guys end up doing that.
496  * so all rid access should use the read/writeXXXRid routines.
497  */
498 
499 /* This structure came from an email sent to me from an engineer at
500    aironet for inclusion into this driver */
501 typedef struct WepKeyRid WepKeyRid;
502 struct WepKeyRid {
503 	__le16 len;
504 	__le16 kindex;
505 	u8 mac[ETH_ALEN];
506 	__le16 klen;
507 	u8 key[16];
508 } __packed;
509 
510 /* These structures are from the Aironet's PC4500 Developers Manual */
511 typedef struct Ssid Ssid;
512 struct Ssid {
513 	__le16 len;
514 	u8 ssid[32];
515 } __packed;
516 
517 typedef struct SsidRid SsidRid;
518 struct SsidRid {
519 	__le16 len;
520 	Ssid ssids[3];
521 } __packed;
522 
523 typedef struct ModulationRid ModulationRid;
524 struct ModulationRid {
525         __le16 len;
526         __le16 modulation;
527 #define MOD_DEFAULT cpu_to_le16(0)
528 #define MOD_CCK cpu_to_le16(1)
529 #define MOD_MOK cpu_to_le16(2)
530 } __packed;
531 
532 typedef struct ConfigRid ConfigRid;
533 struct ConfigRid {
534 	__le16 len; /* sizeof(ConfigRid) */
535 	__le16 opmode; /* operating mode */
536 #define MODE_STA_IBSS cpu_to_le16(0)
537 #define MODE_STA_ESS cpu_to_le16(1)
538 #define MODE_AP cpu_to_le16(2)
539 #define MODE_AP_RPTR cpu_to_le16(3)
540 #define MODE_CFG_MASK cpu_to_le16(0xff)
541 #define MODE_ETHERNET_HOST cpu_to_le16(0<<8) /* rx payloads converted */
542 #define MODE_LLC_HOST cpu_to_le16(1<<8) /* rx payloads left as is */
543 #define MODE_AIRONET_EXTEND cpu_to_le16(1<<9) /* enable Aironet extenstions */
544 #define MODE_AP_INTERFACE cpu_to_le16(1<<10) /* enable ap interface extensions */
545 #define MODE_ANTENNA_ALIGN cpu_to_le16(1<<11) /* enable antenna alignment */
546 #define MODE_ETHER_LLC cpu_to_le16(1<<12) /* enable ethernet LLC */
547 #define MODE_LEAF_NODE cpu_to_le16(1<<13) /* enable leaf node bridge */
548 #define MODE_CF_POLLABLE cpu_to_le16(1<<14) /* enable CF pollable */
549 #define MODE_MIC cpu_to_le16(1<<15) /* enable MIC */
550 	__le16 rmode; /* receive mode */
551 #define RXMODE_BC_MC_ADDR cpu_to_le16(0)
552 #define RXMODE_BC_ADDR cpu_to_le16(1) /* ignore multicasts */
553 #define RXMODE_ADDR cpu_to_le16(2) /* ignore multicast and broadcast */
554 #define RXMODE_RFMON cpu_to_le16(3) /* wireless monitor mode */
555 #define RXMODE_RFMON_ANYBSS cpu_to_le16(4)
556 #define RXMODE_LANMON cpu_to_le16(5) /* lan style monitor -- data packets only */
557 #define RXMODE_MASK cpu_to_le16(255)
558 #define RXMODE_DISABLE_802_3_HEADER cpu_to_le16(1<<8) /* disables 802.3 header on rx */
559 #define RXMODE_FULL_MASK (RXMODE_MASK | RXMODE_DISABLE_802_3_HEADER)
560 #define RXMODE_NORMALIZED_RSSI cpu_to_le16(1<<9) /* return normalized RSSI */
561 	__le16 fragThresh;
562 	__le16 rtsThres;
563 	u8 macAddr[ETH_ALEN];
564 	u8 rates[8];
565 	__le16 shortRetryLimit;
566 	__le16 longRetryLimit;
567 	__le16 txLifetime; /* in kusec */
568 	__le16 rxLifetime; /* in kusec */
569 	__le16 stationary;
570 	__le16 ordering;
571 	__le16 u16deviceType; /* for overriding device type */
572 	__le16 cfpRate;
573 	__le16 cfpDuration;
574 	__le16 _reserved1[3];
575 	/*---------- Scanning/Associating ----------*/
576 	__le16 scanMode;
577 #define SCANMODE_ACTIVE cpu_to_le16(0)
578 #define SCANMODE_PASSIVE cpu_to_le16(1)
579 #define SCANMODE_AIROSCAN cpu_to_le16(2)
580 	__le16 probeDelay; /* in kusec */
581 	__le16 probeEnergyTimeout; /* in kusec */
582         __le16 probeResponseTimeout;
583 	__le16 beaconListenTimeout;
584 	__le16 joinNetTimeout;
585 	__le16 authTimeout;
586 	__le16 authType;
587 #define AUTH_OPEN cpu_to_le16(0x1)
588 #define AUTH_ENCRYPT cpu_to_le16(0x101)
589 #define AUTH_SHAREDKEY cpu_to_le16(0x102)
590 #define AUTH_ALLOW_UNENCRYPTED cpu_to_le16(0x200)
591 	__le16 associationTimeout;
592 	__le16 specifiedApTimeout;
593 	__le16 offlineScanInterval;
594 	__le16 offlineScanDuration;
595 	__le16 linkLossDelay;
596 	__le16 maxBeaconLostTime;
597 	__le16 refreshInterval;
598 #define DISABLE_REFRESH cpu_to_le16(0xFFFF)
599 	__le16 _reserved1a[1];
600 	/*---------- Power save operation ----------*/
601 	__le16 powerSaveMode;
602 #define POWERSAVE_CAM cpu_to_le16(0)
603 #define POWERSAVE_PSP cpu_to_le16(1)
604 #define POWERSAVE_PSPCAM cpu_to_le16(2)
605 	__le16 sleepForDtims;
606 	__le16 listenInterval;
607 	__le16 fastListenInterval;
608 	__le16 listenDecay;
609 	__le16 fastListenDelay;
610 	__le16 _reserved2[2];
611 	/*---------- Ap/Ibss config items ----------*/
612 	__le16 beaconPeriod;
613 	__le16 atimDuration;
614 	__le16 hopPeriod;
615 	__le16 channelSet;
616 	__le16 channel;
617 	__le16 dtimPeriod;
618 	__le16 bridgeDistance;
619 	__le16 radioID;
620 	/*---------- Radio configuration ----------*/
621 	__le16 radioType;
622 #define RADIOTYPE_DEFAULT cpu_to_le16(0)
623 #define RADIOTYPE_802_11 cpu_to_le16(1)
624 #define RADIOTYPE_LEGACY cpu_to_le16(2)
625 	u8 rxDiversity;
626 	u8 txDiversity;
627 	__le16 txPower;
628 #define TXPOWER_DEFAULT 0
629 	__le16 rssiThreshold;
630 #define RSSI_DEFAULT 0
631         __le16 modulation;
632 #define PREAMBLE_AUTO cpu_to_le16(0)
633 #define PREAMBLE_LONG cpu_to_le16(1)
634 #define PREAMBLE_SHORT cpu_to_le16(2)
635 	__le16 preamble;
636 	__le16 homeProduct;
637 	__le16 radioSpecific;
638 	/*---------- Aironet Extensions ----------*/
639 	u8 nodeName[16];
640 	__le16 arlThreshold;
641 	__le16 arlDecay;
642 	__le16 arlDelay;
643 	__le16 _reserved4[1];
644 	/*---------- Aironet Extensions ----------*/
645 	u8 magicAction;
646 #define MAGIC_ACTION_STSCHG 1
647 #define MAGIC_ACTION_RESUME 2
648 #define MAGIC_IGNORE_MCAST (1<<8)
649 #define MAGIC_IGNORE_BCAST (1<<9)
650 #define MAGIC_SWITCH_TO_PSP (0<<10)
651 #define MAGIC_STAY_IN_CAM (1<<10)
652 	u8 magicControl;
653 	__le16 autoWake;
654 } __packed;
655 
656 typedef struct StatusRid StatusRid;
657 struct StatusRid {
658 	__le16 len;
659 	u8 mac[ETH_ALEN];
660 	__le16 mode;
661 	__le16 errorCode;
662 	__le16 sigQuality;
663 	__le16 SSIDlen;
664 	char SSID[32];
665 	char apName[16];
666 	u8 bssid[4][ETH_ALEN];
667 	__le16 beaconPeriod;
668 	__le16 dimPeriod;
669 	__le16 atimDuration;
670 	__le16 hopPeriod;
671 	__le16 channelSet;
672 	__le16 channel;
673 	__le16 hopsToBackbone;
674 	__le16 apTotalLoad;
675 	__le16 generatedLoad;
676 	__le16 accumulatedArl;
677 	__le16 signalQuality;
678 	__le16 currentXmitRate;
679 	__le16 apDevExtensions;
680 	__le16 normalizedSignalStrength;
681 	__le16 shortPreamble;
682 	u8 apIP[4];
683 	u8 noisePercent; /* Noise percent in last second */
684 	u8 noisedBm; /* Noise dBm in last second */
685 	u8 noiseAvePercent; /* Noise percent in last minute */
686 	u8 noiseAvedBm; /* Noise dBm in last minute */
687 	u8 noiseMaxPercent; /* Highest noise percent in last minute */
688 	u8 noiseMaxdBm; /* Highest noise dbm in last minute */
689 	__le16 load;
690 	u8 carrier[4];
691 	__le16 assocStatus;
692 #define STAT_NOPACKETS 0
693 #define STAT_NOCARRIERSET 10
694 #define STAT_GOTCARRIERSET 11
695 #define STAT_WRONGSSID 20
696 #define STAT_BADCHANNEL 25
697 #define STAT_BADBITRATES 30
698 #define STAT_BADPRIVACY 35
699 #define STAT_APFOUND 40
700 #define STAT_APREJECTED 50
701 #define STAT_AUTHENTICATING 60
702 #define STAT_DEAUTHENTICATED 61
703 #define STAT_AUTHTIMEOUT 62
704 #define STAT_ASSOCIATING 70
705 #define STAT_DEASSOCIATED 71
706 #define STAT_ASSOCTIMEOUT 72
707 #define STAT_NOTAIROAP 73
708 #define STAT_ASSOCIATED 80
709 #define STAT_LEAPING 90
710 #define STAT_LEAPFAILED 91
711 #define STAT_LEAPTIMEDOUT 92
712 #define STAT_LEAPCOMPLETE 93
713 } __packed;
714 
715 typedef struct StatsRid StatsRid;
716 struct StatsRid {
717 	__le16 len;
718 	__le16 spacer;
719 	__le32 vals[100];
720 } __packed;
721 
722 typedef struct APListRid APListRid;
723 struct APListRid {
724 	__le16 len;
725 	u8 ap[4][ETH_ALEN];
726 } __packed;
727 
728 typedef struct CapabilityRid CapabilityRid;
729 struct CapabilityRid {
730 	__le16 len;
731 	char oui[3];
732 	char zero;
733 	__le16 prodNum;
734 	char manName[32];
735 	char prodName[16];
736 	char prodVer[8];
737 	char factoryAddr[ETH_ALEN];
738 	char aironetAddr[ETH_ALEN];
739 	__le16 radioType;
740 	__le16 country;
741 	char callid[ETH_ALEN];
742 	char supportedRates[8];
743 	char rxDiversity;
744 	char txDiversity;
745 	__le16 txPowerLevels[8];
746 	__le16 hardVer;
747 	__le16 hardCap;
748 	__le16 tempRange;
749 	__le16 softVer;
750 	__le16 softSubVer;
751 	__le16 interfaceVer;
752 	__le16 softCap;
753 	__le16 bootBlockVer;
754 	__le16 requiredHard;
755 	__le16 extSoftCap;
756 } __packed;
757 
758 /* Only present on firmware >= 5.30.17 */
759 typedef struct BSSListRidExtra BSSListRidExtra;
760 struct BSSListRidExtra {
761   __le16 unknown[4];
762   u8 fixed[12]; /* WLAN management frame */
763   u8 iep[624];
764 } __packed;
765 
766 typedef struct BSSListRid BSSListRid;
767 struct BSSListRid {
768   __le16 len;
769   __le16 index; /* First is 0 and 0xffff means end of list */
770 #define RADIO_FH 1 /* Frequency hopping radio type */
771 #define RADIO_DS 2 /* Direct sequence radio type */
772 #define RADIO_TMA 4 /* Proprietary radio used in old cards (2500) */
773   __le16 radioType;
774   u8 bssid[ETH_ALEN]; /* Mac address of the BSS */
775   u8 zero;
776   u8 ssidLen;
777   u8 ssid[32];
778   __le16 dBm;
779 #define CAP_ESS cpu_to_le16(1<<0)
780 #define CAP_IBSS cpu_to_le16(1<<1)
781 #define CAP_PRIVACY cpu_to_le16(1<<4)
782 #define CAP_SHORTHDR cpu_to_le16(1<<5)
783   __le16 cap;
784   __le16 beaconInterval;
785   u8 rates[8]; /* Same as rates for config rid */
786   struct { /* For frequency hopping only */
787     __le16 dwell;
788     u8 hopSet;
789     u8 hopPattern;
790     u8 hopIndex;
791     u8 fill;
792   } fh;
793   __le16 dsChannel;
794   __le16 atimWindow;
795 
796   /* Only present on firmware >= 5.30.17 */
797   BSSListRidExtra extra;
798 } __packed;
799 
800 typedef struct {
801   BSSListRid bss;
802   struct list_head list;
803 } BSSListElement;
804 
805 typedef struct tdsRssiEntry tdsRssiEntry;
806 struct tdsRssiEntry {
807   u8 rssipct;
808   u8 rssidBm;
809 } __packed;
810 
811 typedef struct tdsRssiRid tdsRssiRid;
812 struct tdsRssiRid {
813   u16 len;
814   tdsRssiEntry x[256];
815 } __packed;
816 
817 typedef struct MICRid MICRid;
818 struct MICRid {
819 	__le16 len;
820 	__le16 state;
821 	__le16 multicastValid;
822 	u8  multicast[16];
823 	__le16 unicastValid;
824 	u8  unicast[16];
825 } __packed;
826 
827 typedef struct MICBuffer MICBuffer;
828 struct MICBuffer {
829 	__be16 typelen;
830 
831 	union {
832 	    u8 snap[8];
833 	    struct {
834 		u8 dsap;
835 		u8 ssap;
836 		u8 control;
837 		u8 orgcode[3];
838 		u8 fieldtype[2];
839 	    } llc;
840 	} u;
841 	__be32 mic;
842 	__be32 seq;
843 } __packed;
844 
845 typedef struct {
846 	u8 da[ETH_ALEN];
847 	u8 sa[ETH_ALEN];
848 } etherHead;
849 
850 #define TXCTL_TXOK (1<<1) /* report if tx is ok */
851 #define TXCTL_TXEX (1<<2) /* report if tx fails */
852 #define TXCTL_802_3 (0<<3) /* 802.3 packet */
853 #define TXCTL_802_11 (1<<3) /* 802.11 mac packet */
854 #define TXCTL_ETHERNET (0<<4) /* payload has ethertype */
855 #define TXCTL_LLC (1<<4) /* payload is llc */
856 #define TXCTL_RELEASE (0<<5) /* release after completion */
857 #define TXCTL_NORELEASE (1<<5) /* on completion returns to host */
858 
859 #define BUSY_FID 0x10000
860 
861 #ifdef CISCO_EXT
862 #define AIROMAGIC	0xa55a
863 /* Warning : SIOCDEVPRIVATE may disapear during 2.5.X - Jean II */
864 #ifdef SIOCIWFIRSTPRIV
865 #ifdef SIOCDEVPRIVATE
866 #define AIROOLDIOCTL	SIOCDEVPRIVATE
867 #define AIROOLDIDIFC 	AIROOLDIOCTL + 1
868 #endif /* SIOCDEVPRIVATE */
869 #else /* SIOCIWFIRSTPRIV */
870 #define SIOCIWFIRSTPRIV SIOCDEVPRIVATE
871 #endif /* SIOCIWFIRSTPRIV */
872 /* This may be wrong. When using the new SIOCIWFIRSTPRIV range, we probably
873  * should use only "GET" ioctls (last bit set to 1). "SET" ioctls are root
874  * only and don't return the modified struct ifreq to the application which
875  * is usually a problem. - Jean II */
876 #define AIROIOCTL	SIOCIWFIRSTPRIV
877 #define AIROIDIFC 	AIROIOCTL + 1
878 
879 /* Ioctl constants to be used in airo_ioctl.command */
880 
881 #define	AIROGCAP  		0	// Capability rid
882 #define AIROGCFG		1       // USED A LOT
883 #define AIROGSLIST		2	// System ID list
884 #define AIROGVLIST		3       // List of specified AP's
885 #define AIROGDRVNAM		4	//  NOTUSED
886 #define AIROGEHTENC		5	// NOTUSED
887 #define AIROGWEPKTMP		6
888 #define AIROGWEPKNV		7
889 #define AIROGSTAT		8
890 #define AIROGSTATSC32		9
891 #define AIROGSTATSD32		10
892 #define AIROGMICRID		11
893 #define AIROGMICSTATS		12
894 #define AIROGFLAGS		13
895 #define AIROGID			14
896 #define AIRORRID		15
897 #define AIRORSWVERSION		17
898 
899 /* Leave gap of 40 commands after AIROGSTATSD32 for future */
900 
901 #define AIROPCAP               	AIROGSTATSD32 + 40
902 #define AIROPVLIST              AIROPCAP      + 1
903 #define AIROPSLIST		AIROPVLIST    + 1
904 #define AIROPCFG		AIROPSLIST    + 1
905 #define AIROPSIDS		AIROPCFG      + 1
906 #define AIROPAPLIST		AIROPSIDS     + 1
907 #define AIROPMACON		AIROPAPLIST   + 1	/* Enable mac  */
908 #define AIROPMACOFF		AIROPMACON    + 1 	/* Disable mac */
909 #define AIROPSTCLR		AIROPMACOFF   + 1
910 #define AIROPWEPKEY		AIROPSTCLR    + 1
911 #define AIROPWEPKEYNV		AIROPWEPKEY   + 1
912 #define AIROPLEAPPWD            AIROPWEPKEYNV + 1
913 #define AIROPLEAPUSR            AIROPLEAPPWD  + 1
914 
915 /* Flash codes */
916 
917 #define AIROFLSHRST	       AIROPWEPKEYNV  + 40
918 #define AIROFLSHGCHR           AIROFLSHRST    + 1
919 #define AIROFLSHSTFL           AIROFLSHGCHR   + 1
920 #define AIROFLSHPCHR           AIROFLSHSTFL   + 1
921 #define AIROFLPUTBUF           AIROFLSHPCHR   + 1
922 #define AIRORESTART            AIROFLPUTBUF   + 1
923 
924 #define FLASHSIZE	32768
925 #define AUXMEMSIZE	(256 * 1024)
926 
927 typedef struct aironet_ioctl {
928 	unsigned short command;		// What to do
929 	unsigned short len;		// Len of data
930 	unsigned short ridnum;		// rid number
931 	unsigned char __user *data;	// d-data
932 } aironet_ioctl;
933 
934 static const char swversion[] = "2.1";
935 #endif /* CISCO_EXT */
936 
937 #define NUM_MODULES       2
938 #define MIC_MSGLEN_MAX    2400
939 #define EMMH32_MSGLEN_MAX MIC_MSGLEN_MAX
940 #define AIRO_DEF_MTU      2312
941 
942 typedef struct {
943 	u32   size;            // size
944 	u8    enabled;         // MIC enabled or not
945 	u32   rxSuccess;       // successful packets received
946 	u32   rxIncorrectMIC;  // pkts dropped due to incorrect MIC comparison
947 	u32   rxNotMICed;      // pkts dropped due to not being MIC'd
948 	u32   rxMICPlummed;    // pkts dropped due to not having a MIC plummed
949 	u32   rxWrongSequence; // pkts dropped due to sequence number violation
950 	u32   reserve[32];
951 } mic_statistics;
952 
953 typedef struct {
954 	u32 coeff[((EMMH32_MSGLEN_MAX)+3)>>2];
955 	u64 accum;	// accumulated mic, reduced to u32 in final()
956 	int position;	// current position (byte offset) in message
957 	union {
958 		u8  d8[4];
959 		__be32 d32;
960 	} part;	// saves partial message word across update() calls
961 } emmh32_context;
962 
963 typedef struct {
964 	emmh32_context seed;	    // Context - the seed
965 	u32		 rx;	    // Received sequence number
966 	u32		 tx;	    // Tx sequence number
967 	u32		 window;    // Start of window
968 	u8		 valid;	    // Flag to say if context is valid or not
969 	u8		 key[16];
970 } miccntx;
971 
972 typedef struct {
973 	miccntx mCtx;		// Multicast context
974 	miccntx uCtx;		// Unicast context
975 } mic_module;
976 
977 typedef struct {
978 	unsigned int  rid: 16;
979 	unsigned int  len: 15;
980 	unsigned int  valid: 1;
981 	dma_addr_t host_addr;
982 } Rid;
983 
984 typedef struct {
985 	unsigned int  offset: 15;
986 	unsigned int  eoc: 1;
987 	unsigned int  len: 15;
988 	unsigned int  valid: 1;
989 	dma_addr_t host_addr;
990 } TxFid;
991 
992 struct rx_hdr {
993 	__le16 status, len;
994 	u8 rssi[2];
995 	u8 rate;
996 	u8 freq;
997 	__le16 tmp[4];
998 } __packed;
999 
1000 typedef struct {
1001 	unsigned int  ctl: 15;
1002 	unsigned int  rdy: 1;
1003 	unsigned int  len: 15;
1004 	unsigned int  valid: 1;
1005 	dma_addr_t host_addr;
1006 } RxFid;
1007 
1008 /*
1009  * Host receive descriptor
1010  */
1011 typedef struct {
1012 	unsigned char __iomem *card_ram_off; /* offset into card memory of the
1013 						desc */
1014 	RxFid         rx_desc;		     /* card receive descriptor */
1015 	char          *virtual_host_addr;    /* virtual address of host receive
1016 					        buffer */
1017 	int           pending;
1018 } HostRxDesc;
1019 
1020 /*
1021  * Host transmit descriptor
1022  */
1023 typedef struct {
1024 	unsigned char __iomem *card_ram_off;	     /* offset into card memory of the
1025 						desc */
1026 	TxFid         tx_desc;		     /* card transmit descriptor */
1027 	char          *virtual_host_addr;    /* virtual address of host receive
1028 					        buffer */
1029 	int           pending;
1030 } HostTxDesc;
1031 
1032 /*
1033  * Host RID descriptor
1034  */
1035 typedef struct {
1036 	unsigned char __iomem *card_ram_off;      /* offset into card memory of the
1037 					     descriptor */
1038 	Rid           rid_desc;		  /* card RID descriptor */
1039 	char          *virtual_host_addr; /* virtual address of host receive
1040 					     buffer */
1041 } HostRidDesc;
1042 
1043 typedef struct {
1044 	u16 sw0;
1045 	u16 sw1;
1046 	u16 status;
1047 	u16 len;
1048 #define HOST_SET (1 << 0)
1049 #define HOST_INT_TX (1 << 1) /* Interrupt on successful TX */
1050 #define HOST_INT_TXERR (1 << 2) /* Interrupt on unseccessful TX */
1051 #define HOST_LCC_PAYLOAD (1 << 4) /* LLC payload, 0 = Ethertype */
1052 #define HOST_DONT_RLSE (1 << 5) /* Don't release buffer when done */
1053 #define HOST_DONT_RETRY (1 << 6) /* Don't retry trasmit */
1054 #define HOST_CLR_AID (1 << 7) /* clear AID failure */
1055 #define HOST_RTS (1 << 9) /* Force RTS use */
1056 #define HOST_SHORT (1 << 10) /* Do short preamble */
1057 	u16 ctl;
1058 	u16 aid;
1059 	u16 retries;
1060 	u16 fill;
1061 } TxCtlHdr;
1062 
1063 typedef struct {
1064         u16 ctl;
1065         u16 duration;
1066         char addr1[6];
1067         char addr2[6];
1068         char addr3[6];
1069         u16 seq;
1070         char addr4[6];
1071 } WifiHdr;
1072 
1073 
1074 typedef struct {
1075 	TxCtlHdr ctlhdr;
1076 	u16 fill1;
1077 	u16 fill2;
1078 	WifiHdr wifihdr;
1079 	u16 gaplen;
1080 	u16 status;
1081 } WifiCtlHdr;
1082 
1083 static WifiCtlHdr wifictlhdr8023 = {
1084 	.ctlhdr = {
1085 		.ctl	= HOST_DONT_RLSE,
1086 	}
1087 };
1088 
1089 // A few details needed for WEP (Wireless Equivalent Privacy)
1090 #define MAX_KEY_SIZE 13			// 128 (?) bits
1091 #define MIN_KEY_SIZE  5			// 40 bits RC4 - WEP
1092 typedef struct wep_key_t {
1093 	u16	len;
1094 	u8	key[16];	/* 40-bit and 104-bit keys */
1095 } wep_key_t;
1096 
1097 /* List of Wireless Handlers (new API) */
1098 static const struct iw_handler_def	airo_handler_def;
1099 
1100 static const char version[] = "airo.c 0.6 (Ben Reed & Javier Achirica)";
1101 
1102 struct airo_info;
1103 
1104 static int get_dec_u16( char *buffer, int *start, int limit );
1105 static void OUT4500( struct airo_info *, u16 register, u16 value );
1106 static unsigned short IN4500( struct airo_info *, u16 register );
1107 static u16 setup_card(struct airo_info*, u8 *mac, int lock);
1108 static int enable_MAC(struct airo_info *ai, int lock);
1109 static void disable_MAC(struct airo_info *ai, int lock);
1110 static void enable_interrupts(struct airo_info*);
1111 static void disable_interrupts(struct airo_info*);
1112 static u16 issuecommand(struct airo_info*, Cmd *pCmd, Resp *pRsp);
1113 static int bap_setup(struct airo_info*, u16 rid, u16 offset, int whichbap);
1114 static int aux_bap_read(struct airo_info*, __le16 *pu16Dst, int bytelen,
1115 			int whichbap);
1116 static int fast_bap_read(struct airo_info*, __le16 *pu16Dst, int bytelen,
1117 			 int whichbap);
1118 static int bap_write(struct airo_info*, const __le16 *pu16Src, int bytelen,
1119 		     int whichbap);
1120 static int PC4500_accessrid(struct airo_info*, u16 rid, u16 accmd);
1121 static int PC4500_readrid(struct airo_info*, u16 rid, void *pBuf, int len, int lock);
1122 static int PC4500_writerid(struct airo_info*, u16 rid, const void
1123 			   *pBuf, int len, int lock);
1124 static int do_writerid( struct airo_info*, u16 rid, const void *rid_data,
1125 			int len, int dummy );
1126 static u16 transmit_allocate(struct airo_info*, int lenPayload, int raw);
1127 static int transmit_802_3_packet(struct airo_info*, int len, char *pPacket);
1128 static int transmit_802_11_packet(struct airo_info*, int len, char *pPacket);
1129 
1130 static int mpi_send_packet (struct net_device *dev);
1131 static void mpi_unmap_card(struct pci_dev *pci);
1132 static void mpi_receive_802_3(struct airo_info *ai);
1133 static void mpi_receive_802_11(struct airo_info *ai);
1134 static int waitbusy (struct airo_info *ai);
1135 
1136 static irqreturn_t airo_interrupt( int irq, void* dev_id);
1137 static int airo_thread(void *data);
1138 static void timer_func( struct net_device *dev );
1139 static int airo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
1140 static struct iw_statistics *airo_get_wireless_stats (struct net_device *dev);
1141 static void airo_read_wireless_stats (struct airo_info *local);
1142 #ifdef CISCO_EXT
1143 static int readrids(struct net_device *dev, aironet_ioctl *comp);
1144 static int writerids(struct net_device *dev, aironet_ioctl *comp);
1145 static int flashcard(struct net_device *dev, aironet_ioctl *comp);
1146 #endif /* CISCO_EXT */
1147 static void micinit(struct airo_info *ai);
1148 static int micsetup(struct airo_info *ai);
1149 static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len);
1150 static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *pPacket, u16 payLen);
1151 
1152 static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi);
1153 static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm);
1154 
1155 static void airo_networks_free(struct airo_info *ai);
1156 
1157 struct airo_info {
1158 	struct net_device             *dev;
1159 	struct list_head              dev_list;
1160 	/* Note, we can have MAX_FIDS outstanding.  FIDs are 16-bits, so we
1161 	   use the high bit to mark whether it is in use. */
1162 #define MAX_FIDS 6
1163 #define MPI_MAX_FIDS 1
1164 	u32                           fids[MAX_FIDS];
1165 	ConfigRid config;
1166 	char keyindex; // Used with auto wep
1167 	char defindex; // Used with auto wep
1168 	struct proc_dir_entry *proc_entry;
1169         spinlock_t aux_lock;
1170 #define FLAG_RADIO_OFF	0	/* User disabling of MAC */
1171 #define FLAG_RADIO_DOWN	1	/* ifup/ifdown disabling of MAC */
1172 #define FLAG_RADIO_MASK 0x03
1173 #define FLAG_ENABLED	2
1174 #define FLAG_ADHOC	3	/* Needed by MIC */
1175 #define FLAG_MIC_CAPABLE 4
1176 #define FLAG_UPDATE_MULTI 5
1177 #define FLAG_UPDATE_UNI 6
1178 #define FLAG_802_11	7
1179 #define FLAG_PROMISC	8	/* IFF_PROMISC 0x100 - include/linux/if.h */
1180 #define FLAG_PENDING_XMIT 9
1181 #define FLAG_PENDING_XMIT11 10
1182 #define FLAG_MPI	11
1183 #define FLAG_REGISTERED	12
1184 #define FLAG_COMMIT	13
1185 #define FLAG_RESET	14
1186 #define FLAG_FLASHING	15
1187 #define FLAG_WPA_CAPABLE	16
1188 	unsigned long flags;
1189 #define JOB_DIE	0
1190 #define JOB_XMIT	1
1191 #define JOB_XMIT11	2
1192 #define JOB_STATS	3
1193 #define JOB_PROMISC	4
1194 #define JOB_MIC	5
1195 #define JOB_EVENT	6
1196 #define JOB_AUTOWEP	7
1197 #define JOB_WSTATS	8
1198 #define JOB_SCAN_RESULTS  9
1199 	unsigned long jobs;
1200 	int (*bap_read)(struct airo_info*, __le16 *pu16Dst, int bytelen,
1201 			int whichbap);
1202 	unsigned short *flash;
1203 	tdsRssiEntry *rssi;
1204 	struct task_struct *list_bss_task;
1205 	struct task_struct *airo_thread_task;
1206 	struct semaphore sem;
1207 	wait_queue_head_t thr_wait;
1208 	unsigned long expires;
1209 	struct {
1210 		struct sk_buff *skb;
1211 		int fid;
1212 	} xmit, xmit11;
1213 	struct net_device *wifidev;
1214 	struct iw_statistics	wstats;		// wireless stats
1215 	unsigned long		scan_timeout;	/* Time scan should be read */
1216 	struct iw_spy_data	spy_data;
1217 	struct iw_public_data	wireless_data;
1218 	/* MIC stuff */
1219 	struct crypto_cipher	*tfm;
1220 	mic_module		mod[2];
1221 	mic_statistics		micstats;
1222 	HostRxDesc rxfids[MPI_MAX_FIDS]; // rx/tx/config MPI350 descriptors
1223 	HostTxDesc txfids[MPI_MAX_FIDS];
1224 	HostRidDesc config_desc;
1225 	unsigned long ridbus; // phys addr of config_desc
1226 	struct sk_buff_head txq;// tx queue used by mpi350 code
1227 	struct pci_dev          *pci;
1228 	unsigned char		__iomem *pcimem;
1229 	unsigned char		__iomem *pciaux;
1230 	unsigned char		*shared;
1231 	dma_addr_t		shared_dma;
1232 	pm_message_t		power;
1233 	SsidRid			*SSID;
1234 	APListRid		*APList;
1235 #define	PCI_SHARED_LEN		2*MPI_MAX_FIDS*PKTSIZE+RIDSIZE
1236 	char			proc_name[IFNAMSIZ];
1237 
1238 	int			wep_capable;
1239 	int			max_wep_idx;
1240 
1241 	/* WPA-related stuff */
1242 	unsigned int bssListFirst;
1243 	unsigned int bssListNext;
1244 	unsigned int bssListRidLen;
1245 
1246 	struct list_head network_list;
1247 	struct list_head network_free_list;
1248 	BSSListElement *networks;
1249 };
1250 
bap_read(struct airo_info * ai,__le16 * pu16Dst,int bytelen,int whichbap)1251 static inline int bap_read(struct airo_info *ai, __le16 *pu16Dst, int bytelen,
1252 			   int whichbap)
1253 {
1254 	return ai->bap_read(ai, pu16Dst, bytelen, whichbap);
1255 }
1256 
1257 static int setup_proc_entry( struct net_device *dev,
1258 			     struct airo_info *apriv );
1259 static int takedown_proc_entry( struct net_device *dev,
1260 				struct airo_info *apriv );
1261 
1262 static int cmdreset(struct airo_info *ai);
1263 static int setflashmode (struct airo_info *ai);
1264 static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime);
1265 static int flashputbuf(struct airo_info *ai);
1266 static int flashrestart(struct airo_info *ai,struct net_device *dev);
1267 
1268 #define airo_print(type, name, fmt, args...) \
1269 	printk(type DRV_NAME "(%s): " fmt "\n", name, ##args)
1270 
1271 #define airo_print_info(name, fmt, args...) \
1272 	airo_print(KERN_INFO, name, fmt, ##args)
1273 
1274 #define airo_print_dbg(name, fmt, args...) \
1275 	airo_print(KERN_DEBUG, name, fmt, ##args)
1276 
1277 #define airo_print_warn(name, fmt, args...) \
1278 	airo_print(KERN_WARNING, name, fmt, ##args)
1279 
1280 #define airo_print_err(name, fmt, args...) \
1281 	airo_print(KERN_ERR, name, fmt, ##args)
1282 
1283 #define AIRO_FLASH(dev) (((struct airo_info *)dev->ml_priv)->flash)
1284 
1285 /***********************************************************************
1286  *                              MIC ROUTINES                           *
1287  ***********************************************************************
1288  */
1289 
1290 static int RxSeqValid (struct airo_info *ai,miccntx *context,int mcast,u32 micSeq);
1291 static void MoveWindow(miccntx *context, u32 micSeq);
1292 static void emmh32_setseed(emmh32_context *context, u8 *pkey, int keylen,
1293 			   struct crypto_cipher *tfm);
1294 static void emmh32_init(emmh32_context *context);
1295 static void emmh32_update(emmh32_context *context, u8 *pOctets, int len);
1296 static void emmh32_final(emmh32_context *context, u8 digest[4]);
1297 static int flashpchar(struct airo_info *ai,int byte,int dwelltime);
1298 
age_mic_context(miccntx * cur,miccntx * old,u8 * key,int key_len,struct crypto_cipher * tfm)1299 static void age_mic_context(miccntx *cur, miccntx *old, u8 *key, int key_len,
1300 			    struct crypto_cipher *tfm)
1301 {
1302 	/* If the current MIC context is valid and its key is the same as
1303 	 * the MIC register, there's nothing to do.
1304 	 */
1305 	if (cur->valid && (memcmp(cur->key, key, key_len) == 0))
1306 		return;
1307 
1308 	/* Age current mic Context */
1309 	memcpy(old, cur, sizeof(*cur));
1310 
1311 	/* Initialize new context */
1312 	memcpy(cur->key, key, key_len);
1313 	cur->window  = 33; /* Window always points to the middle */
1314 	cur->rx      = 0;  /* Rx Sequence numbers */
1315 	cur->tx      = 0;  /* Tx sequence numbers */
1316 	cur->valid   = 1;  /* Key is now valid */
1317 
1318 	/* Give key to mic seed */
1319 	emmh32_setseed(&cur->seed, key, key_len, tfm);
1320 }
1321 
1322 /* micinit - Initialize mic seed */
1323 
micinit(struct airo_info * ai)1324 static void micinit(struct airo_info *ai)
1325 {
1326 	MICRid mic_rid;
1327 
1328 	clear_bit(JOB_MIC, &ai->jobs);
1329 	PC4500_readrid(ai, RID_MIC, &mic_rid, sizeof(mic_rid), 0);
1330 	up(&ai->sem);
1331 
1332 	ai->micstats.enabled = (le16_to_cpu(mic_rid.state) & 0x00FF) ? 1 : 0;
1333 	if (!ai->micstats.enabled) {
1334 		/* So next time we have a valid key and mic is enabled, we will
1335 		 * update the sequence number if the key is the same as before.
1336 		 */
1337 		ai->mod[0].uCtx.valid = 0;
1338 		ai->mod[0].mCtx.valid = 0;
1339 		return;
1340 	}
1341 
1342 	if (mic_rid.multicastValid) {
1343 		age_mic_context(&ai->mod[0].mCtx, &ai->mod[1].mCtx,
1344 		                mic_rid.multicast, sizeof(mic_rid.multicast),
1345 		                ai->tfm);
1346 	}
1347 
1348 	if (mic_rid.unicastValid) {
1349 		age_mic_context(&ai->mod[0].uCtx, &ai->mod[1].uCtx,
1350 				mic_rid.unicast, sizeof(mic_rid.unicast),
1351 				ai->tfm);
1352 	}
1353 }
1354 
1355 /* micsetup - Get ready for business */
1356 
micsetup(struct airo_info * ai)1357 static int micsetup(struct airo_info *ai) {
1358 	int i;
1359 
1360 	if (ai->tfm == NULL)
1361 	        ai->tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
1362 
1363         if (IS_ERR(ai->tfm)) {
1364                 airo_print_err(ai->dev->name, "failed to load transform for AES");
1365                 ai->tfm = NULL;
1366                 return ERROR;
1367         }
1368 
1369 	for (i=0; i < NUM_MODULES; i++) {
1370 		memset(&ai->mod[i].mCtx,0,sizeof(miccntx));
1371 		memset(&ai->mod[i].uCtx,0,sizeof(miccntx));
1372 	}
1373 	return SUCCESS;
1374 }
1375 
1376 static const u8 micsnap[] = {0xAA,0xAA,0x03,0x00,0x40,0x96,0x00,0x02};
1377 
1378 /*===========================================================================
1379  * Description: Mic a packet
1380  *
1381  *      Inputs: etherHead * pointer to an 802.3 frame
1382  *
1383  *     Returns: BOOLEAN if successful, otherwise false.
1384  *             PacketTxLen will be updated with the mic'd packets size.
1385  *
1386  *    Caveats: It is assumed that the frame buffer will already
1387  *             be big enough to hold the largets mic message possible.
1388  *            (No memory allocation is done here).
1389  *
1390  *    Author: sbraneky (10/15/01)
1391  *    Merciless hacks by rwilcher (1/14/02)
1392  */
1393 
encapsulate(struct airo_info * ai,etherHead * frame,MICBuffer * mic,int payLen)1394 static int encapsulate(struct airo_info *ai ,etherHead *frame, MICBuffer *mic, int payLen)
1395 {
1396 	miccntx   *context;
1397 
1398 	// Determine correct context
1399 	// If not adhoc, always use unicast key
1400 
1401 	if (test_bit(FLAG_ADHOC, &ai->flags) && (frame->da[0] & 0x1))
1402 		context = &ai->mod[0].mCtx;
1403 	else
1404 		context = &ai->mod[0].uCtx;
1405 
1406 	if (!context->valid)
1407 		return ERROR;
1408 
1409 	mic->typelen = htons(payLen + 16); //Length of Mic'd packet
1410 
1411 	memcpy(&mic->u.snap, micsnap, sizeof(micsnap)); // Add Snap
1412 
1413 	// Add Tx sequence
1414 	mic->seq = htonl(context->tx);
1415 	context->tx += 2;
1416 
1417 	emmh32_init(&context->seed); // Mic the packet
1418 	emmh32_update(&context->seed,frame->da,ETH_ALEN * 2); // DA,SA
1419 	emmh32_update(&context->seed,(u8*)&mic->typelen,10); // Type/Length and Snap
1420 	emmh32_update(&context->seed,(u8*)&mic->seq,sizeof(mic->seq)); //SEQ
1421 	emmh32_update(&context->seed,(u8*)(frame + 1),payLen); //payload
1422 	emmh32_final(&context->seed, (u8*)&mic->mic);
1423 
1424 	/*    New Type/length ?????????? */
1425 	mic->typelen = 0; //Let NIC know it could be an oversized packet
1426 	return SUCCESS;
1427 }
1428 
1429 typedef enum {
1430     NONE,
1431     NOMIC,
1432     NOMICPLUMMED,
1433     SEQUENCE,
1434     INCORRECTMIC,
1435 } mic_error;
1436 
1437 /*===========================================================================
1438  *  Description: Decapsulates a MIC'd packet and returns the 802.3 packet
1439  *               (removes the MIC stuff) if packet is a valid packet.
1440  *
1441  *       Inputs: etherHead  pointer to the 802.3 packet
1442  *
1443  *      Returns: BOOLEAN - TRUE if packet should be dropped otherwise FALSE
1444  *
1445  *      Author: sbraneky (10/15/01)
1446  *    Merciless hacks by rwilcher (1/14/02)
1447  *---------------------------------------------------------------------------
1448  */
1449 
decapsulate(struct airo_info * ai,MICBuffer * mic,etherHead * eth,u16 payLen)1450 static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *eth, u16 payLen)
1451 {
1452 	int      i;
1453 	u32      micSEQ;
1454 	miccntx  *context;
1455 	u8       digest[4];
1456 	mic_error micError = NONE;
1457 
1458 	// Check if the packet is a Mic'd packet
1459 
1460 	if (!ai->micstats.enabled) {
1461 		//No Mic set or Mic OFF but we received a MIC'd packet.
1462 		if (memcmp ((u8*)eth + 14, micsnap, sizeof(micsnap)) == 0) {
1463 			ai->micstats.rxMICPlummed++;
1464 			return ERROR;
1465 		}
1466 		return SUCCESS;
1467 	}
1468 
1469 	if (ntohs(mic->typelen) == 0x888E)
1470 		return SUCCESS;
1471 
1472 	if (memcmp (mic->u.snap, micsnap, sizeof(micsnap)) != 0) {
1473 	    // Mic enabled but packet isn't Mic'd
1474 		ai->micstats.rxMICPlummed++;
1475 	    	return ERROR;
1476 	}
1477 
1478 	micSEQ = ntohl(mic->seq);            //store SEQ as CPU order
1479 
1480 	//At this point we a have a mic'd packet and mic is enabled
1481 	//Now do the mic error checking.
1482 
1483 	//Receive seq must be odd
1484 	if ( (micSEQ & 1) == 0 ) {
1485 		ai->micstats.rxWrongSequence++;
1486 		return ERROR;
1487 	}
1488 
1489 	for (i = 0; i < NUM_MODULES; i++) {
1490 		int mcast = eth->da[0] & 1;
1491 		//Determine proper context
1492 		context = mcast ? &ai->mod[i].mCtx : &ai->mod[i].uCtx;
1493 
1494 		//Make sure context is valid
1495 		if (!context->valid) {
1496 			if (i == 0)
1497 				micError = NOMICPLUMMED;
1498 			continue;
1499 		}
1500 	       	//DeMic it
1501 
1502 		if (!mic->typelen)
1503 			mic->typelen = htons(payLen + sizeof(MICBuffer) - 2);
1504 
1505 		emmh32_init(&context->seed);
1506 		emmh32_update(&context->seed, eth->da, ETH_ALEN*2);
1507 		emmh32_update(&context->seed, (u8 *)&mic->typelen, sizeof(mic->typelen)+sizeof(mic->u.snap));
1508 		emmh32_update(&context->seed, (u8 *)&mic->seq,sizeof(mic->seq));
1509 		emmh32_update(&context->seed, (u8 *)(eth + 1),payLen);
1510 		//Calculate MIC
1511 		emmh32_final(&context->seed, digest);
1512 
1513 		if (memcmp(digest, &mic->mic, 4)) { //Make sure the mics match
1514 		  //Invalid Mic
1515 			if (i == 0)
1516 				micError = INCORRECTMIC;
1517 			continue;
1518 		}
1519 
1520 		//Check Sequence number if mics pass
1521 		if (RxSeqValid(ai, context, mcast, micSEQ) == SUCCESS) {
1522 			ai->micstats.rxSuccess++;
1523 			return SUCCESS;
1524 		}
1525 		if (i == 0)
1526 			micError = SEQUENCE;
1527 	}
1528 
1529 	// Update statistics
1530 	switch (micError) {
1531 		case NOMICPLUMMED: ai->micstats.rxMICPlummed++;   break;
1532 		case SEQUENCE:    ai->micstats.rxWrongSequence++; break;
1533 		case INCORRECTMIC: ai->micstats.rxIncorrectMIC++; break;
1534 		case NONE:  break;
1535 		case NOMIC: break;
1536 	}
1537 	return ERROR;
1538 }
1539 
1540 /*===========================================================================
1541  * Description:  Checks the Rx Seq number to make sure it is valid
1542  *               and hasn't already been received
1543  *
1544  *     Inputs: miccntx - mic context to check seq against
1545  *             micSeq  - the Mic seq number
1546  *
1547  *    Returns: TRUE if valid otherwise FALSE.
1548  *
1549  *    Author: sbraneky (10/15/01)
1550  *    Merciless hacks by rwilcher (1/14/02)
1551  *---------------------------------------------------------------------------
1552  */
1553 
RxSeqValid(struct airo_info * ai,miccntx * context,int mcast,u32 micSeq)1554 static int RxSeqValid (struct airo_info *ai,miccntx *context,int mcast,u32 micSeq)
1555 {
1556 	u32 seq,index;
1557 
1558 	//Allow for the ap being rebooted - if it is then use the next
1559 	//sequence number of the current sequence number - might go backwards
1560 
1561 	if (mcast) {
1562 		if (test_bit(FLAG_UPDATE_MULTI, &ai->flags)) {
1563 			clear_bit (FLAG_UPDATE_MULTI, &ai->flags);
1564 			context->window = (micSeq > 33) ? micSeq : 33;
1565 			context->rx     = 0;        // Reset rx
1566 		}
1567 	} else if (test_bit(FLAG_UPDATE_UNI, &ai->flags)) {
1568 		clear_bit (FLAG_UPDATE_UNI, &ai->flags);
1569 		context->window = (micSeq > 33) ? micSeq : 33; // Move window
1570 		context->rx     = 0;        // Reset rx
1571 	}
1572 
1573 	//Make sequence number relative to START of window
1574 	seq = micSeq - (context->window - 33);
1575 
1576 	//Too old of a SEQ number to check.
1577 	if ((s32)seq < 0)
1578 		return ERROR;
1579 
1580 	if ( seq > 64 ) {
1581 		//Window is infinite forward
1582 		MoveWindow(context,micSeq);
1583 		return SUCCESS;
1584 	}
1585 
1586 	// We are in the window. Now check the context rx bit to see if it was already sent
1587 	seq >>= 1;         //divide by 2 because we only have odd numbers
1588 	index = 1 << seq;  //Get an index number
1589 
1590 	if (!(context->rx & index)) {
1591 		//micSEQ falls inside the window.
1592 		//Add seqence number to the list of received numbers.
1593 		context->rx |= index;
1594 
1595 		MoveWindow(context,micSeq);
1596 
1597 		return SUCCESS;
1598 	}
1599 	return ERROR;
1600 }
1601 
MoveWindow(miccntx * context,u32 micSeq)1602 static void MoveWindow(miccntx *context, u32 micSeq)
1603 {
1604 	u32 shift;
1605 
1606 	//Move window if seq greater than the middle of the window
1607 	if (micSeq > context->window) {
1608 		shift = (micSeq - context->window) >> 1;
1609 
1610 		    //Shift out old
1611 		if (shift < 32)
1612 			context->rx >>= shift;
1613 		else
1614 			context->rx = 0;
1615 
1616 		context->window = micSeq;      //Move window
1617 	}
1618 }
1619 
1620 /*==============================================*/
1621 /*========== EMMH ROUTINES  ====================*/
1622 /*==============================================*/
1623 
1624 /* mic accumulate */
1625 #define MIC_ACCUM(val)	\
1626 	context->accum += (u64)(val) * context->coeff[coeff_position++];
1627 
1628 static unsigned char aes_counter[16];
1629 
1630 /* expand the key to fill the MMH coefficient array */
emmh32_setseed(emmh32_context * context,u8 * pkey,int keylen,struct crypto_cipher * tfm)1631 static void emmh32_setseed(emmh32_context *context, u8 *pkey, int keylen,
1632 			   struct crypto_cipher *tfm)
1633 {
1634   /* take the keying material, expand if necessary, truncate at 16-bytes */
1635   /* run through AES counter mode to generate context->coeff[] */
1636 
1637 	int i,j;
1638 	u32 counter;
1639 	u8 *cipher, plain[16];
1640 
1641 	crypto_cipher_setkey(tfm, pkey, 16);
1642 	counter = 0;
1643 	for (i = 0; i < ARRAY_SIZE(context->coeff); ) {
1644 		aes_counter[15] = (u8)(counter >> 0);
1645 		aes_counter[14] = (u8)(counter >> 8);
1646 		aes_counter[13] = (u8)(counter >> 16);
1647 		aes_counter[12] = (u8)(counter >> 24);
1648 		counter++;
1649 		memcpy (plain, aes_counter, 16);
1650 		crypto_cipher_encrypt_one(tfm, plain, plain);
1651 		cipher = plain;
1652 		for (j = 0; (j < 16) && (i < ARRAY_SIZE(context->coeff)); ) {
1653 			context->coeff[i++] = ntohl(*(__be32 *)&cipher[j]);
1654 			j += 4;
1655 		}
1656 	}
1657 }
1658 
1659 /* prepare for calculation of a new mic */
emmh32_init(emmh32_context * context)1660 static void emmh32_init(emmh32_context *context)
1661 {
1662 	/* prepare for new mic calculation */
1663 	context->accum = 0;
1664 	context->position = 0;
1665 }
1666 
1667 /* add some bytes to the mic calculation */
emmh32_update(emmh32_context * context,u8 * pOctets,int len)1668 static void emmh32_update(emmh32_context *context, u8 *pOctets, int len)
1669 {
1670 	int	coeff_position, byte_position;
1671 
1672 	if (len == 0) return;
1673 
1674 	coeff_position = context->position >> 2;
1675 
1676 	/* deal with partial 32-bit word left over from last update */
1677 	byte_position = context->position & 3;
1678 	if (byte_position) {
1679 		/* have a partial word in part to deal with */
1680 		do {
1681 			if (len == 0) return;
1682 			context->part.d8[byte_position++] = *pOctets++;
1683 			context->position++;
1684 			len--;
1685 		} while (byte_position < 4);
1686 		MIC_ACCUM(ntohl(context->part.d32));
1687 	}
1688 
1689 	/* deal with full 32-bit words */
1690 	while (len >= 4) {
1691 		MIC_ACCUM(ntohl(*(__be32 *)pOctets));
1692 		context->position += 4;
1693 		pOctets += 4;
1694 		len -= 4;
1695 	}
1696 
1697 	/* deal with partial 32-bit word that will be left over from this update */
1698 	byte_position = 0;
1699 	while (len > 0) {
1700 		context->part.d8[byte_position++] = *pOctets++;
1701 		context->position++;
1702 		len--;
1703 	}
1704 }
1705 
1706 /* mask used to zero empty bytes for final partial word */
1707 static u32 mask32[4] = { 0x00000000L, 0xFF000000L, 0xFFFF0000L, 0xFFFFFF00L };
1708 
1709 /* calculate the mic */
emmh32_final(emmh32_context * context,u8 digest[4])1710 static void emmh32_final(emmh32_context *context, u8 digest[4])
1711 {
1712 	int	coeff_position, byte_position;
1713 	u32	val;
1714 
1715 	u64 sum, utmp;
1716 	s64 stmp;
1717 
1718 	coeff_position = context->position >> 2;
1719 
1720 	/* deal with partial 32-bit word left over from last update */
1721 	byte_position = context->position & 3;
1722 	if (byte_position) {
1723 		/* have a partial word in part to deal with */
1724 		val = ntohl(context->part.d32);
1725 		MIC_ACCUM(val & mask32[byte_position]);	/* zero empty bytes */
1726 	}
1727 
1728 	/* reduce the accumulated u64 to a 32-bit MIC */
1729 	sum = context->accum;
1730 	stmp = (sum  & 0xffffffffLL) - ((sum >> 32)  * 15);
1731 	utmp = (stmp & 0xffffffffLL) - ((stmp >> 32) * 15);
1732 	sum = utmp & 0xffffffffLL;
1733 	if (utmp > 0x10000000fLL)
1734 		sum -= 15;
1735 
1736 	val = (u32)sum;
1737 	digest[0] = (val>>24) & 0xFF;
1738 	digest[1] = (val>>16) & 0xFF;
1739 	digest[2] = (val>>8) & 0xFF;
1740 	digest[3] = val & 0xFF;
1741 }
1742 
readBSSListRid(struct airo_info * ai,int first,BSSListRid * list)1743 static int readBSSListRid(struct airo_info *ai, int first,
1744 		      BSSListRid *list)
1745 {
1746 	Cmd cmd;
1747 	Resp rsp;
1748 
1749 	if (first == 1) {
1750 		if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN;
1751 		memset(&cmd, 0, sizeof(cmd));
1752 		cmd.cmd=CMD_LISTBSS;
1753 		if (down_interruptible(&ai->sem))
1754 			return -ERESTARTSYS;
1755 		ai->list_bss_task = current;
1756 		issuecommand(ai, &cmd, &rsp);
1757 		up(&ai->sem);
1758 		/* Let the command take effect */
1759 		schedule_timeout_uninterruptible(3 * HZ);
1760 		ai->list_bss_task = NULL;
1761 	}
1762 	return PC4500_readrid(ai, first ? ai->bssListFirst : ai->bssListNext,
1763 			    list, ai->bssListRidLen, 1);
1764 }
1765 
readWepKeyRid(struct airo_info * ai,WepKeyRid * wkr,int temp,int lock)1766 static int readWepKeyRid(struct airo_info *ai, WepKeyRid *wkr, int temp, int lock)
1767 {
1768 	return PC4500_readrid(ai, temp ? RID_WEP_TEMP : RID_WEP_PERM,
1769 				wkr, sizeof(*wkr), lock);
1770 }
1771 
writeWepKeyRid(struct airo_info * ai,WepKeyRid * wkr,int perm,int lock)1772 static int writeWepKeyRid(struct airo_info *ai, WepKeyRid *wkr, int perm, int lock)
1773 {
1774 	int rc;
1775 	rc = PC4500_writerid(ai, RID_WEP_TEMP, wkr, sizeof(*wkr), lock);
1776 	if (rc!=SUCCESS)
1777 		airo_print_err(ai->dev->name, "WEP_TEMP set %x", rc);
1778 	if (perm) {
1779 		rc = PC4500_writerid(ai, RID_WEP_PERM, wkr, sizeof(*wkr), lock);
1780 		if (rc!=SUCCESS)
1781 			airo_print_err(ai->dev->name, "WEP_PERM set %x", rc);
1782 	}
1783 	return rc;
1784 }
1785 
readSsidRid(struct airo_info * ai,SsidRid * ssidr)1786 static int readSsidRid(struct airo_info*ai, SsidRid *ssidr)
1787 {
1788 	return PC4500_readrid(ai, RID_SSID, ssidr, sizeof(*ssidr), 1);
1789 }
1790 
writeSsidRid(struct airo_info * ai,SsidRid * pssidr,int lock)1791 static int writeSsidRid(struct airo_info*ai, SsidRid *pssidr, int lock)
1792 {
1793 	return PC4500_writerid(ai, RID_SSID, pssidr, sizeof(*pssidr), lock);
1794 }
1795 
readConfigRid(struct airo_info * ai,int lock)1796 static int readConfigRid(struct airo_info *ai, int lock)
1797 {
1798 	int rc;
1799 	ConfigRid cfg;
1800 
1801 	if (ai->config.len)
1802 		return SUCCESS;
1803 
1804 	rc = PC4500_readrid(ai, RID_ACTUALCONFIG, &cfg, sizeof(cfg), lock);
1805 	if (rc != SUCCESS)
1806 		return rc;
1807 
1808 	ai->config = cfg;
1809 	return SUCCESS;
1810 }
1811 
checkThrottle(struct airo_info * ai)1812 static inline void checkThrottle(struct airo_info *ai)
1813 {
1814 	int i;
1815 /* Old hardware had a limit on encryption speed */
1816 	if (ai->config.authType != AUTH_OPEN && maxencrypt) {
1817 		for(i=0; i<8; i++) {
1818 			if (ai->config.rates[i] > maxencrypt) {
1819 				ai->config.rates[i] = 0;
1820 			}
1821 		}
1822 	}
1823 }
1824 
writeConfigRid(struct airo_info * ai,int lock)1825 static int writeConfigRid(struct airo_info *ai, int lock)
1826 {
1827 	ConfigRid cfgr;
1828 
1829 	if (!test_bit (FLAG_COMMIT, &ai->flags))
1830 		return SUCCESS;
1831 
1832 	clear_bit (FLAG_COMMIT, &ai->flags);
1833 	clear_bit (FLAG_RESET, &ai->flags);
1834 	checkThrottle(ai);
1835 	cfgr = ai->config;
1836 
1837 	if ((cfgr.opmode & MODE_CFG_MASK) == MODE_STA_IBSS)
1838 		set_bit(FLAG_ADHOC, &ai->flags);
1839 	else
1840 		clear_bit(FLAG_ADHOC, &ai->flags);
1841 
1842 	return PC4500_writerid( ai, RID_CONFIG, &cfgr, sizeof(cfgr), lock);
1843 }
1844 
readStatusRid(struct airo_info * ai,StatusRid * statr,int lock)1845 static int readStatusRid(struct airo_info *ai, StatusRid *statr, int lock)
1846 {
1847 	return PC4500_readrid(ai, RID_STATUS, statr, sizeof(*statr), lock);
1848 }
1849 
readAPListRid(struct airo_info * ai,APListRid * aplr)1850 static int readAPListRid(struct airo_info *ai, APListRid *aplr)
1851 {
1852 	return PC4500_readrid(ai, RID_APLIST, aplr, sizeof(*aplr), 1);
1853 }
1854 
writeAPListRid(struct airo_info * ai,APListRid * aplr,int lock)1855 static int writeAPListRid(struct airo_info *ai, APListRid *aplr, int lock)
1856 {
1857 	return PC4500_writerid(ai, RID_APLIST, aplr, sizeof(*aplr), lock);
1858 }
1859 
readCapabilityRid(struct airo_info * ai,CapabilityRid * capr,int lock)1860 static int readCapabilityRid(struct airo_info *ai, CapabilityRid *capr, int lock)
1861 {
1862 	return PC4500_readrid(ai, RID_CAPABILITIES, capr, sizeof(*capr), lock);
1863 }
1864 
readStatsRid(struct airo_info * ai,StatsRid * sr,int rid,int lock)1865 static int readStatsRid(struct airo_info*ai, StatsRid *sr, int rid, int lock)
1866 {
1867 	return PC4500_readrid(ai, rid, sr, sizeof(*sr), lock);
1868 }
1869 
try_auto_wep(struct airo_info * ai)1870 static void try_auto_wep(struct airo_info *ai)
1871 {
1872 	if (auto_wep && !(ai->flags & FLAG_RADIO_DOWN)) {
1873 		ai->expires = RUN_AT(3*HZ);
1874 		wake_up_interruptible(&ai->thr_wait);
1875 	}
1876 }
1877 
airo_open(struct net_device * dev)1878 static int airo_open(struct net_device *dev) {
1879 	struct airo_info *ai = dev->ml_priv;
1880 	int rc = 0;
1881 
1882 	if (test_bit(FLAG_FLASHING, &ai->flags))
1883 		return -EIO;
1884 
1885 	/* Make sure the card is configured.
1886 	 * Wireless Extensions may postpone config changes until the card
1887 	 * is open (to pipeline changes and speed-up card setup). If
1888 	 * those changes are not yet committed, do it now - Jean II */
1889 	if (test_bit(FLAG_COMMIT, &ai->flags)) {
1890 		disable_MAC(ai, 1);
1891 		writeConfigRid(ai, 1);
1892 	}
1893 
1894 	if (ai->wifidev != dev) {
1895 		clear_bit(JOB_DIE, &ai->jobs);
1896 		ai->airo_thread_task = kthread_run(airo_thread, dev, dev->name);
1897 		if (IS_ERR(ai->airo_thread_task))
1898 			return (int)PTR_ERR(ai->airo_thread_task);
1899 
1900 		rc = request_irq(dev->irq, airo_interrupt, IRQF_SHARED,
1901 			dev->name, dev);
1902 		if (rc) {
1903 			airo_print_err(dev->name,
1904 				"register interrupt %d failed, rc %d",
1905 				dev->irq, rc);
1906 			set_bit(JOB_DIE, &ai->jobs);
1907 			kthread_stop(ai->airo_thread_task);
1908 			return rc;
1909 		}
1910 
1911 		/* Power on the MAC controller (which may have been disabled) */
1912 		clear_bit(FLAG_RADIO_DOWN, &ai->flags);
1913 		enable_interrupts(ai);
1914 
1915 		try_auto_wep(ai);
1916 	}
1917 	enable_MAC(ai, 1);
1918 
1919 	netif_start_queue(dev);
1920 	return 0;
1921 }
1922 
mpi_start_xmit(struct sk_buff * skb,struct net_device * dev)1923 static netdev_tx_t mpi_start_xmit(struct sk_buff *skb,
1924 					struct net_device *dev)
1925 {
1926 	int npacks, pending;
1927 	unsigned long flags;
1928 	struct airo_info *ai = dev->ml_priv;
1929 
1930 	if (!skb) {
1931 		airo_print_err(dev->name, "%s: skb == NULL!",__func__);
1932 		return NETDEV_TX_OK;
1933 	}
1934 	npacks = skb_queue_len (&ai->txq);
1935 
1936 	if (npacks >= MAXTXQ - 1) {
1937 		netif_stop_queue (dev);
1938 		if (npacks > MAXTXQ) {
1939 			dev->stats.tx_fifo_errors++;
1940 			return NETDEV_TX_BUSY;
1941 		}
1942 		skb_queue_tail (&ai->txq, skb);
1943 		return NETDEV_TX_OK;
1944 	}
1945 
1946 	spin_lock_irqsave(&ai->aux_lock, flags);
1947 	skb_queue_tail (&ai->txq, skb);
1948 	pending = test_bit(FLAG_PENDING_XMIT, &ai->flags);
1949 	spin_unlock_irqrestore(&ai->aux_lock,flags);
1950 	netif_wake_queue (dev);
1951 
1952 	if (pending == 0) {
1953 		set_bit(FLAG_PENDING_XMIT, &ai->flags);
1954 		mpi_send_packet (dev);
1955 	}
1956 	return NETDEV_TX_OK;
1957 }
1958 
1959 /*
1960  * @mpi_send_packet
1961  *
1962  * Attempt to transmit a packet. Can be called from interrupt
1963  * or transmit . return number of packets we tried to send
1964  */
1965 
mpi_send_packet(struct net_device * dev)1966 static int mpi_send_packet (struct net_device *dev)
1967 {
1968 	struct sk_buff *skb;
1969 	unsigned char *buffer;
1970 	s16 len;
1971 	__le16 *payloadLen;
1972 	struct airo_info *ai = dev->ml_priv;
1973 	u8 *sendbuf;
1974 
1975 	/* get a packet to send */
1976 
1977 	if ((skb = skb_dequeue(&ai->txq)) == NULL) {
1978 		airo_print_err(dev->name,
1979 			"%s: Dequeue'd zero in send_packet()",
1980 			__func__);
1981 		return 0;
1982 	}
1983 
1984 	/* check min length*/
1985 	len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
1986 	buffer = skb->data;
1987 
1988 	ai->txfids[0].tx_desc.offset = 0;
1989 	ai->txfids[0].tx_desc.valid = 1;
1990 	ai->txfids[0].tx_desc.eoc = 1;
1991 	ai->txfids[0].tx_desc.len =len+sizeof(WifiHdr);
1992 
1993 /*
1994  * Magic, the cards firmware needs a length count (2 bytes) in the host buffer
1995  * right after  TXFID_HDR.The TXFID_HDR contains the status short so payloadlen
1996  * is immediately after it. ------------------------------------------------
1997  *                         |TXFIDHDR+STATUS|PAYLOADLEN|802.3HDR|PACKETDATA|
1998  *                         ------------------------------------------------
1999  */
2000 
2001 	memcpy((char *)ai->txfids[0].virtual_host_addr,
2002 		(char *)&wifictlhdr8023, sizeof(wifictlhdr8023));
2003 
2004 	payloadLen = (__le16 *)(ai->txfids[0].virtual_host_addr +
2005 		sizeof(wifictlhdr8023));
2006 	sendbuf = ai->txfids[0].virtual_host_addr +
2007 		sizeof(wifictlhdr8023) + 2 ;
2008 
2009 	/*
2010 	 * Firmware automatically puts 802 header on so
2011 	 * we don't need to account for it in the length
2012 	 */
2013 	if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
2014 		(ntohs(((__be16 *)buffer)[6]) != 0x888E)) {
2015 		MICBuffer pMic;
2016 
2017 		if (encapsulate(ai, (etherHead *)buffer, &pMic, len - sizeof(etherHead)) != SUCCESS)
2018 			return ERROR;
2019 
2020 		*payloadLen = cpu_to_le16(len-sizeof(etherHead)+sizeof(pMic));
2021 		ai->txfids[0].tx_desc.len += sizeof(pMic);
2022 		/* copy data into airo dma buffer */
2023 		memcpy (sendbuf, buffer, sizeof(etherHead));
2024 		buffer += sizeof(etherHead);
2025 		sendbuf += sizeof(etherHead);
2026 		memcpy (sendbuf, &pMic, sizeof(pMic));
2027 		sendbuf += sizeof(pMic);
2028 		memcpy (sendbuf, buffer, len - sizeof(etherHead));
2029 	} else {
2030 		*payloadLen = cpu_to_le16(len - sizeof(etherHead));
2031 
2032 		dev->trans_start = jiffies;
2033 
2034 		/* copy data into airo dma buffer */
2035 		memcpy(sendbuf, buffer, len);
2036 	}
2037 
2038 	memcpy_toio(ai->txfids[0].card_ram_off,
2039 		&ai->txfids[0].tx_desc, sizeof(TxFid));
2040 
2041 	OUT4500(ai, EVACK, 8);
2042 
2043 	dev_kfree_skb_any(skb);
2044 	return 1;
2045 }
2046 
get_tx_error(struct airo_info * ai,s32 fid)2047 static void get_tx_error(struct airo_info *ai, s32 fid)
2048 {
2049 	__le16 status;
2050 
2051 	if (fid < 0)
2052 		status = ((WifiCtlHdr *)ai->txfids[0].virtual_host_addr)->ctlhdr.status;
2053 	else {
2054 		if (bap_setup(ai, ai->fids[fid] & 0xffff, 4, BAP0) != SUCCESS)
2055 			return;
2056 		bap_read(ai, &status, 2, BAP0);
2057 	}
2058 	if (le16_to_cpu(status) & 2) /* Too many retries */
2059 		ai->dev->stats.tx_aborted_errors++;
2060 	if (le16_to_cpu(status) & 4) /* Transmit lifetime exceeded */
2061 		ai->dev->stats.tx_heartbeat_errors++;
2062 	if (le16_to_cpu(status) & 8) /* Aid fail */
2063 		{ }
2064 	if (le16_to_cpu(status) & 0x10) /* MAC disabled */
2065 		ai->dev->stats.tx_carrier_errors++;
2066 	if (le16_to_cpu(status) & 0x20) /* Association lost */
2067 		{ }
2068 	/* We produce a TXDROP event only for retry or lifetime
2069 	 * exceeded, because that's the only status that really mean
2070 	 * that this particular node went away.
2071 	 * Other errors means that *we* screwed up. - Jean II */
2072 	if ((le16_to_cpu(status) & 2) ||
2073 	     (le16_to_cpu(status) & 4)) {
2074 		union iwreq_data	wrqu;
2075 		char junk[0x18];
2076 
2077 		/* Faster to skip over useless data than to do
2078 		 * another bap_setup(). We are at offset 0x6 and
2079 		 * need to go to 0x18 and read 6 bytes - Jean II */
2080 		bap_read(ai, (__le16 *) junk, 0x18, BAP0);
2081 
2082 		/* Copy 802.11 dest address.
2083 		 * We use the 802.11 header because the frame may
2084 		 * not be 802.3 or may be mangled...
2085 		 * In Ad-Hoc mode, it will be the node address.
2086 		 * In managed mode, it will be most likely the AP addr
2087 		 * User space will figure out how to convert it to
2088 		 * whatever it needs (IP address or else).
2089 		 * - Jean II */
2090 		memcpy(wrqu.addr.sa_data, junk + 0x12, ETH_ALEN);
2091 		wrqu.addr.sa_family = ARPHRD_ETHER;
2092 
2093 		/* Send event to user space */
2094 		wireless_send_event(ai->dev, IWEVTXDROP, &wrqu, NULL);
2095 	}
2096 }
2097 
airo_end_xmit(struct net_device * dev)2098 static void airo_end_xmit(struct net_device *dev) {
2099 	u16 status;
2100 	int i;
2101 	struct airo_info *priv = dev->ml_priv;
2102 	struct sk_buff *skb = priv->xmit.skb;
2103 	int fid = priv->xmit.fid;
2104 	u32 *fids = priv->fids;
2105 
2106 	clear_bit(JOB_XMIT, &priv->jobs);
2107 	clear_bit(FLAG_PENDING_XMIT, &priv->flags);
2108 	status = transmit_802_3_packet (priv, fids[fid], skb->data);
2109 	up(&priv->sem);
2110 
2111 	i = 0;
2112 	if ( status == SUCCESS ) {
2113 		dev->trans_start = jiffies;
2114 		for (; i < MAX_FIDS / 2 && (priv->fids[i] & 0xffff0000); i++);
2115 	} else {
2116 		priv->fids[fid] &= 0xffff;
2117 		dev->stats.tx_window_errors++;
2118 	}
2119 	if (i < MAX_FIDS / 2)
2120 		netif_wake_queue(dev);
2121 	dev_kfree_skb(skb);
2122 }
2123 
airo_start_xmit(struct sk_buff * skb,struct net_device * dev)2124 static netdev_tx_t airo_start_xmit(struct sk_buff *skb,
2125 					 struct net_device *dev)
2126 {
2127 	s16 len;
2128 	int i, j;
2129 	struct airo_info *priv = dev->ml_priv;
2130 	u32 *fids = priv->fids;
2131 
2132 	if ( skb == NULL ) {
2133 		airo_print_err(dev->name, "%s: skb == NULL!", __func__);
2134 		return NETDEV_TX_OK;
2135 	}
2136 
2137 	/* Find a vacant FID */
2138 	for( i = 0; i < MAX_FIDS / 2 && (fids[i] & 0xffff0000); i++ );
2139 	for( j = i + 1; j < MAX_FIDS / 2 && (fids[j] & 0xffff0000); j++ );
2140 
2141 	if ( j >= MAX_FIDS / 2 ) {
2142 		netif_stop_queue(dev);
2143 
2144 		if (i == MAX_FIDS / 2) {
2145 			dev->stats.tx_fifo_errors++;
2146 			return NETDEV_TX_BUSY;
2147 		}
2148 	}
2149 	/* check min length*/
2150 	len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
2151         /* Mark fid as used & save length for later */
2152 	fids[i] |= (len << 16);
2153 	priv->xmit.skb = skb;
2154 	priv->xmit.fid = i;
2155 	if (down_trylock(&priv->sem) != 0) {
2156 		set_bit(FLAG_PENDING_XMIT, &priv->flags);
2157 		netif_stop_queue(dev);
2158 		set_bit(JOB_XMIT, &priv->jobs);
2159 		wake_up_interruptible(&priv->thr_wait);
2160 	} else
2161 		airo_end_xmit(dev);
2162 	return NETDEV_TX_OK;
2163 }
2164 
airo_end_xmit11(struct net_device * dev)2165 static void airo_end_xmit11(struct net_device *dev) {
2166 	u16 status;
2167 	int i;
2168 	struct airo_info *priv = dev->ml_priv;
2169 	struct sk_buff *skb = priv->xmit11.skb;
2170 	int fid = priv->xmit11.fid;
2171 	u32 *fids = priv->fids;
2172 
2173 	clear_bit(JOB_XMIT11, &priv->jobs);
2174 	clear_bit(FLAG_PENDING_XMIT11, &priv->flags);
2175 	status = transmit_802_11_packet (priv, fids[fid], skb->data);
2176 	up(&priv->sem);
2177 
2178 	i = MAX_FIDS / 2;
2179 	if ( status == SUCCESS ) {
2180 		dev->trans_start = jiffies;
2181 		for (; i < MAX_FIDS && (priv->fids[i] & 0xffff0000); i++);
2182 	} else {
2183 		priv->fids[fid] &= 0xffff;
2184 		dev->stats.tx_window_errors++;
2185 	}
2186 	if (i < MAX_FIDS)
2187 		netif_wake_queue(dev);
2188 	dev_kfree_skb(skb);
2189 }
2190 
airo_start_xmit11(struct sk_buff * skb,struct net_device * dev)2191 static netdev_tx_t airo_start_xmit11(struct sk_buff *skb,
2192 					   struct net_device *dev)
2193 {
2194 	s16 len;
2195 	int i, j;
2196 	struct airo_info *priv = dev->ml_priv;
2197 	u32 *fids = priv->fids;
2198 
2199 	if (test_bit(FLAG_MPI, &priv->flags)) {
2200 		/* Not implemented yet for MPI350 */
2201 		netif_stop_queue(dev);
2202 		dev_kfree_skb_any(skb);
2203 		return NETDEV_TX_OK;
2204 	}
2205 
2206 	if ( skb == NULL ) {
2207 		airo_print_err(dev->name, "%s: skb == NULL!", __func__);
2208 		return NETDEV_TX_OK;
2209 	}
2210 
2211 	/* Find a vacant FID */
2212 	for( i = MAX_FIDS / 2; i < MAX_FIDS && (fids[i] & 0xffff0000); i++ );
2213 	for( j = i + 1; j < MAX_FIDS && (fids[j] & 0xffff0000); j++ );
2214 
2215 	if ( j >= MAX_FIDS ) {
2216 		netif_stop_queue(dev);
2217 
2218 		if (i == MAX_FIDS) {
2219 			dev->stats.tx_fifo_errors++;
2220 			return NETDEV_TX_BUSY;
2221 		}
2222 	}
2223 	/* check min length*/
2224 	len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
2225         /* Mark fid as used & save length for later */
2226 	fids[i] |= (len << 16);
2227 	priv->xmit11.skb = skb;
2228 	priv->xmit11.fid = i;
2229 	if (down_trylock(&priv->sem) != 0) {
2230 		set_bit(FLAG_PENDING_XMIT11, &priv->flags);
2231 		netif_stop_queue(dev);
2232 		set_bit(JOB_XMIT11, &priv->jobs);
2233 		wake_up_interruptible(&priv->thr_wait);
2234 	} else
2235 		airo_end_xmit11(dev);
2236 	return NETDEV_TX_OK;
2237 }
2238 
airo_read_stats(struct net_device * dev)2239 static void airo_read_stats(struct net_device *dev)
2240 {
2241 	struct airo_info *ai = dev->ml_priv;
2242 	StatsRid stats_rid;
2243 	__le32 *vals = stats_rid.vals;
2244 
2245 	clear_bit(JOB_STATS, &ai->jobs);
2246 	if (ai->power.event) {
2247 		up(&ai->sem);
2248 		return;
2249 	}
2250 	readStatsRid(ai, &stats_rid, RID_STATS, 0);
2251 	up(&ai->sem);
2252 
2253 	dev->stats.rx_packets = le32_to_cpu(vals[43]) + le32_to_cpu(vals[44]) +
2254 			       le32_to_cpu(vals[45]);
2255 	dev->stats.tx_packets = le32_to_cpu(vals[39]) + le32_to_cpu(vals[40]) +
2256 			       le32_to_cpu(vals[41]);
2257 	dev->stats.rx_bytes = le32_to_cpu(vals[92]);
2258 	dev->stats.tx_bytes = le32_to_cpu(vals[91]);
2259 	dev->stats.rx_errors = le32_to_cpu(vals[0]) + le32_to_cpu(vals[2]) +
2260 			      le32_to_cpu(vals[3]) + le32_to_cpu(vals[4]);
2261 	dev->stats.tx_errors = le32_to_cpu(vals[42]) +
2262 			      dev->stats.tx_fifo_errors;
2263 	dev->stats.multicast = le32_to_cpu(vals[43]);
2264 	dev->stats.collisions = le32_to_cpu(vals[89]);
2265 
2266 	/* detailed rx_errors: */
2267 	dev->stats.rx_length_errors = le32_to_cpu(vals[3]);
2268 	dev->stats.rx_crc_errors = le32_to_cpu(vals[4]);
2269 	dev->stats.rx_frame_errors = le32_to_cpu(vals[2]);
2270 	dev->stats.rx_fifo_errors = le32_to_cpu(vals[0]);
2271 }
2272 
airo_get_stats(struct net_device * dev)2273 static struct net_device_stats *airo_get_stats(struct net_device *dev)
2274 {
2275 	struct airo_info *local =  dev->ml_priv;
2276 
2277 	if (!test_bit(JOB_STATS, &local->jobs)) {
2278 		/* Get stats out of the card if available */
2279 		if (down_trylock(&local->sem) != 0) {
2280 			set_bit(JOB_STATS, &local->jobs);
2281 			wake_up_interruptible(&local->thr_wait);
2282 		} else
2283 			airo_read_stats(dev);
2284 	}
2285 
2286 	return &dev->stats;
2287 }
2288 
airo_set_promisc(struct airo_info * ai)2289 static void airo_set_promisc(struct airo_info *ai) {
2290 	Cmd cmd;
2291 	Resp rsp;
2292 
2293 	memset(&cmd, 0, sizeof(cmd));
2294 	cmd.cmd=CMD_SETMODE;
2295 	clear_bit(JOB_PROMISC, &ai->jobs);
2296 	cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC;
2297 	issuecommand(ai, &cmd, &rsp);
2298 	up(&ai->sem);
2299 }
2300 
airo_set_multicast_list(struct net_device * dev)2301 static void airo_set_multicast_list(struct net_device *dev) {
2302 	struct airo_info *ai = dev->ml_priv;
2303 
2304 	if ((dev->flags ^ ai->flags) & IFF_PROMISC) {
2305 		change_bit(FLAG_PROMISC, &ai->flags);
2306 		if (down_trylock(&ai->sem) != 0) {
2307 			set_bit(JOB_PROMISC, &ai->jobs);
2308 			wake_up_interruptible(&ai->thr_wait);
2309 		} else
2310 			airo_set_promisc(ai);
2311 	}
2312 
2313 	if ((dev->flags&IFF_ALLMULTI) || !netdev_mc_empty(dev)) {
2314 		/* Turn on multicast.  (Should be already setup...) */
2315 	}
2316 }
2317 
airo_set_mac_address(struct net_device * dev,void * p)2318 static int airo_set_mac_address(struct net_device *dev, void *p)
2319 {
2320 	struct airo_info *ai = dev->ml_priv;
2321 	struct sockaddr *addr = p;
2322 
2323 	readConfigRid(ai, 1);
2324 	memcpy (ai->config.macAddr, addr->sa_data, dev->addr_len);
2325 	set_bit (FLAG_COMMIT, &ai->flags);
2326 	disable_MAC(ai, 1);
2327 	writeConfigRid (ai, 1);
2328 	enable_MAC(ai, 1);
2329 	memcpy (ai->dev->dev_addr, addr->sa_data, dev->addr_len);
2330 	if (ai->wifidev)
2331 		memcpy (ai->wifidev->dev_addr, addr->sa_data, dev->addr_len);
2332 	return 0;
2333 }
2334 
airo_change_mtu(struct net_device * dev,int new_mtu)2335 static int airo_change_mtu(struct net_device *dev, int new_mtu)
2336 {
2337 	if ((new_mtu < 68) || (new_mtu > 2400))
2338 		return -EINVAL;
2339 	dev->mtu = new_mtu;
2340 	return 0;
2341 }
2342 
2343 static LIST_HEAD(airo_devices);
2344 
add_airo_dev(struct airo_info * ai)2345 static void add_airo_dev(struct airo_info *ai)
2346 {
2347 	/* Upper layers already keep track of PCI devices,
2348 	 * so we only need to remember our non-PCI cards. */
2349 	if (!ai->pci)
2350 		list_add_tail(&ai->dev_list, &airo_devices);
2351 }
2352 
del_airo_dev(struct airo_info * ai)2353 static void del_airo_dev(struct airo_info *ai)
2354 {
2355 	if (!ai->pci)
2356 		list_del(&ai->dev_list);
2357 }
2358 
airo_close(struct net_device * dev)2359 static int airo_close(struct net_device *dev) {
2360 	struct airo_info *ai = dev->ml_priv;
2361 
2362 	netif_stop_queue(dev);
2363 
2364 	if (ai->wifidev != dev) {
2365 #ifdef POWER_ON_DOWN
2366 		/* Shut power to the card. The idea is that the user can save
2367 		 * power when he doesn't need the card with "ifconfig down".
2368 		 * That's the method that is most friendly towards the network
2369 		 * stack (i.e. the network stack won't try to broadcast
2370 		 * anything on the interface and routes are gone. Jean II */
2371 		set_bit(FLAG_RADIO_DOWN, &ai->flags);
2372 		disable_MAC(ai, 1);
2373 #endif
2374 		disable_interrupts( ai );
2375 
2376 		free_irq(dev->irq, dev);
2377 
2378 		set_bit(JOB_DIE, &ai->jobs);
2379 		kthread_stop(ai->airo_thread_task);
2380 	}
2381 	return 0;
2382 }
2383 
stop_airo_card(struct net_device * dev,int freeres)2384 void stop_airo_card( struct net_device *dev, int freeres )
2385 {
2386 	struct airo_info *ai = dev->ml_priv;
2387 
2388 	set_bit(FLAG_RADIO_DOWN, &ai->flags);
2389 	disable_MAC(ai, 1);
2390 	disable_interrupts(ai);
2391 	takedown_proc_entry( dev, ai );
2392 	if (test_bit(FLAG_REGISTERED, &ai->flags)) {
2393 		unregister_netdev( dev );
2394 		if (ai->wifidev) {
2395 			unregister_netdev(ai->wifidev);
2396 			free_netdev(ai->wifidev);
2397 			ai->wifidev = NULL;
2398 		}
2399 		clear_bit(FLAG_REGISTERED, &ai->flags);
2400 	}
2401 	/*
2402 	 * Clean out tx queue
2403 	 */
2404 	if (test_bit(FLAG_MPI, &ai->flags) && !skb_queue_empty(&ai->txq)) {
2405 		struct sk_buff *skb = NULL;
2406 		for (;(skb = skb_dequeue(&ai->txq));)
2407 			dev_kfree_skb(skb);
2408 	}
2409 
2410 	airo_networks_free (ai);
2411 
2412 	kfree(ai->flash);
2413 	kfree(ai->rssi);
2414 	kfree(ai->APList);
2415 	kfree(ai->SSID);
2416 	if (freeres) {
2417 		/* PCMCIA frees this stuff, so only for PCI and ISA */
2418 	        release_region( dev->base_addr, 64 );
2419 		if (test_bit(FLAG_MPI, &ai->flags)) {
2420 			if (ai->pci)
2421 				mpi_unmap_card(ai->pci);
2422 			if (ai->pcimem)
2423 				iounmap(ai->pcimem);
2424 			if (ai->pciaux)
2425 				iounmap(ai->pciaux);
2426 			pci_free_consistent(ai->pci, PCI_SHARED_LEN,
2427 				ai->shared, ai->shared_dma);
2428 		}
2429         }
2430 	crypto_free_cipher(ai->tfm);
2431 	del_airo_dev(ai);
2432 	free_netdev( dev );
2433 }
2434 
2435 EXPORT_SYMBOL(stop_airo_card);
2436 
wll_header_parse(const struct sk_buff * skb,unsigned char * haddr)2437 static int wll_header_parse(const struct sk_buff *skb, unsigned char *haddr)
2438 {
2439 	memcpy(haddr, skb_mac_header(skb) + 10, ETH_ALEN);
2440 	return ETH_ALEN;
2441 }
2442 
mpi_unmap_card(struct pci_dev * pci)2443 static void mpi_unmap_card(struct pci_dev *pci)
2444 {
2445 	unsigned long mem_start = pci_resource_start(pci, 1);
2446 	unsigned long mem_len = pci_resource_len(pci, 1);
2447 	unsigned long aux_start = pci_resource_start(pci, 2);
2448 	unsigned long aux_len = AUXMEMSIZE;
2449 
2450 	release_mem_region(aux_start, aux_len);
2451 	release_mem_region(mem_start, mem_len);
2452 }
2453 
2454 /*************************************************************
2455  *  This routine assumes that descriptors have been setup .
2456  *  Run at insmod time or after reset  when the decriptors
2457  *  have been initialized . Returns 0 if all is well nz
2458  *  otherwise . Does not allocate memory but sets up card
2459  *  using previously allocated descriptors.
2460  */
mpi_init_descriptors(struct airo_info * ai)2461 static int mpi_init_descriptors (struct airo_info *ai)
2462 {
2463 	Cmd cmd;
2464 	Resp rsp;
2465 	int i;
2466 	int rc = SUCCESS;
2467 
2468 	/* Alloc  card RX descriptors */
2469 	netif_stop_queue(ai->dev);
2470 
2471 	memset(&rsp,0,sizeof(rsp));
2472 	memset(&cmd,0,sizeof(cmd));
2473 
2474 	cmd.cmd = CMD_ALLOCATEAUX;
2475 	cmd.parm0 = FID_RX;
2476 	cmd.parm1 = (ai->rxfids[0].card_ram_off - ai->pciaux);
2477 	cmd.parm2 = MPI_MAX_FIDS;
2478 	rc=issuecommand(ai, &cmd, &rsp);
2479 	if (rc != SUCCESS) {
2480 		airo_print_err(ai->dev->name, "Couldn't allocate RX FID");
2481 		return rc;
2482 	}
2483 
2484 	for (i=0; i<MPI_MAX_FIDS; i++) {
2485 		memcpy_toio(ai->rxfids[i].card_ram_off,
2486 			&ai->rxfids[i].rx_desc, sizeof(RxFid));
2487 	}
2488 
2489 	/* Alloc card TX descriptors */
2490 
2491 	memset(&rsp,0,sizeof(rsp));
2492 	memset(&cmd,0,sizeof(cmd));
2493 
2494 	cmd.cmd = CMD_ALLOCATEAUX;
2495 	cmd.parm0 = FID_TX;
2496 	cmd.parm1 = (ai->txfids[0].card_ram_off - ai->pciaux);
2497 	cmd.parm2 = MPI_MAX_FIDS;
2498 
2499 	for (i=0; i<MPI_MAX_FIDS; i++) {
2500 		ai->txfids[i].tx_desc.valid = 1;
2501 		memcpy_toio(ai->txfids[i].card_ram_off,
2502 			&ai->txfids[i].tx_desc, sizeof(TxFid));
2503 	}
2504 	ai->txfids[i-1].tx_desc.eoc = 1; /* Last descriptor has EOC set */
2505 
2506 	rc=issuecommand(ai, &cmd, &rsp);
2507 	if (rc != SUCCESS) {
2508 		airo_print_err(ai->dev->name, "Couldn't allocate TX FID");
2509 		return rc;
2510 	}
2511 
2512 	/* Alloc card Rid descriptor */
2513 	memset(&rsp,0,sizeof(rsp));
2514 	memset(&cmd,0,sizeof(cmd));
2515 
2516 	cmd.cmd = CMD_ALLOCATEAUX;
2517 	cmd.parm0 = RID_RW;
2518 	cmd.parm1 = (ai->config_desc.card_ram_off - ai->pciaux);
2519 	cmd.parm2 = 1; /* Magic number... */
2520 	rc=issuecommand(ai, &cmd, &rsp);
2521 	if (rc != SUCCESS) {
2522 		airo_print_err(ai->dev->name, "Couldn't allocate RID");
2523 		return rc;
2524 	}
2525 
2526 	memcpy_toio(ai->config_desc.card_ram_off,
2527 		&ai->config_desc.rid_desc, sizeof(Rid));
2528 
2529 	return rc;
2530 }
2531 
2532 /*
2533  * We are setting up three things here:
2534  * 1) Map AUX memory for descriptors: Rid, TxFid, or RxFid.
2535  * 2) Map PCI memory for issuing commands.
2536  * 3) Allocate memory (shared) to send and receive ethernet frames.
2537  */
mpi_map_card(struct airo_info * ai,struct pci_dev * pci)2538 static int mpi_map_card(struct airo_info *ai, struct pci_dev *pci)
2539 {
2540 	unsigned long mem_start, mem_len, aux_start, aux_len;
2541 	int rc = -1;
2542 	int i;
2543 	dma_addr_t busaddroff;
2544 	unsigned char *vpackoff;
2545 	unsigned char __iomem *pciaddroff;
2546 
2547 	mem_start = pci_resource_start(pci, 1);
2548 	mem_len = pci_resource_len(pci, 1);
2549 	aux_start = pci_resource_start(pci, 2);
2550 	aux_len = AUXMEMSIZE;
2551 
2552 	if (!request_mem_region(mem_start, mem_len, DRV_NAME)) {
2553 		airo_print_err("", "Couldn't get region %x[%x]",
2554 			(int)mem_start, (int)mem_len);
2555 		goto out;
2556 	}
2557 	if (!request_mem_region(aux_start, aux_len, DRV_NAME)) {
2558 		airo_print_err("", "Couldn't get region %x[%x]",
2559 			(int)aux_start, (int)aux_len);
2560 		goto free_region1;
2561 	}
2562 
2563 	ai->pcimem = ioremap(mem_start, mem_len);
2564 	if (!ai->pcimem) {
2565 		airo_print_err("", "Couldn't map region %x[%x]",
2566 			(int)mem_start, (int)mem_len);
2567 		goto free_region2;
2568 	}
2569 	ai->pciaux = ioremap(aux_start, aux_len);
2570 	if (!ai->pciaux) {
2571 		airo_print_err("", "Couldn't map region %x[%x]",
2572 			(int)aux_start, (int)aux_len);
2573 		goto free_memmap;
2574 	}
2575 
2576 	/* Reserve PKTSIZE for each fid and 2K for the Rids */
2577 	ai->shared = pci_alloc_consistent(pci, PCI_SHARED_LEN, &ai->shared_dma);
2578 	if (!ai->shared) {
2579 		airo_print_err("", "Couldn't alloc_consistent %d",
2580 			PCI_SHARED_LEN);
2581 		goto free_auxmap;
2582 	}
2583 
2584 	/*
2585 	 * Setup descriptor RX, TX, CONFIG
2586 	 */
2587 	busaddroff = ai->shared_dma;
2588 	pciaddroff = ai->pciaux + AUX_OFFSET;
2589 	vpackoff   = ai->shared;
2590 
2591 	/* RX descriptor setup */
2592 	for(i = 0; i < MPI_MAX_FIDS; i++) {
2593 		ai->rxfids[i].pending = 0;
2594 		ai->rxfids[i].card_ram_off = pciaddroff;
2595 		ai->rxfids[i].virtual_host_addr = vpackoff;
2596 		ai->rxfids[i].rx_desc.host_addr = busaddroff;
2597 		ai->rxfids[i].rx_desc.valid = 1;
2598 		ai->rxfids[i].rx_desc.len = PKTSIZE;
2599 		ai->rxfids[i].rx_desc.rdy = 0;
2600 
2601 		pciaddroff += sizeof(RxFid);
2602 		busaddroff += PKTSIZE;
2603 		vpackoff   += PKTSIZE;
2604 	}
2605 
2606 	/* TX descriptor setup */
2607 	for(i = 0; i < MPI_MAX_FIDS; i++) {
2608 		ai->txfids[i].card_ram_off = pciaddroff;
2609 		ai->txfids[i].virtual_host_addr = vpackoff;
2610 		ai->txfids[i].tx_desc.valid = 1;
2611 		ai->txfids[i].tx_desc.host_addr = busaddroff;
2612 		memcpy(ai->txfids[i].virtual_host_addr,
2613 			&wifictlhdr8023, sizeof(wifictlhdr8023));
2614 
2615 		pciaddroff += sizeof(TxFid);
2616 		busaddroff += PKTSIZE;
2617 		vpackoff   += PKTSIZE;
2618 	}
2619 	ai->txfids[i-1].tx_desc.eoc = 1; /* Last descriptor has EOC set */
2620 
2621 	/* Rid descriptor setup */
2622 	ai->config_desc.card_ram_off = pciaddroff;
2623 	ai->config_desc.virtual_host_addr = vpackoff;
2624 	ai->config_desc.rid_desc.host_addr = busaddroff;
2625 	ai->ridbus = busaddroff;
2626 	ai->config_desc.rid_desc.rid = 0;
2627 	ai->config_desc.rid_desc.len = RIDSIZE;
2628 	ai->config_desc.rid_desc.valid = 1;
2629 	pciaddroff += sizeof(Rid);
2630 	busaddroff += RIDSIZE;
2631 	vpackoff   += RIDSIZE;
2632 
2633 	/* Tell card about descriptors */
2634 	if (mpi_init_descriptors (ai) != SUCCESS)
2635 		goto free_shared;
2636 
2637 	return 0;
2638  free_shared:
2639 	pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma);
2640  free_auxmap:
2641 	iounmap(ai->pciaux);
2642  free_memmap:
2643 	iounmap(ai->pcimem);
2644  free_region2:
2645 	release_mem_region(aux_start, aux_len);
2646  free_region1:
2647 	release_mem_region(mem_start, mem_len);
2648  out:
2649 	return rc;
2650 }
2651 
2652 static const struct header_ops airo_header_ops = {
2653 	.parse = wll_header_parse,
2654 };
2655 
2656 static const struct net_device_ops airo11_netdev_ops = {
2657 	.ndo_open 		= airo_open,
2658 	.ndo_stop 		= airo_close,
2659 	.ndo_start_xmit 	= airo_start_xmit11,
2660 	.ndo_get_stats 		= airo_get_stats,
2661 	.ndo_set_mac_address	= airo_set_mac_address,
2662 	.ndo_do_ioctl		= airo_ioctl,
2663 	.ndo_change_mtu		= airo_change_mtu,
2664 };
2665 
wifi_setup(struct net_device * dev)2666 static void wifi_setup(struct net_device *dev)
2667 {
2668 	dev->netdev_ops = &airo11_netdev_ops;
2669 	dev->header_ops = &airo_header_ops;
2670 	dev->wireless_handlers = &airo_handler_def;
2671 
2672 	dev->type               = ARPHRD_IEEE80211;
2673 	dev->hard_header_len    = ETH_HLEN;
2674 	dev->mtu                = AIRO_DEF_MTU;
2675 	dev->addr_len           = ETH_ALEN;
2676 	dev->tx_queue_len       = 100;
2677 
2678 	memset(dev->broadcast,0xFF, ETH_ALEN);
2679 
2680 	dev->flags              = IFF_BROADCAST|IFF_MULTICAST;
2681 }
2682 
init_wifidev(struct airo_info * ai,struct net_device * ethdev)2683 static struct net_device *init_wifidev(struct airo_info *ai,
2684 					struct net_device *ethdev)
2685 {
2686 	int err;
2687 	struct net_device *dev = alloc_netdev(0, "wifi%d", wifi_setup);
2688 	if (!dev)
2689 		return NULL;
2690 	dev->ml_priv = ethdev->ml_priv;
2691 	dev->irq = ethdev->irq;
2692 	dev->base_addr = ethdev->base_addr;
2693 	dev->wireless_data = ethdev->wireless_data;
2694 	SET_NETDEV_DEV(dev, ethdev->dev.parent);
2695 	memcpy(dev->dev_addr, ethdev->dev_addr, dev->addr_len);
2696 	err = register_netdev(dev);
2697 	if (err<0) {
2698 		free_netdev(dev);
2699 		return NULL;
2700 	}
2701 	return dev;
2702 }
2703 
reset_card(struct net_device * dev,int lock)2704 static int reset_card( struct net_device *dev , int lock) {
2705 	struct airo_info *ai = dev->ml_priv;
2706 
2707 	if (lock && down_interruptible(&ai->sem))
2708 		return -1;
2709 	waitbusy (ai);
2710 	OUT4500(ai,COMMAND,CMD_SOFTRESET);
2711 	msleep(200);
2712 	waitbusy (ai);
2713 	msleep(200);
2714 	if (lock)
2715 		up(&ai->sem);
2716 	return 0;
2717 }
2718 
2719 #define AIRO_MAX_NETWORK_COUNT	64
airo_networks_allocate(struct airo_info * ai)2720 static int airo_networks_allocate(struct airo_info *ai)
2721 {
2722 	if (ai->networks)
2723 		return 0;
2724 
2725 	ai->networks = kcalloc(AIRO_MAX_NETWORK_COUNT, sizeof(BSSListElement),
2726 			       GFP_KERNEL);
2727 	if (!ai->networks) {
2728 		airo_print_warn("", "Out of memory allocating beacons");
2729 		return -ENOMEM;
2730 	}
2731 
2732 	return 0;
2733 }
2734 
airo_networks_free(struct airo_info * ai)2735 static void airo_networks_free(struct airo_info *ai)
2736 {
2737 	kfree(ai->networks);
2738 	ai->networks = NULL;
2739 }
2740 
airo_networks_initialize(struct airo_info * ai)2741 static void airo_networks_initialize(struct airo_info *ai)
2742 {
2743 	int i;
2744 
2745 	INIT_LIST_HEAD(&ai->network_free_list);
2746 	INIT_LIST_HEAD(&ai->network_list);
2747 	for (i = 0; i < AIRO_MAX_NETWORK_COUNT; i++)
2748 		list_add_tail(&ai->networks[i].list,
2749 			      &ai->network_free_list);
2750 }
2751 
2752 static const struct net_device_ops airo_netdev_ops = {
2753 	.ndo_open		= airo_open,
2754 	.ndo_stop		= airo_close,
2755 	.ndo_start_xmit		= airo_start_xmit,
2756 	.ndo_get_stats		= airo_get_stats,
2757 	.ndo_set_rx_mode	= airo_set_multicast_list,
2758 	.ndo_set_mac_address	= airo_set_mac_address,
2759 	.ndo_do_ioctl		= airo_ioctl,
2760 	.ndo_change_mtu		= airo_change_mtu,
2761 	.ndo_validate_addr	= eth_validate_addr,
2762 };
2763 
2764 static const struct net_device_ops mpi_netdev_ops = {
2765 	.ndo_open		= airo_open,
2766 	.ndo_stop		= airo_close,
2767 	.ndo_start_xmit		= mpi_start_xmit,
2768 	.ndo_get_stats		= airo_get_stats,
2769 	.ndo_set_rx_mode	= airo_set_multicast_list,
2770 	.ndo_set_mac_address	= airo_set_mac_address,
2771 	.ndo_do_ioctl		= airo_ioctl,
2772 	.ndo_change_mtu		= airo_change_mtu,
2773 	.ndo_validate_addr	= eth_validate_addr,
2774 };
2775 
2776 
_init_airo_card(unsigned short irq,int port,int is_pcmcia,struct pci_dev * pci,struct device * dmdev)2777 static struct net_device *_init_airo_card( unsigned short irq, int port,
2778 					   int is_pcmcia, struct pci_dev *pci,
2779 					   struct device *dmdev )
2780 {
2781 	struct net_device *dev;
2782 	struct airo_info *ai;
2783 	int i, rc;
2784 	CapabilityRid cap_rid;
2785 
2786 	/* Create the network device object. */
2787 	dev = alloc_netdev(sizeof(*ai), "", ether_setup);
2788 	if (!dev) {
2789 		airo_print_err("", "Couldn't alloc_etherdev");
2790 		return NULL;
2791 	}
2792 
2793 	ai = dev->ml_priv = netdev_priv(dev);
2794 	ai->wifidev = NULL;
2795 	ai->flags = 1 << FLAG_RADIO_DOWN;
2796 	ai->jobs = 0;
2797 	ai->dev = dev;
2798 	if (pci && (pci->device == 0x5000 || pci->device == 0xa504)) {
2799 		airo_print_dbg("", "Found an MPI350 card");
2800 		set_bit(FLAG_MPI, &ai->flags);
2801 	}
2802 	spin_lock_init(&ai->aux_lock);
2803 	sema_init(&ai->sem, 1);
2804 	ai->config.len = 0;
2805 	ai->pci = pci;
2806 	init_waitqueue_head (&ai->thr_wait);
2807 	ai->tfm = NULL;
2808 	add_airo_dev(ai);
2809 
2810 	if (airo_networks_allocate (ai))
2811 		goto err_out_free;
2812 	airo_networks_initialize (ai);
2813 
2814 	skb_queue_head_init (&ai->txq);
2815 
2816 	/* The Airo-specific entries in the device structure. */
2817 	if (test_bit(FLAG_MPI,&ai->flags))
2818 		dev->netdev_ops = &mpi_netdev_ops;
2819 	else
2820 		dev->netdev_ops = &airo_netdev_ops;
2821 	dev->wireless_handlers = &airo_handler_def;
2822 	ai->wireless_data.spy_data = &ai->spy_data;
2823 	dev->wireless_data = &ai->wireless_data;
2824 	dev->irq = irq;
2825 	dev->base_addr = port;
2826 	dev->priv_flags &= ~IFF_TX_SKB_SHARING;
2827 
2828 	SET_NETDEV_DEV(dev, dmdev);
2829 
2830 	reset_card (dev, 1);
2831 	msleep(400);
2832 
2833 	if (!is_pcmcia) {
2834 		if (!request_region(dev->base_addr, 64, DRV_NAME)) {
2835 			rc = -EBUSY;
2836 			airo_print_err(dev->name, "Couldn't request region");
2837 			goto err_out_nets;
2838 		}
2839 	}
2840 
2841 	if (test_bit(FLAG_MPI,&ai->flags)) {
2842 		if (mpi_map_card(ai, pci)) {
2843 			airo_print_err("", "Could not map memory");
2844 			goto err_out_res;
2845 		}
2846 	}
2847 
2848 	if (probe) {
2849 		if (setup_card(ai, dev->dev_addr, 1) != SUCCESS) {
2850 			airo_print_err(dev->name, "MAC could not be enabled" );
2851 			rc = -EIO;
2852 			goto err_out_map;
2853 		}
2854 	} else if (!test_bit(FLAG_MPI,&ai->flags)) {
2855 		ai->bap_read = fast_bap_read;
2856 		set_bit(FLAG_FLASHING, &ai->flags);
2857 	}
2858 
2859 	strcpy(dev->name, "eth%d");
2860 	rc = register_netdev(dev);
2861 	if (rc) {
2862 		airo_print_err(dev->name, "Couldn't register_netdev");
2863 		goto err_out_map;
2864 	}
2865 	ai->wifidev = init_wifidev(ai, dev);
2866 	if (!ai->wifidev)
2867 		goto err_out_reg;
2868 
2869 	rc = readCapabilityRid(ai, &cap_rid, 1);
2870 	if (rc != SUCCESS) {
2871 		rc = -EIO;
2872 		goto err_out_wifi;
2873 	}
2874 	/* WEP capability discovery */
2875 	ai->wep_capable = (cap_rid.softCap & cpu_to_le16(0x02)) ? 1 : 0;
2876 	ai->max_wep_idx = (cap_rid.softCap & cpu_to_le16(0x80)) ? 3 : 0;
2877 
2878 	airo_print_info(dev->name, "Firmware version %x.%x.%02d",
2879 	                ((le16_to_cpu(cap_rid.softVer) >> 8) & 0xF),
2880 	                (le16_to_cpu(cap_rid.softVer) & 0xFF),
2881 	                le16_to_cpu(cap_rid.softSubVer));
2882 
2883 	/* Test for WPA support */
2884 	/* Only firmware versions 5.30.17 or better can do WPA */
2885 	if (le16_to_cpu(cap_rid.softVer) > 0x530
2886 	 || (le16_to_cpu(cap_rid.softVer) == 0x530
2887 	      && le16_to_cpu(cap_rid.softSubVer) >= 17)) {
2888 		airo_print_info(ai->dev->name, "WPA supported.");
2889 
2890 		set_bit(FLAG_WPA_CAPABLE, &ai->flags);
2891 		ai->bssListFirst = RID_WPA_BSSLISTFIRST;
2892 		ai->bssListNext = RID_WPA_BSSLISTNEXT;
2893 		ai->bssListRidLen = sizeof(BSSListRid);
2894 	} else {
2895 		airo_print_info(ai->dev->name, "WPA unsupported with firmware "
2896 			"versions older than 5.30.17.");
2897 
2898 		ai->bssListFirst = RID_BSSLISTFIRST;
2899 		ai->bssListNext = RID_BSSLISTNEXT;
2900 		ai->bssListRidLen = sizeof(BSSListRid) - sizeof(BSSListRidExtra);
2901 	}
2902 
2903 	set_bit(FLAG_REGISTERED,&ai->flags);
2904 	airo_print_info(dev->name, "MAC enabled %pM", dev->dev_addr);
2905 
2906 	/* Allocate the transmit buffers */
2907 	if (probe && !test_bit(FLAG_MPI,&ai->flags))
2908 		for( i = 0; i < MAX_FIDS; i++ )
2909 			ai->fids[i] = transmit_allocate(ai,AIRO_DEF_MTU,i>=MAX_FIDS/2);
2910 
2911 	if (setup_proc_entry(dev, dev->ml_priv) < 0)
2912 		goto err_out_wifi;
2913 
2914 	return dev;
2915 
2916 err_out_wifi:
2917 	unregister_netdev(ai->wifidev);
2918 	free_netdev(ai->wifidev);
2919 err_out_reg:
2920 	unregister_netdev(dev);
2921 err_out_map:
2922 	if (test_bit(FLAG_MPI,&ai->flags) && pci) {
2923 		pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma);
2924 		iounmap(ai->pciaux);
2925 		iounmap(ai->pcimem);
2926 		mpi_unmap_card(ai->pci);
2927 	}
2928 err_out_res:
2929 	if (!is_pcmcia)
2930 	        release_region( dev->base_addr, 64 );
2931 err_out_nets:
2932 	airo_networks_free(ai);
2933 err_out_free:
2934 	del_airo_dev(ai);
2935 	free_netdev(dev);
2936 	return NULL;
2937 }
2938 
init_airo_card(unsigned short irq,int port,int is_pcmcia,struct device * dmdev)2939 struct net_device *init_airo_card( unsigned short irq, int port, int is_pcmcia,
2940 				  struct device *dmdev)
2941 {
2942 	return _init_airo_card ( irq, port, is_pcmcia, NULL, dmdev);
2943 }
2944 
2945 EXPORT_SYMBOL(init_airo_card);
2946 
waitbusy(struct airo_info * ai)2947 static int waitbusy (struct airo_info *ai) {
2948 	int delay = 0;
2949 	while ((IN4500(ai, COMMAND) & COMMAND_BUSY) && (delay < 10000)) {
2950 		udelay (10);
2951 		if ((++delay % 20) == 0)
2952 			OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
2953 	}
2954 	return delay < 10000;
2955 }
2956 
reset_airo_card(struct net_device * dev)2957 int reset_airo_card( struct net_device *dev )
2958 {
2959 	int i;
2960 	struct airo_info *ai = dev->ml_priv;
2961 
2962 	if (reset_card (dev, 1))
2963 		return -1;
2964 
2965 	if ( setup_card(ai, dev->dev_addr, 1 ) != SUCCESS ) {
2966 		airo_print_err(dev->name, "MAC could not be enabled");
2967 		return -1;
2968 	}
2969 	airo_print_info(dev->name, "MAC enabled %pM", dev->dev_addr);
2970 	/* Allocate the transmit buffers if needed */
2971 	if (!test_bit(FLAG_MPI,&ai->flags))
2972 		for( i = 0; i < MAX_FIDS; i++ )
2973 			ai->fids[i] = transmit_allocate (ai,AIRO_DEF_MTU,i>=MAX_FIDS/2);
2974 
2975 	enable_interrupts( ai );
2976 	netif_wake_queue(dev);
2977 	return 0;
2978 }
2979 
2980 EXPORT_SYMBOL(reset_airo_card);
2981 
airo_send_event(struct net_device * dev)2982 static void airo_send_event(struct net_device *dev) {
2983 	struct airo_info *ai = dev->ml_priv;
2984 	union iwreq_data wrqu;
2985 	StatusRid status_rid;
2986 
2987 	clear_bit(JOB_EVENT, &ai->jobs);
2988 	PC4500_readrid(ai, RID_STATUS, &status_rid, sizeof(status_rid), 0);
2989 	up(&ai->sem);
2990 	wrqu.data.length = 0;
2991 	wrqu.data.flags = 0;
2992 	memcpy(wrqu.ap_addr.sa_data, status_rid.bssid[0], ETH_ALEN);
2993 	wrqu.ap_addr.sa_family = ARPHRD_ETHER;
2994 
2995 	/* Send event to user space */
2996 	wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
2997 }
2998 
airo_process_scan_results(struct airo_info * ai)2999 static void airo_process_scan_results (struct airo_info *ai) {
3000 	union iwreq_data	wrqu;
3001 	BSSListRid bss;
3002 	int rc;
3003 	BSSListElement * loop_net;
3004 	BSSListElement * tmp_net;
3005 
3006 	/* Blow away current list of scan results */
3007 	list_for_each_entry_safe (loop_net, tmp_net, &ai->network_list, list) {
3008 		list_move_tail (&loop_net->list, &ai->network_free_list);
3009 		/* Don't blow away ->list, just BSS data */
3010 		memset (loop_net, 0, sizeof (loop_net->bss));
3011 	}
3012 
3013 	/* Try to read the first entry of the scan result */
3014 	rc = PC4500_readrid(ai, ai->bssListFirst, &bss, ai->bssListRidLen, 0);
3015 	if((rc) || (bss.index == cpu_to_le16(0xffff))) {
3016 		/* No scan results */
3017 		goto out;
3018 	}
3019 
3020 	/* Read and parse all entries */
3021 	tmp_net = NULL;
3022 	while((!rc) && (bss.index != cpu_to_le16(0xffff))) {
3023 		/* Grab a network off the free list */
3024 		if (!list_empty(&ai->network_free_list)) {
3025 			tmp_net = list_entry(ai->network_free_list.next,
3026 					    BSSListElement, list);
3027 			list_del(ai->network_free_list.next);
3028 		}
3029 
3030 		if (tmp_net != NULL) {
3031 			memcpy(tmp_net, &bss, sizeof(tmp_net->bss));
3032 			list_add_tail(&tmp_net->list, &ai->network_list);
3033 			tmp_net = NULL;
3034 		}
3035 
3036 		/* Read next entry */
3037 		rc = PC4500_readrid(ai, ai->bssListNext,
3038 				    &bss, ai->bssListRidLen, 0);
3039 	}
3040 
3041 out:
3042 	ai->scan_timeout = 0;
3043 	clear_bit(JOB_SCAN_RESULTS, &ai->jobs);
3044 	up(&ai->sem);
3045 
3046 	/* Send an empty event to user space.
3047 	 * We don't send the received data on
3048 	 * the event because it would require
3049 	 * us to do complex transcoding, and
3050 	 * we want to minimise the work done in
3051 	 * the irq handler. Use a request to
3052 	 * extract the data - Jean II */
3053 	wrqu.data.length = 0;
3054 	wrqu.data.flags = 0;
3055 	wireless_send_event(ai->dev, SIOCGIWSCAN, &wrqu, NULL);
3056 }
3057 
airo_thread(void * data)3058 static int airo_thread(void *data) {
3059 	struct net_device *dev = data;
3060 	struct airo_info *ai = dev->ml_priv;
3061 	int locked;
3062 
3063 	set_freezable();
3064 	while(1) {
3065 		/* make swsusp happy with our thread */
3066 		try_to_freeze();
3067 
3068 		if (test_bit(JOB_DIE, &ai->jobs))
3069 			break;
3070 
3071 		if (ai->jobs) {
3072 			locked = down_interruptible(&ai->sem);
3073 		} else {
3074 			wait_queue_t wait;
3075 
3076 			init_waitqueue_entry(&wait, current);
3077 			add_wait_queue(&ai->thr_wait, &wait);
3078 			for (;;) {
3079 				set_current_state(TASK_INTERRUPTIBLE);
3080 				if (ai->jobs)
3081 					break;
3082 				if (ai->expires || ai->scan_timeout) {
3083 					if (ai->scan_timeout &&
3084 							time_after_eq(jiffies,ai->scan_timeout)){
3085 						set_bit(JOB_SCAN_RESULTS, &ai->jobs);
3086 						break;
3087 					} else if (ai->expires &&
3088 							time_after_eq(jiffies,ai->expires)){
3089 						set_bit(JOB_AUTOWEP, &ai->jobs);
3090 						break;
3091 					}
3092 					if (!kthread_should_stop() &&
3093 					    !freezing(current)) {
3094 						unsigned long wake_at;
3095 						if (!ai->expires || !ai->scan_timeout) {
3096 							wake_at = max(ai->expires,
3097 								ai->scan_timeout);
3098 						} else {
3099 							wake_at = min(ai->expires,
3100 								ai->scan_timeout);
3101 						}
3102 						schedule_timeout(wake_at - jiffies);
3103 						continue;
3104 					}
3105 				} else if (!kthread_should_stop() &&
3106 					   !freezing(current)) {
3107 					schedule();
3108 					continue;
3109 				}
3110 				break;
3111 			}
3112 			current->state = TASK_RUNNING;
3113 			remove_wait_queue(&ai->thr_wait, &wait);
3114 			locked = 1;
3115 		}
3116 
3117 		if (locked)
3118 			continue;
3119 
3120 		if (test_bit(JOB_DIE, &ai->jobs)) {
3121 			up(&ai->sem);
3122 			break;
3123 		}
3124 
3125 		if (ai->power.event || test_bit(FLAG_FLASHING, &ai->flags)) {
3126 			up(&ai->sem);
3127 			continue;
3128 		}
3129 
3130 		if (test_bit(JOB_XMIT, &ai->jobs))
3131 			airo_end_xmit(dev);
3132 		else if (test_bit(JOB_XMIT11, &ai->jobs))
3133 			airo_end_xmit11(dev);
3134 		else if (test_bit(JOB_STATS, &ai->jobs))
3135 			airo_read_stats(dev);
3136 		else if (test_bit(JOB_WSTATS, &ai->jobs))
3137 			airo_read_wireless_stats(ai);
3138 		else if (test_bit(JOB_PROMISC, &ai->jobs))
3139 			airo_set_promisc(ai);
3140 		else if (test_bit(JOB_MIC, &ai->jobs))
3141 			micinit(ai);
3142 		else if (test_bit(JOB_EVENT, &ai->jobs))
3143 			airo_send_event(dev);
3144 		else if (test_bit(JOB_AUTOWEP, &ai->jobs))
3145 			timer_func(dev);
3146 		else if (test_bit(JOB_SCAN_RESULTS, &ai->jobs))
3147 			airo_process_scan_results(ai);
3148 		else  /* Shouldn't get here, but we make sure to unlock */
3149 			up(&ai->sem);
3150 	}
3151 
3152 	return 0;
3153 }
3154 
header_len(__le16 ctl)3155 static int header_len(__le16 ctl)
3156 {
3157 	u16 fc = le16_to_cpu(ctl);
3158 	switch (fc & 0xc) {
3159 	case 4:
3160 		if ((fc & 0xe0) == 0xc0)
3161 			return 10;	/* one-address control packet */
3162 		return 16;	/* two-address control packet */
3163 	case 8:
3164 		if ((fc & 0x300) == 0x300)
3165 			return 30;	/* WDS packet */
3166 	}
3167 	return 24;
3168 }
3169 
airo_handle_cisco_mic(struct airo_info * ai)3170 static void airo_handle_cisco_mic(struct airo_info *ai)
3171 {
3172 	if (test_bit(FLAG_MIC_CAPABLE, &ai->flags)) {
3173 		set_bit(JOB_MIC, &ai->jobs);
3174 		wake_up_interruptible(&ai->thr_wait);
3175 	}
3176 }
3177 
3178 /* Airo Status codes */
3179 #define STAT_NOBEACON	0x8000 /* Loss of sync - missed beacons */
3180 #define STAT_MAXRETRIES	0x8001 /* Loss of sync - max retries */
3181 #define STAT_MAXARL	0x8002 /* Loss of sync - average retry level exceeded*/
3182 #define STAT_FORCELOSS	0x8003 /* Loss of sync - host request */
3183 #define STAT_TSFSYNC	0x8004 /* Loss of sync - TSF synchronization */
3184 #define STAT_DEAUTH	0x8100 /* low byte is 802.11 reason code */
3185 #define STAT_DISASSOC	0x8200 /* low byte is 802.11 reason code */
3186 #define STAT_ASSOC_FAIL	0x8400 /* low byte is 802.11 reason code */
3187 #define STAT_AUTH_FAIL	0x0300 /* low byte is 802.11 reason code */
3188 #define STAT_ASSOC	0x0400 /* Associated */
3189 #define STAT_REASSOC    0x0600 /* Reassociated?  Only on firmware >= 5.30.17 */
3190 
airo_print_status(const char * devname,u16 status)3191 static void airo_print_status(const char *devname, u16 status)
3192 {
3193 	u8 reason = status & 0xFF;
3194 
3195 	switch (status & 0xFF00) {
3196 	case STAT_NOBEACON:
3197 		switch (status) {
3198 		case STAT_NOBEACON:
3199 			airo_print_dbg(devname, "link lost (missed beacons)");
3200 			break;
3201 		case STAT_MAXRETRIES:
3202 		case STAT_MAXARL:
3203 			airo_print_dbg(devname, "link lost (max retries)");
3204 			break;
3205 		case STAT_FORCELOSS:
3206 			airo_print_dbg(devname, "link lost (local choice)");
3207 			break;
3208 		case STAT_TSFSYNC:
3209 			airo_print_dbg(devname, "link lost (TSF sync lost)");
3210 			break;
3211 		default:
3212 			airo_print_dbg(devname, "unknow status %x\n", status);
3213 			break;
3214 		}
3215 		break;
3216 	case STAT_DEAUTH:
3217 		airo_print_dbg(devname, "deauthenticated (reason: %d)", reason);
3218 		break;
3219 	case STAT_DISASSOC:
3220 		airo_print_dbg(devname, "disassociated (reason: %d)", reason);
3221 		break;
3222 	case STAT_ASSOC_FAIL:
3223 		airo_print_dbg(devname, "association failed (reason: %d)",
3224 			       reason);
3225 		break;
3226 	case STAT_AUTH_FAIL:
3227 		airo_print_dbg(devname, "authentication failed (reason: %d)",
3228 			       reason);
3229 		break;
3230 	case STAT_ASSOC:
3231 	case STAT_REASSOC:
3232 		break;
3233 	default:
3234 		airo_print_dbg(devname, "unknow status %x\n", status);
3235 		break;
3236 	}
3237 }
3238 
airo_handle_link(struct airo_info * ai)3239 static void airo_handle_link(struct airo_info *ai)
3240 {
3241 	union iwreq_data wrqu;
3242 	int scan_forceloss = 0;
3243 	u16 status;
3244 
3245 	/* Get new status and acknowledge the link change */
3246 	status = le16_to_cpu(IN4500(ai, LINKSTAT));
3247 	OUT4500(ai, EVACK, EV_LINK);
3248 
3249 	if ((status == STAT_FORCELOSS) && (ai->scan_timeout > 0))
3250 		scan_forceloss = 1;
3251 
3252 	airo_print_status(ai->dev->name, status);
3253 
3254 	if ((status == STAT_ASSOC) || (status == STAT_REASSOC)) {
3255 		if (auto_wep)
3256 			ai->expires = 0;
3257 		if (ai->list_bss_task)
3258 			wake_up_process(ai->list_bss_task);
3259 		set_bit(FLAG_UPDATE_UNI, &ai->flags);
3260 		set_bit(FLAG_UPDATE_MULTI, &ai->flags);
3261 
3262 		if (down_trylock(&ai->sem) != 0) {
3263 			set_bit(JOB_EVENT, &ai->jobs);
3264 			wake_up_interruptible(&ai->thr_wait);
3265 		} else
3266 			airo_send_event(ai->dev);
3267 	} else if (!scan_forceloss) {
3268 		if (auto_wep && !ai->expires) {
3269 			ai->expires = RUN_AT(3*HZ);
3270 			wake_up_interruptible(&ai->thr_wait);
3271 		}
3272 
3273 		/* Send event to user space */
3274 		memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN);
3275 		wrqu.ap_addr.sa_family = ARPHRD_ETHER;
3276 		wireless_send_event(ai->dev, SIOCGIWAP, &wrqu, NULL);
3277 	}
3278 }
3279 
airo_handle_rx(struct airo_info * ai)3280 static void airo_handle_rx(struct airo_info *ai)
3281 {
3282 	struct sk_buff *skb = NULL;
3283 	__le16 fc, v, *buffer, tmpbuf[4];
3284 	u16 len, hdrlen = 0, gap, fid;
3285 	struct rx_hdr hdr;
3286 	int success = 0;
3287 
3288 	if (test_bit(FLAG_MPI, &ai->flags)) {
3289 		if (test_bit(FLAG_802_11, &ai->flags))
3290 			mpi_receive_802_11(ai);
3291 		else
3292 			mpi_receive_802_3(ai);
3293 		OUT4500(ai, EVACK, EV_RX);
3294 		return;
3295 	}
3296 
3297 	fid = IN4500(ai, RXFID);
3298 
3299 	/* Get the packet length */
3300 	if (test_bit(FLAG_802_11, &ai->flags)) {
3301 		bap_setup (ai, fid, 4, BAP0);
3302 		bap_read (ai, (__le16*)&hdr, sizeof(hdr), BAP0);
3303 		/* Bad CRC. Ignore packet */
3304 		if (le16_to_cpu(hdr.status) & 2)
3305 			hdr.len = 0;
3306 		if (ai->wifidev == NULL)
3307 			hdr.len = 0;
3308 	} else {
3309 		bap_setup(ai, fid, 0x36, BAP0);
3310 		bap_read(ai, &hdr.len, 2, BAP0);
3311 	}
3312 	len = le16_to_cpu(hdr.len);
3313 
3314 	if (len > AIRO_DEF_MTU) {
3315 		airo_print_err(ai->dev->name, "Bad size %d", len);
3316 		goto done;
3317 	}
3318 	if (len == 0)
3319 		goto done;
3320 
3321 	if (test_bit(FLAG_802_11, &ai->flags)) {
3322 		bap_read(ai, &fc, sizeof (fc), BAP0);
3323 		hdrlen = header_len(fc);
3324 	} else
3325 		hdrlen = ETH_ALEN * 2;
3326 
3327 	skb = dev_alloc_skb(len + hdrlen + 2 + 2);
3328 	if (!skb) {
3329 		ai->dev->stats.rx_dropped++;
3330 		goto done;
3331 	}
3332 
3333 	skb_reserve(skb, 2); /* This way the IP header is aligned */
3334 	buffer = (__le16 *) skb_put(skb, len + hdrlen);
3335 	if (test_bit(FLAG_802_11, &ai->flags)) {
3336 		buffer[0] = fc;
3337 		bap_read(ai, buffer + 1, hdrlen - 2, BAP0);
3338 		if (hdrlen == 24)
3339 			bap_read(ai, tmpbuf, 6, BAP0);
3340 
3341 		bap_read(ai, &v, sizeof(v), BAP0);
3342 		gap = le16_to_cpu(v);
3343 		if (gap) {
3344 			if (gap <= 8) {
3345 				bap_read(ai, tmpbuf, gap, BAP0);
3346 			} else {
3347 				airo_print_err(ai->dev->name, "gaplen too "
3348 					"big. Problems will follow...");
3349 			}
3350 		}
3351 		bap_read(ai, buffer + hdrlen/2, len, BAP0);
3352 	} else {
3353 		MICBuffer micbuf;
3354 
3355 		bap_read(ai, buffer, ETH_ALEN * 2, BAP0);
3356 		if (ai->micstats.enabled) {
3357 			bap_read(ai, (__le16 *) &micbuf, sizeof (micbuf), BAP0);
3358 			if (ntohs(micbuf.typelen) > 0x05DC)
3359 				bap_setup(ai, fid, 0x44, BAP0);
3360 			else {
3361 				if (len <= sizeof (micbuf)) {
3362 					dev_kfree_skb_irq(skb);
3363 					goto done;
3364 				}
3365 
3366 				len -= sizeof(micbuf);
3367 				skb_trim(skb, len + hdrlen);
3368 			}
3369 		}
3370 
3371 		bap_read(ai, buffer + ETH_ALEN, len, BAP0);
3372 		if (decapsulate(ai, &micbuf, (etherHead*) buffer, len))
3373 			dev_kfree_skb_irq (skb);
3374 		else
3375 			success = 1;
3376 	}
3377 
3378 #ifdef WIRELESS_SPY
3379 	if (success && (ai->spy_data.spy_number > 0)) {
3380 		char *sa;
3381 		struct iw_quality wstats;
3382 
3383 		/* Prepare spy data : addr + qual */
3384 		if (!test_bit(FLAG_802_11, &ai->flags)) {
3385 			sa = (char *) buffer + 6;
3386 			bap_setup(ai, fid, 8, BAP0);
3387 			bap_read(ai, (__le16 *) hdr.rssi, 2, BAP0);
3388 		} else
3389 			sa = (char *) buffer + 10;
3390 		wstats.qual = hdr.rssi[0];
3391 		if (ai->rssi)
3392 			wstats.level = 0x100 - ai->rssi[hdr.rssi[1]].rssidBm;
3393 		else
3394 			wstats.level = (hdr.rssi[1] + 321) / 2;
3395 		wstats.noise = ai->wstats.qual.noise;
3396 		wstats.updated =  IW_QUAL_LEVEL_UPDATED
3397 				| IW_QUAL_QUAL_UPDATED
3398 				| IW_QUAL_DBM;
3399 		/* Update spy records */
3400 		wireless_spy_update(ai->dev, sa, &wstats);
3401 	}
3402 #endif /* WIRELESS_SPY */
3403 
3404 done:
3405 	OUT4500(ai, EVACK, EV_RX);
3406 
3407 	if (success) {
3408 		if (test_bit(FLAG_802_11, &ai->flags)) {
3409 			skb_reset_mac_header(skb);
3410 			skb->pkt_type = PACKET_OTHERHOST;
3411 			skb->dev = ai->wifidev;
3412 			skb->protocol = htons(ETH_P_802_2);
3413 		} else
3414 			skb->protocol = eth_type_trans(skb, ai->dev);
3415 		skb->ip_summed = CHECKSUM_NONE;
3416 
3417 		netif_rx(skb);
3418 	}
3419 }
3420 
airo_handle_tx(struct airo_info * ai,u16 status)3421 static void airo_handle_tx(struct airo_info *ai, u16 status)
3422 {
3423 	int i, len = 0, index = -1;
3424 	u16 fid;
3425 
3426 	if (test_bit(FLAG_MPI, &ai->flags)) {
3427 		unsigned long flags;
3428 
3429 		if (status & EV_TXEXC)
3430 			get_tx_error(ai, -1);
3431 
3432 		spin_lock_irqsave(&ai->aux_lock, flags);
3433 		if (!skb_queue_empty(&ai->txq)) {
3434 			spin_unlock_irqrestore(&ai->aux_lock,flags);
3435 			mpi_send_packet(ai->dev);
3436 		} else {
3437 			clear_bit(FLAG_PENDING_XMIT, &ai->flags);
3438 			spin_unlock_irqrestore(&ai->aux_lock,flags);
3439 			netif_wake_queue(ai->dev);
3440 		}
3441 		OUT4500(ai, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC));
3442 		return;
3443 	}
3444 
3445 	fid = IN4500(ai, TXCOMPLFID);
3446 
3447 	for(i = 0; i < MAX_FIDS; i++) {
3448 		if ((ai->fids[i] & 0xffff) == fid) {
3449 			len = ai->fids[i] >> 16;
3450 			index = i;
3451 		}
3452 	}
3453 
3454 	if (index != -1) {
3455 		if (status & EV_TXEXC)
3456 			get_tx_error(ai, index);
3457 
3458 		OUT4500(ai, EVACK, status & (EV_TX | EV_TXEXC));
3459 
3460 		/* Set up to be used again */
3461 		ai->fids[index] &= 0xffff;
3462 		if (index < MAX_FIDS / 2) {
3463 			if (!test_bit(FLAG_PENDING_XMIT, &ai->flags))
3464 				netif_wake_queue(ai->dev);
3465 		} else {
3466 			if (!test_bit(FLAG_PENDING_XMIT11, &ai->flags))
3467 				netif_wake_queue(ai->wifidev);
3468 		}
3469 	} else {
3470 		OUT4500(ai, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC));
3471 		airo_print_err(ai->dev->name, "Unallocated FID was used to xmit");
3472 	}
3473 }
3474 
airo_interrupt(int irq,void * dev_id)3475 static irqreturn_t airo_interrupt(int irq, void *dev_id)
3476 {
3477 	struct net_device *dev = dev_id;
3478 	u16 status, savedInterrupts = 0;
3479 	struct airo_info *ai = dev->ml_priv;
3480 	int handled = 0;
3481 
3482 	if (!netif_device_present(dev))
3483 		return IRQ_NONE;
3484 
3485 	for (;;) {
3486 		status = IN4500(ai, EVSTAT);
3487 		if (!(status & STATUS_INTS) || (status == 0xffff))
3488 			break;
3489 
3490 		handled = 1;
3491 
3492 		if (status & EV_AWAKE) {
3493 			OUT4500(ai, EVACK, EV_AWAKE);
3494 			OUT4500(ai, EVACK, EV_AWAKE);
3495 		}
3496 
3497 		if (!savedInterrupts) {
3498 			savedInterrupts = IN4500(ai, EVINTEN);
3499 			OUT4500(ai, EVINTEN, 0);
3500 		}
3501 
3502 		if (status & EV_MIC) {
3503 			OUT4500(ai, EVACK, EV_MIC);
3504 			airo_handle_cisco_mic(ai);
3505 		}
3506 
3507 		if (status & EV_LINK) {
3508 			/* Link status changed */
3509 			airo_handle_link(ai);
3510 		}
3511 
3512 		/* Check to see if there is something to receive */
3513 		if (status & EV_RX)
3514 			airo_handle_rx(ai);
3515 
3516 		/* Check to see if a packet has been transmitted */
3517 		if (status & (EV_TX | EV_TXCPY | EV_TXEXC))
3518 			airo_handle_tx(ai, status);
3519 
3520 		if ( status & ~STATUS_INTS & ~IGNORE_INTS ) {
3521 			airo_print_warn(ai->dev->name, "Got weird status %x",
3522 				status & ~STATUS_INTS & ~IGNORE_INTS );
3523 		}
3524 	}
3525 
3526 	if (savedInterrupts)
3527 		OUT4500(ai, EVINTEN, savedInterrupts);
3528 
3529 	return IRQ_RETVAL(handled);
3530 }
3531 
3532 /*
3533  *  Routines to talk to the card
3534  */
3535 
3536 /*
3537  *  This was originally written for the 4500, hence the name
3538  *  NOTE:  If use with 8bit mode and SMP bad things will happen!
3539  *         Why would some one do 8 bit IO in an SMP machine?!?
3540  */
OUT4500(struct airo_info * ai,u16 reg,u16 val)3541 static void OUT4500( struct airo_info *ai, u16 reg, u16 val ) {
3542 	if (test_bit(FLAG_MPI,&ai->flags))
3543 		reg <<= 1;
3544 	if ( !do8bitIO )
3545 		outw( val, ai->dev->base_addr + reg );
3546 	else {
3547 		outb( val & 0xff, ai->dev->base_addr + reg );
3548 		outb( val >> 8, ai->dev->base_addr + reg + 1 );
3549 	}
3550 }
3551 
IN4500(struct airo_info * ai,u16 reg)3552 static u16 IN4500( struct airo_info *ai, u16 reg ) {
3553 	unsigned short rc;
3554 
3555 	if (test_bit(FLAG_MPI,&ai->flags))
3556 		reg <<= 1;
3557 	if ( !do8bitIO )
3558 		rc = inw( ai->dev->base_addr + reg );
3559 	else {
3560 		rc = inb( ai->dev->base_addr + reg );
3561 		rc += ((int)inb( ai->dev->base_addr + reg + 1 )) << 8;
3562 	}
3563 	return rc;
3564 }
3565 
enable_MAC(struct airo_info * ai,int lock)3566 static int enable_MAC(struct airo_info *ai, int lock)
3567 {
3568 	int rc;
3569 	Cmd cmd;
3570 	Resp rsp;
3571 
3572 	/* FLAG_RADIO_OFF : Radio disabled via /proc or Wireless Extensions
3573 	 * FLAG_RADIO_DOWN : Radio disabled via "ifconfig ethX down"
3574 	 * Note : we could try to use !netif_running(dev) in enable_MAC()
3575 	 * instead of this flag, but I don't trust it *within* the
3576 	 * open/close functions, and testing both flags together is
3577 	 * "cheaper" - Jean II */
3578 	if (ai->flags & FLAG_RADIO_MASK) return SUCCESS;
3579 
3580 	if (lock && down_interruptible(&ai->sem))
3581 		return -ERESTARTSYS;
3582 
3583 	if (!test_bit(FLAG_ENABLED, &ai->flags)) {
3584 		memset(&cmd, 0, sizeof(cmd));
3585 		cmd.cmd = MAC_ENABLE;
3586 		rc = issuecommand(ai, &cmd, &rsp);
3587 		if (rc == SUCCESS)
3588 			set_bit(FLAG_ENABLED, &ai->flags);
3589 	} else
3590 		rc = SUCCESS;
3591 
3592 	if (lock)
3593 	    up(&ai->sem);
3594 
3595 	if (rc)
3596 		airo_print_err(ai->dev->name, "Cannot enable MAC");
3597 	else if ((rsp.status & 0xFF00) != 0) {
3598 		airo_print_err(ai->dev->name, "Bad MAC enable reason=%x, "
3599 			"rid=%x, offset=%d", rsp.rsp0, rsp.rsp1, rsp.rsp2);
3600 		rc = ERROR;
3601 	}
3602 	return rc;
3603 }
3604 
disable_MAC(struct airo_info * ai,int lock)3605 static void disable_MAC( struct airo_info *ai, int lock ) {
3606         Cmd cmd;
3607 	Resp rsp;
3608 
3609 	if (lock && down_interruptible(&ai->sem))
3610 		return;
3611 
3612 	if (test_bit(FLAG_ENABLED, &ai->flags)) {
3613 		memset(&cmd, 0, sizeof(cmd));
3614 		cmd.cmd = MAC_DISABLE; // disable in case already enabled
3615 		issuecommand(ai, &cmd, &rsp);
3616 		clear_bit(FLAG_ENABLED, &ai->flags);
3617 	}
3618 	if (lock)
3619 		up(&ai->sem);
3620 }
3621 
enable_interrupts(struct airo_info * ai)3622 static void enable_interrupts( struct airo_info *ai ) {
3623 	/* Enable the interrupts */
3624 	OUT4500( ai, EVINTEN, STATUS_INTS );
3625 }
3626 
disable_interrupts(struct airo_info * ai)3627 static void disable_interrupts( struct airo_info *ai ) {
3628 	OUT4500( ai, EVINTEN, 0 );
3629 }
3630 
mpi_receive_802_3(struct airo_info * ai)3631 static void mpi_receive_802_3(struct airo_info *ai)
3632 {
3633 	RxFid rxd;
3634 	int len = 0;
3635 	struct sk_buff *skb;
3636 	char *buffer;
3637 	int off = 0;
3638 	MICBuffer micbuf;
3639 
3640 	memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd));
3641 	/* Make sure we got something */
3642 	if (rxd.rdy && rxd.valid == 0) {
3643 		len = rxd.len + 12;
3644 		if (len < 12 || len > 2048)
3645 			goto badrx;
3646 
3647 		skb = dev_alloc_skb(len);
3648 		if (!skb) {
3649 			ai->dev->stats.rx_dropped++;
3650 			goto badrx;
3651 		}
3652 		buffer = skb_put(skb,len);
3653 		memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2);
3654 		if (ai->micstats.enabled) {
3655 			memcpy(&micbuf,
3656 				ai->rxfids[0].virtual_host_addr + ETH_ALEN * 2,
3657 				sizeof(micbuf));
3658 			if (ntohs(micbuf.typelen) <= 0x05DC) {
3659 				if (len <= sizeof(micbuf) + ETH_ALEN * 2)
3660 					goto badmic;
3661 
3662 				off = sizeof(micbuf);
3663 				skb_trim (skb, len - off);
3664 			}
3665 		}
3666 		memcpy(buffer + ETH_ALEN * 2,
3667 			ai->rxfids[0].virtual_host_addr + ETH_ALEN * 2 + off,
3668 			len - ETH_ALEN * 2 - off);
3669 		if (decapsulate (ai, &micbuf, (etherHead*)buffer, len - off - ETH_ALEN * 2)) {
3670 badmic:
3671 			dev_kfree_skb_irq (skb);
3672 			goto badrx;
3673 		}
3674 #ifdef WIRELESS_SPY
3675 		if (ai->spy_data.spy_number > 0) {
3676 			char *sa;
3677 			struct iw_quality wstats;
3678 			/* Prepare spy data : addr + qual */
3679 			sa = buffer + ETH_ALEN;
3680 			wstats.qual = 0; /* XXX Where do I get that info from ??? */
3681 			wstats.level = 0;
3682 			wstats.updated = 0;
3683 			/* Update spy records */
3684 			wireless_spy_update(ai->dev, sa, &wstats);
3685 		}
3686 #endif /* WIRELESS_SPY */
3687 
3688 		skb->ip_summed = CHECKSUM_NONE;
3689 		skb->protocol = eth_type_trans(skb, ai->dev);
3690 		netif_rx(skb);
3691 	}
3692 badrx:
3693 	if (rxd.valid == 0) {
3694 		rxd.valid = 1;
3695 		rxd.rdy = 0;
3696 		rxd.len = PKTSIZE;
3697 		memcpy_toio(ai->rxfids[0].card_ram_off, &rxd, sizeof(rxd));
3698 	}
3699 }
3700 
mpi_receive_802_11(struct airo_info * ai)3701 static void mpi_receive_802_11(struct airo_info *ai)
3702 {
3703 	RxFid rxd;
3704 	struct sk_buff *skb = NULL;
3705 	u16 len, hdrlen = 0;
3706 	__le16 fc;
3707 	struct rx_hdr hdr;
3708 	u16 gap;
3709 	u16 *buffer;
3710 	char *ptr = ai->rxfids[0].virtual_host_addr + 4;
3711 
3712 	memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd));
3713 	memcpy ((char *)&hdr, ptr, sizeof(hdr));
3714 	ptr += sizeof(hdr);
3715 	/* Bad CRC. Ignore packet */
3716 	if (le16_to_cpu(hdr.status) & 2)
3717 		hdr.len = 0;
3718 	if (ai->wifidev == NULL)
3719 		hdr.len = 0;
3720 	len = le16_to_cpu(hdr.len);
3721 	if (len > AIRO_DEF_MTU) {
3722 		airo_print_err(ai->dev->name, "Bad size %d", len);
3723 		goto badrx;
3724 	}
3725 	if (len == 0)
3726 		goto badrx;
3727 
3728 	fc = get_unaligned((__le16 *)ptr);
3729 	hdrlen = header_len(fc);
3730 
3731 	skb = dev_alloc_skb( len + hdrlen + 2 );
3732 	if ( !skb ) {
3733 		ai->dev->stats.rx_dropped++;
3734 		goto badrx;
3735 	}
3736 	buffer = (u16*)skb_put (skb, len + hdrlen);
3737 	memcpy ((char *)buffer, ptr, hdrlen);
3738 	ptr += hdrlen;
3739 	if (hdrlen == 24)
3740 		ptr += 6;
3741 	gap = get_unaligned_le16(ptr);
3742 	ptr += sizeof(__le16);
3743 	if (gap) {
3744 		if (gap <= 8)
3745 			ptr += gap;
3746 		else
3747 			airo_print_err(ai->dev->name,
3748 			    "gaplen too big. Problems will follow...");
3749 	}
3750 	memcpy ((char *)buffer + hdrlen, ptr, len);
3751 	ptr += len;
3752 #ifdef IW_WIRELESS_SPY	  /* defined in iw_handler.h */
3753 	if (ai->spy_data.spy_number > 0) {
3754 		char *sa;
3755 		struct iw_quality wstats;
3756 		/* Prepare spy data : addr + qual */
3757 		sa = (char*)buffer + 10;
3758 		wstats.qual = hdr.rssi[0];
3759 		if (ai->rssi)
3760 			wstats.level = 0x100 - ai->rssi[hdr.rssi[1]].rssidBm;
3761 		else
3762 			wstats.level = (hdr.rssi[1] + 321) / 2;
3763 		wstats.noise = ai->wstats.qual.noise;
3764 		wstats.updated = IW_QUAL_QUAL_UPDATED
3765 			| IW_QUAL_LEVEL_UPDATED
3766 			| IW_QUAL_DBM;
3767 		/* Update spy records */
3768 		wireless_spy_update(ai->dev, sa, &wstats);
3769 	}
3770 #endif /* IW_WIRELESS_SPY */
3771 	skb_reset_mac_header(skb);
3772 	skb->pkt_type = PACKET_OTHERHOST;
3773 	skb->dev = ai->wifidev;
3774 	skb->protocol = htons(ETH_P_802_2);
3775 	skb->ip_summed = CHECKSUM_NONE;
3776 	netif_rx( skb );
3777 
3778 badrx:
3779 	if (rxd.valid == 0) {
3780 		rxd.valid = 1;
3781 		rxd.rdy = 0;
3782 		rxd.len = PKTSIZE;
3783 		memcpy_toio(ai->rxfids[0].card_ram_off, &rxd, sizeof(rxd));
3784 	}
3785 }
3786 
setup_card(struct airo_info * ai,u8 * mac,int lock)3787 static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
3788 {
3789 	Cmd cmd;
3790 	Resp rsp;
3791 	int status;
3792 	SsidRid mySsid;
3793 	__le16 lastindex;
3794 	WepKeyRid wkr;
3795 	int rc;
3796 
3797 	memset( &mySsid, 0, sizeof( mySsid ) );
3798 	kfree (ai->flash);
3799 	ai->flash = NULL;
3800 
3801 	/* The NOP is the first step in getting the card going */
3802 	cmd.cmd = NOP;
3803 	cmd.parm0 = cmd.parm1 = cmd.parm2 = 0;
3804 	if (lock && down_interruptible(&ai->sem))
3805 		return ERROR;
3806 	if ( issuecommand( ai, &cmd, &rsp ) != SUCCESS ) {
3807 		if (lock)
3808 			up(&ai->sem);
3809 		return ERROR;
3810 	}
3811 	disable_MAC( ai, 0);
3812 
3813 	// Let's figure out if we need to use the AUX port
3814 	if (!test_bit(FLAG_MPI,&ai->flags)) {
3815 		cmd.cmd = CMD_ENABLEAUX;
3816 		if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
3817 			if (lock)
3818 				up(&ai->sem);
3819 			airo_print_err(ai->dev->name, "Error checking for AUX port");
3820 			return ERROR;
3821 		}
3822 		if (!aux_bap || rsp.status & 0xff00) {
3823 			ai->bap_read = fast_bap_read;
3824 			airo_print_dbg(ai->dev->name, "Doing fast bap_reads");
3825 		} else {
3826 			ai->bap_read = aux_bap_read;
3827 			airo_print_dbg(ai->dev->name, "Doing AUX bap_reads");
3828 		}
3829 	}
3830 	if (lock)
3831 		up(&ai->sem);
3832 	if (ai->config.len == 0) {
3833 		int i;
3834 		tdsRssiRid rssi_rid;
3835 		CapabilityRid cap_rid;
3836 
3837 		kfree(ai->APList);
3838 		ai->APList = NULL;
3839 		kfree(ai->SSID);
3840 		ai->SSID = NULL;
3841 		// general configuration (read/modify/write)
3842 		status = readConfigRid(ai, lock);
3843 		if ( status != SUCCESS ) return ERROR;
3844 
3845 		status = readCapabilityRid(ai, &cap_rid, lock);
3846 		if ( status != SUCCESS ) return ERROR;
3847 
3848 		status = PC4500_readrid(ai,RID_RSSI,&rssi_rid,sizeof(rssi_rid),lock);
3849 		if ( status == SUCCESS ) {
3850 			if (ai->rssi || (ai->rssi = kmalloc(512, GFP_KERNEL)) != NULL)
3851 				memcpy(ai->rssi, (u8*)&rssi_rid + 2, 512); /* Skip RID length member */
3852 		}
3853 		else {
3854 			kfree(ai->rssi);
3855 			ai->rssi = NULL;
3856 			if (cap_rid.softCap & cpu_to_le16(8))
3857 				ai->config.rmode |= RXMODE_NORMALIZED_RSSI;
3858 			else
3859 				airo_print_warn(ai->dev->name, "unknown received signal "
3860 						"level scale");
3861 		}
3862 		ai->config.opmode = adhoc ? MODE_STA_IBSS : MODE_STA_ESS;
3863 		ai->config.authType = AUTH_OPEN;
3864 		ai->config.modulation = MOD_CCK;
3865 
3866 		if (le16_to_cpu(cap_rid.len) >= sizeof(cap_rid) &&
3867 		    (cap_rid.extSoftCap & cpu_to_le16(1)) &&
3868 		    micsetup(ai) == SUCCESS) {
3869 			ai->config.opmode |= MODE_MIC;
3870 			set_bit(FLAG_MIC_CAPABLE, &ai->flags);
3871 		}
3872 
3873 		/* Save off the MAC */
3874 		for( i = 0; i < ETH_ALEN; i++ ) {
3875 			mac[i] = ai->config.macAddr[i];
3876 		}
3877 
3878 		/* Check to see if there are any insmod configured
3879 		   rates to add */
3880 		if ( rates[0] ) {
3881 			memset(ai->config.rates,0,sizeof(ai->config.rates));
3882 			for( i = 0; i < 8 && rates[i]; i++ ) {
3883 				ai->config.rates[i] = rates[i];
3884 			}
3885 		}
3886 		set_bit (FLAG_COMMIT, &ai->flags);
3887 	}
3888 
3889 	/* Setup the SSIDs if present */
3890 	if ( ssids[0] ) {
3891 		int i;
3892 		for( i = 0; i < 3 && ssids[i]; i++ ) {
3893 			size_t len = strlen(ssids[i]);
3894 			if (len > 32)
3895 				len = 32;
3896 			mySsid.ssids[i].len = cpu_to_le16(len);
3897 			memcpy(mySsid.ssids[i].ssid, ssids[i], len);
3898 		}
3899 		mySsid.len = cpu_to_le16(sizeof(mySsid));
3900 	}
3901 
3902 	status = writeConfigRid(ai, lock);
3903 	if ( status != SUCCESS ) return ERROR;
3904 
3905 	/* Set up the SSID list */
3906 	if ( ssids[0] ) {
3907 		status = writeSsidRid(ai, &mySsid, lock);
3908 		if ( status != SUCCESS ) return ERROR;
3909 	}
3910 
3911 	status = enable_MAC(ai, lock);
3912 	if (status != SUCCESS)
3913 		return ERROR;
3914 
3915 	/* Grab the initial wep key, we gotta save it for auto_wep */
3916 	rc = readWepKeyRid(ai, &wkr, 1, lock);
3917 	if (rc == SUCCESS) do {
3918 		lastindex = wkr.kindex;
3919 		if (wkr.kindex == cpu_to_le16(0xffff)) {
3920 			ai->defindex = wkr.mac[0];
3921 		}
3922 		rc = readWepKeyRid(ai, &wkr, 0, lock);
3923 	} while(lastindex != wkr.kindex);
3924 
3925 	try_auto_wep(ai);
3926 
3927 	return SUCCESS;
3928 }
3929 
issuecommand(struct airo_info * ai,Cmd * pCmd,Resp * pRsp)3930 static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
3931         // Im really paranoid about letting it run forever!
3932 	int max_tries = 600000;
3933 
3934 	if (IN4500(ai, EVSTAT) & EV_CMD)
3935 		OUT4500(ai, EVACK, EV_CMD);
3936 
3937 	OUT4500(ai, PARAM0, pCmd->parm0);
3938 	OUT4500(ai, PARAM1, pCmd->parm1);
3939 	OUT4500(ai, PARAM2, pCmd->parm2);
3940 	OUT4500(ai, COMMAND, pCmd->cmd);
3941 
3942 	while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) {
3943 		if ((IN4500(ai, COMMAND)) == pCmd->cmd)
3944 			// PC4500 didn't notice command, try again
3945 			OUT4500(ai, COMMAND, pCmd->cmd);
3946 		if (!in_atomic() && (max_tries & 255) == 0)
3947 			schedule();
3948 	}
3949 
3950 	if ( max_tries == -1 ) {
3951 		airo_print_err(ai->dev->name,
3952 			"Max tries exceeded when issuing command");
3953 		if (IN4500(ai, COMMAND) & COMMAND_BUSY)
3954 			OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
3955 		return ERROR;
3956 	}
3957 
3958 	// command completed
3959 	pRsp->status = IN4500(ai, STATUS);
3960 	pRsp->rsp0 = IN4500(ai, RESP0);
3961 	pRsp->rsp1 = IN4500(ai, RESP1);
3962 	pRsp->rsp2 = IN4500(ai, RESP2);
3963 	if ((pRsp->status & 0xff00)!=0 && pCmd->cmd != CMD_SOFTRESET)
3964 		airo_print_err(ai->dev->name,
3965 			"cmd:%x status:%x rsp0:%x rsp1:%x rsp2:%x",
3966 			pCmd->cmd, pRsp->status, pRsp->rsp0, pRsp->rsp1,
3967 			pRsp->rsp2);
3968 
3969 	// clear stuck command busy if necessary
3970 	if (IN4500(ai, COMMAND) & COMMAND_BUSY) {
3971 		OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
3972 	}
3973 	// acknowledge processing the status/response
3974 	OUT4500(ai, EVACK, EV_CMD);
3975 
3976 	return SUCCESS;
3977 }
3978 
3979 /* Sets up the bap to start exchange data.  whichbap should
3980  * be one of the BAP0 or BAP1 defines.  Locks should be held before
3981  * calling! */
bap_setup(struct airo_info * ai,u16 rid,u16 offset,int whichbap)3982 static int bap_setup(struct airo_info *ai, u16 rid, u16 offset, int whichbap )
3983 {
3984 	int timeout = 50;
3985 	int max_tries = 3;
3986 
3987 	OUT4500(ai, SELECT0+whichbap, rid);
3988 	OUT4500(ai, OFFSET0+whichbap, offset);
3989 	while (1) {
3990 		int status = IN4500(ai, OFFSET0+whichbap);
3991 		if (status & BAP_BUSY) {
3992                         /* This isn't really a timeout, but its kinda
3993 			   close */
3994 			if (timeout--) {
3995 				continue;
3996 			}
3997 		} else if ( status & BAP_ERR ) {
3998 			/* invalid rid or offset */
3999 			airo_print_err(ai->dev->name, "BAP error %x %d",
4000 				status, whichbap );
4001 			return ERROR;
4002 		} else if (status & BAP_DONE) { // success
4003 			return SUCCESS;
4004 		}
4005 		if ( !(max_tries--) ) {
4006 			airo_print_err(ai->dev->name,
4007 				"BAP setup error too many retries\n");
4008 			return ERROR;
4009 		}
4010 		// -- PC4500 missed it, try again
4011 		OUT4500(ai, SELECT0+whichbap, rid);
4012 		OUT4500(ai, OFFSET0+whichbap, offset);
4013 		timeout = 50;
4014 	}
4015 }
4016 
4017 /* should only be called by aux_bap_read.  This aux function and the
4018    following use concepts not documented in the developers guide.  I
4019    got them from a patch given to my by Aironet */
aux_setup(struct airo_info * ai,u16 page,u16 offset,u16 * len)4020 static u16 aux_setup(struct airo_info *ai, u16 page,
4021 		     u16 offset, u16 *len)
4022 {
4023 	u16 next;
4024 
4025 	OUT4500(ai, AUXPAGE, page);
4026 	OUT4500(ai, AUXOFF, 0);
4027 	next = IN4500(ai, AUXDATA);
4028 	*len = IN4500(ai, AUXDATA)&0xff;
4029 	if (offset != 4) OUT4500(ai, AUXOFF, offset);
4030 	return next;
4031 }
4032 
4033 /* requires call to bap_setup() first */
aux_bap_read(struct airo_info * ai,__le16 * pu16Dst,int bytelen,int whichbap)4034 static int aux_bap_read(struct airo_info *ai, __le16 *pu16Dst,
4035 			int bytelen, int whichbap)
4036 {
4037 	u16 len;
4038 	u16 page;
4039 	u16 offset;
4040 	u16 next;
4041 	int words;
4042 	int i;
4043 	unsigned long flags;
4044 
4045 	spin_lock_irqsave(&ai->aux_lock, flags);
4046 	page = IN4500(ai, SWS0+whichbap);
4047 	offset = IN4500(ai, SWS2+whichbap);
4048 	next = aux_setup(ai, page, offset, &len);
4049 	words = (bytelen+1)>>1;
4050 
4051 	for (i=0; i<words;) {
4052 		int count;
4053 		count = (len>>1) < (words-i) ? (len>>1) : (words-i);
4054 		if ( !do8bitIO )
4055 			insw( ai->dev->base_addr+DATA0+whichbap,
4056 			      pu16Dst+i,count );
4057 		else
4058 			insb( ai->dev->base_addr+DATA0+whichbap,
4059 			      pu16Dst+i, count << 1 );
4060 		i += count;
4061 		if (i<words) {
4062 			next = aux_setup(ai, next, 4, &len);
4063 		}
4064 	}
4065 	spin_unlock_irqrestore(&ai->aux_lock, flags);
4066 	return SUCCESS;
4067 }
4068 
4069 
4070 /* requires call to bap_setup() first */
fast_bap_read(struct airo_info * ai,__le16 * pu16Dst,int bytelen,int whichbap)4071 static int fast_bap_read(struct airo_info *ai, __le16 *pu16Dst,
4072 			 int bytelen, int whichbap)
4073 {
4074 	bytelen = (bytelen + 1) & (~1); // round up to even value
4075 	if ( !do8bitIO )
4076 		insw( ai->dev->base_addr+DATA0+whichbap, pu16Dst, bytelen>>1 );
4077 	else
4078 		insb( ai->dev->base_addr+DATA0+whichbap, pu16Dst, bytelen );
4079 	return SUCCESS;
4080 }
4081 
4082 /* requires call to bap_setup() first */
bap_write(struct airo_info * ai,const __le16 * pu16Src,int bytelen,int whichbap)4083 static int bap_write(struct airo_info *ai, const __le16 *pu16Src,
4084 		     int bytelen, int whichbap)
4085 {
4086 	bytelen = (bytelen + 1) & (~1); // round up to even value
4087 	if ( !do8bitIO )
4088 		outsw( ai->dev->base_addr+DATA0+whichbap,
4089 		       pu16Src, bytelen>>1 );
4090 	else
4091 		outsb( ai->dev->base_addr+DATA0+whichbap, pu16Src, bytelen );
4092 	return SUCCESS;
4093 }
4094 
PC4500_accessrid(struct airo_info * ai,u16 rid,u16 accmd)4095 static int PC4500_accessrid(struct airo_info *ai, u16 rid, u16 accmd)
4096 {
4097 	Cmd cmd; /* for issuing commands */
4098 	Resp rsp; /* response from commands */
4099 	u16 status;
4100 
4101 	memset(&cmd, 0, sizeof(cmd));
4102 	cmd.cmd = accmd;
4103 	cmd.parm0 = rid;
4104 	status = issuecommand(ai, &cmd, &rsp);
4105 	if (status != 0) return status;
4106 	if ( (rsp.status & 0x7F00) != 0) {
4107 		return (accmd << 8) + (rsp.rsp0 & 0xFF);
4108 	}
4109 	return 0;
4110 }
4111 
4112 /*  Note, that we are using BAP1 which is also used by transmit, so
4113  *  we must get a lock. */
PC4500_readrid(struct airo_info * ai,u16 rid,void * pBuf,int len,int lock)4114 static int PC4500_readrid(struct airo_info *ai, u16 rid, void *pBuf, int len, int lock)
4115 {
4116 	u16 status;
4117         int rc = SUCCESS;
4118 
4119 	if (lock) {
4120 		if (down_interruptible(&ai->sem))
4121 			return ERROR;
4122 	}
4123 	if (test_bit(FLAG_MPI,&ai->flags)) {
4124 		Cmd cmd;
4125 		Resp rsp;
4126 
4127 		memset(&cmd, 0, sizeof(cmd));
4128 		memset(&rsp, 0, sizeof(rsp));
4129 		ai->config_desc.rid_desc.valid = 1;
4130 		ai->config_desc.rid_desc.len = RIDSIZE;
4131 		ai->config_desc.rid_desc.rid = 0;
4132 		ai->config_desc.rid_desc.host_addr = ai->ridbus;
4133 
4134 		cmd.cmd = CMD_ACCESS;
4135 		cmd.parm0 = rid;
4136 
4137 		memcpy_toio(ai->config_desc.card_ram_off,
4138 			&ai->config_desc.rid_desc, sizeof(Rid));
4139 
4140 		rc = issuecommand(ai, &cmd, &rsp);
4141 
4142 		if (rsp.status & 0x7f00)
4143 			rc = rsp.rsp0;
4144 		if (!rc)
4145 			memcpy(pBuf, ai->config_desc.virtual_host_addr, len);
4146 		goto done;
4147 	} else {
4148 		if ((status = PC4500_accessrid(ai, rid, CMD_ACCESS))!=SUCCESS) {
4149 	                rc = status;
4150 	                goto done;
4151 	        }
4152 		if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) {
4153 			rc = ERROR;
4154 	                goto done;
4155 	        }
4156 		// read the rid length field
4157 		bap_read(ai, pBuf, 2, BAP1);
4158 		// length for remaining part of rid
4159 		len = min(len, (int)le16_to_cpu(*(__le16*)pBuf)) - 2;
4160 
4161 		if ( len <= 2 ) {
4162 			airo_print_err(ai->dev->name,
4163 				"Rid %x has a length of %d which is too short",
4164 				(int)rid, (int)len );
4165 			rc = ERROR;
4166 	                goto done;
4167 		}
4168 		// read remainder of the rid
4169 		rc = bap_read(ai, ((__le16*)pBuf)+1, len, BAP1);
4170 	}
4171 done:
4172 	if (lock)
4173 		up(&ai->sem);
4174 	return rc;
4175 }
4176 
4177 /*  Note, that we are using BAP1 which is also used by transmit, so
4178  *  make sure this isn't called when a transmit is happening */
PC4500_writerid(struct airo_info * ai,u16 rid,const void * pBuf,int len,int lock)4179 static int PC4500_writerid(struct airo_info *ai, u16 rid,
4180 			   const void *pBuf, int len, int lock)
4181 {
4182 	u16 status;
4183 	int rc = SUCCESS;
4184 
4185 	*(__le16*)pBuf = cpu_to_le16((u16)len);
4186 
4187 	if (lock) {
4188 		if (down_interruptible(&ai->sem))
4189 			return ERROR;
4190 	}
4191 	if (test_bit(FLAG_MPI,&ai->flags)) {
4192 		Cmd cmd;
4193 		Resp rsp;
4194 
4195 		if (test_bit(FLAG_ENABLED, &ai->flags) && (RID_WEP_TEMP != rid))
4196 			airo_print_err(ai->dev->name,
4197 				"%s: MAC should be disabled (rid=%04x)",
4198 				__func__, rid);
4199 		memset(&cmd, 0, sizeof(cmd));
4200 		memset(&rsp, 0, sizeof(rsp));
4201 
4202 		ai->config_desc.rid_desc.valid = 1;
4203 		ai->config_desc.rid_desc.len = *((u16 *)pBuf);
4204 		ai->config_desc.rid_desc.rid = 0;
4205 
4206 		cmd.cmd = CMD_WRITERID;
4207 		cmd.parm0 = rid;
4208 
4209 		memcpy_toio(ai->config_desc.card_ram_off,
4210 			&ai->config_desc.rid_desc, sizeof(Rid));
4211 
4212 		if (len < 4 || len > 2047) {
4213 			airo_print_err(ai->dev->name, "%s: len=%d", __func__, len);
4214 			rc = -1;
4215 		} else {
4216 			memcpy((char *)ai->config_desc.virtual_host_addr,
4217 				pBuf, len);
4218 
4219 			rc = issuecommand(ai, &cmd, &rsp);
4220 			if ((rc & 0xff00) != 0) {
4221 				airo_print_err(ai->dev->name, "%s: Write rid Error %d",
4222 						__func__, rc);
4223 				airo_print_err(ai->dev->name, "%s: Cmd=%04x",
4224 						__func__, cmd.cmd);
4225 			}
4226 
4227 			if ((rsp.status & 0x7f00))
4228 				rc = rsp.rsp0;
4229 		}
4230 	} else {
4231 		// --- first access so that we can write the rid data
4232 		if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != 0) {
4233 	                rc = status;
4234 	                goto done;
4235 	        }
4236 		// --- now write the rid data
4237 		if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) {
4238 	                rc = ERROR;
4239 	                goto done;
4240 	        }
4241 		bap_write(ai, pBuf, len, BAP1);
4242 		// ---now commit the rid data
4243 		rc = PC4500_accessrid(ai, rid, 0x100|CMD_ACCESS);
4244 	}
4245 done:
4246 	if (lock)
4247 		up(&ai->sem);
4248         return rc;
4249 }
4250 
4251 /* Allocates a FID to be used for transmitting packets.  We only use
4252    one for now. */
transmit_allocate(struct airo_info * ai,int lenPayload,int raw)4253 static u16 transmit_allocate(struct airo_info *ai, int lenPayload, int raw)
4254 {
4255 	unsigned int loop = 3000;
4256 	Cmd cmd;
4257 	Resp rsp;
4258 	u16 txFid;
4259 	__le16 txControl;
4260 
4261 	cmd.cmd = CMD_ALLOCATETX;
4262 	cmd.parm0 = lenPayload;
4263 	if (down_interruptible(&ai->sem))
4264 		return ERROR;
4265 	if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
4266 		txFid = ERROR;
4267 		goto done;
4268 	}
4269 	if ( (rsp.status & 0xFF00) != 0) {
4270 		txFid = ERROR;
4271 		goto done;
4272 	}
4273 	/* wait for the allocate event/indication
4274 	 * It makes me kind of nervous that this can just sit here and spin,
4275 	 * but in practice it only loops like four times. */
4276 	while (((IN4500(ai, EVSTAT) & EV_ALLOC) == 0) && --loop);
4277 	if (!loop) {
4278 		txFid = ERROR;
4279 		goto done;
4280 	}
4281 
4282 	// get the allocated fid and acknowledge
4283 	txFid = IN4500(ai, TXALLOCFID);
4284 	OUT4500(ai, EVACK, EV_ALLOC);
4285 
4286 	/*  The CARD is pretty cool since it converts the ethernet packet
4287 	 *  into 802.11.  Also note that we don't release the FID since we
4288 	 *  will be using the same one over and over again. */
4289 	/*  We only have to setup the control once since we are not
4290 	 *  releasing the fid. */
4291 	if (raw)
4292 		txControl = cpu_to_le16(TXCTL_TXOK | TXCTL_TXEX | TXCTL_802_11
4293 			| TXCTL_ETHERNET | TXCTL_NORELEASE);
4294 	else
4295 		txControl = cpu_to_le16(TXCTL_TXOK | TXCTL_TXEX | TXCTL_802_3
4296 			| TXCTL_ETHERNET | TXCTL_NORELEASE);
4297 	if (bap_setup(ai, txFid, 0x0008, BAP1) != SUCCESS)
4298 		txFid = ERROR;
4299 	else
4300 		bap_write(ai, &txControl, sizeof(txControl), BAP1);
4301 
4302 done:
4303 	up(&ai->sem);
4304 
4305 	return txFid;
4306 }
4307 
4308 /* In general BAP1 is dedicated to transmiting packets.  However,
4309    since we need a BAP when accessing RIDs, we also use BAP1 for that.
4310    Make sure the BAP1 spinlock is held when this is called. */
transmit_802_3_packet(struct airo_info * ai,int len,char * pPacket)4311 static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket)
4312 {
4313 	__le16 payloadLen;
4314 	Cmd cmd;
4315 	Resp rsp;
4316 	int miclen = 0;
4317 	u16 txFid = len;
4318 	MICBuffer pMic;
4319 
4320 	len >>= 16;
4321 
4322 	if (len <= ETH_ALEN * 2) {
4323 		airo_print_warn(ai->dev->name, "Short packet %d", len);
4324 		return ERROR;
4325 	}
4326 	len -= ETH_ALEN * 2;
4327 
4328 	if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
4329 	    (ntohs(((__be16 *)pPacket)[6]) != 0x888E)) {
4330 		if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS)
4331 			return ERROR;
4332 		miclen = sizeof(pMic);
4333 	}
4334 	// packet is destination[6], source[6], payload[len-12]
4335 	// write the payload length and dst/src/payload
4336 	if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR;
4337 	/* The hardware addresses aren't counted as part of the payload, so
4338 	 * we have to subtract the 12 bytes for the addresses off */
4339 	payloadLen = cpu_to_le16(len + miclen);
4340 	bap_write(ai, &payloadLen, sizeof(payloadLen),BAP1);
4341 	bap_write(ai, (__le16*)pPacket, sizeof(etherHead), BAP1);
4342 	if (miclen)
4343 		bap_write(ai, (__le16*)&pMic, miclen, BAP1);
4344 	bap_write(ai, (__le16*)(pPacket + sizeof(etherHead)), len, BAP1);
4345 	// issue the transmit command
4346 	memset( &cmd, 0, sizeof( cmd ) );
4347 	cmd.cmd = CMD_TRANSMIT;
4348 	cmd.parm0 = txFid;
4349 	if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
4350 	if ( (rsp.status & 0xFF00) != 0) return ERROR;
4351 	return SUCCESS;
4352 }
4353 
transmit_802_11_packet(struct airo_info * ai,int len,char * pPacket)4354 static int transmit_802_11_packet(struct airo_info *ai, int len, char *pPacket)
4355 {
4356 	__le16 fc, payloadLen;
4357 	Cmd cmd;
4358 	Resp rsp;
4359 	int hdrlen;
4360 	static u8 tail[(30-10) + 2 + 6] = {[30-10] = 6};
4361 	/* padding of header to full size + le16 gaplen (6) + gaplen bytes */
4362 	u16 txFid = len;
4363 	len >>= 16;
4364 
4365 	fc = *(__le16*)pPacket;
4366 	hdrlen = header_len(fc);
4367 
4368 	if (len < hdrlen) {
4369 		airo_print_warn(ai->dev->name, "Short packet %d", len);
4370 		return ERROR;
4371 	}
4372 
4373 	/* packet is 802.11 header +  payload
4374 	 * write the payload length and dst/src/payload */
4375 	if (bap_setup(ai, txFid, 6, BAP1) != SUCCESS) return ERROR;
4376 	/* The 802.11 header aren't counted as part of the payload, so
4377 	 * we have to subtract the header bytes off */
4378 	payloadLen = cpu_to_le16(len-hdrlen);
4379 	bap_write(ai, &payloadLen, sizeof(payloadLen),BAP1);
4380 	if (bap_setup(ai, txFid, 0x0014, BAP1) != SUCCESS) return ERROR;
4381 	bap_write(ai, (__le16 *)pPacket, hdrlen, BAP1);
4382 	bap_write(ai, (__le16 *)(tail + (hdrlen - 10)), 38 - hdrlen, BAP1);
4383 
4384 	bap_write(ai, (__le16 *)(pPacket + hdrlen), len - hdrlen, BAP1);
4385 	// issue the transmit command
4386 	memset( &cmd, 0, sizeof( cmd ) );
4387 	cmd.cmd = CMD_TRANSMIT;
4388 	cmd.parm0 = txFid;
4389 	if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
4390 	if ( (rsp.status & 0xFF00) != 0) return ERROR;
4391 	return SUCCESS;
4392 }
4393 
4394 /*
4395  *  This is the proc_fs routines.  It is a bit messier than I would
4396  *  like!  Feel free to clean it up!
4397  */
4398 
4399 static ssize_t proc_read( struct file *file,
4400 			  char __user *buffer,
4401 			  size_t len,
4402 			  loff_t *offset);
4403 
4404 static ssize_t proc_write( struct file *file,
4405 			   const char __user *buffer,
4406 			   size_t len,
4407 			   loff_t *offset );
4408 static int proc_close( struct inode *inode, struct file *file );
4409 
4410 static int proc_stats_open( struct inode *inode, struct file *file );
4411 static int proc_statsdelta_open( struct inode *inode, struct file *file );
4412 static int proc_status_open( struct inode *inode, struct file *file );
4413 static int proc_SSID_open( struct inode *inode, struct file *file );
4414 static int proc_APList_open( struct inode *inode, struct file *file );
4415 static int proc_BSSList_open( struct inode *inode, struct file *file );
4416 static int proc_config_open( struct inode *inode, struct file *file );
4417 static int proc_wepkey_open( struct inode *inode, struct file *file );
4418 
4419 static const struct file_operations proc_statsdelta_ops = {
4420 	.owner		= THIS_MODULE,
4421 	.read		= proc_read,
4422 	.open		= proc_statsdelta_open,
4423 	.release	= proc_close,
4424 	.llseek		= default_llseek,
4425 };
4426 
4427 static const struct file_operations proc_stats_ops = {
4428 	.owner		= THIS_MODULE,
4429 	.read		= proc_read,
4430 	.open		= proc_stats_open,
4431 	.release	= proc_close,
4432 	.llseek		= default_llseek,
4433 };
4434 
4435 static const struct file_operations proc_status_ops = {
4436 	.owner		= THIS_MODULE,
4437 	.read		= proc_read,
4438 	.open		= proc_status_open,
4439 	.release	= proc_close,
4440 	.llseek		= default_llseek,
4441 };
4442 
4443 static const struct file_operations proc_SSID_ops = {
4444 	.owner		= THIS_MODULE,
4445 	.read		= proc_read,
4446 	.write		= proc_write,
4447 	.open		= proc_SSID_open,
4448 	.release	= proc_close,
4449 	.llseek		= default_llseek,
4450 };
4451 
4452 static const struct file_operations proc_BSSList_ops = {
4453 	.owner		= THIS_MODULE,
4454 	.read		= proc_read,
4455 	.write		= proc_write,
4456 	.open		= proc_BSSList_open,
4457 	.release	= proc_close,
4458 	.llseek		= default_llseek,
4459 };
4460 
4461 static const struct file_operations proc_APList_ops = {
4462 	.owner		= THIS_MODULE,
4463 	.read		= proc_read,
4464 	.write		= proc_write,
4465 	.open		= proc_APList_open,
4466 	.release	= proc_close,
4467 	.llseek		= default_llseek,
4468 };
4469 
4470 static const struct file_operations proc_config_ops = {
4471 	.owner		= THIS_MODULE,
4472 	.read		= proc_read,
4473 	.write		= proc_write,
4474 	.open		= proc_config_open,
4475 	.release	= proc_close,
4476 	.llseek		= default_llseek,
4477 };
4478 
4479 static const struct file_operations proc_wepkey_ops = {
4480 	.owner		= THIS_MODULE,
4481 	.read		= proc_read,
4482 	.write		= proc_write,
4483 	.open		= proc_wepkey_open,
4484 	.release	= proc_close,
4485 	.llseek		= default_llseek,
4486 };
4487 
4488 static struct proc_dir_entry *airo_entry;
4489 
4490 struct proc_data {
4491 	int release_buffer;
4492 	int readlen;
4493 	char *rbuffer;
4494 	int writelen;
4495 	int maxwritelen;
4496 	char *wbuffer;
4497 	void (*on_close) (struct inode *, struct file *);
4498 };
4499 
setup_proc_entry(struct net_device * dev,struct airo_info * apriv)4500 static int setup_proc_entry( struct net_device *dev,
4501 			     struct airo_info *apriv ) {
4502 	struct proc_dir_entry *entry;
4503 	/* First setup the device directory */
4504 	strcpy(apriv->proc_name,dev->name);
4505 	apriv->proc_entry = proc_mkdir_mode(apriv->proc_name, airo_perm,
4506 					    airo_entry);
4507 	if (!apriv->proc_entry)
4508 		goto fail;
4509 	apriv->proc_entry->uid = proc_uid;
4510 	apriv->proc_entry->gid = proc_gid;
4511 
4512 	/* Setup the StatsDelta */
4513 	entry = proc_create_data("StatsDelta", S_IRUGO & proc_perm,
4514 				 apriv->proc_entry, &proc_statsdelta_ops, dev);
4515 	if (!entry)
4516 		goto fail_stats_delta;
4517 	entry->uid = proc_uid;
4518 	entry->gid = proc_gid;
4519 
4520 	/* Setup the Stats */
4521 	entry = proc_create_data("Stats", S_IRUGO & proc_perm,
4522 				 apriv->proc_entry, &proc_stats_ops, dev);
4523 	if (!entry)
4524 		goto fail_stats;
4525 	entry->uid = proc_uid;
4526 	entry->gid = proc_gid;
4527 
4528 	/* Setup the Status */
4529 	entry = proc_create_data("Status", S_IRUGO & proc_perm,
4530 				 apriv->proc_entry, &proc_status_ops, dev);
4531 	if (!entry)
4532 		goto fail_status;
4533 	entry->uid = proc_uid;
4534 	entry->gid = proc_gid;
4535 
4536 	/* Setup the Config */
4537 	entry = proc_create_data("Config", proc_perm,
4538 				 apriv->proc_entry, &proc_config_ops, dev);
4539 	if (!entry)
4540 		goto fail_config;
4541 	entry->uid = proc_uid;
4542 	entry->gid = proc_gid;
4543 
4544 	/* Setup the SSID */
4545 	entry = proc_create_data("SSID", proc_perm,
4546 				 apriv->proc_entry, &proc_SSID_ops, dev);
4547 	if (!entry)
4548 		goto fail_ssid;
4549 	entry->uid = proc_uid;
4550 	entry->gid = proc_gid;
4551 
4552 	/* Setup the APList */
4553 	entry = proc_create_data("APList", proc_perm,
4554 				 apriv->proc_entry, &proc_APList_ops, dev);
4555 	if (!entry)
4556 		goto fail_aplist;
4557 	entry->uid = proc_uid;
4558 	entry->gid = proc_gid;
4559 
4560 	/* Setup the BSSList */
4561 	entry = proc_create_data("BSSList", proc_perm,
4562 				 apriv->proc_entry, &proc_BSSList_ops, dev);
4563 	if (!entry)
4564 		goto fail_bsslist;
4565 	entry->uid = proc_uid;
4566 	entry->gid = proc_gid;
4567 
4568 	/* Setup the WepKey */
4569 	entry = proc_create_data("WepKey", proc_perm,
4570 				 apriv->proc_entry, &proc_wepkey_ops, dev);
4571 	if (!entry)
4572 		goto fail_wepkey;
4573 	entry->uid = proc_uid;
4574 	entry->gid = proc_gid;
4575 
4576 	return 0;
4577 
4578 fail_wepkey:
4579 	remove_proc_entry("BSSList", apriv->proc_entry);
4580 fail_bsslist:
4581 	remove_proc_entry("APList", apriv->proc_entry);
4582 fail_aplist:
4583 	remove_proc_entry("SSID", apriv->proc_entry);
4584 fail_ssid:
4585 	remove_proc_entry("Config", apriv->proc_entry);
4586 fail_config:
4587 	remove_proc_entry("Status", apriv->proc_entry);
4588 fail_status:
4589 	remove_proc_entry("Stats", apriv->proc_entry);
4590 fail_stats:
4591 	remove_proc_entry("StatsDelta", apriv->proc_entry);
4592 fail_stats_delta:
4593 	remove_proc_entry(apriv->proc_name, airo_entry);
4594 fail:
4595 	return -ENOMEM;
4596 }
4597 
takedown_proc_entry(struct net_device * dev,struct airo_info * apriv)4598 static int takedown_proc_entry( struct net_device *dev,
4599 				struct airo_info *apriv ) {
4600 	if ( !apriv->proc_entry->namelen ) return 0;
4601 	remove_proc_entry("Stats",apriv->proc_entry);
4602 	remove_proc_entry("StatsDelta",apriv->proc_entry);
4603 	remove_proc_entry("Status",apriv->proc_entry);
4604 	remove_proc_entry("Config",apriv->proc_entry);
4605 	remove_proc_entry("SSID",apriv->proc_entry);
4606 	remove_proc_entry("APList",apriv->proc_entry);
4607 	remove_proc_entry("BSSList",apriv->proc_entry);
4608 	remove_proc_entry("WepKey",apriv->proc_entry);
4609 	remove_proc_entry(apriv->proc_name,airo_entry);
4610 	return 0;
4611 }
4612 
4613 /*
4614  *  What we want from the proc_fs is to be able to efficiently read
4615  *  and write the configuration.  To do this, we want to read the
4616  *  configuration when the file is opened and write it when the file is
4617  *  closed.  So basically we allocate a read buffer at open and fill it
4618  *  with data, and allocate a write buffer and read it at close.
4619  */
4620 
4621 /*
4622  *  The read routine is generic, it relies on the preallocated rbuffer
4623  *  to supply the data.
4624  */
proc_read(struct file * file,char __user * buffer,size_t len,loff_t * offset)4625 static ssize_t proc_read( struct file *file,
4626 			  char __user *buffer,
4627 			  size_t len,
4628 			  loff_t *offset )
4629 {
4630 	struct proc_data *priv = file->private_data;
4631 
4632 	if (!priv->rbuffer)
4633 		return -EINVAL;
4634 
4635 	return simple_read_from_buffer(buffer, len, offset, priv->rbuffer,
4636 					priv->readlen);
4637 }
4638 
4639 /*
4640  *  The write routine is generic, it fills in a preallocated rbuffer
4641  *  to supply the data.
4642  */
proc_write(struct file * file,const char __user * buffer,size_t len,loff_t * offset)4643 static ssize_t proc_write( struct file *file,
4644 			   const char __user *buffer,
4645 			   size_t len,
4646 			   loff_t *offset )
4647 {
4648 	ssize_t ret;
4649 	struct proc_data *priv = file->private_data;
4650 
4651 	if (!priv->wbuffer)
4652 		return -EINVAL;
4653 
4654 	ret = simple_write_to_buffer(priv->wbuffer, priv->maxwritelen, offset,
4655 					buffer, len);
4656 	if (ret > 0)
4657 		priv->writelen = max_t(int, priv->writelen, *offset);
4658 
4659 	return ret;
4660 }
4661 
proc_status_open(struct inode * inode,struct file * file)4662 static int proc_status_open(struct inode *inode, struct file *file)
4663 {
4664 	struct proc_data *data;
4665 	struct proc_dir_entry *dp = PDE(inode);
4666 	struct net_device *dev = dp->data;
4667 	struct airo_info *apriv = dev->ml_priv;
4668 	CapabilityRid cap_rid;
4669 	StatusRid status_rid;
4670 	u16 mode;
4671 	int i;
4672 
4673 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
4674 		return -ENOMEM;
4675 	data = file->private_data;
4676 	if ((data->rbuffer = kmalloc( 2048, GFP_KERNEL )) == NULL) {
4677 		kfree (file->private_data);
4678 		return -ENOMEM;
4679 	}
4680 
4681 	readStatusRid(apriv, &status_rid, 1);
4682 	readCapabilityRid(apriv, &cap_rid, 1);
4683 
4684 	mode = le16_to_cpu(status_rid.mode);
4685 
4686         i = sprintf(data->rbuffer, "Status: %s%s%s%s%s%s%s%s%s\n",
4687                     mode & 1 ? "CFG ": "",
4688                     mode & 2 ? "ACT ": "",
4689                     mode & 0x10 ? "SYN ": "",
4690                     mode & 0x20 ? "LNK ": "",
4691                     mode & 0x40 ? "LEAP ": "",
4692                     mode & 0x80 ? "PRIV ": "",
4693                     mode & 0x100 ? "KEY ": "",
4694                     mode & 0x200 ? "WEP ": "",
4695                     mode & 0x8000 ? "ERR ": "");
4696 	sprintf( data->rbuffer+i, "Mode: %x\n"
4697 		 "Signal Strength: %d\n"
4698 		 "Signal Quality: %d\n"
4699 		 "SSID: %-.*s\n"
4700 		 "AP: %-.16s\n"
4701 		 "Freq: %d\n"
4702 		 "BitRate: %dmbs\n"
4703 		 "Driver Version: %s\n"
4704 		 "Device: %s\nManufacturer: %s\nFirmware Version: %s\n"
4705 		 "Radio type: %x\nCountry: %x\nHardware Version: %x\n"
4706 		 "Software Version: %x\nSoftware Subversion: %x\n"
4707 		 "Boot block version: %x\n",
4708 		 le16_to_cpu(status_rid.mode),
4709 		 le16_to_cpu(status_rid.normalizedSignalStrength),
4710 		 le16_to_cpu(status_rid.signalQuality),
4711 		 le16_to_cpu(status_rid.SSIDlen),
4712 		 status_rid.SSID,
4713 		 status_rid.apName,
4714 		 le16_to_cpu(status_rid.channel),
4715 		 le16_to_cpu(status_rid.currentXmitRate) / 2,
4716 		 version,
4717 		 cap_rid.prodName,
4718 		 cap_rid.manName,
4719 		 cap_rid.prodVer,
4720 		 le16_to_cpu(cap_rid.radioType),
4721 		 le16_to_cpu(cap_rid.country),
4722 		 le16_to_cpu(cap_rid.hardVer),
4723 		 le16_to_cpu(cap_rid.softVer),
4724 		 le16_to_cpu(cap_rid.softSubVer),
4725 		 le16_to_cpu(cap_rid.bootBlockVer));
4726 	data->readlen = strlen( data->rbuffer );
4727 	return 0;
4728 }
4729 
4730 static int proc_stats_rid_open(struct inode*, struct file*, u16);
proc_statsdelta_open(struct inode * inode,struct file * file)4731 static int proc_statsdelta_open( struct inode *inode,
4732 				 struct file *file ) {
4733 	if (file->f_mode&FMODE_WRITE) {
4734 		return proc_stats_rid_open(inode, file, RID_STATSDELTACLEAR);
4735 	}
4736 	return proc_stats_rid_open(inode, file, RID_STATSDELTA);
4737 }
4738 
proc_stats_open(struct inode * inode,struct file * file)4739 static int proc_stats_open( struct inode *inode, struct file *file ) {
4740 	return proc_stats_rid_open(inode, file, RID_STATS);
4741 }
4742 
proc_stats_rid_open(struct inode * inode,struct file * file,u16 rid)4743 static int proc_stats_rid_open( struct inode *inode,
4744 				struct file *file,
4745 				u16 rid )
4746 {
4747 	struct proc_data *data;
4748 	struct proc_dir_entry *dp = PDE(inode);
4749 	struct net_device *dev = dp->data;
4750 	struct airo_info *apriv = dev->ml_priv;
4751 	StatsRid stats;
4752 	int i, j;
4753 	__le32 *vals = stats.vals;
4754 	int len;
4755 
4756 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
4757 		return -ENOMEM;
4758 	data = file->private_data;
4759 	if ((data->rbuffer = kmalloc( 4096, GFP_KERNEL )) == NULL) {
4760 		kfree (file->private_data);
4761 		return -ENOMEM;
4762 	}
4763 
4764 	readStatsRid(apriv, &stats, rid, 1);
4765 	len = le16_to_cpu(stats.len);
4766 
4767         j = 0;
4768 	for(i=0; statsLabels[i]!=(char *)-1 && i*4<len; i++) {
4769 		if (!statsLabels[i]) continue;
4770 		if (j+strlen(statsLabels[i])+16>4096) {
4771 			airo_print_warn(apriv->dev->name,
4772 			       "Potentially disastrous buffer overflow averted!");
4773 			break;
4774 		}
4775 		j+=sprintf(data->rbuffer+j, "%s: %u\n", statsLabels[i],
4776 				le32_to_cpu(vals[i]));
4777 	}
4778 	if (i*4 >= len) {
4779 		airo_print_warn(apriv->dev->name, "Got a short rid");
4780 	}
4781 	data->readlen = j;
4782 	return 0;
4783 }
4784 
get_dec_u16(char * buffer,int * start,int limit)4785 static int get_dec_u16( char *buffer, int *start, int limit ) {
4786 	u16 value;
4787 	int valid = 0;
4788 	for (value = 0; *start < limit && buffer[*start] >= '0' &&
4789 			buffer[*start] <= '9'; (*start)++) {
4790 		valid = 1;
4791 		value *= 10;
4792 		value += buffer[*start] - '0';
4793 	}
4794 	if ( !valid ) return -1;
4795 	return value;
4796 }
4797 
4798 static int airo_config_commit(struct net_device *dev,
4799 			      struct iw_request_info *info, void *zwrq,
4800 			      char *extra);
4801 
sniffing_mode(struct airo_info * ai)4802 static inline int sniffing_mode(struct airo_info *ai)
4803 {
4804 	return (le16_to_cpu(ai->config.rmode) & le16_to_cpu(RXMODE_MASK)) >=
4805 		le16_to_cpu(RXMODE_RFMON);
4806 }
4807 
proc_config_on_close(struct inode * inode,struct file * file)4808 static void proc_config_on_close(struct inode *inode, struct file *file)
4809 {
4810 	struct proc_data *data = file->private_data;
4811 	struct proc_dir_entry *dp = PDE(inode);
4812 	struct net_device *dev = dp->data;
4813 	struct airo_info *ai = dev->ml_priv;
4814 	char *line;
4815 
4816 	if ( !data->writelen ) return;
4817 
4818 	readConfigRid(ai, 1);
4819 	set_bit (FLAG_COMMIT, &ai->flags);
4820 
4821 	line = data->wbuffer;
4822 	while( line[0] ) {
4823 /*** Mode processing */
4824 		if ( !strncmp( line, "Mode: ", 6 ) ) {
4825 			line += 6;
4826 			if (sniffing_mode(ai))
4827 				set_bit (FLAG_RESET, &ai->flags);
4828 			ai->config.rmode &= ~RXMODE_FULL_MASK;
4829 			clear_bit (FLAG_802_11, &ai->flags);
4830 			ai->config.opmode &= ~MODE_CFG_MASK;
4831 			ai->config.scanMode = SCANMODE_ACTIVE;
4832 			if ( line[0] == 'a' ) {
4833 				ai->config.opmode |= MODE_STA_IBSS;
4834 			} else {
4835 				ai->config.opmode |= MODE_STA_ESS;
4836 				if ( line[0] == 'r' ) {
4837 					ai->config.rmode |= RXMODE_RFMON | RXMODE_DISABLE_802_3_HEADER;
4838 					ai->config.scanMode = SCANMODE_PASSIVE;
4839 					set_bit (FLAG_802_11, &ai->flags);
4840 				} else if ( line[0] == 'y' ) {
4841 					ai->config.rmode |= RXMODE_RFMON_ANYBSS | RXMODE_DISABLE_802_3_HEADER;
4842 					ai->config.scanMode = SCANMODE_PASSIVE;
4843 					set_bit (FLAG_802_11, &ai->flags);
4844 				} else if ( line[0] == 'l' )
4845 					ai->config.rmode |= RXMODE_LANMON;
4846 			}
4847 			set_bit (FLAG_COMMIT, &ai->flags);
4848 		}
4849 
4850 /*** Radio status */
4851 		else if (!strncmp(line,"Radio: ", 7)) {
4852 			line += 7;
4853 			if (!strncmp(line,"off",3)) {
4854 				set_bit (FLAG_RADIO_OFF, &ai->flags);
4855 			} else {
4856 				clear_bit (FLAG_RADIO_OFF, &ai->flags);
4857 			}
4858 		}
4859 /*** NodeName processing */
4860 		else if ( !strncmp( line, "NodeName: ", 10 ) ) {
4861 			int j;
4862 
4863 			line += 10;
4864 			memset( ai->config.nodeName, 0, 16 );
4865 /* Do the name, assume a space between the mode and node name */
4866 			for( j = 0; j < 16 && line[j] != '\n'; j++ ) {
4867 				ai->config.nodeName[j] = line[j];
4868 			}
4869 			set_bit (FLAG_COMMIT, &ai->flags);
4870 		}
4871 
4872 /*** PowerMode processing */
4873 		else if ( !strncmp( line, "PowerMode: ", 11 ) ) {
4874 			line += 11;
4875 			if ( !strncmp( line, "PSPCAM", 6 ) ) {
4876 				ai->config.powerSaveMode = POWERSAVE_PSPCAM;
4877 				set_bit (FLAG_COMMIT, &ai->flags);
4878 			} else if ( !strncmp( line, "PSP", 3 ) ) {
4879 				ai->config.powerSaveMode = POWERSAVE_PSP;
4880 				set_bit (FLAG_COMMIT, &ai->flags);
4881 			} else {
4882 				ai->config.powerSaveMode = POWERSAVE_CAM;
4883 				set_bit (FLAG_COMMIT, &ai->flags);
4884 			}
4885 		} else if ( !strncmp( line, "DataRates: ", 11 ) ) {
4886 			int v, i = 0, k = 0; /* i is index into line,
4887 						k is index to rates */
4888 
4889 			line += 11;
4890 			while((v = get_dec_u16(line, &i, 3))!=-1) {
4891 				ai->config.rates[k++] = (u8)v;
4892 				line += i + 1;
4893 				i = 0;
4894 			}
4895 			set_bit (FLAG_COMMIT, &ai->flags);
4896 		} else if ( !strncmp( line, "Channel: ", 9 ) ) {
4897 			int v, i = 0;
4898 			line += 9;
4899 			v = get_dec_u16(line, &i, i+3);
4900 			if ( v != -1 ) {
4901 				ai->config.channelSet = cpu_to_le16(v);
4902 				set_bit (FLAG_COMMIT, &ai->flags);
4903 			}
4904 		} else if ( !strncmp( line, "XmitPower: ", 11 ) ) {
4905 			int v, i = 0;
4906 			line += 11;
4907 			v = get_dec_u16(line, &i, i+3);
4908 			if ( v != -1 ) {
4909 				ai->config.txPower = cpu_to_le16(v);
4910 				set_bit (FLAG_COMMIT, &ai->flags);
4911 			}
4912 		} else if ( !strncmp( line, "WEP: ", 5 ) ) {
4913 			line += 5;
4914 			switch( line[0] ) {
4915 			case 's':
4916 				ai->config.authType = AUTH_SHAREDKEY;
4917 				break;
4918 			case 'e':
4919 				ai->config.authType = AUTH_ENCRYPT;
4920 				break;
4921 			default:
4922 				ai->config.authType = AUTH_OPEN;
4923 				break;
4924 			}
4925 			set_bit (FLAG_COMMIT, &ai->flags);
4926 		} else if ( !strncmp( line, "LongRetryLimit: ", 16 ) ) {
4927 			int v, i = 0;
4928 
4929 			line += 16;
4930 			v = get_dec_u16(line, &i, 3);
4931 			v = (v<0) ? 0 : ((v>255) ? 255 : v);
4932 			ai->config.longRetryLimit = cpu_to_le16(v);
4933 			set_bit (FLAG_COMMIT, &ai->flags);
4934 		} else if ( !strncmp( line, "ShortRetryLimit: ", 17 ) ) {
4935 			int v, i = 0;
4936 
4937 			line += 17;
4938 			v = get_dec_u16(line, &i, 3);
4939 			v = (v<0) ? 0 : ((v>255) ? 255 : v);
4940 			ai->config.shortRetryLimit = cpu_to_le16(v);
4941 			set_bit (FLAG_COMMIT, &ai->flags);
4942 		} else if ( !strncmp( line, "RTSThreshold: ", 14 ) ) {
4943 			int v, i = 0;
4944 
4945 			line += 14;
4946 			v = get_dec_u16(line, &i, 4);
4947 			v = (v<0) ? 0 : ((v>AIRO_DEF_MTU) ? AIRO_DEF_MTU : v);
4948 			ai->config.rtsThres = cpu_to_le16(v);
4949 			set_bit (FLAG_COMMIT, &ai->flags);
4950 		} else if ( !strncmp( line, "TXMSDULifetime: ", 16 ) ) {
4951 			int v, i = 0;
4952 
4953 			line += 16;
4954 			v = get_dec_u16(line, &i, 5);
4955 			v = (v<0) ? 0 : v;
4956 			ai->config.txLifetime = cpu_to_le16(v);
4957 			set_bit (FLAG_COMMIT, &ai->flags);
4958 		} else if ( !strncmp( line, "RXMSDULifetime: ", 16 ) ) {
4959 			int v, i = 0;
4960 
4961 			line += 16;
4962 			v = get_dec_u16(line, &i, 5);
4963 			v = (v<0) ? 0 : v;
4964 			ai->config.rxLifetime = cpu_to_le16(v);
4965 			set_bit (FLAG_COMMIT, &ai->flags);
4966 		} else if ( !strncmp( line, "TXDiversity: ", 13 ) ) {
4967 			ai->config.txDiversity =
4968 				(line[13]=='l') ? 1 :
4969 				((line[13]=='r')? 2: 3);
4970 			set_bit (FLAG_COMMIT, &ai->flags);
4971 		} else if ( !strncmp( line, "RXDiversity: ", 13 ) ) {
4972 			ai->config.rxDiversity =
4973 				(line[13]=='l') ? 1 :
4974 				((line[13]=='r')? 2: 3);
4975 			set_bit (FLAG_COMMIT, &ai->flags);
4976 		} else if ( !strncmp( line, "FragThreshold: ", 15 ) ) {
4977 			int v, i = 0;
4978 
4979 			line += 15;
4980 			v = get_dec_u16(line, &i, 4);
4981 			v = (v<256) ? 256 : ((v>AIRO_DEF_MTU) ? AIRO_DEF_MTU : v);
4982 			v = v & 0xfffe; /* Make sure its even */
4983 			ai->config.fragThresh = cpu_to_le16(v);
4984 			set_bit (FLAG_COMMIT, &ai->flags);
4985 		} else if (!strncmp(line, "Modulation: ", 12)) {
4986 			line += 12;
4987 			switch(*line) {
4988 			case 'd':  ai->config.modulation=MOD_DEFAULT; set_bit(FLAG_COMMIT, &ai->flags); break;
4989 			case 'c':  ai->config.modulation=MOD_CCK; set_bit(FLAG_COMMIT, &ai->flags); break;
4990 			case 'm':  ai->config.modulation=MOD_MOK; set_bit(FLAG_COMMIT, &ai->flags); break;
4991 			default: airo_print_warn(ai->dev->name, "Unknown modulation");
4992 			}
4993 		} else if (!strncmp(line, "Preamble: ", 10)) {
4994 			line += 10;
4995 			switch(*line) {
4996 			case 'a': ai->config.preamble=PREAMBLE_AUTO; set_bit(FLAG_COMMIT, &ai->flags); break;
4997 			case 'l': ai->config.preamble=PREAMBLE_LONG; set_bit(FLAG_COMMIT, &ai->flags); break;
4998 			case 's': ai->config.preamble=PREAMBLE_SHORT; set_bit(FLAG_COMMIT, &ai->flags); break;
4999 			default: airo_print_warn(ai->dev->name, "Unknown preamble");
5000 			}
5001 		} else {
5002 			airo_print_warn(ai->dev->name, "Couldn't figure out %s", line);
5003 		}
5004 		while( line[0] && line[0] != '\n' ) line++;
5005 		if ( line[0] ) line++;
5006 	}
5007 	airo_config_commit(dev, NULL, NULL, NULL);
5008 }
5009 
get_rmode(__le16 mode)5010 static const char *get_rmode(__le16 mode)
5011 {
5012         switch(mode & RXMODE_MASK) {
5013         case RXMODE_RFMON:  return "rfmon";
5014         case RXMODE_RFMON_ANYBSS:  return "yna (any) bss rfmon";
5015         case RXMODE_LANMON:  return "lanmon";
5016         }
5017         return "ESS";
5018 }
5019 
proc_config_open(struct inode * inode,struct file * file)5020 static int proc_config_open(struct inode *inode, struct file *file)
5021 {
5022 	struct proc_data *data;
5023 	struct proc_dir_entry *dp = PDE(inode);
5024 	struct net_device *dev = dp->data;
5025 	struct airo_info *ai = dev->ml_priv;
5026 	int i;
5027 	__le16 mode;
5028 
5029 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
5030 		return -ENOMEM;
5031 	data = file->private_data;
5032 	if ((data->rbuffer = kmalloc( 2048, GFP_KERNEL )) == NULL) {
5033 		kfree (file->private_data);
5034 		return -ENOMEM;
5035 	}
5036 	if ((data->wbuffer = kzalloc( 2048, GFP_KERNEL )) == NULL) {
5037 		kfree (data->rbuffer);
5038 		kfree (file->private_data);
5039 		return -ENOMEM;
5040 	}
5041 	data->maxwritelen = 2048;
5042 	data->on_close = proc_config_on_close;
5043 
5044 	readConfigRid(ai, 1);
5045 
5046 	mode = ai->config.opmode & MODE_CFG_MASK;
5047 	i = sprintf( data->rbuffer,
5048 		     "Mode: %s\n"
5049 		     "Radio: %s\n"
5050 		     "NodeName: %-16s\n"
5051 		     "PowerMode: %s\n"
5052 		     "DataRates: %d %d %d %d %d %d %d %d\n"
5053 		     "Channel: %d\n"
5054 		     "XmitPower: %d\n",
5055 		     mode == MODE_STA_IBSS ? "adhoc" :
5056 		     mode == MODE_STA_ESS ? get_rmode(ai->config.rmode):
5057 		     mode == MODE_AP ? "AP" :
5058 		     mode == MODE_AP_RPTR ? "AP RPTR" : "Error",
5059 		     test_bit(FLAG_RADIO_OFF, &ai->flags) ? "off" : "on",
5060 		     ai->config.nodeName,
5061 		     ai->config.powerSaveMode == POWERSAVE_CAM ? "CAM" :
5062 		     ai->config.powerSaveMode == POWERSAVE_PSP ? "PSP" :
5063 		     ai->config.powerSaveMode == POWERSAVE_PSPCAM ? "PSPCAM" :
5064 		     "Error",
5065 		     (int)ai->config.rates[0],
5066 		     (int)ai->config.rates[1],
5067 		     (int)ai->config.rates[2],
5068 		     (int)ai->config.rates[3],
5069 		     (int)ai->config.rates[4],
5070 		     (int)ai->config.rates[5],
5071 		     (int)ai->config.rates[6],
5072 		     (int)ai->config.rates[7],
5073 		     le16_to_cpu(ai->config.channelSet),
5074 		     le16_to_cpu(ai->config.txPower)
5075 		);
5076 	sprintf( data->rbuffer + i,
5077 		 "LongRetryLimit: %d\n"
5078 		 "ShortRetryLimit: %d\n"
5079 		 "RTSThreshold: %d\n"
5080 		 "TXMSDULifetime: %d\n"
5081 		 "RXMSDULifetime: %d\n"
5082 		 "TXDiversity: %s\n"
5083 		 "RXDiversity: %s\n"
5084 		 "FragThreshold: %d\n"
5085 		 "WEP: %s\n"
5086 		 "Modulation: %s\n"
5087 		 "Preamble: %s\n",
5088 		 le16_to_cpu(ai->config.longRetryLimit),
5089 		 le16_to_cpu(ai->config.shortRetryLimit),
5090 		 le16_to_cpu(ai->config.rtsThres),
5091 		 le16_to_cpu(ai->config.txLifetime),
5092 		 le16_to_cpu(ai->config.rxLifetime),
5093 		 ai->config.txDiversity == 1 ? "left" :
5094 		 ai->config.txDiversity == 2 ? "right" : "both",
5095 		 ai->config.rxDiversity == 1 ? "left" :
5096 		 ai->config.rxDiversity == 2 ? "right" : "both",
5097 		 le16_to_cpu(ai->config.fragThresh),
5098 		 ai->config.authType == AUTH_ENCRYPT ? "encrypt" :
5099 		 ai->config.authType == AUTH_SHAREDKEY ? "shared" : "open",
5100 		 ai->config.modulation == MOD_DEFAULT ? "default" :
5101 		 ai->config.modulation == MOD_CCK ? "cck" :
5102 		 ai->config.modulation == MOD_MOK ? "mok" : "error",
5103 		 ai->config.preamble == PREAMBLE_AUTO ? "auto" :
5104 		 ai->config.preamble == PREAMBLE_LONG ? "long" :
5105 		 ai->config.preamble == PREAMBLE_SHORT ? "short" : "error"
5106 		);
5107 	data->readlen = strlen( data->rbuffer );
5108 	return 0;
5109 }
5110 
proc_SSID_on_close(struct inode * inode,struct file * file)5111 static void proc_SSID_on_close(struct inode *inode, struct file *file)
5112 {
5113 	struct proc_data *data = file->private_data;
5114 	struct proc_dir_entry *dp = PDE(inode);
5115 	struct net_device *dev = dp->data;
5116 	struct airo_info *ai = dev->ml_priv;
5117 	SsidRid SSID_rid;
5118 	int i;
5119 	char *p = data->wbuffer;
5120 	char *end = p + data->writelen;
5121 
5122 	if (!data->writelen)
5123 		return;
5124 
5125 	*end = '\n'; /* sentinel; we have space for it */
5126 
5127 	memset(&SSID_rid, 0, sizeof(SSID_rid));
5128 
5129 	for (i = 0; i < 3 && p < end; i++) {
5130 		int j = 0;
5131 		/* copy up to 32 characters from this line */
5132 		while (*p != '\n' && j < 32)
5133 			SSID_rid.ssids[i].ssid[j++] = *p++;
5134 		if (j == 0)
5135 			break;
5136 		SSID_rid.ssids[i].len = cpu_to_le16(j);
5137 		/* skip to the beginning of the next line */
5138 		while (*p++ != '\n')
5139 			;
5140 	}
5141 	if (i)
5142 		SSID_rid.len = cpu_to_le16(sizeof(SSID_rid));
5143 	disable_MAC(ai, 1);
5144 	writeSsidRid(ai, &SSID_rid, 1);
5145 	enable_MAC(ai, 1);
5146 }
5147 
proc_APList_on_close(struct inode * inode,struct file * file)5148 static void proc_APList_on_close( struct inode *inode, struct file *file ) {
5149 	struct proc_data *data = file->private_data;
5150 	struct proc_dir_entry *dp = PDE(inode);
5151 	struct net_device *dev = dp->data;
5152 	struct airo_info *ai = dev->ml_priv;
5153 	APListRid APList_rid;
5154 	int i;
5155 
5156 	if ( !data->writelen ) return;
5157 
5158 	memset( &APList_rid, 0, sizeof(APList_rid) );
5159 	APList_rid.len = cpu_to_le16(sizeof(APList_rid));
5160 
5161 	for( i = 0; i < 4 && data->writelen >= (i+1)*6*3; i++ ) {
5162 		int j;
5163 		for( j = 0; j < 6*3 && data->wbuffer[j+i*6*3]; j++ ) {
5164 			switch(j%3) {
5165 			case 0:
5166 				APList_rid.ap[i][j/3]=
5167 					hex_to_bin(data->wbuffer[j+i*6*3])<<4;
5168 				break;
5169 			case 1:
5170 				APList_rid.ap[i][j/3]|=
5171 					hex_to_bin(data->wbuffer[j+i*6*3]);
5172 				break;
5173 			}
5174 		}
5175 	}
5176 	disable_MAC(ai, 1);
5177 	writeAPListRid(ai, &APList_rid, 1);
5178 	enable_MAC(ai, 1);
5179 }
5180 
5181 /* This function wraps PC4500_writerid with a MAC disable */
do_writerid(struct airo_info * ai,u16 rid,const void * rid_data,int len,int dummy)5182 static int do_writerid( struct airo_info *ai, u16 rid, const void *rid_data,
5183 			int len, int dummy ) {
5184 	int rc;
5185 
5186 	disable_MAC(ai, 1);
5187 	rc = PC4500_writerid(ai, rid, rid_data, len, 1);
5188 	enable_MAC(ai, 1);
5189 	return rc;
5190 }
5191 
5192 /* Returns the WEP key at the specified index, or -1 if that key does
5193  * not exist.  The buffer is assumed to be at least 16 bytes in length.
5194  */
get_wep_key(struct airo_info * ai,u16 index,char * buf,u16 buflen)5195 static int get_wep_key(struct airo_info *ai, u16 index, char *buf, u16 buflen)
5196 {
5197 	WepKeyRid wkr;
5198 	int rc;
5199 	__le16 lastindex;
5200 
5201 	rc = readWepKeyRid(ai, &wkr, 1, 1);
5202 	if (rc != SUCCESS)
5203 		return -1;
5204 	do {
5205 		lastindex = wkr.kindex;
5206 		if (le16_to_cpu(wkr.kindex) == index) {
5207 			int klen = min_t(int, buflen, le16_to_cpu(wkr.klen));
5208 			memcpy(buf, wkr.key, klen);
5209 			return klen;
5210 		}
5211 		rc = readWepKeyRid(ai, &wkr, 0, 1);
5212 		if (rc != SUCCESS)
5213 			return -1;
5214 	} while (lastindex != wkr.kindex);
5215 	return -1;
5216 }
5217 
get_wep_tx_idx(struct airo_info * ai)5218 static int get_wep_tx_idx(struct airo_info *ai)
5219 {
5220 	WepKeyRid wkr;
5221 	int rc;
5222 	__le16 lastindex;
5223 
5224 	rc = readWepKeyRid(ai, &wkr, 1, 1);
5225 	if (rc != SUCCESS)
5226 		return -1;
5227 	do {
5228 		lastindex = wkr.kindex;
5229 		if (wkr.kindex == cpu_to_le16(0xffff))
5230 			return wkr.mac[0];
5231 		rc = readWepKeyRid(ai, &wkr, 0, 1);
5232 		if (rc != SUCCESS)
5233 			return -1;
5234 	} while (lastindex != wkr.kindex);
5235 	return -1;
5236 }
5237 
set_wep_key(struct airo_info * ai,u16 index,const char * key,u16 keylen,int perm,int lock)5238 static int set_wep_key(struct airo_info *ai, u16 index, const char *key,
5239 		       u16 keylen, int perm, int lock)
5240 {
5241 	static const unsigned char macaddr[ETH_ALEN] = { 0x01, 0, 0, 0, 0, 0 };
5242 	WepKeyRid wkr;
5243 	int rc;
5244 
5245 	if (WARN_ON(keylen == 0))
5246 		return -1;
5247 
5248 	memset(&wkr, 0, sizeof(wkr));
5249 	wkr.len = cpu_to_le16(sizeof(wkr));
5250 	wkr.kindex = cpu_to_le16(index);
5251 	wkr.klen = cpu_to_le16(keylen);
5252 	memcpy(wkr.key, key, keylen);
5253 	memcpy(wkr.mac, macaddr, ETH_ALEN);
5254 
5255 	if (perm) disable_MAC(ai, lock);
5256 	rc = writeWepKeyRid(ai, &wkr, perm, lock);
5257 	if (perm) enable_MAC(ai, lock);
5258 	return rc;
5259 }
5260 
set_wep_tx_idx(struct airo_info * ai,u16 index,int perm,int lock)5261 static int set_wep_tx_idx(struct airo_info *ai, u16 index, int perm, int lock)
5262 {
5263 	WepKeyRid wkr;
5264 	int rc;
5265 
5266 	memset(&wkr, 0, sizeof(wkr));
5267 	wkr.len = cpu_to_le16(sizeof(wkr));
5268 	wkr.kindex = cpu_to_le16(0xffff);
5269 	wkr.mac[0] = (char)index;
5270 
5271 	if (perm) {
5272 		ai->defindex = (char)index;
5273 		disable_MAC(ai, lock);
5274 	}
5275 
5276 	rc = writeWepKeyRid(ai, &wkr, perm, lock);
5277 
5278 	if (perm)
5279 		enable_MAC(ai, lock);
5280 	return rc;
5281 }
5282 
proc_wepkey_on_close(struct inode * inode,struct file * file)5283 static void proc_wepkey_on_close( struct inode *inode, struct file *file ) {
5284 	struct proc_data *data;
5285 	struct proc_dir_entry *dp = PDE(inode);
5286 	struct net_device *dev = dp->data;
5287 	struct airo_info *ai = dev->ml_priv;
5288 	int i, rc;
5289 	char key[16];
5290 	u16 index = 0;
5291 	int j = 0;
5292 
5293 	memset(key, 0, sizeof(key));
5294 
5295 	data = file->private_data;
5296 	if ( !data->writelen ) return;
5297 
5298 	if (data->wbuffer[0] >= '0' && data->wbuffer[0] <= '3' &&
5299 	    (data->wbuffer[1] == ' ' || data->wbuffer[1] == '\n')) {
5300 		index = data->wbuffer[0] - '0';
5301 		if (data->wbuffer[1] == '\n') {
5302 			rc = set_wep_tx_idx(ai, index, 1, 1);
5303 			if (rc < 0) {
5304 				airo_print_err(ai->dev->name, "failed to set "
5305 				               "WEP transmit index to %d: %d.",
5306 				               index, rc);
5307 			}
5308 			return;
5309 		}
5310 		j = 2;
5311 	} else {
5312 		airo_print_err(ai->dev->name, "WepKey passed invalid key index");
5313 		return;
5314 	}
5315 
5316 	for( i = 0; i < 16*3 && data->wbuffer[i+j]; i++ ) {
5317 		switch(i%3) {
5318 		case 0:
5319 			key[i/3] = hex_to_bin(data->wbuffer[i+j])<<4;
5320 			break;
5321 		case 1:
5322 			key[i/3] |= hex_to_bin(data->wbuffer[i+j]);
5323 			break;
5324 		}
5325 	}
5326 
5327 	rc = set_wep_key(ai, index, key, i/3, 1, 1);
5328 	if (rc < 0) {
5329 		airo_print_err(ai->dev->name, "failed to set WEP key at index "
5330 		               "%d: %d.", index, rc);
5331 	}
5332 }
5333 
proc_wepkey_open(struct inode * inode,struct file * file)5334 static int proc_wepkey_open( struct inode *inode, struct file *file )
5335 {
5336 	struct proc_data *data;
5337 	struct proc_dir_entry *dp = PDE(inode);
5338 	struct net_device *dev = dp->data;
5339 	struct airo_info *ai = dev->ml_priv;
5340 	char *ptr;
5341 	WepKeyRid wkr;
5342 	__le16 lastindex;
5343 	int j=0;
5344 	int rc;
5345 
5346 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
5347 		return -ENOMEM;
5348 	memset(&wkr, 0, sizeof(wkr));
5349 	data = file->private_data;
5350 	if ((data->rbuffer = kzalloc( 180, GFP_KERNEL )) == NULL) {
5351 		kfree (file->private_data);
5352 		return -ENOMEM;
5353 	}
5354 	data->writelen = 0;
5355 	data->maxwritelen = 80;
5356 	if ((data->wbuffer = kzalloc( 80, GFP_KERNEL )) == NULL) {
5357 		kfree (data->rbuffer);
5358 		kfree (file->private_data);
5359 		return -ENOMEM;
5360 	}
5361 	data->on_close = proc_wepkey_on_close;
5362 
5363 	ptr = data->rbuffer;
5364 	strcpy(ptr, "No wep keys\n");
5365 	rc = readWepKeyRid(ai, &wkr, 1, 1);
5366 	if (rc == SUCCESS) do {
5367 		lastindex = wkr.kindex;
5368 		if (wkr.kindex == cpu_to_le16(0xffff)) {
5369 			j += sprintf(ptr+j, "Tx key = %d\n",
5370 				     (int)wkr.mac[0]);
5371 		} else {
5372 			j += sprintf(ptr+j, "Key %d set with length = %d\n",
5373 				     le16_to_cpu(wkr.kindex),
5374 				     le16_to_cpu(wkr.klen));
5375 		}
5376 		readWepKeyRid(ai, &wkr, 0, 1);
5377 	} while((lastindex != wkr.kindex) && (j < 180-30));
5378 
5379 	data->readlen = strlen( data->rbuffer );
5380 	return 0;
5381 }
5382 
proc_SSID_open(struct inode * inode,struct file * file)5383 static int proc_SSID_open(struct inode *inode, struct file *file)
5384 {
5385 	struct proc_data *data;
5386 	struct proc_dir_entry *dp = PDE(inode);
5387 	struct net_device *dev = dp->data;
5388 	struct airo_info *ai = dev->ml_priv;
5389 	int i;
5390 	char *ptr;
5391 	SsidRid SSID_rid;
5392 
5393 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
5394 		return -ENOMEM;
5395 	data = file->private_data;
5396 	if ((data->rbuffer = kmalloc( 104, GFP_KERNEL )) == NULL) {
5397 		kfree (file->private_data);
5398 		return -ENOMEM;
5399 	}
5400 	data->writelen = 0;
5401 	data->maxwritelen = 33*3;
5402 	/* allocate maxwritelen + 1; we'll want a sentinel */
5403 	if ((data->wbuffer = kzalloc(33*3 + 1, GFP_KERNEL)) == NULL) {
5404 		kfree (data->rbuffer);
5405 		kfree (file->private_data);
5406 		return -ENOMEM;
5407 	}
5408 	data->on_close = proc_SSID_on_close;
5409 
5410 	readSsidRid(ai, &SSID_rid);
5411 	ptr = data->rbuffer;
5412 	for (i = 0; i < 3; i++) {
5413 		int j;
5414 		size_t len = le16_to_cpu(SSID_rid.ssids[i].len);
5415 		if (!len)
5416 			break;
5417 		if (len > 32)
5418 			len = 32;
5419 		for (j = 0; j < len && SSID_rid.ssids[i].ssid[j]; j++)
5420 			*ptr++ = SSID_rid.ssids[i].ssid[j];
5421 		*ptr++ = '\n';
5422 	}
5423 	*ptr = '\0';
5424 	data->readlen = strlen( data->rbuffer );
5425 	return 0;
5426 }
5427 
proc_APList_open(struct inode * inode,struct file * file)5428 static int proc_APList_open( struct inode *inode, struct file *file ) {
5429 	struct proc_data *data;
5430 	struct proc_dir_entry *dp = PDE(inode);
5431 	struct net_device *dev = dp->data;
5432 	struct airo_info *ai = dev->ml_priv;
5433 	int i;
5434 	char *ptr;
5435 	APListRid APList_rid;
5436 
5437 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
5438 		return -ENOMEM;
5439 	data = file->private_data;
5440 	if ((data->rbuffer = kmalloc( 104, GFP_KERNEL )) == NULL) {
5441 		kfree (file->private_data);
5442 		return -ENOMEM;
5443 	}
5444 	data->writelen = 0;
5445 	data->maxwritelen = 4*6*3;
5446 	if ((data->wbuffer = kzalloc( data->maxwritelen, GFP_KERNEL )) == NULL) {
5447 		kfree (data->rbuffer);
5448 		kfree (file->private_data);
5449 		return -ENOMEM;
5450 	}
5451 	data->on_close = proc_APList_on_close;
5452 
5453 	readAPListRid(ai, &APList_rid);
5454 	ptr = data->rbuffer;
5455 	for( i = 0; i < 4; i++ ) {
5456 // We end when we find a zero MAC
5457 		if ( !*(int*)APList_rid.ap[i] &&
5458 		     !*(int*)&APList_rid.ap[i][2]) break;
5459 		ptr += sprintf(ptr, "%pM\n", APList_rid.ap[i]);
5460 	}
5461 	if (i==0) ptr += sprintf(ptr, "Not using specific APs\n");
5462 
5463 	*ptr = '\0';
5464 	data->readlen = strlen( data->rbuffer );
5465 	return 0;
5466 }
5467 
proc_BSSList_open(struct inode * inode,struct file * file)5468 static int proc_BSSList_open( struct inode *inode, struct file *file ) {
5469 	struct proc_data *data;
5470 	struct proc_dir_entry *dp = PDE(inode);
5471 	struct net_device *dev = dp->data;
5472 	struct airo_info *ai = dev->ml_priv;
5473 	char *ptr;
5474 	BSSListRid BSSList_rid;
5475 	int rc;
5476 	/* If doLoseSync is not 1, we won't do a Lose Sync */
5477 	int doLoseSync = -1;
5478 
5479 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
5480 		return -ENOMEM;
5481 	data = file->private_data;
5482 	if ((data->rbuffer = kmalloc( 1024, GFP_KERNEL )) == NULL) {
5483 		kfree (file->private_data);
5484 		return -ENOMEM;
5485 	}
5486 	data->writelen = 0;
5487 	data->maxwritelen = 0;
5488 	data->wbuffer = NULL;
5489 	data->on_close = NULL;
5490 
5491 	if (file->f_mode & FMODE_WRITE) {
5492 		if (!(file->f_mode & FMODE_READ)) {
5493 			Cmd cmd;
5494 			Resp rsp;
5495 
5496 			if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN;
5497 			memset(&cmd, 0, sizeof(cmd));
5498 			cmd.cmd=CMD_LISTBSS;
5499 			if (down_interruptible(&ai->sem))
5500 				return -ERESTARTSYS;
5501 			issuecommand(ai, &cmd, &rsp);
5502 			up(&ai->sem);
5503 			data->readlen = 0;
5504 			return 0;
5505 		}
5506 		doLoseSync = 1;
5507 	}
5508 	ptr = data->rbuffer;
5509 	/* There is a race condition here if there are concurrent opens.
5510            Since it is a rare condition, we'll just live with it, otherwise
5511            we have to add a spin lock... */
5512 	rc = readBSSListRid(ai, doLoseSync, &BSSList_rid);
5513 	while(rc == 0 && BSSList_rid.index != cpu_to_le16(0xffff)) {
5514 		ptr += sprintf(ptr, "%pM %*s rssi = %d",
5515 			       BSSList_rid.bssid,
5516 				(int)BSSList_rid.ssidLen,
5517 				BSSList_rid.ssid,
5518 				le16_to_cpu(BSSList_rid.dBm));
5519 		ptr += sprintf(ptr, " channel = %d %s %s %s %s\n",
5520 				le16_to_cpu(BSSList_rid.dsChannel),
5521 				BSSList_rid.cap & CAP_ESS ? "ESS" : "",
5522 				BSSList_rid.cap & CAP_IBSS ? "adhoc" : "",
5523 				BSSList_rid.cap & CAP_PRIVACY ? "wep" : "",
5524 				BSSList_rid.cap & CAP_SHORTHDR ? "shorthdr" : "");
5525 		rc = readBSSListRid(ai, 0, &BSSList_rid);
5526 	}
5527 	*ptr = '\0';
5528 	data->readlen = strlen( data->rbuffer );
5529 	return 0;
5530 }
5531 
proc_close(struct inode * inode,struct file * file)5532 static int proc_close( struct inode *inode, struct file *file )
5533 {
5534 	struct proc_data *data = file->private_data;
5535 
5536 	if (data->on_close != NULL)
5537 		data->on_close(inode, file);
5538 	kfree(data->rbuffer);
5539 	kfree(data->wbuffer);
5540 	kfree(data);
5541 	return 0;
5542 }
5543 
5544 /* Since the card doesn't automatically switch to the right WEP mode,
5545    we will make it do it.  If the card isn't associated, every secs we
5546    will switch WEP modes to see if that will help.  If the card is
5547    associated we will check every minute to see if anything has
5548    changed. */
timer_func(struct net_device * dev)5549 static void timer_func( struct net_device *dev ) {
5550 	struct airo_info *apriv = dev->ml_priv;
5551 
5552 /* We don't have a link so try changing the authtype */
5553 	readConfigRid(apriv, 0);
5554 	disable_MAC(apriv, 0);
5555 	switch(apriv->config.authType) {
5556 		case AUTH_ENCRYPT:
5557 /* So drop to OPEN */
5558 			apriv->config.authType = AUTH_OPEN;
5559 			break;
5560 		case AUTH_SHAREDKEY:
5561 			if (apriv->keyindex < auto_wep) {
5562 				set_wep_tx_idx(apriv, apriv->keyindex, 0, 0);
5563 				apriv->config.authType = AUTH_SHAREDKEY;
5564 				apriv->keyindex++;
5565 			} else {
5566 			        /* Drop to ENCRYPT */
5567 				apriv->keyindex = 0;
5568 				set_wep_tx_idx(apriv, apriv->defindex, 0, 0);
5569 				apriv->config.authType = AUTH_ENCRYPT;
5570 			}
5571 			break;
5572 		default:  /* We'll escalate to SHAREDKEY */
5573 			apriv->config.authType = AUTH_SHAREDKEY;
5574 	}
5575 	set_bit (FLAG_COMMIT, &apriv->flags);
5576 	writeConfigRid(apriv, 0);
5577 	enable_MAC(apriv, 0);
5578 	up(&apriv->sem);
5579 
5580 /* Schedule check to see if the change worked */
5581 	clear_bit(JOB_AUTOWEP, &apriv->jobs);
5582 	apriv->expires = RUN_AT(HZ*3);
5583 }
5584 
5585 #ifdef CONFIG_PCI
airo_pci_probe(struct pci_dev * pdev,const struct pci_device_id * pent)5586 static int __devinit airo_pci_probe(struct pci_dev *pdev,
5587 				    const struct pci_device_id *pent)
5588 {
5589 	struct net_device *dev;
5590 
5591 	if (pci_enable_device(pdev))
5592 		return -ENODEV;
5593 	pci_set_master(pdev);
5594 
5595 	if (pdev->device == 0x5000 || pdev->device == 0xa504)
5596 			dev = _init_airo_card(pdev->irq, pdev->resource[0].start, 0, pdev, &pdev->dev);
5597 	else
5598 			dev = _init_airo_card(pdev->irq, pdev->resource[2].start, 0, pdev, &pdev->dev);
5599 	if (!dev) {
5600 		pci_disable_device(pdev);
5601 		return -ENODEV;
5602 	}
5603 
5604 	pci_set_drvdata(pdev, dev);
5605 	return 0;
5606 }
5607 
airo_pci_remove(struct pci_dev * pdev)5608 static void __devexit airo_pci_remove(struct pci_dev *pdev)
5609 {
5610 	struct net_device *dev = pci_get_drvdata(pdev);
5611 
5612 	airo_print_info(dev->name, "Unregistering...");
5613 	stop_airo_card(dev, 1);
5614 	pci_disable_device(pdev);
5615 	pci_set_drvdata(pdev, NULL);
5616 }
5617 
airo_pci_suspend(struct pci_dev * pdev,pm_message_t state)5618 static int airo_pci_suspend(struct pci_dev *pdev, pm_message_t state)
5619 {
5620 	struct net_device *dev = pci_get_drvdata(pdev);
5621 	struct airo_info *ai = dev->ml_priv;
5622 	Cmd cmd;
5623 	Resp rsp;
5624 
5625 	if (!ai->APList)
5626 		ai->APList = kmalloc(sizeof(APListRid), GFP_KERNEL);
5627 	if (!ai->APList)
5628 		return -ENOMEM;
5629 	if (!ai->SSID)
5630 		ai->SSID = kmalloc(sizeof(SsidRid), GFP_KERNEL);
5631 	if (!ai->SSID)
5632 		return -ENOMEM;
5633 	readAPListRid(ai, ai->APList);
5634 	readSsidRid(ai, ai->SSID);
5635 	memset(&cmd, 0, sizeof(cmd));
5636 	/* the lock will be released at the end of the resume callback */
5637 	if (down_interruptible(&ai->sem))
5638 		return -EAGAIN;
5639 	disable_MAC(ai, 0);
5640 	netif_device_detach(dev);
5641 	ai->power = state;
5642 	cmd.cmd = HOSTSLEEP;
5643 	issuecommand(ai, &cmd, &rsp);
5644 
5645 	pci_enable_wake(pdev, pci_choose_state(pdev, state), 1);
5646 	pci_save_state(pdev);
5647 	pci_set_power_state(pdev, pci_choose_state(pdev, state));
5648 	return 0;
5649 }
5650 
airo_pci_resume(struct pci_dev * pdev)5651 static int airo_pci_resume(struct pci_dev *pdev)
5652 {
5653 	struct net_device *dev = pci_get_drvdata(pdev);
5654 	struct airo_info *ai = dev->ml_priv;
5655 	pci_power_t prev_state = pdev->current_state;
5656 
5657 	pci_set_power_state(pdev, PCI_D0);
5658 	pci_restore_state(pdev);
5659 	pci_enable_wake(pdev, PCI_D0, 0);
5660 
5661 	if (prev_state != PCI_D1) {
5662 		reset_card(dev, 0);
5663 		mpi_init_descriptors(ai);
5664 		setup_card(ai, dev->dev_addr, 0);
5665 		clear_bit(FLAG_RADIO_OFF, &ai->flags);
5666 		clear_bit(FLAG_PENDING_XMIT, &ai->flags);
5667 	} else {
5668 		OUT4500(ai, EVACK, EV_AWAKEN);
5669 		OUT4500(ai, EVACK, EV_AWAKEN);
5670 		msleep(100);
5671 	}
5672 
5673 	set_bit(FLAG_COMMIT, &ai->flags);
5674 	disable_MAC(ai, 0);
5675         msleep(200);
5676 	if (ai->SSID) {
5677 		writeSsidRid(ai, ai->SSID, 0);
5678 		kfree(ai->SSID);
5679 		ai->SSID = NULL;
5680 	}
5681 	if (ai->APList) {
5682 		writeAPListRid(ai, ai->APList, 0);
5683 		kfree(ai->APList);
5684 		ai->APList = NULL;
5685 	}
5686 	writeConfigRid(ai, 0);
5687 	enable_MAC(ai, 0);
5688 	ai->power = PMSG_ON;
5689 	netif_device_attach(dev);
5690 	netif_wake_queue(dev);
5691 	enable_interrupts(ai);
5692 	up(&ai->sem);
5693 	return 0;
5694 }
5695 #endif
5696 
airo_init_module(void)5697 static int __init airo_init_module( void )
5698 {
5699 	int i;
5700 
5701 	airo_entry = proc_mkdir_mode("driver/aironet", airo_perm, NULL);
5702 
5703 	if (airo_entry) {
5704 		airo_entry->uid = proc_uid;
5705 		airo_entry->gid = proc_gid;
5706 	}
5707 
5708 	for (i = 0; i < 4 && io[i] && irq[i]; i++) {
5709 		airo_print_info("", "Trying to configure ISA adapter at irq=%d "
5710 			"io=0x%x", irq[i], io[i] );
5711 		if (init_airo_card( irq[i], io[i], 0, NULL ))
5712 			/* do nothing */ ;
5713 	}
5714 
5715 #ifdef CONFIG_PCI
5716 	airo_print_info("", "Probing for PCI adapters");
5717 	i = pci_register_driver(&airo_driver);
5718 	airo_print_info("", "Finished probing for PCI adapters");
5719 
5720 	if (i) {
5721 		remove_proc_entry("driver/aironet", NULL);
5722 		return i;
5723 	}
5724 #endif
5725 
5726 	/* Always exit with success, as we are a library module
5727 	 * as well as a driver module
5728 	 */
5729 	return 0;
5730 }
5731 
airo_cleanup_module(void)5732 static void __exit airo_cleanup_module( void )
5733 {
5734 	struct airo_info *ai;
5735 	while(!list_empty(&airo_devices)) {
5736 		ai = list_entry(airo_devices.next, struct airo_info, dev_list);
5737 		airo_print_info(ai->dev->name, "Unregistering...");
5738 		stop_airo_card(ai->dev, 1);
5739 	}
5740 #ifdef CONFIG_PCI
5741 	pci_unregister_driver(&airo_driver);
5742 #endif
5743 	remove_proc_entry("driver/aironet", NULL);
5744 }
5745 
5746 /*
5747  * Initial Wireless Extension code for Aironet driver by :
5748  *	Jean Tourrilhes <jt@hpl.hp.com> - HPL - 17 November 00
5749  * Conversion to new driver API by :
5750  *	Jean Tourrilhes <jt@hpl.hp.com> - HPL - 26 March 02
5751  * Javier also did a good amount of work here, adding some new extensions
5752  * and fixing my code. Let's just say that without him this code just
5753  * would not work at all... - Jean II
5754  */
5755 
airo_rssi_to_dbm(tdsRssiEntry * rssi_rid,u8 rssi)5756 static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi)
5757 {
5758 	if (!rssi_rid)
5759 		return 0;
5760 
5761 	return (0x100 - rssi_rid[rssi].rssidBm);
5762 }
5763 
airo_dbm_to_pct(tdsRssiEntry * rssi_rid,u8 dbm)5764 static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm)
5765 {
5766 	int i;
5767 
5768 	if (!rssi_rid)
5769 		return 0;
5770 
5771 	for (i = 0; i < 256; i++)
5772 		if (rssi_rid[i].rssidBm == dbm)
5773 			return rssi_rid[i].rssipct;
5774 
5775 	return 0;
5776 }
5777 
5778 
airo_get_quality(StatusRid * status_rid,CapabilityRid * cap_rid)5779 static int airo_get_quality (StatusRid *status_rid, CapabilityRid *cap_rid)
5780 {
5781 	int quality = 0;
5782 	u16 sq;
5783 
5784 	if ((status_rid->mode & cpu_to_le16(0x3f)) != cpu_to_le16(0x3f))
5785 		return 0;
5786 
5787 	if (!(cap_rid->hardCap & cpu_to_le16(8)))
5788 		return 0;
5789 
5790 	sq = le16_to_cpu(status_rid->signalQuality);
5791 	if (memcmp(cap_rid->prodName, "350", 3))
5792 		if (sq > 0x20)
5793 			quality = 0;
5794 		else
5795 			quality = 0x20 - sq;
5796 	else
5797 		if (sq > 0xb0)
5798 			quality = 0;
5799 		else if (sq < 0x10)
5800 			quality = 0xa0;
5801 		else
5802 			quality = 0xb0 - sq;
5803 	return quality;
5804 }
5805 
5806 #define airo_get_max_quality(cap_rid) (memcmp((cap_rid)->prodName, "350", 3) ? 0x20 : 0xa0)
5807 #define airo_get_avg_quality(cap_rid) (memcmp((cap_rid)->prodName, "350", 3) ? 0x10 : 0x50);
5808 
5809 /*------------------------------------------------------------------*/
5810 /*
5811  * Wireless Handler : get protocol name
5812  */
airo_get_name(struct net_device * dev,struct iw_request_info * info,char * cwrq,char * extra)5813 static int airo_get_name(struct net_device *dev,
5814 			 struct iw_request_info *info,
5815 			 char *cwrq,
5816 			 char *extra)
5817 {
5818 	strcpy(cwrq, "IEEE 802.11-DS");
5819 	return 0;
5820 }
5821 
5822 /*------------------------------------------------------------------*/
5823 /*
5824  * Wireless Handler : set frequency
5825  */
airo_set_freq(struct net_device * dev,struct iw_request_info * info,struct iw_freq * fwrq,char * extra)5826 static int airo_set_freq(struct net_device *dev,
5827 			 struct iw_request_info *info,
5828 			 struct iw_freq *fwrq,
5829 			 char *extra)
5830 {
5831 	struct airo_info *local = dev->ml_priv;
5832 	int rc = -EINPROGRESS;		/* Call commit handler */
5833 
5834 	/* If setting by frequency, convert to a channel */
5835 	if(fwrq->e == 1) {
5836 		int f = fwrq->m / 100000;
5837 
5838 		/* Hack to fall through... */
5839 		fwrq->e = 0;
5840 		fwrq->m = ieee80211_freq_to_dsss_chan(f);
5841 	}
5842 	/* Setting by channel number */
5843 	if((fwrq->m > 1000) || (fwrq->e > 0))
5844 		rc = -EOPNOTSUPP;
5845 	else {
5846 		int channel = fwrq->m;
5847 		/* We should do a better check than that,
5848 		 * based on the card capability !!! */
5849 		if((channel < 1) || (channel > 14)) {
5850 			airo_print_dbg(dev->name, "New channel value of %d is invalid!",
5851 				fwrq->m);
5852 			rc = -EINVAL;
5853 		} else {
5854 			readConfigRid(local, 1);
5855 			/* Yes ! We can set it !!! */
5856 			local->config.channelSet = cpu_to_le16(channel);
5857 			set_bit (FLAG_COMMIT, &local->flags);
5858 		}
5859 	}
5860 	return rc;
5861 }
5862 
5863 /*------------------------------------------------------------------*/
5864 /*
5865  * Wireless Handler : get frequency
5866  */
airo_get_freq(struct net_device * dev,struct iw_request_info * info,struct iw_freq * fwrq,char * extra)5867 static int airo_get_freq(struct net_device *dev,
5868 			 struct iw_request_info *info,
5869 			 struct iw_freq *fwrq,
5870 			 char *extra)
5871 {
5872 	struct airo_info *local = dev->ml_priv;
5873 	StatusRid status_rid;		/* Card status info */
5874 	int ch;
5875 
5876 	readConfigRid(local, 1);
5877 	if ((local->config.opmode & MODE_CFG_MASK) == MODE_STA_ESS)
5878 		status_rid.channel = local->config.channelSet;
5879 	else
5880 		readStatusRid(local, &status_rid, 1);
5881 
5882 	ch = le16_to_cpu(status_rid.channel);
5883 	if((ch > 0) && (ch < 15)) {
5884 		fwrq->m = ieee80211_dsss_chan_to_freq(ch) * 100000;
5885 		fwrq->e = 1;
5886 	} else {
5887 		fwrq->m = ch;
5888 		fwrq->e = 0;
5889 	}
5890 
5891 	return 0;
5892 }
5893 
5894 /*------------------------------------------------------------------*/
5895 /*
5896  * Wireless Handler : set ESSID
5897  */
airo_set_essid(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)5898 static int airo_set_essid(struct net_device *dev,
5899 			  struct iw_request_info *info,
5900 			  struct iw_point *dwrq,
5901 			  char *extra)
5902 {
5903 	struct airo_info *local = dev->ml_priv;
5904 	SsidRid SSID_rid;		/* SSIDs */
5905 
5906 	/* Reload the list of current SSID */
5907 	readSsidRid(local, &SSID_rid);
5908 
5909 	/* Check if we asked for `any' */
5910 	if (dwrq->flags == 0) {
5911 		/* Just send an empty SSID list */
5912 		memset(&SSID_rid, 0, sizeof(SSID_rid));
5913 	} else {
5914 		unsigned index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
5915 
5916 		/* Check the size of the string */
5917 		if (dwrq->length > IW_ESSID_MAX_SIZE)
5918 			return -E2BIG ;
5919 
5920 		/* Check if index is valid */
5921 		if (index >= ARRAY_SIZE(SSID_rid.ssids))
5922 			return -EINVAL;
5923 
5924 		/* Set the SSID */
5925 		memset(SSID_rid.ssids[index].ssid, 0,
5926 		       sizeof(SSID_rid.ssids[index].ssid));
5927 		memcpy(SSID_rid.ssids[index].ssid, extra, dwrq->length);
5928 		SSID_rid.ssids[index].len = cpu_to_le16(dwrq->length);
5929 	}
5930 	SSID_rid.len = cpu_to_le16(sizeof(SSID_rid));
5931 	/* Write it to the card */
5932 	disable_MAC(local, 1);
5933 	writeSsidRid(local, &SSID_rid, 1);
5934 	enable_MAC(local, 1);
5935 
5936 	return 0;
5937 }
5938 
5939 /*------------------------------------------------------------------*/
5940 /*
5941  * Wireless Handler : get ESSID
5942  */
airo_get_essid(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)5943 static int airo_get_essid(struct net_device *dev,
5944 			  struct iw_request_info *info,
5945 			  struct iw_point *dwrq,
5946 			  char *extra)
5947 {
5948 	struct airo_info *local = dev->ml_priv;
5949 	StatusRid status_rid;		/* Card status info */
5950 
5951 	readStatusRid(local, &status_rid, 1);
5952 
5953 	/* Note : if dwrq->flags != 0, we should
5954 	 * get the relevant SSID from the SSID list... */
5955 
5956 	/* Get the current SSID */
5957 	memcpy(extra, status_rid.SSID, le16_to_cpu(status_rid.SSIDlen));
5958 	/* If none, we may want to get the one that was set */
5959 
5960 	/* Push it out ! */
5961 	dwrq->length = le16_to_cpu(status_rid.SSIDlen);
5962 	dwrq->flags = 1; /* active */
5963 
5964 	return 0;
5965 }
5966 
5967 /*------------------------------------------------------------------*/
5968 /*
5969  * Wireless Handler : set AP address
5970  */
airo_set_wap(struct net_device * dev,struct iw_request_info * info,struct sockaddr * awrq,char * extra)5971 static int airo_set_wap(struct net_device *dev,
5972 			struct iw_request_info *info,
5973 			struct sockaddr *awrq,
5974 			char *extra)
5975 {
5976 	struct airo_info *local = dev->ml_priv;
5977 	Cmd cmd;
5978 	Resp rsp;
5979 	APListRid APList_rid;
5980 	static const u8 any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
5981 	static const u8 off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
5982 
5983 	if (awrq->sa_family != ARPHRD_ETHER)
5984 		return -EINVAL;
5985 	else if (!memcmp(any, awrq->sa_data, ETH_ALEN) ||
5986 	         !memcmp(off, awrq->sa_data, ETH_ALEN)) {
5987 		memset(&cmd, 0, sizeof(cmd));
5988 		cmd.cmd=CMD_LOSE_SYNC;
5989 		if (down_interruptible(&local->sem))
5990 			return -ERESTARTSYS;
5991 		issuecommand(local, &cmd, &rsp);
5992 		up(&local->sem);
5993 	} else {
5994 		memset(&APList_rid, 0, sizeof(APList_rid));
5995 		APList_rid.len = cpu_to_le16(sizeof(APList_rid));
5996 		memcpy(APList_rid.ap[0], awrq->sa_data, ETH_ALEN);
5997 		disable_MAC(local, 1);
5998 		writeAPListRid(local, &APList_rid, 1);
5999 		enable_MAC(local, 1);
6000 	}
6001 	return 0;
6002 }
6003 
6004 /*------------------------------------------------------------------*/
6005 /*
6006  * Wireless Handler : get AP address
6007  */
airo_get_wap(struct net_device * dev,struct iw_request_info * info,struct sockaddr * awrq,char * extra)6008 static int airo_get_wap(struct net_device *dev,
6009 			struct iw_request_info *info,
6010 			struct sockaddr *awrq,
6011 			char *extra)
6012 {
6013 	struct airo_info *local = dev->ml_priv;
6014 	StatusRid status_rid;		/* Card status info */
6015 
6016 	readStatusRid(local, &status_rid, 1);
6017 
6018 	/* Tentative. This seems to work, wow, I'm lucky !!! */
6019 	memcpy(awrq->sa_data, status_rid.bssid[0], ETH_ALEN);
6020 	awrq->sa_family = ARPHRD_ETHER;
6021 
6022 	return 0;
6023 }
6024 
6025 /*------------------------------------------------------------------*/
6026 /*
6027  * Wireless Handler : set Nickname
6028  */
airo_set_nick(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)6029 static int airo_set_nick(struct net_device *dev,
6030 			 struct iw_request_info *info,
6031 			 struct iw_point *dwrq,
6032 			 char *extra)
6033 {
6034 	struct airo_info *local = dev->ml_priv;
6035 
6036 	/* Check the size of the string */
6037 	if(dwrq->length > 16) {
6038 		return -E2BIG;
6039 	}
6040 	readConfigRid(local, 1);
6041 	memset(local->config.nodeName, 0, sizeof(local->config.nodeName));
6042 	memcpy(local->config.nodeName, extra, dwrq->length);
6043 	set_bit (FLAG_COMMIT, &local->flags);
6044 
6045 	return -EINPROGRESS;		/* Call commit handler */
6046 }
6047 
6048 /*------------------------------------------------------------------*/
6049 /*
6050  * Wireless Handler : get Nickname
6051  */
airo_get_nick(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)6052 static int airo_get_nick(struct net_device *dev,
6053 			 struct iw_request_info *info,
6054 			 struct iw_point *dwrq,
6055 			 char *extra)
6056 {
6057 	struct airo_info *local = dev->ml_priv;
6058 
6059 	readConfigRid(local, 1);
6060 	strncpy(extra, local->config.nodeName, 16);
6061 	extra[16] = '\0';
6062 	dwrq->length = strlen(extra);
6063 
6064 	return 0;
6065 }
6066 
6067 /*------------------------------------------------------------------*/
6068 /*
6069  * Wireless Handler : set Bit-Rate
6070  */
airo_set_rate(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6071 static int airo_set_rate(struct net_device *dev,
6072 			 struct iw_request_info *info,
6073 			 struct iw_param *vwrq,
6074 			 char *extra)
6075 {
6076 	struct airo_info *local = dev->ml_priv;
6077 	CapabilityRid cap_rid;		/* Card capability info */
6078 	u8	brate = 0;
6079 	int	i;
6080 
6081 	/* First : get a valid bit rate value */
6082 	readCapabilityRid(local, &cap_rid, 1);
6083 
6084 	/* Which type of value ? */
6085 	if((vwrq->value < 8) && (vwrq->value >= 0)) {
6086 		/* Setting by rate index */
6087 		/* Find value in the magic rate table */
6088 		brate = cap_rid.supportedRates[vwrq->value];
6089 	} else {
6090 		/* Setting by frequency value */
6091 		u8	normvalue = (u8) (vwrq->value/500000);
6092 
6093 		/* Check if rate is valid */
6094 		for(i = 0 ; i < 8 ; i++) {
6095 			if(normvalue == cap_rid.supportedRates[i]) {
6096 				brate = normvalue;
6097 				break;
6098 			}
6099 		}
6100 	}
6101 	/* -1 designed the max rate (mostly auto mode) */
6102 	if(vwrq->value == -1) {
6103 		/* Get the highest available rate */
6104 		for(i = 0 ; i < 8 ; i++) {
6105 			if(cap_rid.supportedRates[i] == 0)
6106 				break;
6107 		}
6108 		if(i != 0)
6109 			brate = cap_rid.supportedRates[i - 1];
6110 	}
6111 	/* Check that it is valid */
6112 	if(brate == 0) {
6113 		return -EINVAL;
6114 	}
6115 
6116 	readConfigRid(local, 1);
6117 	/* Now, check if we want a fixed or auto value */
6118 	if(vwrq->fixed == 0) {
6119 		/* Fill all the rates up to this max rate */
6120 		memset(local->config.rates, 0, 8);
6121 		for(i = 0 ; i < 8 ; i++) {
6122 			local->config.rates[i] = cap_rid.supportedRates[i];
6123 			if(local->config.rates[i] == brate)
6124 				break;
6125 		}
6126 	} else {
6127 		/* Fixed mode */
6128 		/* One rate, fixed */
6129 		memset(local->config.rates, 0, 8);
6130 		local->config.rates[0] = brate;
6131 	}
6132 	set_bit (FLAG_COMMIT, &local->flags);
6133 
6134 	return -EINPROGRESS;		/* Call commit handler */
6135 }
6136 
6137 /*------------------------------------------------------------------*/
6138 /*
6139  * Wireless Handler : get Bit-Rate
6140  */
airo_get_rate(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6141 static int airo_get_rate(struct net_device *dev,
6142 			 struct iw_request_info *info,
6143 			 struct iw_param *vwrq,
6144 			 char *extra)
6145 {
6146 	struct airo_info *local = dev->ml_priv;
6147 	StatusRid status_rid;		/* Card status info */
6148 
6149 	readStatusRid(local, &status_rid, 1);
6150 
6151 	vwrq->value = le16_to_cpu(status_rid.currentXmitRate) * 500000;
6152 	/* If more than one rate, set auto */
6153 	readConfigRid(local, 1);
6154 	vwrq->fixed = (local->config.rates[1] == 0);
6155 
6156 	return 0;
6157 }
6158 
6159 /*------------------------------------------------------------------*/
6160 /*
6161  * Wireless Handler : set RTS threshold
6162  */
airo_set_rts(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6163 static int airo_set_rts(struct net_device *dev,
6164 			struct iw_request_info *info,
6165 			struct iw_param *vwrq,
6166 			char *extra)
6167 {
6168 	struct airo_info *local = dev->ml_priv;
6169 	int rthr = vwrq->value;
6170 
6171 	if(vwrq->disabled)
6172 		rthr = AIRO_DEF_MTU;
6173 	if((rthr < 0) || (rthr > AIRO_DEF_MTU)) {
6174 		return -EINVAL;
6175 	}
6176 	readConfigRid(local, 1);
6177 	local->config.rtsThres = cpu_to_le16(rthr);
6178 	set_bit (FLAG_COMMIT, &local->flags);
6179 
6180 	return -EINPROGRESS;		/* Call commit handler */
6181 }
6182 
6183 /*------------------------------------------------------------------*/
6184 /*
6185  * Wireless Handler : get RTS threshold
6186  */
airo_get_rts(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6187 static int airo_get_rts(struct net_device *dev,
6188 			struct iw_request_info *info,
6189 			struct iw_param *vwrq,
6190 			char *extra)
6191 {
6192 	struct airo_info *local = dev->ml_priv;
6193 
6194 	readConfigRid(local, 1);
6195 	vwrq->value = le16_to_cpu(local->config.rtsThres);
6196 	vwrq->disabled = (vwrq->value >= AIRO_DEF_MTU);
6197 	vwrq->fixed = 1;
6198 
6199 	return 0;
6200 }
6201 
6202 /*------------------------------------------------------------------*/
6203 /*
6204  * Wireless Handler : set Fragmentation threshold
6205  */
airo_set_frag(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6206 static int airo_set_frag(struct net_device *dev,
6207 			 struct iw_request_info *info,
6208 			 struct iw_param *vwrq,
6209 			 char *extra)
6210 {
6211 	struct airo_info *local = dev->ml_priv;
6212 	int fthr = vwrq->value;
6213 
6214 	if(vwrq->disabled)
6215 		fthr = AIRO_DEF_MTU;
6216 	if((fthr < 256) || (fthr > AIRO_DEF_MTU)) {
6217 		return -EINVAL;
6218 	}
6219 	fthr &= ~0x1;	/* Get an even value - is it really needed ??? */
6220 	readConfigRid(local, 1);
6221 	local->config.fragThresh = cpu_to_le16(fthr);
6222 	set_bit (FLAG_COMMIT, &local->flags);
6223 
6224 	return -EINPROGRESS;		/* Call commit handler */
6225 }
6226 
6227 /*------------------------------------------------------------------*/
6228 /*
6229  * Wireless Handler : get Fragmentation threshold
6230  */
airo_get_frag(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6231 static int airo_get_frag(struct net_device *dev,
6232 			 struct iw_request_info *info,
6233 			 struct iw_param *vwrq,
6234 			 char *extra)
6235 {
6236 	struct airo_info *local = dev->ml_priv;
6237 
6238 	readConfigRid(local, 1);
6239 	vwrq->value = le16_to_cpu(local->config.fragThresh);
6240 	vwrq->disabled = (vwrq->value >= AIRO_DEF_MTU);
6241 	vwrq->fixed = 1;
6242 
6243 	return 0;
6244 }
6245 
6246 /*------------------------------------------------------------------*/
6247 /*
6248  * Wireless Handler : set Mode of Operation
6249  */
airo_set_mode(struct net_device * dev,struct iw_request_info * info,__u32 * uwrq,char * extra)6250 static int airo_set_mode(struct net_device *dev,
6251 			 struct iw_request_info *info,
6252 			 __u32 *uwrq,
6253 			 char *extra)
6254 {
6255 	struct airo_info *local = dev->ml_priv;
6256 	int reset = 0;
6257 
6258 	readConfigRid(local, 1);
6259 	if (sniffing_mode(local))
6260 		reset = 1;
6261 
6262 	switch(*uwrq) {
6263 		case IW_MODE_ADHOC:
6264 			local->config.opmode &= ~MODE_CFG_MASK;
6265 			local->config.opmode |= MODE_STA_IBSS;
6266 			local->config.rmode &= ~RXMODE_FULL_MASK;
6267 			local->config.scanMode = SCANMODE_ACTIVE;
6268 			clear_bit (FLAG_802_11, &local->flags);
6269 			break;
6270 		case IW_MODE_INFRA:
6271 			local->config.opmode &= ~MODE_CFG_MASK;
6272 			local->config.opmode |= MODE_STA_ESS;
6273 			local->config.rmode &= ~RXMODE_FULL_MASK;
6274 			local->config.scanMode = SCANMODE_ACTIVE;
6275 			clear_bit (FLAG_802_11, &local->flags);
6276 			break;
6277 		case IW_MODE_MASTER:
6278 			local->config.opmode &= ~MODE_CFG_MASK;
6279 			local->config.opmode |= MODE_AP;
6280 			local->config.rmode &= ~RXMODE_FULL_MASK;
6281 			local->config.scanMode = SCANMODE_ACTIVE;
6282 			clear_bit (FLAG_802_11, &local->flags);
6283 			break;
6284 		case IW_MODE_REPEAT:
6285 			local->config.opmode &= ~MODE_CFG_MASK;
6286 			local->config.opmode |= MODE_AP_RPTR;
6287 			local->config.rmode &= ~RXMODE_FULL_MASK;
6288 			local->config.scanMode = SCANMODE_ACTIVE;
6289 			clear_bit (FLAG_802_11, &local->flags);
6290 			break;
6291 		case IW_MODE_MONITOR:
6292 			local->config.opmode &= ~MODE_CFG_MASK;
6293 			local->config.opmode |= MODE_STA_ESS;
6294 			local->config.rmode &= ~RXMODE_FULL_MASK;
6295 			local->config.rmode |= RXMODE_RFMON | RXMODE_DISABLE_802_3_HEADER;
6296 			local->config.scanMode = SCANMODE_PASSIVE;
6297 			set_bit (FLAG_802_11, &local->flags);
6298 			break;
6299 		default:
6300 			return -EINVAL;
6301 	}
6302 	if (reset)
6303 		set_bit (FLAG_RESET, &local->flags);
6304 	set_bit (FLAG_COMMIT, &local->flags);
6305 
6306 	return -EINPROGRESS;		/* Call commit handler */
6307 }
6308 
6309 /*------------------------------------------------------------------*/
6310 /*
6311  * Wireless Handler : get Mode of Operation
6312  */
airo_get_mode(struct net_device * dev,struct iw_request_info * info,__u32 * uwrq,char * extra)6313 static int airo_get_mode(struct net_device *dev,
6314 			 struct iw_request_info *info,
6315 			 __u32 *uwrq,
6316 			 char *extra)
6317 {
6318 	struct airo_info *local = dev->ml_priv;
6319 
6320 	readConfigRid(local, 1);
6321 	/* If not managed, assume it's ad-hoc */
6322 	switch (local->config.opmode & MODE_CFG_MASK) {
6323 		case MODE_STA_ESS:
6324 			*uwrq = IW_MODE_INFRA;
6325 			break;
6326 		case MODE_AP:
6327 			*uwrq = IW_MODE_MASTER;
6328 			break;
6329 		case MODE_AP_RPTR:
6330 			*uwrq = IW_MODE_REPEAT;
6331 			break;
6332 		default:
6333 			*uwrq = IW_MODE_ADHOC;
6334 	}
6335 
6336 	return 0;
6337 }
6338 
valid_index(struct airo_info * ai,int index)6339 static inline int valid_index(struct airo_info *ai, int index)
6340 {
6341 	return (index >= 0) && (index <= ai->max_wep_idx);
6342 }
6343 
6344 /*------------------------------------------------------------------*/
6345 /*
6346  * Wireless Handler : set Encryption Key
6347  */
airo_set_encode(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)6348 static int airo_set_encode(struct net_device *dev,
6349 			   struct iw_request_info *info,
6350 			   struct iw_point *dwrq,
6351 			   char *extra)
6352 {
6353 	struct airo_info *local = dev->ml_priv;
6354 	int perm = (dwrq->flags & IW_ENCODE_TEMP ? 0 : 1);
6355 	__le16 currentAuthType = local->config.authType;
6356 	int rc = 0;
6357 
6358 	if (!local->wep_capable)
6359 		return -EOPNOTSUPP;
6360 
6361 	readConfigRid(local, 1);
6362 
6363 	/* Basic checking: do we have a key to set ?
6364 	 * Note : with the new API, it's impossible to get a NULL pointer.
6365 	 * Therefore, we need to check a key size == 0 instead.
6366 	 * New version of iwconfig properly set the IW_ENCODE_NOKEY flag
6367 	 * when no key is present (only change flags), but older versions
6368 	 * don't do it. - Jean II */
6369 	if (dwrq->length > 0) {
6370 		wep_key_t key;
6371 		int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
6372 		int current_index;
6373 
6374 		/* Check the size of the key */
6375 		if (dwrq->length > MAX_KEY_SIZE) {
6376 			return -EINVAL;
6377 		}
6378 
6379 		current_index = get_wep_tx_idx(local);
6380 		if (current_index < 0)
6381 			current_index = 0;
6382 
6383 		/* Check the index (none -> use current) */
6384 		if (!valid_index(local, index))
6385 			index = current_index;
6386 
6387 		/* Set the length */
6388 		if (dwrq->length > MIN_KEY_SIZE)
6389 			key.len = MAX_KEY_SIZE;
6390 		else
6391 			key.len = MIN_KEY_SIZE;
6392 		/* Check if the key is not marked as invalid */
6393 		if(!(dwrq->flags & IW_ENCODE_NOKEY)) {
6394 			/* Cleanup */
6395 			memset(key.key, 0, MAX_KEY_SIZE);
6396 			/* Copy the key in the driver */
6397 			memcpy(key.key, extra, dwrq->length);
6398 			/* Send the key to the card */
6399 			rc = set_wep_key(local, index, key.key, key.len, perm, 1);
6400 			if (rc < 0) {
6401 				airo_print_err(local->dev->name, "failed to set"
6402 				               " WEP key at index %d: %d.",
6403 				               index, rc);
6404 				return rc;
6405 			}
6406 		}
6407 		/* WE specify that if a valid key is set, encryption
6408 		 * should be enabled (user may turn it off later)
6409 		 * This is also how "iwconfig ethX key on" works */
6410 		if((index == current_index) && (key.len > 0) &&
6411 		   (local->config.authType == AUTH_OPEN)) {
6412 			local->config.authType = AUTH_ENCRYPT;
6413 		}
6414 	} else {
6415 		/* Do we want to just set the transmit key index ? */
6416 		int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
6417 		if (valid_index(local, index)) {
6418 			rc = set_wep_tx_idx(local, index, perm, 1);
6419 			if (rc < 0) {
6420 				airo_print_err(local->dev->name, "failed to set"
6421 				               " WEP transmit index to %d: %d.",
6422 				               index, rc);
6423 				return rc;
6424 			}
6425 		} else {
6426 			/* Don't complain if only change the mode */
6427 			if (!(dwrq->flags & IW_ENCODE_MODE))
6428 				return -EINVAL;
6429 		}
6430 	}
6431 	/* Read the flags */
6432 	if(dwrq->flags & IW_ENCODE_DISABLED)
6433 		local->config.authType = AUTH_OPEN;	// disable encryption
6434 	if(dwrq->flags & IW_ENCODE_RESTRICTED)
6435 		local->config.authType = AUTH_SHAREDKEY;	// Only Both
6436 	if(dwrq->flags & IW_ENCODE_OPEN)
6437 		local->config.authType = AUTH_ENCRYPT;	// Only Wep
6438 	/* Commit the changes to flags if needed */
6439 	if (local->config.authType != currentAuthType)
6440 		set_bit (FLAG_COMMIT, &local->flags);
6441 	return -EINPROGRESS;		/* Call commit handler */
6442 }
6443 
6444 /*------------------------------------------------------------------*/
6445 /*
6446  * Wireless Handler : get Encryption Key
6447  */
airo_get_encode(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)6448 static int airo_get_encode(struct net_device *dev,
6449 			   struct iw_request_info *info,
6450 			   struct iw_point *dwrq,
6451 			   char *extra)
6452 {
6453 	struct airo_info *local = dev->ml_priv;
6454 	int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
6455 	int wep_key_len;
6456 	u8 buf[16];
6457 
6458 	if (!local->wep_capable)
6459 		return -EOPNOTSUPP;
6460 
6461 	readConfigRid(local, 1);
6462 
6463 	/* Check encryption mode */
6464 	switch(local->config.authType)	{
6465 		case AUTH_ENCRYPT:
6466 			dwrq->flags = IW_ENCODE_OPEN;
6467 			break;
6468 		case AUTH_SHAREDKEY:
6469 			dwrq->flags = IW_ENCODE_RESTRICTED;
6470 			break;
6471 		default:
6472 		case AUTH_OPEN:
6473 			dwrq->flags = IW_ENCODE_DISABLED;
6474 			break;
6475 	}
6476 	/* We can't return the key, so set the proper flag and return zero */
6477 	dwrq->flags |= IW_ENCODE_NOKEY;
6478 	memset(extra, 0, 16);
6479 
6480 	/* Which key do we want ? -1 -> tx index */
6481 	if (!valid_index(local, index)) {
6482 		index = get_wep_tx_idx(local);
6483 		if (index < 0)
6484 			index = 0;
6485 	}
6486 	dwrq->flags |= index + 1;
6487 
6488 	/* Copy the key to the user buffer */
6489 	wep_key_len = get_wep_key(local, index, &buf[0], sizeof(buf));
6490 	if (wep_key_len < 0) {
6491 		dwrq->length = 0;
6492 	} else {
6493 		dwrq->length = wep_key_len;
6494 		memcpy(extra, buf, dwrq->length);
6495 	}
6496 
6497 	return 0;
6498 }
6499 
6500 /*------------------------------------------------------------------*/
6501 /*
6502  * Wireless Handler : set extended Encryption parameters
6503  */
airo_set_encodeext(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6504 static int airo_set_encodeext(struct net_device *dev,
6505 			   struct iw_request_info *info,
6506 			    union iwreq_data *wrqu,
6507 			    char *extra)
6508 {
6509 	struct airo_info *local = dev->ml_priv;
6510 	struct iw_point *encoding = &wrqu->encoding;
6511 	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
6512 	int perm = ( encoding->flags & IW_ENCODE_TEMP ? 0 : 1 );
6513 	__le16 currentAuthType = local->config.authType;
6514 	int idx, key_len, alg = ext->alg, set_key = 1, rc;
6515 	wep_key_t key;
6516 
6517 	if (!local->wep_capable)
6518 		return -EOPNOTSUPP;
6519 
6520 	readConfigRid(local, 1);
6521 
6522 	/* Determine and validate the key index */
6523 	idx = encoding->flags & IW_ENCODE_INDEX;
6524 	if (idx) {
6525 		if (!valid_index(local, idx - 1))
6526 			return -EINVAL;
6527 		idx--;
6528 	} else {
6529 		idx = get_wep_tx_idx(local);
6530 		if (idx < 0)
6531 			idx = 0;
6532 	}
6533 
6534 	if (encoding->flags & IW_ENCODE_DISABLED)
6535 		alg = IW_ENCODE_ALG_NONE;
6536 
6537 	if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
6538 		/* Only set transmit key index here, actual
6539 		 * key is set below if needed.
6540 		 */
6541 		rc = set_wep_tx_idx(local, idx, perm, 1);
6542 		if (rc < 0) {
6543 			airo_print_err(local->dev->name, "failed to set "
6544 			               "WEP transmit index to %d: %d.",
6545 			               idx, rc);
6546 			return rc;
6547 		}
6548 		set_key = ext->key_len > 0 ? 1 : 0;
6549 	}
6550 
6551 	if (set_key) {
6552 		/* Set the requested key first */
6553 		memset(key.key, 0, MAX_KEY_SIZE);
6554 		switch (alg) {
6555 		case IW_ENCODE_ALG_NONE:
6556 			key.len = 0;
6557 			break;
6558 		case IW_ENCODE_ALG_WEP:
6559 			if (ext->key_len > MIN_KEY_SIZE) {
6560 				key.len = MAX_KEY_SIZE;
6561 			} else if (ext->key_len > 0) {
6562 				key.len = MIN_KEY_SIZE;
6563 			} else {
6564 				return -EINVAL;
6565 			}
6566 			key_len = min (ext->key_len, key.len);
6567 			memcpy(key.key, ext->key, key_len);
6568 			break;
6569 		default:
6570 			return -EINVAL;
6571 		}
6572 		if (key.len == 0) {
6573 			rc = set_wep_tx_idx(local, idx, perm, 1);
6574 			if (rc < 0) {
6575 				airo_print_err(local->dev->name,
6576 					       "failed to set WEP transmit index to %d: %d.",
6577 					       idx, rc);
6578 				return rc;
6579 			}
6580 		} else {
6581 			rc = set_wep_key(local, idx, key.key, key.len, perm, 1);
6582 			if (rc < 0) {
6583 				airo_print_err(local->dev->name,
6584 					       "failed to set WEP key at index %d: %d.",
6585 					       idx, rc);
6586 				return rc;
6587 			}
6588 		}
6589 	}
6590 
6591 	/* Read the flags */
6592 	if(encoding->flags & IW_ENCODE_DISABLED)
6593 		local->config.authType = AUTH_OPEN;	// disable encryption
6594 	if(encoding->flags & IW_ENCODE_RESTRICTED)
6595 		local->config.authType = AUTH_SHAREDKEY;	// Only Both
6596 	if(encoding->flags & IW_ENCODE_OPEN)
6597 		local->config.authType = AUTH_ENCRYPT;	// Only Wep
6598 	/* Commit the changes to flags if needed */
6599 	if (local->config.authType != currentAuthType)
6600 		set_bit (FLAG_COMMIT, &local->flags);
6601 
6602 	return -EINPROGRESS;
6603 }
6604 
6605 
6606 /*------------------------------------------------------------------*/
6607 /*
6608  * Wireless Handler : get extended Encryption parameters
6609  */
airo_get_encodeext(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6610 static int airo_get_encodeext(struct net_device *dev,
6611 			    struct iw_request_info *info,
6612 			    union iwreq_data *wrqu,
6613 			    char *extra)
6614 {
6615 	struct airo_info *local = dev->ml_priv;
6616 	struct iw_point *encoding = &wrqu->encoding;
6617 	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
6618 	int idx, max_key_len, wep_key_len;
6619 	u8 buf[16];
6620 
6621 	if (!local->wep_capable)
6622 		return -EOPNOTSUPP;
6623 
6624 	readConfigRid(local, 1);
6625 
6626 	max_key_len = encoding->length - sizeof(*ext);
6627 	if (max_key_len < 0)
6628 		return -EINVAL;
6629 
6630 	idx = encoding->flags & IW_ENCODE_INDEX;
6631 	if (idx) {
6632 		if (!valid_index(local, idx - 1))
6633 			return -EINVAL;
6634 		idx--;
6635 	} else {
6636 		idx = get_wep_tx_idx(local);
6637 		if (idx < 0)
6638 			idx = 0;
6639 	}
6640 
6641 	encoding->flags = idx + 1;
6642 	memset(ext, 0, sizeof(*ext));
6643 
6644 	/* Check encryption mode */
6645 	switch(local->config.authType) {
6646 		case AUTH_ENCRYPT:
6647 			encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
6648 			break;
6649 		case AUTH_SHAREDKEY:
6650 			encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
6651 			break;
6652 		default:
6653 		case AUTH_OPEN:
6654 			encoding->flags = IW_ENCODE_ALG_NONE | IW_ENCODE_DISABLED;
6655 			break;
6656 	}
6657 	/* We can't return the key, so set the proper flag and return zero */
6658 	encoding->flags |= IW_ENCODE_NOKEY;
6659 	memset(extra, 0, 16);
6660 
6661 	/* Copy the key to the user buffer */
6662 	wep_key_len = get_wep_key(local, idx, &buf[0], sizeof(buf));
6663 	if (wep_key_len < 0) {
6664 		ext->key_len = 0;
6665 	} else {
6666 		ext->key_len = wep_key_len;
6667 		memcpy(extra, buf, ext->key_len);
6668 	}
6669 
6670 	return 0;
6671 }
6672 
6673 
6674 /*------------------------------------------------------------------*/
6675 /*
6676  * Wireless Handler : set extended authentication parameters
6677  */
airo_set_auth(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6678 static int airo_set_auth(struct net_device *dev,
6679 			       struct iw_request_info *info,
6680 			       union iwreq_data *wrqu, char *extra)
6681 {
6682 	struct airo_info *local = dev->ml_priv;
6683 	struct iw_param *param = &wrqu->param;
6684 	__le16 currentAuthType = local->config.authType;
6685 
6686 	switch (param->flags & IW_AUTH_INDEX) {
6687 	case IW_AUTH_WPA_VERSION:
6688 	case IW_AUTH_CIPHER_PAIRWISE:
6689 	case IW_AUTH_CIPHER_GROUP:
6690 	case IW_AUTH_KEY_MGMT:
6691 	case IW_AUTH_RX_UNENCRYPTED_EAPOL:
6692 	case IW_AUTH_PRIVACY_INVOKED:
6693 		/*
6694 		 * airo does not use these parameters
6695 		 */
6696 		break;
6697 
6698 	case IW_AUTH_DROP_UNENCRYPTED:
6699 		if (param->value) {
6700 			/* Only change auth type if unencrypted */
6701 			if (currentAuthType == AUTH_OPEN)
6702 				local->config.authType = AUTH_ENCRYPT;
6703 		} else {
6704 			local->config.authType = AUTH_OPEN;
6705 		}
6706 
6707 		/* Commit the changes to flags if needed */
6708 		if (local->config.authType != currentAuthType)
6709 			set_bit (FLAG_COMMIT, &local->flags);
6710 		break;
6711 
6712 	case IW_AUTH_80211_AUTH_ALG: {
6713 			/* FIXME: What about AUTH_OPEN?  This API seems to
6714 			 * disallow setting our auth to AUTH_OPEN.
6715 			 */
6716 			if (param->value & IW_AUTH_ALG_SHARED_KEY) {
6717 				local->config.authType = AUTH_SHAREDKEY;
6718 			} else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
6719 				local->config.authType = AUTH_ENCRYPT;
6720 			} else
6721 				return -EINVAL;
6722 
6723 			/* Commit the changes to flags if needed */
6724 			if (local->config.authType != currentAuthType)
6725 				set_bit (FLAG_COMMIT, &local->flags);
6726 			break;
6727 		}
6728 
6729 	case IW_AUTH_WPA_ENABLED:
6730 		/* Silently accept disable of WPA */
6731 		if (param->value > 0)
6732 			return -EOPNOTSUPP;
6733 		break;
6734 
6735 	default:
6736 		return -EOPNOTSUPP;
6737 	}
6738 	return -EINPROGRESS;
6739 }
6740 
6741 
6742 /*------------------------------------------------------------------*/
6743 /*
6744  * Wireless Handler : get extended authentication parameters
6745  */
airo_get_auth(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6746 static int airo_get_auth(struct net_device *dev,
6747 			       struct iw_request_info *info,
6748 			       union iwreq_data *wrqu, char *extra)
6749 {
6750 	struct airo_info *local = dev->ml_priv;
6751 	struct iw_param *param = &wrqu->param;
6752 	__le16 currentAuthType = local->config.authType;
6753 
6754 	switch (param->flags & IW_AUTH_INDEX) {
6755 	case IW_AUTH_DROP_UNENCRYPTED:
6756 		switch (currentAuthType) {
6757 		case AUTH_SHAREDKEY:
6758 		case AUTH_ENCRYPT:
6759 			param->value = 1;
6760 			break;
6761 		default:
6762 			param->value = 0;
6763 			break;
6764 		}
6765 		break;
6766 
6767 	case IW_AUTH_80211_AUTH_ALG:
6768 		switch (currentAuthType) {
6769 		case AUTH_SHAREDKEY:
6770 			param->value = IW_AUTH_ALG_SHARED_KEY;
6771 			break;
6772 		case AUTH_ENCRYPT:
6773 		default:
6774 			param->value = IW_AUTH_ALG_OPEN_SYSTEM;
6775 			break;
6776 		}
6777 		break;
6778 
6779 	case IW_AUTH_WPA_ENABLED:
6780 		param->value = 0;
6781 		break;
6782 
6783 	default:
6784 		return -EOPNOTSUPP;
6785 	}
6786 	return 0;
6787 }
6788 
6789 
6790 /*------------------------------------------------------------------*/
6791 /*
6792  * Wireless Handler : set Tx-Power
6793  */
airo_set_txpow(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6794 static int airo_set_txpow(struct net_device *dev,
6795 			  struct iw_request_info *info,
6796 			  struct iw_param *vwrq,
6797 			  char *extra)
6798 {
6799 	struct airo_info *local = dev->ml_priv;
6800 	CapabilityRid cap_rid;		/* Card capability info */
6801 	int i;
6802 	int rc = -EINVAL;
6803 	__le16 v = cpu_to_le16(vwrq->value);
6804 
6805 	readCapabilityRid(local, &cap_rid, 1);
6806 
6807 	if (vwrq->disabled) {
6808 		set_bit (FLAG_RADIO_OFF, &local->flags);
6809 		set_bit (FLAG_COMMIT, &local->flags);
6810 		return -EINPROGRESS;		/* Call commit handler */
6811 	}
6812 	if (vwrq->flags != IW_TXPOW_MWATT) {
6813 		return -EINVAL;
6814 	}
6815 	clear_bit (FLAG_RADIO_OFF, &local->flags);
6816 	for (i = 0; i < 8 && cap_rid.txPowerLevels[i]; i++)
6817 		if (v == cap_rid.txPowerLevels[i]) {
6818 			readConfigRid(local, 1);
6819 			local->config.txPower = v;
6820 			set_bit (FLAG_COMMIT, &local->flags);
6821 			rc = -EINPROGRESS;	/* Call commit handler */
6822 			break;
6823 		}
6824 	return rc;
6825 }
6826 
6827 /*------------------------------------------------------------------*/
6828 /*
6829  * Wireless Handler : get Tx-Power
6830  */
airo_get_txpow(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6831 static int airo_get_txpow(struct net_device *dev,
6832 			  struct iw_request_info *info,
6833 			  struct iw_param *vwrq,
6834 			  char *extra)
6835 {
6836 	struct airo_info *local = dev->ml_priv;
6837 
6838 	readConfigRid(local, 1);
6839 	vwrq->value = le16_to_cpu(local->config.txPower);
6840 	vwrq->fixed = 1;	/* No power control */
6841 	vwrq->disabled = test_bit(FLAG_RADIO_OFF, &local->flags);
6842 	vwrq->flags = IW_TXPOW_MWATT;
6843 
6844 	return 0;
6845 }
6846 
6847 /*------------------------------------------------------------------*/
6848 /*
6849  * Wireless Handler : set Retry limits
6850  */
airo_set_retry(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6851 static int airo_set_retry(struct net_device *dev,
6852 			  struct iw_request_info *info,
6853 			  struct iw_param *vwrq,
6854 			  char *extra)
6855 {
6856 	struct airo_info *local = dev->ml_priv;
6857 	int rc = -EINVAL;
6858 
6859 	if(vwrq->disabled) {
6860 		return -EINVAL;
6861 	}
6862 	readConfigRid(local, 1);
6863 	if(vwrq->flags & IW_RETRY_LIMIT) {
6864 		__le16 v = cpu_to_le16(vwrq->value);
6865 		if(vwrq->flags & IW_RETRY_LONG)
6866 			local->config.longRetryLimit = v;
6867 		else if (vwrq->flags & IW_RETRY_SHORT)
6868 			local->config.shortRetryLimit = v;
6869 		else {
6870 			/* No modifier : set both */
6871 			local->config.longRetryLimit = v;
6872 			local->config.shortRetryLimit = v;
6873 		}
6874 		set_bit (FLAG_COMMIT, &local->flags);
6875 		rc = -EINPROGRESS;		/* Call commit handler */
6876 	}
6877 	if(vwrq->flags & IW_RETRY_LIFETIME) {
6878 		local->config.txLifetime = cpu_to_le16(vwrq->value / 1024);
6879 		set_bit (FLAG_COMMIT, &local->flags);
6880 		rc = -EINPROGRESS;		/* Call commit handler */
6881 	}
6882 	return rc;
6883 }
6884 
6885 /*------------------------------------------------------------------*/
6886 /*
6887  * Wireless Handler : get Retry limits
6888  */
airo_get_retry(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6889 static int airo_get_retry(struct net_device *dev,
6890 			  struct iw_request_info *info,
6891 			  struct iw_param *vwrq,
6892 			  char *extra)
6893 {
6894 	struct airo_info *local = dev->ml_priv;
6895 
6896 	vwrq->disabled = 0;      /* Can't be disabled */
6897 
6898 	readConfigRid(local, 1);
6899 	/* Note : by default, display the min retry number */
6900 	if((vwrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) {
6901 		vwrq->flags = IW_RETRY_LIFETIME;
6902 		vwrq->value = le16_to_cpu(local->config.txLifetime) * 1024;
6903 	} else if((vwrq->flags & IW_RETRY_LONG)) {
6904 		vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
6905 		vwrq->value = le16_to_cpu(local->config.longRetryLimit);
6906 	} else {
6907 		vwrq->flags = IW_RETRY_LIMIT;
6908 		vwrq->value = le16_to_cpu(local->config.shortRetryLimit);
6909 		if(local->config.shortRetryLimit != local->config.longRetryLimit)
6910 			vwrq->flags |= IW_RETRY_SHORT;
6911 	}
6912 
6913 	return 0;
6914 }
6915 
6916 /*------------------------------------------------------------------*/
6917 /*
6918  * Wireless Handler : get range info
6919  */
airo_get_range(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)6920 static int airo_get_range(struct net_device *dev,
6921 			  struct iw_request_info *info,
6922 			  struct iw_point *dwrq,
6923 			  char *extra)
6924 {
6925 	struct airo_info *local = dev->ml_priv;
6926 	struct iw_range *range = (struct iw_range *) extra;
6927 	CapabilityRid cap_rid;		/* Card capability info */
6928 	int		i;
6929 	int		k;
6930 
6931 	readCapabilityRid(local, &cap_rid, 1);
6932 
6933 	dwrq->length = sizeof(struct iw_range);
6934 	memset(range, 0, sizeof(*range));
6935 	range->min_nwid = 0x0000;
6936 	range->max_nwid = 0x0000;
6937 	range->num_channels = 14;
6938 	/* Should be based on cap_rid.country to give only
6939 	 * what the current card support */
6940 	k = 0;
6941 	for(i = 0; i < 14; i++) {
6942 		range->freq[k].i = i + 1; /* List index */
6943 		range->freq[k].m = ieee80211_dsss_chan_to_freq(i + 1) * 100000;
6944 		range->freq[k++].e = 1;	/* Values in MHz -> * 10^5 * 10 */
6945 	}
6946 	range->num_frequency = k;
6947 
6948 	range->sensitivity = 65535;
6949 
6950 	/* Hum... Should put the right values there */
6951 	if (local->rssi)
6952 		range->max_qual.qual = 100;	/* % */
6953 	else
6954 		range->max_qual.qual = airo_get_max_quality(&cap_rid);
6955 	range->max_qual.level = 0x100 - 120;	/* -120 dBm */
6956 	range->max_qual.noise = 0x100 - 120;	/* -120 dBm */
6957 
6958 	/* Experimental measurements - boundary 11/5.5 Mb/s */
6959 	/* Note : with or without the (local->rssi), results
6960 	 * are somewhat different. - Jean II */
6961 	if (local->rssi) {
6962 		range->avg_qual.qual = 50;		/* % */
6963 		range->avg_qual.level = 0x100 - 70;	/* -70 dBm */
6964 	} else {
6965 		range->avg_qual.qual = airo_get_avg_quality(&cap_rid);
6966 		range->avg_qual.level = 0x100 - 80;	/* -80 dBm */
6967 	}
6968 	range->avg_qual.noise = 0x100 - 85;		/* -85 dBm */
6969 
6970 	for(i = 0 ; i < 8 ; i++) {
6971 		range->bitrate[i] = cap_rid.supportedRates[i] * 500000;
6972 		if(range->bitrate[i] == 0)
6973 			break;
6974 	}
6975 	range->num_bitrates = i;
6976 
6977 	/* Set an indication of the max TCP throughput
6978 	 * in bit/s that we can expect using this interface.
6979 	 * May be use for QoS stuff... Jean II */
6980 	if(i > 2)
6981 		range->throughput = 5000 * 1000;
6982 	else
6983 		range->throughput = 1500 * 1000;
6984 
6985 	range->min_rts = 0;
6986 	range->max_rts = AIRO_DEF_MTU;
6987 	range->min_frag = 256;
6988 	range->max_frag = AIRO_DEF_MTU;
6989 
6990 	if(cap_rid.softCap & cpu_to_le16(2)) {
6991 		// WEP: RC4 40 bits
6992 		range->encoding_size[0] = 5;
6993 		// RC4 ~128 bits
6994 		if (cap_rid.softCap & cpu_to_le16(0x100)) {
6995 			range->encoding_size[1] = 13;
6996 			range->num_encoding_sizes = 2;
6997 		} else
6998 			range->num_encoding_sizes = 1;
6999 		range->max_encoding_tokens =
7000 			cap_rid.softCap & cpu_to_le16(0x80) ? 4 : 1;
7001 	} else {
7002 		range->num_encoding_sizes = 0;
7003 		range->max_encoding_tokens = 0;
7004 	}
7005 	range->min_pmp = 0;
7006 	range->max_pmp = 5000000;	/* 5 secs */
7007 	range->min_pmt = 0;
7008 	range->max_pmt = 65535 * 1024;	/* ??? */
7009 	range->pmp_flags = IW_POWER_PERIOD;
7010 	range->pmt_flags = IW_POWER_TIMEOUT;
7011 	range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R;
7012 
7013 	/* Transmit Power - values are in mW */
7014 	for(i = 0 ; i < 8 ; i++) {
7015 		range->txpower[i] = le16_to_cpu(cap_rid.txPowerLevels[i]);
7016 		if(range->txpower[i] == 0)
7017 			break;
7018 	}
7019 	range->num_txpower = i;
7020 	range->txpower_capa = IW_TXPOW_MWATT;
7021 	range->we_version_source = 19;
7022 	range->we_version_compiled = WIRELESS_EXT;
7023 	range->retry_capa = IW_RETRY_LIMIT | IW_RETRY_LIFETIME;
7024 	range->retry_flags = IW_RETRY_LIMIT;
7025 	range->r_time_flags = IW_RETRY_LIFETIME;
7026 	range->min_retry = 1;
7027 	range->max_retry = 65535;
7028 	range->min_r_time = 1024;
7029 	range->max_r_time = 65535 * 1024;
7030 
7031 	/* Event capability (kernel + driver) */
7032 	range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
7033 				IW_EVENT_CAPA_MASK(SIOCGIWTHRSPY) |
7034 				IW_EVENT_CAPA_MASK(SIOCGIWAP) |
7035 				IW_EVENT_CAPA_MASK(SIOCGIWSCAN));
7036 	range->event_capa[1] = IW_EVENT_CAPA_K_1;
7037 	range->event_capa[4] = IW_EVENT_CAPA_MASK(IWEVTXDROP);
7038 	return 0;
7039 }
7040 
7041 /*------------------------------------------------------------------*/
7042 /*
7043  * Wireless Handler : set Power Management
7044  */
airo_set_power(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)7045 static int airo_set_power(struct net_device *dev,
7046 			  struct iw_request_info *info,
7047 			  struct iw_param *vwrq,
7048 			  char *extra)
7049 {
7050 	struct airo_info *local = dev->ml_priv;
7051 
7052 	readConfigRid(local, 1);
7053 	if (vwrq->disabled) {
7054 		if (sniffing_mode(local))
7055 			return -EINVAL;
7056 		local->config.powerSaveMode = POWERSAVE_CAM;
7057 		local->config.rmode &= ~RXMODE_MASK;
7058 		local->config.rmode |= RXMODE_BC_MC_ADDR;
7059 		set_bit (FLAG_COMMIT, &local->flags);
7060 		return -EINPROGRESS;		/* Call commit handler */
7061 	}
7062 	if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
7063 		local->config.fastListenDelay = cpu_to_le16((vwrq->value + 500) / 1024);
7064 		local->config.powerSaveMode = POWERSAVE_PSPCAM;
7065 		set_bit (FLAG_COMMIT, &local->flags);
7066 	} else if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_PERIOD) {
7067 		local->config.fastListenInterval =
7068 		local->config.listenInterval =
7069 			cpu_to_le16((vwrq->value + 500) / 1024);
7070 		local->config.powerSaveMode = POWERSAVE_PSPCAM;
7071 		set_bit (FLAG_COMMIT, &local->flags);
7072 	}
7073 	switch (vwrq->flags & IW_POWER_MODE) {
7074 		case IW_POWER_UNICAST_R:
7075 			if (sniffing_mode(local))
7076 				return -EINVAL;
7077 			local->config.rmode &= ~RXMODE_MASK;
7078 			local->config.rmode |= RXMODE_ADDR;
7079 			set_bit (FLAG_COMMIT, &local->flags);
7080 			break;
7081 		case IW_POWER_ALL_R:
7082 			if (sniffing_mode(local))
7083 				return -EINVAL;
7084 			local->config.rmode &= ~RXMODE_MASK;
7085 			local->config.rmode |= RXMODE_BC_MC_ADDR;
7086 			set_bit (FLAG_COMMIT, &local->flags);
7087 		case IW_POWER_ON:
7088 			/* This is broken, fixme ;-) */
7089 			break;
7090 		default:
7091 			return -EINVAL;
7092 	}
7093 	// Note : we may want to factor local->need_commit here
7094 	// Note2 : may also want to factor RXMODE_RFMON test
7095 	return -EINPROGRESS;		/* Call commit handler */
7096 }
7097 
7098 /*------------------------------------------------------------------*/
7099 /*
7100  * Wireless Handler : get Power Management
7101  */
airo_get_power(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)7102 static int airo_get_power(struct net_device *dev,
7103 			  struct iw_request_info *info,
7104 			  struct iw_param *vwrq,
7105 			  char *extra)
7106 {
7107 	struct airo_info *local = dev->ml_priv;
7108 	__le16 mode;
7109 
7110 	readConfigRid(local, 1);
7111 	mode = local->config.powerSaveMode;
7112 	if ((vwrq->disabled = (mode == POWERSAVE_CAM)))
7113 		return 0;
7114 	if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
7115 		vwrq->value = le16_to_cpu(local->config.fastListenDelay) * 1024;
7116 		vwrq->flags = IW_POWER_TIMEOUT;
7117 	} else {
7118 		vwrq->value = le16_to_cpu(local->config.fastListenInterval) * 1024;
7119 		vwrq->flags = IW_POWER_PERIOD;
7120 	}
7121 	if ((local->config.rmode & RXMODE_MASK) == RXMODE_ADDR)
7122 		vwrq->flags |= IW_POWER_UNICAST_R;
7123 	else
7124 		vwrq->flags |= IW_POWER_ALL_R;
7125 
7126 	return 0;
7127 }
7128 
7129 /*------------------------------------------------------------------*/
7130 /*
7131  * Wireless Handler : set Sensitivity
7132  */
airo_set_sens(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)7133 static int airo_set_sens(struct net_device *dev,
7134 			 struct iw_request_info *info,
7135 			 struct iw_param *vwrq,
7136 			 char *extra)
7137 {
7138 	struct airo_info *local = dev->ml_priv;
7139 
7140 	readConfigRid(local, 1);
7141 	local->config.rssiThreshold =
7142 		cpu_to_le16(vwrq->disabled ? RSSI_DEFAULT : vwrq->value);
7143 	set_bit (FLAG_COMMIT, &local->flags);
7144 
7145 	return -EINPROGRESS;		/* Call commit handler */
7146 }
7147 
7148 /*------------------------------------------------------------------*/
7149 /*
7150  * Wireless Handler : get Sensitivity
7151  */
airo_get_sens(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)7152 static int airo_get_sens(struct net_device *dev,
7153 			 struct iw_request_info *info,
7154 			 struct iw_param *vwrq,
7155 			 char *extra)
7156 {
7157 	struct airo_info *local = dev->ml_priv;
7158 
7159 	readConfigRid(local, 1);
7160 	vwrq->value = le16_to_cpu(local->config.rssiThreshold);
7161 	vwrq->disabled = (vwrq->value == 0);
7162 	vwrq->fixed = 1;
7163 
7164 	return 0;
7165 }
7166 
7167 /*------------------------------------------------------------------*/
7168 /*
7169  * Wireless Handler : get AP List
7170  * Note : this is deprecated in favor of IWSCAN
7171  */
airo_get_aplist(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)7172 static int airo_get_aplist(struct net_device *dev,
7173 			   struct iw_request_info *info,
7174 			   struct iw_point *dwrq,
7175 			   char *extra)
7176 {
7177 	struct airo_info *local = dev->ml_priv;
7178 	struct sockaddr *address = (struct sockaddr *) extra;
7179 	struct iw_quality *qual;
7180 	BSSListRid BSSList;
7181 	int i;
7182 	int loseSync = capable(CAP_NET_ADMIN) ? 1: -1;
7183 
7184 	qual = kmalloc(IW_MAX_AP * sizeof(*qual), GFP_KERNEL);
7185 	if (!qual)
7186 		return -ENOMEM;
7187 
7188 	for (i = 0; i < IW_MAX_AP; i++) {
7189 		u16 dBm;
7190 		if (readBSSListRid(local, loseSync, &BSSList))
7191 			break;
7192 		loseSync = 0;
7193 		memcpy(address[i].sa_data, BSSList.bssid, ETH_ALEN);
7194 		address[i].sa_family = ARPHRD_ETHER;
7195 		dBm = le16_to_cpu(BSSList.dBm);
7196 		if (local->rssi) {
7197 			qual[i].level = 0x100 - dBm;
7198 			qual[i].qual = airo_dbm_to_pct(local->rssi, dBm);
7199 			qual[i].updated = IW_QUAL_QUAL_UPDATED
7200 					| IW_QUAL_LEVEL_UPDATED
7201 					| IW_QUAL_DBM;
7202 		} else {
7203 			qual[i].level = (dBm + 321) / 2;
7204 			qual[i].qual = 0;
7205 			qual[i].updated = IW_QUAL_QUAL_INVALID
7206 					| IW_QUAL_LEVEL_UPDATED
7207 					| IW_QUAL_DBM;
7208 		}
7209 		qual[i].noise = local->wstats.qual.noise;
7210 		if (BSSList.index == cpu_to_le16(0xffff))
7211 			break;
7212 	}
7213 	if (!i) {
7214 		StatusRid status_rid;		/* Card status info */
7215 		readStatusRid(local, &status_rid, 1);
7216 		for (i = 0;
7217 		     i < min(IW_MAX_AP, 4) &&
7218 			     (status_rid.bssid[i][0]
7219 			      & status_rid.bssid[i][1]
7220 			      & status_rid.bssid[i][2]
7221 			      & status_rid.bssid[i][3]
7222 			      & status_rid.bssid[i][4]
7223 			      & status_rid.bssid[i][5])!=0xff &&
7224 			     (status_rid.bssid[i][0]
7225 			      | status_rid.bssid[i][1]
7226 			      | status_rid.bssid[i][2]
7227 			      | status_rid.bssid[i][3]
7228 			      | status_rid.bssid[i][4]
7229 			      | status_rid.bssid[i][5]);
7230 		     i++) {
7231 			memcpy(address[i].sa_data,
7232 			       status_rid.bssid[i], ETH_ALEN);
7233 			address[i].sa_family = ARPHRD_ETHER;
7234 		}
7235 	} else {
7236 		dwrq->flags = 1; /* Should be define'd */
7237 		memcpy(extra + sizeof(struct sockaddr)*i,
7238 		       &qual,  sizeof(struct iw_quality)*i);
7239 	}
7240 	dwrq->length = i;
7241 
7242 	kfree(qual);
7243 	return 0;
7244 }
7245 
7246 /*------------------------------------------------------------------*/
7247 /*
7248  * Wireless Handler : Initiate Scan
7249  */
airo_set_scan(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)7250 static int airo_set_scan(struct net_device *dev,
7251 			 struct iw_request_info *info,
7252 			 struct iw_point *dwrq,
7253 			 char *extra)
7254 {
7255 	struct airo_info *ai = dev->ml_priv;
7256 	Cmd cmd;
7257 	Resp rsp;
7258 	int wake = 0;
7259 
7260 	/* Note : you may have realised that, as this is a SET operation,
7261 	 * this is privileged and therefore a normal user can't
7262 	 * perform scanning.
7263 	 * This is not an error, while the device perform scanning,
7264 	 * traffic doesn't flow, so it's a perfect DoS...
7265 	 * Jean II */
7266 	if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN;
7267 
7268 	if (down_interruptible(&ai->sem))
7269 		return -ERESTARTSYS;
7270 
7271 	/* If there's already a scan in progress, don't
7272 	 * trigger another one. */
7273 	if (ai->scan_timeout > 0)
7274 		goto out;
7275 
7276 	/* Initiate a scan command */
7277 	ai->scan_timeout = RUN_AT(3*HZ);
7278 	memset(&cmd, 0, sizeof(cmd));
7279 	cmd.cmd=CMD_LISTBSS;
7280 	issuecommand(ai, &cmd, &rsp);
7281 	wake = 1;
7282 
7283 out:
7284 	up(&ai->sem);
7285 	if (wake)
7286 		wake_up_interruptible(&ai->thr_wait);
7287 	return 0;
7288 }
7289 
7290 /*------------------------------------------------------------------*/
7291 /*
7292  * Translate scan data returned from the card to a card independent
7293  * format that the Wireless Tools will understand - Jean II
7294  */
airo_translate_scan(struct net_device * dev,struct iw_request_info * info,char * current_ev,char * end_buf,BSSListRid * bss)7295 static inline char *airo_translate_scan(struct net_device *dev,
7296 					struct iw_request_info *info,
7297 					char *current_ev,
7298 					char *end_buf,
7299 					BSSListRid *bss)
7300 {
7301 	struct airo_info *ai = dev->ml_priv;
7302 	struct iw_event		iwe;		/* Temporary buffer */
7303 	__le16			capabilities;
7304 	char *			current_val;	/* For rates */
7305 	int			i;
7306 	char *		buf;
7307 	u16 dBm;
7308 
7309 	/* First entry *MUST* be the AP MAC address */
7310 	iwe.cmd = SIOCGIWAP;
7311 	iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
7312 	memcpy(iwe.u.ap_addr.sa_data, bss->bssid, ETH_ALEN);
7313 	current_ev = iwe_stream_add_event(info, current_ev, end_buf,
7314 					  &iwe, IW_EV_ADDR_LEN);
7315 
7316 	/* Other entries will be displayed in the order we give them */
7317 
7318 	/* Add the ESSID */
7319 	iwe.u.data.length = bss->ssidLen;
7320 	if(iwe.u.data.length > 32)
7321 		iwe.u.data.length = 32;
7322 	iwe.cmd = SIOCGIWESSID;
7323 	iwe.u.data.flags = 1;
7324 	current_ev = iwe_stream_add_point(info, current_ev, end_buf,
7325 					  &iwe, bss->ssid);
7326 
7327 	/* Add mode */
7328 	iwe.cmd = SIOCGIWMODE;
7329 	capabilities = bss->cap;
7330 	if(capabilities & (CAP_ESS | CAP_IBSS)) {
7331 		if(capabilities & CAP_ESS)
7332 			iwe.u.mode = IW_MODE_MASTER;
7333 		else
7334 			iwe.u.mode = IW_MODE_ADHOC;
7335 		current_ev = iwe_stream_add_event(info, current_ev, end_buf,
7336 						  &iwe, IW_EV_UINT_LEN);
7337 	}
7338 
7339 	/* Add frequency */
7340 	iwe.cmd = SIOCGIWFREQ;
7341 	iwe.u.freq.m = le16_to_cpu(bss->dsChannel);
7342 	iwe.u.freq.m = ieee80211_dsss_chan_to_freq(iwe.u.freq.m) * 100000;
7343 	iwe.u.freq.e = 1;
7344 	current_ev = iwe_stream_add_event(info, current_ev, end_buf,
7345 					  &iwe, IW_EV_FREQ_LEN);
7346 
7347 	dBm = le16_to_cpu(bss->dBm);
7348 
7349 	/* Add quality statistics */
7350 	iwe.cmd = IWEVQUAL;
7351 	if (ai->rssi) {
7352 		iwe.u.qual.level = 0x100 - dBm;
7353 		iwe.u.qual.qual = airo_dbm_to_pct(ai->rssi, dBm);
7354 		iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED
7355 				| IW_QUAL_LEVEL_UPDATED
7356 				| IW_QUAL_DBM;
7357 	} else {
7358 		iwe.u.qual.level = (dBm + 321) / 2;
7359 		iwe.u.qual.qual = 0;
7360 		iwe.u.qual.updated = IW_QUAL_QUAL_INVALID
7361 				| IW_QUAL_LEVEL_UPDATED
7362 				| IW_QUAL_DBM;
7363 	}
7364 	iwe.u.qual.noise = ai->wstats.qual.noise;
7365 	current_ev = iwe_stream_add_event(info, current_ev, end_buf,
7366 					  &iwe, IW_EV_QUAL_LEN);
7367 
7368 	/* Add encryption capability */
7369 	iwe.cmd = SIOCGIWENCODE;
7370 	if(capabilities & CAP_PRIVACY)
7371 		iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
7372 	else
7373 		iwe.u.data.flags = IW_ENCODE_DISABLED;
7374 	iwe.u.data.length = 0;
7375 	current_ev = iwe_stream_add_point(info, current_ev, end_buf,
7376 					  &iwe, bss->ssid);
7377 
7378 	/* Rate : stuffing multiple values in a single event require a bit
7379 	 * more of magic - Jean II */
7380 	current_val = current_ev + iwe_stream_lcp_len(info);
7381 
7382 	iwe.cmd = SIOCGIWRATE;
7383 	/* Those two flags are ignored... */
7384 	iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
7385 	/* Max 8 values */
7386 	for(i = 0 ; i < 8 ; i++) {
7387 		/* NULL terminated */
7388 		if(bss->rates[i] == 0)
7389 			break;
7390 		/* Bit rate given in 500 kb/s units (+ 0x80) */
7391 		iwe.u.bitrate.value = ((bss->rates[i] & 0x7f) * 500000);
7392 		/* Add new value to event */
7393 		current_val = iwe_stream_add_value(info, current_ev,
7394 						   current_val, end_buf,
7395 						   &iwe, IW_EV_PARAM_LEN);
7396 	}
7397 	/* Check if we added any event */
7398 	if ((current_val - current_ev) > iwe_stream_lcp_len(info))
7399 		current_ev = current_val;
7400 
7401 	/* Beacon interval */
7402 	buf = kmalloc(30, GFP_KERNEL);
7403 	if (buf) {
7404 		iwe.cmd = IWEVCUSTOM;
7405 		sprintf(buf, "bcn_int=%d", bss->beaconInterval);
7406 		iwe.u.data.length = strlen(buf);
7407 		current_ev = iwe_stream_add_point(info, current_ev, end_buf,
7408 						  &iwe, buf);
7409 		kfree(buf);
7410 	}
7411 
7412 	/* Put WPA/RSN Information Elements into the event stream */
7413 	if (test_bit(FLAG_WPA_CAPABLE, &ai->flags)) {
7414 		unsigned int num_null_ies = 0;
7415 		u16 length = sizeof (bss->extra.iep);
7416 		u8 *ie = (void *)&bss->extra.iep;
7417 
7418 		while ((length >= 2) && (num_null_ies < 2)) {
7419 			if (2 + ie[1] > length) {
7420 				/* Invalid element, don't continue parsing IE */
7421 				break;
7422 			}
7423 
7424 			switch (ie[0]) {
7425 			case WLAN_EID_SSID:
7426 				/* Two zero-length SSID elements
7427 				 * mean we're done parsing elements */
7428 				if (!ie[1])
7429 					num_null_ies++;
7430 				break;
7431 
7432 			case WLAN_EID_GENERIC:
7433 				if (ie[1] >= 4 &&
7434 				    ie[2] == 0x00 &&
7435 				    ie[3] == 0x50 &&
7436 				    ie[4] == 0xf2 &&
7437 				    ie[5] == 0x01) {
7438 					iwe.cmd = IWEVGENIE;
7439 					/* 64 is an arbitrary cut-off */
7440 					iwe.u.data.length = min(ie[1] + 2,
7441 								64);
7442 					current_ev = iwe_stream_add_point(
7443 							info, current_ev,
7444 							end_buf, &iwe, ie);
7445 				}
7446 				break;
7447 
7448 			case WLAN_EID_RSN:
7449 				iwe.cmd = IWEVGENIE;
7450 				/* 64 is an arbitrary cut-off */
7451 				iwe.u.data.length = min(ie[1] + 2, 64);
7452 				current_ev = iwe_stream_add_point(
7453 					info, current_ev, end_buf,
7454 					&iwe, ie);
7455 				break;
7456 
7457 			default:
7458 				break;
7459 			}
7460 
7461 			length -= 2 + ie[1];
7462 			ie += 2 + ie[1];
7463 		}
7464 	}
7465 	return current_ev;
7466 }
7467 
7468 /*------------------------------------------------------------------*/
7469 /*
7470  * Wireless Handler : Read Scan Results
7471  */
airo_get_scan(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)7472 static int airo_get_scan(struct net_device *dev,
7473 			 struct iw_request_info *info,
7474 			 struct iw_point *dwrq,
7475 			 char *extra)
7476 {
7477 	struct airo_info *ai = dev->ml_priv;
7478 	BSSListElement *net;
7479 	int err = 0;
7480 	char *current_ev = extra;
7481 
7482 	/* If a scan is in-progress, return -EAGAIN */
7483 	if (ai->scan_timeout > 0)
7484 		return -EAGAIN;
7485 
7486 	if (down_interruptible(&ai->sem))
7487 		return -EAGAIN;
7488 
7489 	list_for_each_entry (net, &ai->network_list, list) {
7490 		/* Translate to WE format this entry */
7491 		current_ev = airo_translate_scan(dev, info, current_ev,
7492 						 extra + dwrq->length,
7493 						 &net->bss);
7494 
7495 		/* Check if there is space for one more entry */
7496 		if((extra + dwrq->length - current_ev) <= IW_EV_ADDR_LEN) {
7497 			/* Ask user space to try again with a bigger buffer */
7498 			err = -E2BIG;
7499 			goto out;
7500 		}
7501 	}
7502 
7503 	/* Length of data */
7504 	dwrq->length = (current_ev - extra);
7505 	dwrq->flags = 0;	/* todo */
7506 
7507 out:
7508 	up(&ai->sem);
7509 	return err;
7510 }
7511 
7512 /*------------------------------------------------------------------*/
7513 /*
7514  * Commit handler : called after a bunch of SET operations
7515  */
airo_config_commit(struct net_device * dev,struct iw_request_info * info,void * zwrq,char * extra)7516 static int airo_config_commit(struct net_device *dev,
7517 			      struct iw_request_info *info,	/* NULL */
7518 			      void *zwrq,			/* NULL */
7519 			      char *extra)			/* NULL */
7520 {
7521 	struct airo_info *local = dev->ml_priv;
7522 
7523 	if (!test_bit (FLAG_COMMIT, &local->flags))
7524 		return 0;
7525 
7526 	/* Some of the "SET" function may have modified some of the
7527 	 * parameters. It's now time to commit them in the card */
7528 	disable_MAC(local, 1);
7529 	if (test_bit (FLAG_RESET, &local->flags)) {
7530 		APListRid APList_rid;
7531 		SsidRid SSID_rid;
7532 
7533 		readAPListRid(local, &APList_rid);
7534 		readSsidRid(local, &SSID_rid);
7535 		if (test_bit(FLAG_MPI,&local->flags))
7536 			setup_card(local, dev->dev_addr, 1 );
7537 		else
7538 			reset_airo_card(dev);
7539 		disable_MAC(local, 1);
7540 		writeSsidRid(local, &SSID_rid, 1);
7541 		writeAPListRid(local, &APList_rid, 1);
7542 	}
7543 	if (down_interruptible(&local->sem))
7544 		return -ERESTARTSYS;
7545 	writeConfigRid(local, 0);
7546 	enable_MAC(local, 0);
7547 	if (test_bit (FLAG_RESET, &local->flags))
7548 		airo_set_promisc(local);
7549 	else
7550 		up(&local->sem);
7551 
7552 	return 0;
7553 }
7554 
7555 /*------------------------------------------------------------------*/
7556 /*
7557  * Structures to export the Wireless Handlers
7558  */
7559 
7560 static const struct iw_priv_args airo_private_args[] = {
7561 /*{ cmd,         set_args,                            get_args, name } */
7562   { AIROIOCTL, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | sizeof (aironet_ioctl),
7563     IW_PRIV_TYPE_BYTE | 2047, "airoioctl" },
7564   { AIROIDIFC, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | sizeof (aironet_ioctl),
7565     IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "airoidifc" },
7566 };
7567 
7568 static const iw_handler		airo_handler[] =
7569 {
7570 	(iw_handler) airo_config_commit,	/* SIOCSIWCOMMIT */
7571 	(iw_handler) airo_get_name,		/* SIOCGIWNAME */
7572 	(iw_handler) NULL,			/* SIOCSIWNWID */
7573 	(iw_handler) NULL,			/* SIOCGIWNWID */
7574 	(iw_handler) airo_set_freq,		/* SIOCSIWFREQ */
7575 	(iw_handler) airo_get_freq,		/* SIOCGIWFREQ */
7576 	(iw_handler) airo_set_mode,		/* SIOCSIWMODE */
7577 	(iw_handler) airo_get_mode,		/* SIOCGIWMODE */
7578 	(iw_handler) airo_set_sens,		/* SIOCSIWSENS */
7579 	(iw_handler) airo_get_sens,		/* SIOCGIWSENS */
7580 	(iw_handler) NULL,			/* SIOCSIWRANGE */
7581 	(iw_handler) airo_get_range,		/* SIOCGIWRANGE */
7582 	(iw_handler) NULL,			/* SIOCSIWPRIV */
7583 	(iw_handler) NULL,			/* SIOCGIWPRIV */
7584 	(iw_handler) NULL,			/* SIOCSIWSTATS */
7585 	(iw_handler) NULL,			/* SIOCGIWSTATS */
7586 	iw_handler_set_spy,			/* SIOCSIWSPY */
7587 	iw_handler_get_spy,			/* SIOCGIWSPY */
7588 	iw_handler_set_thrspy,			/* SIOCSIWTHRSPY */
7589 	iw_handler_get_thrspy,			/* SIOCGIWTHRSPY */
7590 	(iw_handler) airo_set_wap,		/* SIOCSIWAP */
7591 	(iw_handler) airo_get_wap,		/* SIOCGIWAP */
7592 	(iw_handler) NULL,			/* -- hole -- */
7593 	(iw_handler) airo_get_aplist,		/* SIOCGIWAPLIST */
7594 	(iw_handler) airo_set_scan,		/* SIOCSIWSCAN */
7595 	(iw_handler) airo_get_scan,		/* SIOCGIWSCAN */
7596 	(iw_handler) airo_set_essid,		/* SIOCSIWESSID */
7597 	(iw_handler) airo_get_essid,		/* SIOCGIWESSID */
7598 	(iw_handler) airo_set_nick,		/* SIOCSIWNICKN */
7599 	(iw_handler) airo_get_nick,		/* SIOCGIWNICKN */
7600 	(iw_handler) NULL,			/* -- hole -- */
7601 	(iw_handler) NULL,			/* -- hole -- */
7602 	(iw_handler) airo_set_rate,		/* SIOCSIWRATE */
7603 	(iw_handler) airo_get_rate,		/* SIOCGIWRATE */
7604 	(iw_handler) airo_set_rts,		/* SIOCSIWRTS */
7605 	(iw_handler) airo_get_rts,		/* SIOCGIWRTS */
7606 	(iw_handler) airo_set_frag,		/* SIOCSIWFRAG */
7607 	(iw_handler) airo_get_frag,		/* SIOCGIWFRAG */
7608 	(iw_handler) airo_set_txpow,		/* SIOCSIWTXPOW */
7609 	(iw_handler) airo_get_txpow,		/* SIOCGIWTXPOW */
7610 	(iw_handler) airo_set_retry,		/* SIOCSIWRETRY */
7611 	(iw_handler) airo_get_retry,		/* SIOCGIWRETRY */
7612 	(iw_handler) airo_set_encode,		/* SIOCSIWENCODE */
7613 	(iw_handler) airo_get_encode,		/* SIOCGIWENCODE */
7614 	(iw_handler) airo_set_power,		/* SIOCSIWPOWER */
7615 	(iw_handler) airo_get_power,		/* SIOCGIWPOWER */
7616 	(iw_handler) NULL,			/* -- hole -- */
7617 	(iw_handler) NULL,			/* -- hole -- */
7618 	(iw_handler) NULL,			/* SIOCSIWGENIE */
7619 	(iw_handler) NULL,			/* SIOCGIWGENIE */
7620 	(iw_handler) airo_set_auth,		/* SIOCSIWAUTH */
7621 	(iw_handler) airo_get_auth,		/* SIOCGIWAUTH */
7622 	(iw_handler) airo_set_encodeext,	/* SIOCSIWENCODEEXT */
7623 	(iw_handler) airo_get_encodeext,	/* SIOCGIWENCODEEXT */
7624 	(iw_handler) NULL,			/* SIOCSIWPMKSA */
7625 };
7626 
7627 /* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here.
7628  * We want to force the use of the ioctl code, because those can't be
7629  * won't work the iw_handler code (because they simultaneously read
7630  * and write data and iw_handler can't do that).
7631  * Note that it's perfectly legal to read/write on a single ioctl command,
7632  * you just can't use iwpriv and need to force it via the ioctl handler.
7633  * Jean II */
7634 static const iw_handler		airo_private_handler[] =
7635 {
7636 	NULL,				/* SIOCIWFIRSTPRIV */
7637 };
7638 
7639 static const struct iw_handler_def	airo_handler_def =
7640 {
7641 	.num_standard	= ARRAY_SIZE(airo_handler),
7642 	.num_private	= ARRAY_SIZE(airo_private_handler),
7643 	.num_private_args = ARRAY_SIZE(airo_private_args),
7644 	.standard	= airo_handler,
7645 	.private	= airo_private_handler,
7646 	.private_args	= airo_private_args,
7647 	.get_wireless_stats = airo_get_wireless_stats,
7648 };
7649 
7650 /*
7651  * This defines the configuration part of the Wireless Extensions
7652  * Note : irq and spinlock protection will occur in the subroutines
7653  *
7654  * TODO :
7655  *	o Check input value more carefully and fill correct values in range
7656  *	o Test and shakeout the bugs (if any)
7657  *
7658  * Jean II
7659  *
7660  * Javier Achirica did a great job of merging code from the unnamed CISCO
7661  * developer that added support for flashing the card.
7662  */
airo_ioctl(struct net_device * dev,struct ifreq * rq,int cmd)7663 static int airo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
7664 {
7665 	int rc = 0;
7666 	struct airo_info *ai = dev->ml_priv;
7667 
7668 	if (ai->power.event)
7669 		return 0;
7670 
7671 	switch (cmd) {
7672 #ifdef CISCO_EXT
7673 	case AIROIDIFC:
7674 #ifdef AIROOLDIDIFC
7675 	case AIROOLDIDIFC:
7676 #endif
7677 	{
7678 		int val = AIROMAGIC;
7679 		aironet_ioctl com;
7680 		if (copy_from_user(&com,rq->ifr_data,sizeof(com)))
7681 			rc = -EFAULT;
7682 		else if (copy_to_user(com.data,(char *)&val,sizeof(val)))
7683 			rc = -EFAULT;
7684 	}
7685 	break;
7686 
7687 	case AIROIOCTL:
7688 #ifdef AIROOLDIOCTL
7689 	case AIROOLDIOCTL:
7690 #endif
7691 		/* Get the command struct and hand it off for evaluation by
7692 		 * the proper subfunction
7693 		 */
7694 	{
7695 		aironet_ioctl com;
7696 		if (copy_from_user(&com,rq->ifr_data,sizeof(com))) {
7697 			rc = -EFAULT;
7698 			break;
7699 		}
7700 
7701 		/* Separate R/W functions bracket legality here
7702 		 */
7703 		if ( com.command == AIRORSWVERSION ) {
7704 			if (copy_to_user(com.data, swversion, sizeof(swversion)))
7705 				rc = -EFAULT;
7706 			else
7707 				rc = 0;
7708 		}
7709 		else if ( com.command <= AIRORRID)
7710 			rc = readrids(dev,&com);
7711 		else if ( com.command >= AIROPCAP && com.command <= (AIROPLEAPUSR+2) )
7712 			rc = writerids(dev,&com);
7713 		else if ( com.command >= AIROFLSHRST && com.command <= AIRORESTART )
7714 			rc = flashcard(dev,&com);
7715 		else
7716 			rc = -EINVAL;      /* Bad command in ioctl */
7717 	}
7718 	break;
7719 #endif /* CISCO_EXT */
7720 
7721 	// All other calls are currently unsupported
7722 	default:
7723 		rc = -EOPNOTSUPP;
7724 	}
7725 	return rc;
7726 }
7727 
7728 /*
7729  * Get the Wireless stats out of the driver
7730  * Note : irq and spinlock protection will occur in the subroutines
7731  *
7732  * TODO :
7733  *	o Check if work in Ad-Hoc mode (otherwise, use SPY, as in wvlan_cs)
7734  *
7735  * Jean
7736  */
airo_read_wireless_stats(struct airo_info * local)7737 static void airo_read_wireless_stats(struct airo_info *local)
7738 {
7739 	StatusRid status_rid;
7740 	StatsRid stats_rid;
7741 	CapabilityRid cap_rid;
7742 	__le32 *vals = stats_rid.vals;
7743 
7744 	/* Get stats out of the card */
7745 	clear_bit(JOB_WSTATS, &local->jobs);
7746 	if (local->power.event) {
7747 		up(&local->sem);
7748 		return;
7749 	}
7750 	readCapabilityRid(local, &cap_rid, 0);
7751 	readStatusRid(local, &status_rid, 0);
7752 	readStatsRid(local, &stats_rid, RID_STATS, 0);
7753 	up(&local->sem);
7754 
7755 	/* The status */
7756 	local->wstats.status = le16_to_cpu(status_rid.mode);
7757 
7758 	/* Signal quality and co */
7759 	if (local->rssi) {
7760 		local->wstats.qual.level =
7761 			airo_rssi_to_dbm(local->rssi,
7762 					 le16_to_cpu(status_rid.sigQuality));
7763 		/* normalizedSignalStrength appears to be a percentage */
7764 		local->wstats.qual.qual =
7765 			le16_to_cpu(status_rid.normalizedSignalStrength);
7766 	} else {
7767 		local->wstats.qual.level =
7768 			(le16_to_cpu(status_rid.normalizedSignalStrength) + 321) / 2;
7769 		local->wstats.qual.qual = airo_get_quality(&status_rid, &cap_rid);
7770 	}
7771 	if (le16_to_cpu(status_rid.len) >= 124) {
7772 		local->wstats.qual.noise = 0x100 - status_rid.noisedBm;
7773 		local->wstats.qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
7774 	} else {
7775 		local->wstats.qual.noise = 0;
7776 		local->wstats.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID | IW_QUAL_DBM;
7777 	}
7778 
7779 	/* Packets discarded in the wireless adapter due to wireless
7780 	 * specific problems */
7781 	local->wstats.discard.nwid = le32_to_cpu(vals[56]) +
7782 				     le32_to_cpu(vals[57]) +
7783 				     le32_to_cpu(vals[58]); /* SSID Mismatch */
7784 	local->wstats.discard.code = le32_to_cpu(vals[6]);/* RxWepErr */
7785 	local->wstats.discard.fragment = le32_to_cpu(vals[30]);
7786 	local->wstats.discard.retries = le32_to_cpu(vals[10]);
7787 	local->wstats.discard.misc = le32_to_cpu(vals[1]) +
7788 				     le32_to_cpu(vals[32]);
7789 	local->wstats.miss.beacon = le32_to_cpu(vals[34]);
7790 }
7791 
airo_get_wireless_stats(struct net_device * dev)7792 static struct iw_statistics *airo_get_wireless_stats(struct net_device *dev)
7793 {
7794 	struct airo_info *local =  dev->ml_priv;
7795 
7796 	if (!test_bit(JOB_WSTATS, &local->jobs)) {
7797 		/* Get stats out of the card if available */
7798 		if (down_trylock(&local->sem) != 0) {
7799 			set_bit(JOB_WSTATS, &local->jobs);
7800 			wake_up_interruptible(&local->thr_wait);
7801 		} else
7802 			airo_read_wireless_stats(local);
7803 	}
7804 
7805 	return &local->wstats;
7806 }
7807 
7808 #ifdef CISCO_EXT
7809 /*
7810  * This just translates from driver IOCTL codes to the command codes to
7811  * feed to the radio's host interface. Things can be added/deleted
7812  * as needed.  This represents the READ side of control I/O to
7813  * the card
7814  */
readrids(struct net_device * dev,aironet_ioctl * comp)7815 static int readrids(struct net_device *dev, aironet_ioctl *comp) {
7816 	unsigned short ridcode;
7817 	unsigned char *iobuf;
7818 	int len;
7819 	struct airo_info *ai = dev->ml_priv;
7820 
7821 	if (test_bit(FLAG_FLASHING, &ai->flags))
7822 		return -EIO;
7823 
7824 	switch(comp->command)
7825 	{
7826 	case AIROGCAP:      ridcode = RID_CAPABILITIES; break;
7827 	case AIROGCFG:      ridcode = RID_CONFIG;
7828 		if (test_bit(FLAG_COMMIT, &ai->flags)) {
7829 			disable_MAC (ai, 1);
7830 			writeConfigRid (ai, 1);
7831 			enable_MAC(ai, 1);
7832 		}
7833 		break;
7834 	case AIROGSLIST:    ridcode = RID_SSID;         break;
7835 	case AIROGVLIST:    ridcode = RID_APLIST;       break;
7836 	case AIROGDRVNAM:   ridcode = RID_DRVNAME;      break;
7837 	case AIROGEHTENC:   ridcode = RID_ETHERENCAP;   break;
7838 	case AIROGWEPKTMP:  ridcode = RID_WEP_TEMP;
7839 		/* Only super-user can read WEP keys */
7840 		if (!capable(CAP_NET_ADMIN))
7841 			return -EPERM;
7842 		break;
7843 	case AIROGWEPKNV:   ridcode = RID_WEP_PERM;
7844 		/* Only super-user can read WEP keys */
7845 		if (!capable(CAP_NET_ADMIN))
7846 			return -EPERM;
7847 		break;
7848 	case AIROGSTAT:     ridcode = RID_STATUS;       break;
7849 	case AIROGSTATSD32: ridcode = RID_STATSDELTA;   break;
7850 	case AIROGSTATSC32: ridcode = RID_STATS;        break;
7851 	case AIROGMICSTATS:
7852 		if (copy_to_user(comp->data, &ai->micstats,
7853 				 min((int)comp->len,(int)sizeof(ai->micstats))))
7854 			return -EFAULT;
7855 		return 0;
7856 	case AIRORRID:      ridcode = comp->ridnum;     break;
7857 	default:
7858 		return -EINVAL;
7859 		break;
7860 	}
7861 
7862 	if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL)
7863 		return -ENOMEM;
7864 
7865 	PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1);
7866 	/* get the count of bytes in the rid  docs say 1st 2 bytes is it.
7867 	 * then return it to the user
7868 	 * 9/22/2000 Honor user given length
7869 	 */
7870 	len = comp->len;
7871 
7872 	if (copy_to_user(comp->data, iobuf, min(len, (int)RIDSIZE))) {
7873 		kfree (iobuf);
7874 		return -EFAULT;
7875 	}
7876 	kfree (iobuf);
7877 	return 0;
7878 }
7879 
7880 /*
7881  * Danger Will Robinson write the rids here
7882  */
7883 
writerids(struct net_device * dev,aironet_ioctl * comp)7884 static int writerids(struct net_device *dev, aironet_ioctl *comp) {
7885 	struct airo_info *ai = dev->ml_priv;
7886 	int  ridcode;
7887         int  enabled;
7888 	static int (* writer)(struct airo_info *, u16 rid, const void *, int, int);
7889 	unsigned char *iobuf;
7890 
7891 	/* Only super-user can write RIDs */
7892 	if (!capable(CAP_NET_ADMIN))
7893 		return -EPERM;
7894 
7895 	if (test_bit(FLAG_FLASHING, &ai->flags))
7896 		return -EIO;
7897 
7898 	ridcode = 0;
7899 	writer = do_writerid;
7900 
7901 	switch(comp->command)
7902 	{
7903 	case AIROPSIDS:     ridcode = RID_SSID;         break;
7904 	case AIROPCAP:      ridcode = RID_CAPABILITIES; break;
7905 	case AIROPAPLIST:   ridcode = RID_APLIST;       break;
7906 	case AIROPCFG: ai->config.len = 0;
7907 			    clear_bit(FLAG_COMMIT, &ai->flags);
7908 			    ridcode = RID_CONFIG;       break;
7909 	case AIROPWEPKEYNV: ridcode = RID_WEP_PERM;     break;
7910 	case AIROPLEAPUSR:  ridcode = RID_LEAPUSERNAME; break;
7911 	case AIROPLEAPPWD:  ridcode = RID_LEAPPASSWORD; break;
7912 	case AIROPWEPKEY:   ridcode = RID_WEP_TEMP; writer = PC4500_writerid;
7913 		break;
7914 	case AIROPLEAPUSR+1: ridcode = 0xFF2A;          break;
7915 	case AIROPLEAPUSR+2: ridcode = 0xFF2B;          break;
7916 
7917 		/* this is not really a rid but a command given to the card
7918 		 * same with MAC off
7919 		 */
7920 	case AIROPMACON:
7921 		if (enable_MAC(ai, 1) != 0)
7922 			return -EIO;
7923 		return 0;
7924 
7925 		/*
7926 		 * Evidently this code in the airo driver does not get a symbol
7927 		 * as disable_MAC. it's probably so short the compiler does not gen one.
7928 		 */
7929 	case AIROPMACOFF:
7930 		disable_MAC(ai, 1);
7931 		return 0;
7932 
7933 		/* This command merely clears the counts does not actually store any data
7934 		 * only reads rid. But as it changes the cards state, I put it in the
7935 		 * writerid routines.
7936 		 */
7937 	case AIROPSTCLR:
7938 		if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL)
7939 			return -ENOMEM;
7940 
7941 		PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1);
7942 
7943 		enabled = ai->micstats.enabled;
7944 		memset(&ai->micstats,0,sizeof(ai->micstats));
7945 		ai->micstats.enabled = enabled;
7946 
7947 		if (copy_to_user(comp->data, iobuf,
7948 				 min((int)comp->len, (int)RIDSIZE))) {
7949 			kfree (iobuf);
7950 			return -EFAULT;
7951 		}
7952 		kfree (iobuf);
7953 		return 0;
7954 
7955 	default:
7956 		return -EOPNOTSUPP;	/* Blarg! */
7957 	}
7958 	if(comp->len > RIDSIZE)
7959 		return -EINVAL;
7960 
7961 	if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL)
7962 		return -ENOMEM;
7963 
7964 	if (copy_from_user(iobuf,comp->data,comp->len)) {
7965 		kfree (iobuf);
7966 		return -EFAULT;
7967 	}
7968 
7969 	if (comp->command == AIROPCFG) {
7970 		ConfigRid *cfg = (ConfigRid *)iobuf;
7971 
7972 		if (test_bit(FLAG_MIC_CAPABLE, &ai->flags))
7973 			cfg->opmode |= MODE_MIC;
7974 
7975 		if ((cfg->opmode & MODE_CFG_MASK) == MODE_STA_IBSS)
7976 			set_bit (FLAG_ADHOC, &ai->flags);
7977 		else
7978 			clear_bit (FLAG_ADHOC, &ai->flags);
7979 	}
7980 
7981 	if((*writer)(ai, ridcode, iobuf,comp->len,1)) {
7982 		kfree (iobuf);
7983 		return -EIO;
7984 	}
7985 	kfree (iobuf);
7986 	return 0;
7987 }
7988 
7989 /*****************************************************************************
7990  * Ancillary flash / mod functions much black magic lurkes here              *
7991  *****************************************************************************
7992  */
7993 
7994 /*
7995  * Flash command switch table
7996  */
7997 
flashcard(struct net_device * dev,aironet_ioctl * comp)7998 static int flashcard(struct net_device *dev, aironet_ioctl *comp) {
7999 	int z;
8000 
8001 	/* Only super-user can modify flash */
8002 	if (!capable(CAP_NET_ADMIN))
8003 		return -EPERM;
8004 
8005 	switch(comp->command)
8006 	{
8007 	case AIROFLSHRST:
8008 		return cmdreset((struct airo_info *)dev->ml_priv);
8009 
8010 	case AIROFLSHSTFL:
8011 		if (!AIRO_FLASH(dev) &&
8012 		    (AIRO_FLASH(dev) = kmalloc(FLASHSIZE, GFP_KERNEL)) == NULL)
8013 			return -ENOMEM;
8014 		return setflashmode((struct airo_info *)dev->ml_priv);
8015 
8016 	case AIROFLSHGCHR: /* Get char from aux */
8017 		if(comp->len != sizeof(int))
8018 			return -EINVAL;
8019 		if (copy_from_user(&z,comp->data,comp->len))
8020 			return -EFAULT;
8021 		return flashgchar((struct airo_info *)dev->ml_priv, z, 8000);
8022 
8023 	case AIROFLSHPCHR: /* Send char to card. */
8024 		if(comp->len != sizeof(int))
8025 			return -EINVAL;
8026 		if (copy_from_user(&z,comp->data,comp->len))
8027 			return -EFAULT;
8028 		return flashpchar((struct airo_info *)dev->ml_priv, z, 8000);
8029 
8030 	case AIROFLPUTBUF: /* Send 32k to card */
8031 		if (!AIRO_FLASH(dev))
8032 			return -ENOMEM;
8033 		if(comp->len > FLASHSIZE)
8034 			return -EINVAL;
8035 		if (copy_from_user(AIRO_FLASH(dev), comp->data, comp->len))
8036 			return -EFAULT;
8037 
8038 		flashputbuf((struct airo_info *)dev->ml_priv);
8039 		return 0;
8040 
8041 	case AIRORESTART:
8042 		if (flashrestart((struct airo_info *)dev->ml_priv, dev))
8043 			return -EIO;
8044 		return 0;
8045 	}
8046 	return -EINVAL;
8047 }
8048 
8049 #define FLASH_COMMAND  0x7e7e
8050 
8051 /*
8052  * STEP 1)
8053  * Disable MAC and do soft reset on
8054  * card.
8055  */
8056 
cmdreset(struct airo_info * ai)8057 static int cmdreset(struct airo_info *ai) {
8058 	disable_MAC(ai, 1);
8059 
8060 	if(!waitbusy (ai)){
8061 		airo_print_info(ai->dev->name, "Waitbusy hang before RESET");
8062 		return -EBUSY;
8063 	}
8064 
8065 	OUT4500(ai,COMMAND,CMD_SOFTRESET);
8066 
8067 	ssleep(1);			/* WAS 600 12/7/00 */
8068 
8069 	if(!waitbusy (ai)){
8070 		airo_print_info(ai->dev->name, "Waitbusy hang AFTER RESET");
8071 		return -EBUSY;
8072 	}
8073 	return 0;
8074 }
8075 
8076 /* STEP 2)
8077  * Put the card in legendary flash
8078  * mode
8079  */
8080 
setflashmode(struct airo_info * ai)8081 static int setflashmode (struct airo_info *ai) {
8082 	set_bit (FLAG_FLASHING, &ai->flags);
8083 
8084 	OUT4500(ai, SWS0, FLASH_COMMAND);
8085 	OUT4500(ai, SWS1, FLASH_COMMAND);
8086 	if (probe) {
8087 		OUT4500(ai, SWS0, FLASH_COMMAND);
8088 		OUT4500(ai, COMMAND,0x10);
8089 	} else {
8090 		OUT4500(ai, SWS2, FLASH_COMMAND);
8091 		OUT4500(ai, SWS3, FLASH_COMMAND);
8092 		OUT4500(ai, COMMAND,0);
8093 	}
8094 	msleep(500);		/* 500ms delay */
8095 
8096 	if(!waitbusy(ai)) {
8097 		clear_bit (FLAG_FLASHING, &ai->flags);
8098 		airo_print_info(ai->dev->name, "Waitbusy hang after setflash mode");
8099 		return -EIO;
8100 	}
8101 	return 0;
8102 }
8103 
8104 /* Put character to SWS0 wait for dwelltime
8105  * x 50us for  echo .
8106  */
8107 
flashpchar(struct airo_info * ai,int byte,int dwelltime)8108 static int flashpchar(struct airo_info *ai,int byte,int dwelltime) {
8109 	int echo;
8110 	int waittime;
8111 
8112 	byte |= 0x8000;
8113 
8114 	if(dwelltime == 0 )
8115 		dwelltime = 200;
8116 
8117 	waittime=dwelltime;
8118 
8119 	/* Wait for busy bit d15 to go false indicating buffer empty */
8120 	while ((IN4500 (ai, SWS0) & 0x8000) && waittime > 0) {
8121 		udelay (50);
8122 		waittime -= 50;
8123 	}
8124 
8125 	/* timeout for busy clear wait */
8126 	if(waittime <= 0 ){
8127 		airo_print_info(ai->dev->name, "flash putchar busywait timeout!");
8128 		return -EBUSY;
8129 	}
8130 
8131 	/* Port is clear now write byte and wait for it to echo back */
8132 	do {
8133 		OUT4500(ai,SWS0,byte);
8134 		udelay(50);
8135 		dwelltime -= 50;
8136 		echo = IN4500(ai,SWS1);
8137 	} while (dwelltime >= 0 && echo != byte);
8138 
8139 	OUT4500(ai,SWS1,0);
8140 
8141 	return (echo == byte) ? 0 : -EIO;
8142 }
8143 
8144 /*
8145  * Get a character from the card matching matchbyte
8146  * Step 3)
8147  */
flashgchar(struct airo_info * ai,int matchbyte,int dwelltime)8148 static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime){
8149 	int           rchar;
8150 	unsigned char rbyte=0;
8151 
8152 	do {
8153 		rchar = IN4500(ai,SWS1);
8154 
8155 		if(dwelltime && !(0x8000 & rchar)){
8156 			dwelltime -= 10;
8157 			mdelay(10);
8158 			continue;
8159 		}
8160 		rbyte = 0xff & rchar;
8161 
8162 		if( (rbyte == matchbyte) && (0x8000 & rchar) ){
8163 			OUT4500(ai,SWS1,0);
8164 			return 0;
8165 		}
8166 		if( rbyte == 0x81 || rbyte == 0x82 || rbyte == 0x83 || rbyte == 0x1a || 0xffff == rchar)
8167 			break;
8168 		OUT4500(ai,SWS1,0);
8169 
8170 	}while(dwelltime > 0);
8171 	return -EIO;
8172 }
8173 
8174 /*
8175  * Transfer 32k of firmware data from user buffer to our buffer and
8176  * send to the card
8177  */
8178 
flashputbuf(struct airo_info * ai)8179 static int flashputbuf(struct airo_info *ai){
8180 	int            nwords;
8181 
8182 	/* Write stuff */
8183 	if (test_bit(FLAG_MPI,&ai->flags))
8184 		memcpy_toio(ai->pciaux + 0x8000, ai->flash, FLASHSIZE);
8185 	else {
8186 		OUT4500(ai,AUXPAGE,0x100);
8187 		OUT4500(ai,AUXOFF,0);
8188 
8189 		for(nwords=0;nwords != FLASHSIZE / 2;nwords++){
8190 			OUT4500(ai,AUXDATA,ai->flash[nwords] & 0xffff);
8191 		}
8192 	}
8193 	OUT4500(ai,SWS0,0x8000);
8194 
8195 	return 0;
8196 }
8197 
8198 /*
8199  *
8200  */
flashrestart(struct airo_info * ai,struct net_device * dev)8201 static int flashrestart(struct airo_info *ai,struct net_device *dev){
8202 	int    i,status;
8203 
8204 	ssleep(1);			/* Added 12/7/00 */
8205 	clear_bit (FLAG_FLASHING, &ai->flags);
8206 	if (test_bit(FLAG_MPI, &ai->flags)) {
8207 		status = mpi_init_descriptors(ai);
8208 		if (status != SUCCESS)
8209 			return status;
8210 	}
8211 	status = setup_card(ai, dev->dev_addr, 1);
8212 
8213 	if (!test_bit(FLAG_MPI,&ai->flags))
8214 		for( i = 0; i < MAX_FIDS; i++ ) {
8215 			ai->fids[i] = transmit_allocate
8216 				( ai, AIRO_DEF_MTU, i >= MAX_FIDS / 2 );
8217 		}
8218 
8219 	ssleep(1);			/* Added 12/7/00 */
8220 	return status;
8221 }
8222 #endif /* CISCO_EXT */
8223 
8224 /*
8225     This program is free software; you can redistribute it and/or
8226     modify it under the terms of the GNU General Public License
8227     as published by the Free Software Foundation; either version 2
8228     of the License, or (at your option) any later version.
8229 
8230     This program is distributed in the hope that it will be useful,
8231     but WITHOUT ANY WARRANTY; without even the implied warranty of
8232     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8233     GNU General Public License for more details.
8234 
8235     In addition:
8236 
8237     Redistribution and use in source and binary forms, with or without
8238     modification, are permitted provided that the following conditions
8239     are met:
8240 
8241     1. Redistributions of source code must retain the above copyright
8242        notice, this list of conditions and the following disclaimer.
8243     2. Redistributions in binary form must reproduce the above copyright
8244        notice, this list of conditions and the following disclaimer in the
8245        documentation and/or other materials provided with the distribution.
8246     3. The name of the author may not be used to endorse or promote
8247        products derived from this software without specific prior written
8248        permission.
8249 
8250     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
8251     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
8252     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
8253     ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
8254     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
8255     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
8256     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
8257     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
8258     STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
8259     IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
8260     POSSIBILITY OF SUCH DAMAGE.
8261 */
8262 
8263 module_init(airo_init_module);
8264 module_exit(airo_cleanup_module);
8265