• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/unaligned.h>
41 
42 #include <linux/netdevice.h>
43 #include <linux/etherdevice.h>
44 #include <linux/skbuff.h>
45 #include <linux/if_arp.h>
46 #include <linux/ioport.h>
47 #include <linux/pci.h>
48 #include <asm/uaccess.h>
49 #include <linux/kthread.h>
50 #include <linux/freezer.h>
51 
52 #include <linux/ieee80211.h>
53 #include <net/iw_handler.h>
54 
55 #include "airo.h"
56 
57 #define DRV_NAME "airo"
58 
59 #ifdef CONFIG_PCI
60 static DEFINE_PCI_DEVICE_TABLE(card_ids) = {
61 	{ 0x14b9, 1, PCI_ANY_ID, PCI_ANY_ID, },
62 	{ 0x14b9, 0x4500, PCI_ANY_ID, PCI_ANY_ID },
63 	{ 0x14b9, 0x4800, PCI_ANY_ID, PCI_ANY_ID, },
64 	{ 0x14b9, 0x0340, PCI_ANY_ID, PCI_ANY_ID, },
65 	{ 0x14b9, 0x0350, PCI_ANY_ID, PCI_ANY_ID, },
66 	{ 0x14b9, 0x5000, PCI_ANY_ID, PCI_ANY_ID, },
67 	{ 0x14b9, 0xa504, PCI_ANY_ID, PCI_ANY_ID, },
68 	{ 0, }
69 };
70 MODULE_DEVICE_TABLE(pci, card_ids);
71 
72 static int airo_pci_probe(struct pci_dev *, const struct pci_device_id *);
73 static void airo_pci_remove(struct pci_dev *);
74 static int airo_pci_suspend(struct pci_dev *pdev, pm_message_t state);
75 static int airo_pci_resume(struct pci_dev *pdev);
76 
77 static struct pci_driver airo_driver = {
78 	.name     = DRV_NAME,
79 	.id_table = card_ids,
80 	.probe    = airo_pci_probe,
81 	.remove   = airo_pci_remove,
82 	.suspend  = airo_pci_suspend,
83 	.resume   = airo_pci_resume,
84 };
85 #endif /* CONFIG_PCI */
86 
87 /* Include Wireless Extension definition and check version - Jean II */
88 #include <linux/wireless.h>
89 #define WIRELESS_SPY		/* enable iwspy support */
90 
91 #define CISCO_EXT		/* enable Cisco extensions */
92 #ifdef CISCO_EXT
93 #include <linux/delay.h>
94 #endif
95 
96 /* Hack to do some power saving */
97 #define POWER_ON_DOWN
98 
99 /* As you can see this list is HUGH!
100    I really don't know what a lot of these counts are about, but they
101    are all here for completeness.  If the IGNLABEL macro is put in
102    infront of the label, that statistic will not be included in the list
103    of statistics in the /proc filesystem */
104 
105 #define IGNLABEL(comment) NULL
106 static const char *statsLabels[] = {
107 	"RxOverrun",
108 	IGNLABEL("RxPlcpCrcErr"),
109 	IGNLABEL("RxPlcpFormatErr"),
110 	IGNLABEL("RxPlcpLengthErr"),
111 	"RxMacCrcErr",
112 	"RxMacCrcOk",
113 	"RxWepErr",
114 	"RxWepOk",
115 	"RetryLong",
116 	"RetryShort",
117 	"MaxRetries",
118 	"NoAck",
119 	"NoCts",
120 	"RxAck",
121 	"RxCts",
122 	"TxAck",
123 	"TxRts",
124 	"TxCts",
125 	"TxMc",
126 	"TxBc",
127 	"TxUcFrags",
128 	"TxUcPackets",
129 	"TxBeacon",
130 	"RxBeacon",
131 	"TxSinColl",
132 	"TxMulColl",
133 	"DefersNo",
134 	"DefersProt",
135 	"DefersEngy",
136 	"DupFram",
137 	"RxFragDisc",
138 	"TxAged",
139 	"RxAged",
140 	"LostSync-MaxRetry",
141 	"LostSync-MissedBeacons",
142 	"LostSync-ArlExceeded",
143 	"LostSync-Deauth",
144 	"LostSync-Disassoced",
145 	"LostSync-TsfTiming",
146 	"HostTxMc",
147 	"HostTxBc",
148 	"HostTxUc",
149 	"HostTxFail",
150 	"HostRxMc",
151 	"HostRxBc",
152 	"HostRxUc",
153 	"HostRxDiscard",
154 	IGNLABEL("HmacTxMc"),
155 	IGNLABEL("HmacTxBc"),
156 	IGNLABEL("HmacTxUc"),
157 	IGNLABEL("HmacTxFail"),
158 	IGNLABEL("HmacRxMc"),
159 	IGNLABEL("HmacRxBc"),
160 	IGNLABEL("HmacRxUc"),
161 	IGNLABEL("HmacRxDiscard"),
162 	IGNLABEL("HmacRxAccepted"),
163 	"SsidMismatch",
164 	"ApMismatch",
165 	"RatesMismatch",
166 	"AuthReject",
167 	"AuthTimeout",
168 	"AssocReject",
169 	"AssocTimeout",
170 	IGNLABEL("ReasonOutsideTable"),
171 	IGNLABEL("ReasonStatus1"),
172 	IGNLABEL("ReasonStatus2"),
173 	IGNLABEL("ReasonStatus3"),
174 	IGNLABEL("ReasonStatus4"),
175 	IGNLABEL("ReasonStatus5"),
176 	IGNLABEL("ReasonStatus6"),
177 	IGNLABEL("ReasonStatus7"),
178 	IGNLABEL("ReasonStatus8"),
179 	IGNLABEL("ReasonStatus9"),
180 	IGNLABEL("ReasonStatus10"),
181 	IGNLABEL("ReasonStatus11"),
182 	IGNLABEL("ReasonStatus12"),
183 	IGNLABEL("ReasonStatus13"),
184 	IGNLABEL("ReasonStatus14"),
185 	IGNLABEL("ReasonStatus15"),
186 	IGNLABEL("ReasonStatus16"),
187 	IGNLABEL("ReasonStatus17"),
188 	IGNLABEL("ReasonStatus18"),
189 	IGNLABEL("ReasonStatus19"),
190 	"RxMan",
191 	"TxMan",
192 	"RxRefresh",
193 	"TxRefresh",
194 	"RxPoll",
195 	"TxPoll",
196 	"HostRetries",
197 	"LostSync-HostReq",
198 	"HostTxBytes",
199 	"HostRxBytes",
200 	"ElapsedUsec",
201 	"ElapsedSec",
202 	"LostSyncBetterAP",
203 	"PrivacyMismatch",
204 	"Jammed",
205 	"DiscRxNotWepped",
206 	"PhyEleMismatch",
207 	(char*)-1 };
208 #ifndef RUN_AT
209 #define RUN_AT(x) (jiffies+(x))
210 #endif
211 
212 
213 /* These variables are for insmod, since it seems that the rates
214    can only be set in setup_card.  Rates should be a comma separated
215    (no spaces) list of rates (up to 8). */
216 
217 static int rates[8];
218 static char *ssids[3];
219 
220 static int io[4];
221 static int irq[4];
222 
223 static
224 int maxencrypt /* = 0 */; /* The highest rate that the card can encrypt at.
225 		       0 means no limit.  For old cards this was 4 */
226 
227 static int auto_wep /* = 0 */; /* If set, it tries to figure out the wep mode */
228 static int aux_bap /* = 0 */; /* Checks to see if the aux ports are needed to read
229 		    the bap, needed on some older cards and buses. */
230 static int adhoc;
231 
232 static int probe = 1;
233 
234 static kuid_t proc_kuid;
235 static int proc_uid /* = 0 */;
236 
237 static kgid_t proc_kgid;
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 && !test_bit(FLAG_RADIO_DOWN, &ai->flags)) {
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(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(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 
4504 	/* First setup the device directory */
4505 	strcpy(apriv->proc_name,dev->name);
4506 	apriv->proc_entry = proc_mkdir_mode(apriv->proc_name, airo_perm,
4507 					    airo_entry);
4508 	if (!apriv->proc_entry)
4509 		return -ENOMEM;
4510 	proc_set_user(apriv->proc_entry, proc_kuid, proc_kgid);
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;
4517 	proc_set_user(entry, proc_kuid, proc_kgid);
4518 
4519 	/* Setup the Stats */
4520 	entry = proc_create_data("Stats", S_IRUGO & proc_perm,
4521 				 apriv->proc_entry, &proc_stats_ops, dev);
4522 	if (!entry)
4523 		goto fail;
4524 	proc_set_user(entry, proc_kuid, proc_kgid);
4525 
4526 	/* Setup the Status */
4527 	entry = proc_create_data("Status", S_IRUGO & proc_perm,
4528 				 apriv->proc_entry, &proc_status_ops, dev);
4529 	if (!entry)
4530 		goto fail;
4531 	proc_set_user(entry, proc_kuid, proc_kgid);
4532 
4533 	/* Setup the Config */
4534 	entry = proc_create_data("Config", proc_perm,
4535 				 apriv->proc_entry, &proc_config_ops, dev);
4536 	if (!entry)
4537 		goto fail;
4538 	proc_set_user(entry, proc_kuid, proc_kgid);
4539 
4540 	/* Setup the SSID */
4541 	entry = proc_create_data("SSID", proc_perm,
4542 				 apriv->proc_entry, &proc_SSID_ops, dev);
4543 	if (!entry)
4544 		goto fail;
4545 	proc_set_user(entry, proc_kuid, proc_kgid);
4546 
4547 	/* Setup the APList */
4548 	entry = proc_create_data("APList", proc_perm,
4549 				 apriv->proc_entry, &proc_APList_ops, dev);
4550 	if (!entry)
4551 		goto fail;
4552 	proc_set_user(entry, proc_kuid, proc_kgid);
4553 
4554 	/* Setup the BSSList */
4555 	entry = proc_create_data("BSSList", proc_perm,
4556 				 apriv->proc_entry, &proc_BSSList_ops, dev);
4557 	if (!entry)
4558 		goto fail;
4559 	proc_set_user(entry, proc_kuid, proc_kgid);
4560 
4561 	/* Setup the WepKey */
4562 	entry = proc_create_data("WepKey", proc_perm,
4563 				 apriv->proc_entry, &proc_wepkey_ops, dev);
4564 	if (!entry)
4565 		goto fail;
4566 	proc_set_user(entry, proc_kuid, proc_kgid);
4567 	return 0;
4568 
4569 fail:
4570 	remove_proc_subtree(apriv->proc_name, airo_entry);
4571 	return -ENOMEM;
4572 }
4573 
takedown_proc_entry(struct net_device * dev,struct airo_info * apriv)4574 static int takedown_proc_entry( struct net_device *dev,
4575 				struct airo_info *apriv )
4576 {
4577 	remove_proc_subtree(apriv->proc_name, airo_entry);
4578 	return 0;
4579 }
4580 
4581 /*
4582  *  What we want from the proc_fs is to be able to efficiently read
4583  *  and write the configuration.  To do this, we want to read the
4584  *  configuration when the file is opened and write it when the file is
4585  *  closed.  So basically we allocate a read buffer at open and fill it
4586  *  with data, and allocate a write buffer and read it at close.
4587  */
4588 
4589 /*
4590  *  The read routine is generic, it relies on the preallocated rbuffer
4591  *  to supply the data.
4592  */
proc_read(struct file * file,char __user * buffer,size_t len,loff_t * offset)4593 static ssize_t proc_read( struct file *file,
4594 			  char __user *buffer,
4595 			  size_t len,
4596 			  loff_t *offset )
4597 {
4598 	struct proc_data *priv = file->private_data;
4599 
4600 	if (!priv->rbuffer)
4601 		return -EINVAL;
4602 
4603 	return simple_read_from_buffer(buffer, len, offset, priv->rbuffer,
4604 					priv->readlen);
4605 }
4606 
4607 /*
4608  *  The write routine is generic, it fills in a preallocated rbuffer
4609  *  to supply the data.
4610  */
proc_write(struct file * file,const char __user * buffer,size_t len,loff_t * offset)4611 static ssize_t proc_write( struct file *file,
4612 			   const char __user *buffer,
4613 			   size_t len,
4614 			   loff_t *offset )
4615 {
4616 	ssize_t ret;
4617 	struct proc_data *priv = file->private_data;
4618 
4619 	if (!priv->wbuffer)
4620 		return -EINVAL;
4621 
4622 	ret = simple_write_to_buffer(priv->wbuffer, priv->maxwritelen, offset,
4623 					buffer, len);
4624 	if (ret > 0)
4625 		priv->writelen = max_t(int, priv->writelen, *offset);
4626 
4627 	return ret;
4628 }
4629 
proc_status_open(struct inode * inode,struct file * file)4630 static int proc_status_open(struct inode *inode, struct file *file)
4631 {
4632 	struct proc_data *data;
4633 	struct net_device *dev = PDE_DATA(inode);
4634 	struct airo_info *apriv = dev->ml_priv;
4635 	CapabilityRid cap_rid;
4636 	StatusRid status_rid;
4637 	u16 mode;
4638 	int i;
4639 
4640 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
4641 		return -ENOMEM;
4642 	data = file->private_data;
4643 	if ((data->rbuffer = kmalloc( 2048, GFP_KERNEL )) == NULL) {
4644 		kfree (file->private_data);
4645 		return -ENOMEM;
4646 	}
4647 
4648 	readStatusRid(apriv, &status_rid, 1);
4649 	readCapabilityRid(apriv, &cap_rid, 1);
4650 
4651 	mode = le16_to_cpu(status_rid.mode);
4652 
4653         i = sprintf(data->rbuffer, "Status: %s%s%s%s%s%s%s%s%s\n",
4654                     mode & 1 ? "CFG ": "",
4655                     mode & 2 ? "ACT ": "",
4656                     mode & 0x10 ? "SYN ": "",
4657                     mode & 0x20 ? "LNK ": "",
4658                     mode & 0x40 ? "LEAP ": "",
4659                     mode & 0x80 ? "PRIV ": "",
4660                     mode & 0x100 ? "KEY ": "",
4661                     mode & 0x200 ? "WEP ": "",
4662                     mode & 0x8000 ? "ERR ": "");
4663 	sprintf( data->rbuffer+i, "Mode: %x\n"
4664 		 "Signal Strength: %d\n"
4665 		 "Signal Quality: %d\n"
4666 		 "SSID: %-.*s\n"
4667 		 "AP: %-.16s\n"
4668 		 "Freq: %d\n"
4669 		 "BitRate: %dmbs\n"
4670 		 "Driver Version: %s\n"
4671 		 "Device: %s\nManufacturer: %s\nFirmware Version: %s\n"
4672 		 "Radio type: %x\nCountry: %x\nHardware Version: %x\n"
4673 		 "Software Version: %x\nSoftware Subversion: %x\n"
4674 		 "Boot block version: %x\n",
4675 		 le16_to_cpu(status_rid.mode),
4676 		 le16_to_cpu(status_rid.normalizedSignalStrength),
4677 		 le16_to_cpu(status_rid.signalQuality),
4678 		 le16_to_cpu(status_rid.SSIDlen),
4679 		 status_rid.SSID,
4680 		 status_rid.apName,
4681 		 le16_to_cpu(status_rid.channel),
4682 		 le16_to_cpu(status_rid.currentXmitRate) / 2,
4683 		 version,
4684 		 cap_rid.prodName,
4685 		 cap_rid.manName,
4686 		 cap_rid.prodVer,
4687 		 le16_to_cpu(cap_rid.radioType),
4688 		 le16_to_cpu(cap_rid.country),
4689 		 le16_to_cpu(cap_rid.hardVer),
4690 		 le16_to_cpu(cap_rid.softVer),
4691 		 le16_to_cpu(cap_rid.softSubVer),
4692 		 le16_to_cpu(cap_rid.bootBlockVer));
4693 	data->readlen = strlen( data->rbuffer );
4694 	return 0;
4695 }
4696 
4697 static int proc_stats_rid_open(struct inode*, struct file*, u16);
proc_statsdelta_open(struct inode * inode,struct file * file)4698 static int proc_statsdelta_open( struct inode *inode,
4699 				 struct file *file ) {
4700 	if (file->f_mode&FMODE_WRITE) {
4701 		return proc_stats_rid_open(inode, file, RID_STATSDELTACLEAR);
4702 	}
4703 	return proc_stats_rid_open(inode, file, RID_STATSDELTA);
4704 }
4705 
proc_stats_open(struct inode * inode,struct file * file)4706 static int proc_stats_open( struct inode *inode, struct file *file ) {
4707 	return proc_stats_rid_open(inode, file, RID_STATS);
4708 }
4709 
proc_stats_rid_open(struct inode * inode,struct file * file,u16 rid)4710 static int proc_stats_rid_open( struct inode *inode,
4711 				struct file *file,
4712 				u16 rid )
4713 {
4714 	struct proc_data *data;
4715 	struct net_device *dev = PDE_DATA(inode);
4716 	struct airo_info *apriv = dev->ml_priv;
4717 	StatsRid stats;
4718 	int i, j;
4719 	__le32 *vals = stats.vals;
4720 	int len;
4721 
4722 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
4723 		return -ENOMEM;
4724 	data = file->private_data;
4725 	if ((data->rbuffer = kmalloc( 4096, GFP_KERNEL )) == NULL) {
4726 		kfree (file->private_data);
4727 		return -ENOMEM;
4728 	}
4729 
4730 	readStatsRid(apriv, &stats, rid, 1);
4731 	len = le16_to_cpu(stats.len);
4732 
4733         j = 0;
4734 	for(i=0; statsLabels[i]!=(char *)-1 && i*4<len; i++) {
4735 		if (!statsLabels[i]) continue;
4736 		if (j+strlen(statsLabels[i])+16>4096) {
4737 			airo_print_warn(apriv->dev->name,
4738 			       "Potentially disastrous buffer overflow averted!");
4739 			break;
4740 		}
4741 		j+=sprintf(data->rbuffer+j, "%s: %u\n", statsLabels[i],
4742 				le32_to_cpu(vals[i]));
4743 	}
4744 	if (i*4 >= len) {
4745 		airo_print_warn(apriv->dev->name, "Got a short rid");
4746 	}
4747 	data->readlen = j;
4748 	return 0;
4749 }
4750 
get_dec_u16(char * buffer,int * start,int limit)4751 static int get_dec_u16( char *buffer, int *start, int limit ) {
4752 	u16 value;
4753 	int valid = 0;
4754 	for (value = 0; *start < limit && buffer[*start] >= '0' &&
4755 			buffer[*start] <= '9'; (*start)++) {
4756 		valid = 1;
4757 		value *= 10;
4758 		value += buffer[*start] - '0';
4759 	}
4760 	if ( !valid ) return -1;
4761 	return value;
4762 }
4763 
4764 static int airo_config_commit(struct net_device *dev,
4765 			      struct iw_request_info *info, void *zwrq,
4766 			      char *extra);
4767 
sniffing_mode(struct airo_info * ai)4768 static inline int sniffing_mode(struct airo_info *ai)
4769 {
4770 	return (le16_to_cpu(ai->config.rmode) & le16_to_cpu(RXMODE_MASK)) >=
4771 		le16_to_cpu(RXMODE_RFMON);
4772 }
4773 
proc_config_on_close(struct inode * inode,struct file * file)4774 static void proc_config_on_close(struct inode *inode, struct file *file)
4775 {
4776 	struct proc_data *data = file->private_data;
4777 	struct net_device *dev = PDE_DATA(inode);
4778 	struct airo_info *ai = dev->ml_priv;
4779 	char *line;
4780 
4781 	if ( !data->writelen ) return;
4782 
4783 	readConfigRid(ai, 1);
4784 	set_bit (FLAG_COMMIT, &ai->flags);
4785 
4786 	line = data->wbuffer;
4787 	while( line[0] ) {
4788 /*** Mode processing */
4789 		if ( !strncmp( line, "Mode: ", 6 ) ) {
4790 			line += 6;
4791 			if (sniffing_mode(ai))
4792 				set_bit (FLAG_RESET, &ai->flags);
4793 			ai->config.rmode &= ~RXMODE_FULL_MASK;
4794 			clear_bit (FLAG_802_11, &ai->flags);
4795 			ai->config.opmode &= ~MODE_CFG_MASK;
4796 			ai->config.scanMode = SCANMODE_ACTIVE;
4797 			if ( line[0] == 'a' ) {
4798 				ai->config.opmode |= MODE_STA_IBSS;
4799 			} else {
4800 				ai->config.opmode |= MODE_STA_ESS;
4801 				if ( line[0] == 'r' ) {
4802 					ai->config.rmode |= RXMODE_RFMON | RXMODE_DISABLE_802_3_HEADER;
4803 					ai->config.scanMode = SCANMODE_PASSIVE;
4804 					set_bit (FLAG_802_11, &ai->flags);
4805 				} else if ( line[0] == 'y' ) {
4806 					ai->config.rmode |= RXMODE_RFMON_ANYBSS | RXMODE_DISABLE_802_3_HEADER;
4807 					ai->config.scanMode = SCANMODE_PASSIVE;
4808 					set_bit (FLAG_802_11, &ai->flags);
4809 				} else if ( line[0] == 'l' )
4810 					ai->config.rmode |= RXMODE_LANMON;
4811 			}
4812 			set_bit (FLAG_COMMIT, &ai->flags);
4813 		}
4814 
4815 /*** Radio status */
4816 		else if (!strncmp(line,"Radio: ", 7)) {
4817 			line += 7;
4818 			if (!strncmp(line,"off",3)) {
4819 				set_bit (FLAG_RADIO_OFF, &ai->flags);
4820 			} else {
4821 				clear_bit (FLAG_RADIO_OFF, &ai->flags);
4822 			}
4823 		}
4824 /*** NodeName processing */
4825 		else if ( !strncmp( line, "NodeName: ", 10 ) ) {
4826 			int j;
4827 
4828 			line += 10;
4829 			memset( ai->config.nodeName, 0, 16 );
4830 /* Do the name, assume a space between the mode and node name */
4831 			for( j = 0; j < 16 && line[j] != '\n'; j++ ) {
4832 				ai->config.nodeName[j] = line[j];
4833 			}
4834 			set_bit (FLAG_COMMIT, &ai->flags);
4835 		}
4836 
4837 /*** PowerMode processing */
4838 		else if ( !strncmp( line, "PowerMode: ", 11 ) ) {
4839 			line += 11;
4840 			if ( !strncmp( line, "PSPCAM", 6 ) ) {
4841 				ai->config.powerSaveMode = POWERSAVE_PSPCAM;
4842 				set_bit (FLAG_COMMIT, &ai->flags);
4843 			} else if ( !strncmp( line, "PSP", 3 ) ) {
4844 				ai->config.powerSaveMode = POWERSAVE_PSP;
4845 				set_bit (FLAG_COMMIT, &ai->flags);
4846 			} else {
4847 				ai->config.powerSaveMode = POWERSAVE_CAM;
4848 				set_bit (FLAG_COMMIT, &ai->flags);
4849 			}
4850 		} else if ( !strncmp( line, "DataRates: ", 11 ) ) {
4851 			int v, i = 0, k = 0; /* i is index into line,
4852 						k is index to rates */
4853 
4854 			line += 11;
4855 			while((v = get_dec_u16(line, &i, 3))!=-1) {
4856 				ai->config.rates[k++] = (u8)v;
4857 				line += i + 1;
4858 				i = 0;
4859 			}
4860 			set_bit (FLAG_COMMIT, &ai->flags);
4861 		} else if ( !strncmp( line, "Channel: ", 9 ) ) {
4862 			int v, i = 0;
4863 			line += 9;
4864 			v = get_dec_u16(line, &i, i+3);
4865 			if ( v != -1 ) {
4866 				ai->config.channelSet = cpu_to_le16(v);
4867 				set_bit (FLAG_COMMIT, &ai->flags);
4868 			}
4869 		} else if ( !strncmp( line, "XmitPower: ", 11 ) ) {
4870 			int v, i = 0;
4871 			line += 11;
4872 			v = get_dec_u16(line, &i, i+3);
4873 			if ( v != -1 ) {
4874 				ai->config.txPower = cpu_to_le16(v);
4875 				set_bit (FLAG_COMMIT, &ai->flags);
4876 			}
4877 		} else if ( !strncmp( line, "WEP: ", 5 ) ) {
4878 			line += 5;
4879 			switch( line[0] ) {
4880 			case 's':
4881 				ai->config.authType = AUTH_SHAREDKEY;
4882 				break;
4883 			case 'e':
4884 				ai->config.authType = AUTH_ENCRYPT;
4885 				break;
4886 			default:
4887 				ai->config.authType = AUTH_OPEN;
4888 				break;
4889 			}
4890 			set_bit (FLAG_COMMIT, &ai->flags);
4891 		} else if ( !strncmp( line, "LongRetryLimit: ", 16 ) ) {
4892 			int v, i = 0;
4893 
4894 			line += 16;
4895 			v = get_dec_u16(line, &i, 3);
4896 			v = (v<0) ? 0 : ((v>255) ? 255 : v);
4897 			ai->config.longRetryLimit = cpu_to_le16(v);
4898 			set_bit (FLAG_COMMIT, &ai->flags);
4899 		} else if ( !strncmp( line, "ShortRetryLimit: ", 17 ) ) {
4900 			int v, i = 0;
4901 
4902 			line += 17;
4903 			v = get_dec_u16(line, &i, 3);
4904 			v = (v<0) ? 0 : ((v>255) ? 255 : v);
4905 			ai->config.shortRetryLimit = cpu_to_le16(v);
4906 			set_bit (FLAG_COMMIT, &ai->flags);
4907 		} else if ( !strncmp( line, "RTSThreshold: ", 14 ) ) {
4908 			int v, i = 0;
4909 
4910 			line += 14;
4911 			v = get_dec_u16(line, &i, 4);
4912 			v = (v<0) ? 0 : ((v>AIRO_DEF_MTU) ? AIRO_DEF_MTU : v);
4913 			ai->config.rtsThres = cpu_to_le16(v);
4914 			set_bit (FLAG_COMMIT, &ai->flags);
4915 		} else if ( !strncmp( line, "TXMSDULifetime: ", 16 ) ) {
4916 			int v, i = 0;
4917 
4918 			line += 16;
4919 			v = get_dec_u16(line, &i, 5);
4920 			v = (v<0) ? 0 : v;
4921 			ai->config.txLifetime = cpu_to_le16(v);
4922 			set_bit (FLAG_COMMIT, &ai->flags);
4923 		} else if ( !strncmp( line, "RXMSDULifetime: ", 16 ) ) {
4924 			int v, i = 0;
4925 
4926 			line += 16;
4927 			v = get_dec_u16(line, &i, 5);
4928 			v = (v<0) ? 0 : v;
4929 			ai->config.rxLifetime = cpu_to_le16(v);
4930 			set_bit (FLAG_COMMIT, &ai->flags);
4931 		} else if ( !strncmp( line, "TXDiversity: ", 13 ) ) {
4932 			ai->config.txDiversity =
4933 				(line[13]=='l') ? 1 :
4934 				((line[13]=='r')? 2: 3);
4935 			set_bit (FLAG_COMMIT, &ai->flags);
4936 		} else if ( !strncmp( line, "RXDiversity: ", 13 ) ) {
4937 			ai->config.rxDiversity =
4938 				(line[13]=='l') ? 1 :
4939 				((line[13]=='r')? 2: 3);
4940 			set_bit (FLAG_COMMIT, &ai->flags);
4941 		} else if ( !strncmp( line, "FragThreshold: ", 15 ) ) {
4942 			int v, i = 0;
4943 
4944 			line += 15;
4945 			v = get_dec_u16(line, &i, 4);
4946 			v = (v<256) ? 256 : ((v>AIRO_DEF_MTU) ? AIRO_DEF_MTU : v);
4947 			v = v & 0xfffe; /* Make sure its even */
4948 			ai->config.fragThresh = cpu_to_le16(v);
4949 			set_bit (FLAG_COMMIT, &ai->flags);
4950 		} else if (!strncmp(line, "Modulation: ", 12)) {
4951 			line += 12;
4952 			switch(*line) {
4953 			case 'd':  ai->config.modulation=MOD_DEFAULT; set_bit(FLAG_COMMIT, &ai->flags); break;
4954 			case 'c':  ai->config.modulation=MOD_CCK; set_bit(FLAG_COMMIT, &ai->flags); break;
4955 			case 'm':  ai->config.modulation=MOD_MOK; set_bit(FLAG_COMMIT, &ai->flags); break;
4956 			default: airo_print_warn(ai->dev->name, "Unknown modulation");
4957 			}
4958 		} else if (!strncmp(line, "Preamble: ", 10)) {
4959 			line += 10;
4960 			switch(*line) {
4961 			case 'a': ai->config.preamble=PREAMBLE_AUTO; set_bit(FLAG_COMMIT, &ai->flags); break;
4962 			case 'l': ai->config.preamble=PREAMBLE_LONG; set_bit(FLAG_COMMIT, &ai->flags); break;
4963 			case 's': ai->config.preamble=PREAMBLE_SHORT; set_bit(FLAG_COMMIT, &ai->flags); break;
4964 			default: airo_print_warn(ai->dev->name, "Unknown preamble");
4965 			}
4966 		} else {
4967 			airo_print_warn(ai->dev->name, "Couldn't figure out %s", line);
4968 		}
4969 		while( line[0] && line[0] != '\n' ) line++;
4970 		if ( line[0] ) line++;
4971 	}
4972 	airo_config_commit(dev, NULL, NULL, NULL);
4973 }
4974 
get_rmode(__le16 mode)4975 static const char *get_rmode(__le16 mode)
4976 {
4977         switch(mode & RXMODE_MASK) {
4978         case RXMODE_RFMON:  return "rfmon";
4979         case RXMODE_RFMON_ANYBSS:  return "yna (any) bss rfmon";
4980         case RXMODE_LANMON:  return "lanmon";
4981         }
4982         return "ESS";
4983 }
4984 
proc_config_open(struct inode * inode,struct file * file)4985 static int proc_config_open(struct inode *inode, struct file *file)
4986 {
4987 	struct proc_data *data;
4988 	struct net_device *dev = PDE_DATA(inode);
4989 	struct airo_info *ai = dev->ml_priv;
4990 	int i;
4991 	__le16 mode;
4992 
4993 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
4994 		return -ENOMEM;
4995 	data = file->private_data;
4996 	if ((data->rbuffer = kmalloc( 2048, GFP_KERNEL )) == NULL) {
4997 		kfree (file->private_data);
4998 		return -ENOMEM;
4999 	}
5000 	if ((data->wbuffer = kzalloc( 2048, GFP_KERNEL )) == NULL) {
5001 		kfree (data->rbuffer);
5002 		kfree (file->private_data);
5003 		return -ENOMEM;
5004 	}
5005 	data->maxwritelen = 2048;
5006 	data->on_close = proc_config_on_close;
5007 
5008 	readConfigRid(ai, 1);
5009 
5010 	mode = ai->config.opmode & MODE_CFG_MASK;
5011 	i = sprintf( data->rbuffer,
5012 		     "Mode: %s\n"
5013 		     "Radio: %s\n"
5014 		     "NodeName: %-16s\n"
5015 		     "PowerMode: %s\n"
5016 		     "DataRates: %d %d %d %d %d %d %d %d\n"
5017 		     "Channel: %d\n"
5018 		     "XmitPower: %d\n",
5019 		     mode == MODE_STA_IBSS ? "adhoc" :
5020 		     mode == MODE_STA_ESS ? get_rmode(ai->config.rmode):
5021 		     mode == MODE_AP ? "AP" :
5022 		     mode == MODE_AP_RPTR ? "AP RPTR" : "Error",
5023 		     test_bit(FLAG_RADIO_OFF, &ai->flags) ? "off" : "on",
5024 		     ai->config.nodeName,
5025 		     ai->config.powerSaveMode == POWERSAVE_CAM ? "CAM" :
5026 		     ai->config.powerSaveMode == POWERSAVE_PSP ? "PSP" :
5027 		     ai->config.powerSaveMode == POWERSAVE_PSPCAM ? "PSPCAM" :
5028 		     "Error",
5029 		     (int)ai->config.rates[0],
5030 		     (int)ai->config.rates[1],
5031 		     (int)ai->config.rates[2],
5032 		     (int)ai->config.rates[3],
5033 		     (int)ai->config.rates[4],
5034 		     (int)ai->config.rates[5],
5035 		     (int)ai->config.rates[6],
5036 		     (int)ai->config.rates[7],
5037 		     le16_to_cpu(ai->config.channelSet),
5038 		     le16_to_cpu(ai->config.txPower)
5039 		);
5040 	sprintf( data->rbuffer + i,
5041 		 "LongRetryLimit: %d\n"
5042 		 "ShortRetryLimit: %d\n"
5043 		 "RTSThreshold: %d\n"
5044 		 "TXMSDULifetime: %d\n"
5045 		 "RXMSDULifetime: %d\n"
5046 		 "TXDiversity: %s\n"
5047 		 "RXDiversity: %s\n"
5048 		 "FragThreshold: %d\n"
5049 		 "WEP: %s\n"
5050 		 "Modulation: %s\n"
5051 		 "Preamble: %s\n",
5052 		 le16_to_cpu(ai->config.longRetryLimit),
5053 		 le16_to_cpu(ai->config.shortRetryLimit),
5054 		 le16_to_cpu(ai->config.rtsThres),
5055 		 le16_to_cpu(ai->config.txLifetime),
5056 		 le16_to_cpu(ai->config.rxLifetime),
5057 		 ai->config.txDiversity == 1 ? "left" :
5058 		 ai->config.txDiversity == 2 ? "right" : "both",
5059 		 ai->config.rxDiversity == 1 ? "left" :
5060 		 ai->config.rxDiversity == 2 ? "right" : "both",
5061 		 le16_to_cpu(ai->config.fragThresh),
5062 		 ai->config.authType == AUTH_ENCRYPT ? "encrypt" :
5063 		 ai->config.authType == AUTH_SHAREDKEY ? "shared" : "open",
5064 		 ai->config.modulation == MOD_DEFAULT ? "default" :
5065 		 ai->config.modulation == MOD_CCK ? "cck" :
5066 		 ai->config.modulation == MOD_MOK ? "mok" : "error",
5067 		 ai->config.preamble == PREAMBLE_AUTO ? "auto" :
5068 		 ai->config.preamble == PREAMBLE_LONG ? "long" :
5069 		 ai->config.preamble == PREAMBLE_SHORT ? "short" : "error"
5070 		);
5071 	data->readlen = strlen( data->rbuffer );
5072 	return 0;
5073 }
5074 
proc_SSID_on_close(struct inode * inode,struct file * file)5075 static void proc_SSID_on_close(struct inode *inode, struct file *file)
5076 {
5077 	struct proc_data *data = file->private_data;
5078 	struct net_device *dev = PDE_DATA(inode);
5079 	struct airo_info *ai = dev->ml_priv;
5080 	SsidRid SSID_rid;
5081 	int i;
5082 	char *p = data->wbuffer;
5083 	char *end = p + data->writelen;
5084 
5085 	if (!data->writelen)
5086 		return;
5087 
5088 	*end = '\n'; /* sentinel; we have space for it */
5089 
5090 	memset(&SSID_rid, 0, sizeof(SSID_rid));
5091 
5092 	for (i = 0; i < 3 && p < end; i++) {
5093 		int j = 0;
5094 		/* copy up to 32 characters from this line */
5095 		while (*p != '\n' && j < 32)
5096 			SSID_rid.ssids[i].ssid[j++] = *p++;
5097 		if (j == 0)
5098 			break;
5099 		SSID_rid.ssids[i].len = cpu_to_le16(j);
5100 		/* skip to the beginning of the next line */
5101 		while (*p++ != '\n')
5102 			;
5103 	}
5104 	if (i)
5105 		SSID_rid.len = cpu_to_le16(sizeof(SSID_rid));
5106 	disable_MAC(ai, 1);
5107 	writeSsidRid(ai, &SSID_rid, 1);
5108 	enable_MAC(ai, 1);
5109 }
5110 
proc_APList_on_close(struct inode * inode,struct file * file)5111 static void proc_APList_on_close( struct inode *inode, struct file *file ) {
5112 	struct proc_data *data = file->private_data;
5113 	struct net_device *dev = PDE_DATA(inode);
5114 	struct airo_info *ai = dev->ml_priv;
5115 	APListRid APList_rid;
5116 	int i;
5117 
5118 	if ( !data->writelen ) return;
5119 
5120 	memset( &APList_rid, 0, sizeof(APList_rid) );
5121 	APList_rid.len = cpu_to_le16(sizeof(APList_rid));
5122 
5123 	for( i = 0; i < 4 && data->writelen >= (i+1)*6*3; i++ ) {
5124 		int j;
5125 		for( j = 0; j < 6*3 && data->wbuffer[j+i*6*3]; j++ ) {
5126 			switch(j%3) {
5127 			case 0:
5128 				APList_rid.ap[i][j/3]=
5129 					hex_to_bin(data->wbuffer[j+i*6*3])<<4;
5130 				break;
5131 			case 1:
5132 				APList_rid.ap[i][j/3]|=
5133 					hex_to_bin(data->wbuffer[j+i*6*3]);
5134 				break;
5135 			}
5136 		}
5137 	}
5138 	disable_MAC(ai, 1);
5139 	writeAPListRid(ai, &APList_rid, 1);
5140 	enable_MAC(ai, 1);
5141 }
5142 
5143 /* 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)5144 static int do_writerid( struct airo_info *ai, u16 rid, const void *rid_data,
5145 			int len, int dummy ) {
5146 	int rc;
5147 
5148 	disable_MAC(ai, 1);
5149 	rc = PC4500_writerid(ai, rid, rid_data, len, 1);
5150 	enable_MAC(ai, 1);
5151 	return rc;
5152 }
5153 
5154 /* Returns the WEP key at the specified index, or -1 if that key does
5155  * not exist.  The buffer is assumed to be at least 16 bytes in length.
5156  */
get_wep_key(struct airo_info * ai,u16 index,char * buf,u16 buflen)5157 static int get_wep_key(struct airo_info *ai, u16 index, char *buf, u16 buflen)
5158 {
5159 	WepKeyRid wkr;
5160 	int rc;
5161 	__le16 lastindex;
5162 
5163 	rc = readWepKeyRid(ai, &wkr, 1, 1);
5164 	if (rc != SUCCESS)
5165 		return -1;
5166 	do {
5167 		lastindex = wkr.kindex;
5168 		if (le16_to_cpu(wkr.kindex) == index) {
5169 			int klen = min_t(int, buflen, le16_to_cpu(wkr.klen));
5170 			memcpy(buf, wkr.key, klen);
5171 			return klen;
5172 		}
5173 		rc = readWepKeyRid(ai, &wkr, 0, 1);
5174 		if (rc != SUCCESS)
5175 			return -1;
5176 	} while (lastindex != wkr.kindex);
5177 	return -1;
5178 }
5179 
get_wep_tx_idx(struct airo_info * ai)5180 static int get_wep_tx_idx(struct airo_info *ai)
5181 {
5182 	WepKeyRid wkr;
5183 	int rc;
5184 	__le16 lastindex;
5185 
5186 	rc = readWepKeyRid(ai, &wkr, 1, 1);
5187 	if (rc != SUCCESS)
5188 		return -1;
5189 	do {
5190 		lastindex = wkr.kindex;
5191 		if (wkr.kindex == cpu_to_le16(0xffff))
5192 			return wkr.mac[0];
5193 		rc = readWepKeyRid(ai, &wkr, 0, 1);
5194 		if (rc != SUCCESS)
5195 			return -1;
5196 	} while (lastindex != wkr.kindex);
5197 	return -1;
5198 }
5199 
set_wep_key(struct airo_info * ai,u16 index,const char * key,u16 keylen,int perm,int lock)5200 static int set_wep_key(struct airo_info *ai, u16 index, const char *key,
5201 		       u16 keylen, int perm, int lock)
5202 {
5203 	static const unsigned char macaddr[ETH_ALEN] = { 0x01, 0, 0, 0, 0, 0 };
5204 	WepKeyRid wkr;
5205 	int rc;
5206 
5207 	if (WARN_ON(keylen == 0))
5208 		return -1;
5209 
5210 	memset(&wkr, 0, sizeof(wkr));
5211 	wkr.len = cpu_to_le16(sizeof(wkr));
5212 	wkr.kindex = cpu_to_le16(index);
5213 	wkr.klen = cpu_to_le16(keylen);
5214 	memcpy(wkr.key, key, keylen);
5215 	memcpy(wkr.mac, macaddr, ETH_ALEN);
5216 
5217 	if (perm) disable_MAC(ai, lock);
5218 	rc = writeWepKeyRid(ai, &wkr, perm, lock);
5219 	if (perm) enable_MAC(ai, lock);
5220 	return rc;
5221 }
5222 
set_wep_tx_idx(struct airo_info * ai,u16 index,int perm,int lock)5223 static int set_wep_tx_idx(struct airo_info *ai, u16 index, int perm, int lock)
5224 {
5225 	WepKeyRid wkr;
5226 	int rc;
5227 
5228 	memset(&wkr, 0, sizeof(wkr));
5229 	wkr.len = cpu_to_le16(sizeof(wkr));
5230 	wkr.kindex = cpu_to_le16(0xffff);
5231 	wkr.mac[0] = (char)index;
5232 
5233 	if (perm) {
5234 		ai->defindex = (char)index;
5235 		disable_MAC(ai, lock);
5236 	}
5237 
5238 	rc = writeWepKeyRid(ai, &wkr, perm, lock);
5239 
5240 	if (perm)
5241 		enable_MAC(ai, lock);
5242 	return rc;
5243 }
5244 
proc_wepkey_on_close(struct inode * inode,struct file * file)5245 static void proc_wepkey_on_close( struct inode *inode, struct file *file ) {
5246 	struct proc_data *data;
5247 	struct net_device *dev = PDE_DATA(inode);
5248 	struct airo_info *ai = dev->ml_priv;
5249 	int i, rc;
5250 	char key[16];
5251 	u16 index = 0;
5252 	int j = 0;
5253 
5254 	memset(key, 0, sizeof(key));
5255 
5256 	data = file->private_data;
5257 	if ( !data->writelen ) return;
5258 
5259 	if (data->wbuffer[0] >= '0' && data->wbuffer[0] <= '3' &&
5260 	    (data->wbuffer[1] == ' ' || data->wbuffer[1] == '\n')) {
5261 		index = data->wbuffer[0] - '0';
5262 		if (data->wbuffer[1] == '\n') {
5263 			rc = set_wep_tx_idx(ai, index, 1, 1);
5264 			if (rc < 0) {
5265 				airo_print_err(ai->dev->name, "failed to set "
5266 				               "WEP transmit index to %d: %d.",
5267 				               index, rc);
5268 			}
5269 			return;
5270 		}
5271 		j = 2;
5272 	} else {
5273 		airo_print_err(ai->dev->name, "WepKey passed invalid key index");
5274 		return;
5275 	}
5276 
5277 	for( i = 0; i < 16*3 && data->wbuffer[i+j]; i++ ) {
5278 		switch(i%3) {
5279 		case 0:
5280 			key[i/3] = hex_to_bin(data->wbuffer[i+j])<<4;
5281 			break;
5282 		case 1:
5283 			key[i/3] |= hex_to_bin(data->wbuffer[i+j]);
5284 			break;
5285 		}
5286 	}
5287 
5288 	rc = set_wep_key(ai, index, key, i/3, 1, 1);
5289 	if (rc < 0) {
5290 		airo_print_err(ai->dev->name, "failed to set WEP key at index "
5291 		               "%d: %d.", index, rc);
5292 	}
5293 }
5294 
proc_wepkey_open(struct inode * inode,struct file * file)5295 static int proc_wepkey_open( struct inode *inode, struct file *file )
5296 {
5297 	struct proc_data *data;
5298 	struct net_device *dev = PDE_DATA(inode);
5299 	struct airo_info *ai = dev->ml_priv;
5300 	char *ptr;
5301 	WepKeyRid wkr;
5302 	__le16 lastindex;
5303 	int j=0;
5304 	int rc;
5305 
5306 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
5307 		return -ENOMEM;
5308 	memset(&wkr, 0, sizeof(wkr));
5309 	data = file->private_data;
5310 	if ((data->rbuffer = kzalloc( 180, GFP_KERNEL )) == NULL) {
5311 		kfree (file->private_data);
5312 		return -ENOMEM;
5313 	}
5314 	data->writelen = 0;
5315 	data->maxwritelen = 80;
5316 	if ((data->wbuffer = kzalloc( 80, GFP_KERNEL )) == NULL) {
5317 		kfree (data->rbuffer);
5318 		kfree (file->private_data);
5319 		return -ENOMEM;
5320 	}
5321 	data->on_close = proc_wepkey_on_close;
5322 
5323 	ptr = data->rbuffer;
5324 	strcpy(ptr, "No wep keys\n");
5325 	rc = readWepKeyRid(ai, &wkr, 1, 1);
5326 	if (rc == SUCCESS) do {
5327 		lastindex = wkr.kindex;
5328 		if (wkr.kindex == cpu_to_le16(0xffff)) {
5329 			j += sprintf(ptr+j, "Tx key = %d\n",
5330 				     (int)wkr.mac[0]);
5331 		} else {
5332 			j += sprintf(ptr+j, "Key %d set with length = %d\n",
5333 				     le16_to_cpu(wkr.kindex),
5334 				     le16_to_cpu(wkr.klen));
5335 		}
5336 		readWepKeyRid(ai, &wkr, 0, 1);
5337 	} while((lastindex != wkr.kindex) && (j < 180-30));
5338 
5339 	data->readlen = strlen( data->rbuffer );
5340 	return 0;
5341 }
5342 
proc_SSID_open(struct inode * inode,struct file * file)5343 static int proc_SSID_open(struct inode *inode, struct file *file)
5344 {
5345 	struct proc_data *data;
5346 	struct net_device *dev = PDE_DATA(inode);
5347 	struct airo_info *ai = dev->ml_priv;
5348 	int i;
5349 	char *ptr;
5350 	SsidRid SSID_rid;
5351 
5352 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
5353 		return -ENOMEM;
5354 	data = file->private_data;
5355 	if ((data->rbuffer = kmalloc( 104, GFP_KERNEL )) == NULL) {
5356 		kfree (file->private_data);
5357 		return -ENOMEM;
5358 	}
5359 	data->writelen = 0;
5360 	data->maxwritelen = 33*3;
5361 	/* allocate maxwritelen + 1; we'll want a sentinel */
5362 	if ((data->wbuffer = kzalloc(33*3 + 1, GFP_KERNEL)) == NULL) {
5363 		kfree (data->rbuffer);
5364 		kfree (file->private_data);
5365 		return -ENOMEM;
5366 	}
5367 	data->on_close = proc_SSID_on_close;
5368 
5369 	readSsidRid(ai, &SSID_rid);
5370 	ptr = data->rbuffer;
5371 	for (i = 0; i < 3; i++) {
5372 		int j;
5373 		size_t len = le16_to_cpu(SSID_rid.ssids[i].len);
5374 		if (!len)
5375 			break;
5376 		if (len > 32)
5377 			len = 32;
5378 		for (j = 0; j < len && SSID_rid.ssids[i].ssid[j]; j++)
5379 			*ptr++ = SSID_rid.ssids[i].ssid[j];
5380 		*ptr++ = '\n';
5381 	}
5382 	*ptr = '\0';
5383 	data->readlen = strlen( data->rbuffer );
5384 	return 0;
5385 }
5386 
proc_APList_open(struct inode * inode,struct file * file)5387 static int proc_APList_open( struct inode *inode, struct file *file ) {
5388 	struct proc_data *data;
5389 	struct net_device *dev = PDE_DATA(inode);
5390 	struct airo_info *ai = dev->ml_priv;
5391 	int i;
5392 	char *ptr;
5393 	APListRid APList_rid;
5394 
5395 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
5396 		return -ENOMEM;
5397 	data = file->private_data;
5398 	if ((data->rbuffer = kmalloc( 104, GFP_KERNEL )) == NULL) {
5399 		kfree (file->private_data);
5400 		return -ENOMEM;
5401 	}
5402 	data->writelen = 0;
5403 	data->maxwritelen = 4*6*3;
5404 	if ((data->wbuffer = kzalloc( data->maxwritelen, GFP_KERNEL )) == NULL) {
5405 		kfree (data->rbuffer);
5406 		kfree (file->private_data);
5407 		return -ENOMEM;
5408 	}
5409 	data->on_close = proc_APList_on_close;
5410 
5411 	readAPListRid(ai, &APList_rid);
5412 	ptr = data->rbuffer;
5413 	for( i = 0; i < 4; i++ ) {
5414 // We end when we find a zero MAC
5415 		if ( !*(int*)APList_rid.ap[i] &&
5416 		     !*(int*)&APList_rid.ap[i][2]) break;
5417 		ptr += sprintf(ptr, "%pM\n", APList_rid.ap[i]);
5418 	}
5419 	if (i==0) ptr += sprintf(ptr, "Not using specific APs\n");
5420 
5421 	*ptr = '\0';
5422 	data->readlen = strlen( data->rbuffer );
5423 	return 0;
5424 }
5425 
proc_BSSList_open(struct inode * inode,struct file * file)5426 static int proc_BSSList_open( struct inode *inode, struct file *file ) {
5427 	struct proc_data *data;
5428 	struct net_device *dev = PDE_DATA(inode);
5429 	struct airo_info *ai = dev->ml_priv;
5430 	char *ptr;
5431 	BSSListRid BSSList_rid;
5432 	int rc;
5433 	/* If doLoseSync is not 1, we won't do a Lose Sync */
5434 	int doLoseSync = -1;
5435 
5436 	if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
5437 		return -ENOMEM;
5438 	data = file->private_data;
5439 	if ((data->rbuffer = kmalloc( 1024, GFP_KERNEL )) == NULL) {
5440 		kfree (file->private_data);
5441 		return -ENOMEM;
5442 	}
5443 	data->writelen = 0;
5444 	data->maxwritelen = 0;
5445 	data->wbuffer = NULL;
5446 	data->on_close = NULL;
5447 
5448 	if (file->f_mode & FMODE_WRITE) {
5449 		if (!(file->f_mode & FMODE_READ)) {
5450 			Cmd cmd;
5451 			Resp rsp;
5452 
5453 			if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN;
5454 			memset(&cmd, 0, sizeof(cmd));
5455 			cmd.cmd=CMD_LISTBSS;
5456 			if (down_interruptible(&ai->sem))
5457 				return -ERESTARTSYS;
5458 			issuecommand(ai, &cmd, &rsp);
5459 			up(&ai->sem);
5460 			data->readlen = 0;
5461 			return 0;
5462 		}
5463 		doLoseSync = 1;
5464 	}
5465 	ptr = data->rbuffer;
5466 	/* There is a race condition here if there are concurrent opens.
5467            Since it is a rare condition, we'll just live with it, otherwise
5468            we have to add a spin lock... */
5469 	rc = readBSSListRid(ai, doLoseSync, &BSSList_rid);
5470 	while(rc == 0 && BSSList_rid.index != cpu_to_le16(0xffff)) {
5471 		ptr += sprintf(ptr, "%pM %*s rssi = %d",
5472 			       BSSList_rid.bssid,
5473 				(int)BSSList_rid.ssidLen,
5474 				BSSList_rid.ssid,
5475 				le16_to_cpu(BSSList_rid.dBm));
5476 		ptr += sprintf(ptr, " channel = %d %s %s %s %s\n",
5477 				le16_to_cpu(BSSList_rid.dsChannel),
5478 				BSSList_rid.cap & CAP_ESS ? "ESS" : "",
5479 				BSSList_rid.cap & CAP_IBSS ? "adhoc" : "",
5480 				BSSList_rid.cap & CAP_PRIVACY ? "wep" : "",
5481 				BSSList_rid.cap & CAP_SHORTHDR ? "shorthdr" : "");
5482 		rc = readBSSListRid(ai, 0, &BSSList_rid);
5483 	}
5484 	*ptr = '\0';
5485 	data->readlen = strlen( data->rbuffer );
5486 	return 0;
5487 }
5488 
proc_close(struct inode * inode,struct file * file)5489 static int proc_close( struct inode *inode, struct file *file )
5490 {
5491 	struct proc_data *data = file->private_data;
5492 
5493 	if (data->on_close != NULL)
5494 		data->on_close(inode, file);
5495 	kfree(data->rbuffer);
5496 	kfree(data->wbuffer);
5497 	kfree(data);
5498 	return 0;
5499 }
5500 
5501 /* Since the card doesn't automatically switch to the right WEP mode,
5502    we will make it do it.  If the card isn't associated, every secs we
5503    will switch WEP modes to see if that will help.  If the card is
5504    associated we will check every minute to see if anything has
5505    changed. */
timer_func(struct net_device * dev)5506 static void timer_func( struct net_device *dev ) {
5507 	struct airo_info *apriv = dev->ml_priv;
5508 
5509 /* We don't have a link so try changing the authtype */
5510 	readConfigRid(apriv, 0);
5511 	disable_MAC(apriv, 0);
5512 	switch(apriv->config.authType) {
5513 		case AUTH_ENCRYPT:
5514 /* So drop to OPEN */
5515 			apriv->config.authType = AUTH_OPEN;
5516 			break;
5517 		case AUTH_SHAREDKEY:
5518 			if (apriv->keyindex < auto_wep) {
5519 				set_wep_tx_idx(apriv, apriv->keyindex, 0, 0);
5520 				apriv->config.authType = AUTH_SHAREDKEY;
5521 				apriv->keyindex++;
5522 			} else {
5523 			        /* Drop to ENCRYPT */
5524 				apriv->keyindex = 0;
5525 				set_wep_tx_idx(apriv, apriv->defindex, 0, 0);
5526 				apriv->config.authType = AUTH_ENCRYPT;
5527 			}
5528 			break;
5529 		default:  /* We'll escalate to SHAREDKEY */
5530 			apriv->config.authType = AUTH_SHAREDKEY;
5531 	}
5532 	set_bit (FLAG_COMMIT, &apriv->flags);
5533 	writeConfigRid(apriv, 0);
5534 	enable_MAC(apriv, 0);
5535 	up(&apriv->sem);
5536 
5537 /* Schedule check to see if the change worked */
5538 	clear_bit(JOB_AUTOWEP, &apriv->jobs);
5539 	apriv->expires = RUN_AT(HZ*3);
5540 }
5541 
5542 #ifdef CONFIG_PCI
airo_pci_probe(struct pci_dev * pdev,const struct pci_device_id * pent)5543 static int airo_pci_probe(struct pci_dev *pdev,
5544 				    const struct pci_device_id *pent)
5545 {
5546 	struct net_device *dev;
5547 
5548 	if (pci_enable_device(pdev))
5549 		return -ENODEV;
5550 	pci_set_master(pdev);
5551 
5552 	if (pdev->device == 0x5000 || pdev->device == 0xa504)
5553 			dev = _init_airo_card(pdev->irq, pdev->resource[0].start, 0, pdev, &pdev->dev);
5554 	else
5555 			dev = _init_airo_card(pdev->irq, pdev->resource[2].start, 0, pdev, &pdev->dev);
5556 	if (!dev) {
5557 		pci_disable_device(pdev);
5558 		return -ENODEV;
5559 	}
5560 
5561 	pci_set_drvdata(pdev, dev);
5562 	return 0;
5563 }
5564 
airo_pci_remove(struct pci_dev * pdev)5565 static void airo_pci_remove(struct pci_dev *pdev)
5566 {
5567 	struct net_device *dev = pci_get_drvdata(pdev);
5568 
5569 	airo_print_info(dev->name, "Unregistering...");
5570 	stop_airo_card(dev, 1);
5571 	pci_disable_device(pdev);
5572 	pci_set_drvdata(pdev, NULL);
5573 }
5574 
airo_pci_suspend(struct pci_dev * pdev,pm_message_t state)5575 static int airo_pci_suspend(struct pci_dev *pdev, pm_message_t state)
5576 {
5577 	struct net_device *dev = pci_get_drvdata(pdev);
5578 	struct airo_info *ai = dev->ml_priv;
5579 	Cmd cmd;
5580 	Resp rsp;
5581 
5582 	if (!ai->APList)
5583 		ai->APList = kmalloc(sizeof(APListRid), GFP_KERNEL);
5584 	if (!ai->APList)
5585 		return -ENOMEM;
5586 	if (!ai->SSID)
5587 		ai->SSID = kmalloc(sizeof(SsidRid), GFP_KERNEL);
5588 	if (!ai->SSID)
5589 		return -ENOMEM;
5590 	readAPListRid(ai, ai->APList);
5591 	readSsidRid(ai, ai->SSID);
5592 	memset(&cmd, 0, sizeof(cmd));
5593 	/* the lock will be released at the end of the resume callback */
5594 	if (down_interruptible(&ai->sem))
5595 		return -EAGAIN;
5596 	disable_MAC(ai, 0);
5597 	netif_device_detach(dev);
5598 	ai->power = state;
5599 	cmd.cmd = HOSTSLEEP;
5600 	issuecommand(ai, &cmd, &rsp);
5601 
5602 	pci_enable_wake(pdev, pci_choose_state(pdev, state), 1);
5603 	pci_save_state(pdev);
5604 	pci_set_power_state(pdev, pci_choose_state(pdev, state));
5605 	return 0;
5606 }
5607 
airo_pci_resume(struct pci_dev * pdev)5608 static int airo_pci_resume(struct pci_dev *pdev)
5609 {
5610 	struct net_device *dev = pci_get_drvdata(pdev);
5611 	struct airo_info *ai = dev->ml_priv;
5612 	pci_power_t prev_state = pdev->current_state;
5613 
5614 	pci_set_power_state(pdev, PCI_D0);
5615 	pci_restore_state(pdev);
5616 	pci_enable_wake(pdev, PCI_D0, 0);
5617 
5618 	if (prev_state != PCI_D1) {
5619 		reset_card(dev, 0);
5620 		mpi_init_descriptors(ai);
5621 		setup_card(ai, dev->dev_addr, 0);
5622 		clear_bit(FLAG_RADIO_OFF, &ai->flags);
5623 		clear_bit(FLAG_PENDING_XMIT, &ai->flags);
5624 	} else {
5625 		OUT4500(ai, EVACK, EV_AWAKEN);
5626 		OUT4500(ai, EVACK, EV_AWAKEN);
5627 		msleep(100);
5628 	}
5629 
5630 	set_bit(FLAG_COMMIT, &ai->flags);
5631 	disable_MAC(ai, 0);
5632         msleep(200);
5633 	if (ai->SSID) {
5634 		writeSsidRid(ai, ai->SSID, 0);
5635 		kfree(ai->SSID);
5636 		ai->SSID = NULL;
5637 	}
5638 	if (ai->APList) {
5639 		writeAPListRid(ai, ai->APList, 0);
5640 		kfree(ai->APList);
5641 		ai->APList = NULL;
5642 	}
5643 	writeConfigRid(ai, 0);
5644 	enable_MAC(ai, 0);
5645 	ai->power = PMSG_ON;
5646 	netif_device_attach(dev);
5647 	netif_wake_queue(dev);
5648 	enable_interrupts(ai);
5649 	up(&ai->sem);
5650 	return 0;
5651 }
5652 #endif
5653 
airo_init_module(void)5654 static int __init airo_init_module( void )
5655 {
5656 	int i;
5657 
5658 	proc_kuid = make_kuid(&init_user_ns, proc_uid);
5659 	proc_kgid = make_kgid(&init_user_ns, proc_gid);
5660 	if (!uid_valid(proc_kuid) || !gid_valid(proc_kgid))
5661 		return -EINVAL;
5662 
5663 	airo_entry = proc_mkdir_mode("driver/aironet", airo_perm, NULL);
5664 
5665 	if (airo_entry)
5666 		proc_set_user(airo_entry, proc_kuid, proc_kgid);
5667 
5668 	for (i = 0; i < 4 && io[i] && irq[i]; i++) {
5669 		airo_print_info("", "Trying to configure ISA adapter at irq=%d "
5670 			"io=0x%x", irq[i], io[i] );
5671 		if (init_airo_card( irq[i], io[i], 0, NULL ))
5672 			/* do nothing */ ;
5673 	}
5674 
5675 #ifdef CONFIG_PCI
5676 	airo_print_info("", "Probing for PCI adapters");
5677 	i = pci_register_driver(&airo_driver);
5678 	airo_print_info("", "Finished probing for PCI adapters");
5679 
5680 	if (i) {
5681 		remove_proc_entry("driver/aironet", NULL);
5682 		return i;
5683 	}
5684 #endif
5685 
5686 	/* Always exit with success, as we are a library module
5687 	 * as well as a driver module
5688 	 */
5689 	return 0;
5690 }
5691 
airo_cleanup_module(void)5692 static void __exit airo_cleanup_module( void )
5693 {
5694 	struct airo_info *ai;
5695 	while(!list_empty(&airo_devices)) {
5696 		ai = list_entry(airo_devices.next, struct airo_info, dev_list);
5697 		airo_print_info(ai->dev->name, "Unregistering...");
5698 		stop_airo_card(ai->dev, 1);
5699 	}
5700 #ifdef CONFIG_PCI
5701 	pci_unregister_driver(&airo_driver);
5702 #endif
5703 	remove_proc_entry("driver/aironet", NULL);
5704 }
5705 
5706 /*
5707  * Initial Wireless Extension code for Aironet driver by :
5708  *	Jean Tourrilhes <jt@hpl.hp.com> - HPL - 17 November 00
5709  * Conversion to new driver API by :
5710  *	Jean Tourrilhes <jt@hpl.hp.com> - HPL - 26 March 02
5711  * Javier also did a good amount of work here, adding some new extensions
5712  * and fixing my code. Let's just say that without him this code just
5713  * would not work at all... - Jean II
5714  */
5715 
airo_rssi_to_dbm(tdsRssiEntry * rssi_rid,u8 rssi)5716 static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi)
5717 {
5718 	if (!rssi_rid)
5719 		return 0;
5720 
5721 	return (0x100 - rssi_rid[rssi].rssidBm);
5722 }
5723 
airo_dbm_to_pct(tdsRssiEntry * rssi_rid,u8 dbm)5724 static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm)
5725 {
5726 	int i;
5727 
5728 	if (!rssi_rid)
5729 		return 0;
5730 
5731 	for (i = 0; i < 256; i++)
5732 		if (rssi_rid[i].rssidBm == dbm)
5733 			return rssi_rid[i].rssipct;
5734 
5735 	return 0;
5736 }
5737 
5738 
airo_get_quality(StatusRid * status_rid,CapabilityRid * cap_rid)5739 static int airo_get_quality (StatusRid *status_rid, CapabilityRid *cap_rid)
5740 {
5741 	int quality = 0;
5742 	u16 sq;
5743 
5744 	if ((status_rid->mode & cpu_to_le16(0x3f)) != cpu_to_le16(0x3f))
5745 		return 0;
5746 
5747 	if (!(cap_rid->hardCap & cpu_to_le16(8)))
5748 		return 0;
5749 
5750 	sq = le16_to_cpu(status_rid->signalQuality);
5751 	if (memcmp(cap_rid->prodName, "350", 3))
5752 		if (sq > 0x20)
5753 			quality = 0;
5754 		else
5755 			quality = 0x20 - sq;
5756 	else
5757 		if (sq > 0xb0)
5758 			quality = 0;
5759 		else if (sq < 0x10)
5760 			quality = 0xa0;
5761 		else
5762 			quality = 0xb0 - sq;
5763 	return quality;
5764 }
5765 
5766 #define airo_get_max_quality(cap_rid) (memcmp((cap_rid)->prodName, "350", 3) ? 0x20 : 0xa0)
5767 #define airo_get_avg_quality(cap_rid) (memcmp((cap_rid)->prodName, "350", 3) ? 0x10 : 0x50);
5768 
5769 /*------------------------------------------------------------------*/
5770 /*
5771  * Wireless Handler : get protocol name
5772  */
airo_get_name(struct net_device * dev,struct iw_request_info * info,char * cwrq,char * extra)5773 static int airo_get_name(struct net_device *dev,
5774 			 struct iw_request_info *info,
5775 			 char *cwrq,
5776 			 char *extra)
5777 {
5778 	strcpy(cwrq, "IEEE 802.11-DS");
5779 	return 0;
5780 }
5781 
5782 /*------------------------------------------------------------------*/
5783 /*
5784  * Wireless Handler : set frequency
5785  */
airo_set_freq(struct net_device * dev,struct iw_request_info * info,struct iw_freq * fwrq,char * extra)5786 static int airo_set_freq(struct net_device *dev,
5787 			 struct iw_request_info *info,
5788 			 struct iw_freq *fwrq,
5789 			 char *extra)
5790 {
5791 	struct airo_info *local = dev->ml_priv;
5792 	int rc = -EINPROGRESS;		/* Call commit handler */
5793 
5794 	/* If setting by frequency, convert to a channel */
5795 	if(fwrq->e == 1) {
5796 		int f = fwrq->m / 100000;
5797 
5798 		/* Hack to fall through... */
5799 		fwrq->e = 0;
5800 		fwrq->m = ieee80211_freq_to_dsss_chan(f);
5801 	}
5802 	/* Setting by channel number */
5803 	if((fwrq->m > 1000) || (fwrq->e > 0))
5804 		rc = -EOPNOTSUPP;
5805 	else {
5806 		int channel = fwrq->m;
5807 		/* We should do a better check than that,
5808 		 * based on the card capability !!! */
5809 		if((channel < 1) || (channel > 14)) {
5810 			airo_print_dbg(dev->name, "New channel value of %d is invalid!",
5811 				fwrq->m);
5812 			rc = -EINVAL;
5813 		} else {
5814 			readConfigRid(local, 1);
5815 			/* Yes ! We can set it !!! */
5816 			local->config.channelSet = cpu_to_le16(channel);
5817 			set_bit (FLAG_COMMIT, &local->flags);
5818 		}
5819 	}
5820 	return rc;
5821 }
5822 
5823 /*------------------------------------------------------------------*/
5824 /*
5825  * Wireless Handler : get frequency
5826  */
airo_get_freq(struct net_device * dev,struct iw_request_info * info,struct iw_freq * fwrq,char * extra)5827 static int airo_get_freq(struct net_device *dev,
5828 			 struct iw_request_info *info,
5829 			 struct iw_freq *fwrq,
5830 			 char *extra)
5831 {
5832 	struct airo_info *local = dev->ml_priv;
5833 	StatusRid status_rid;		/* Card status info */
5834 	int ch;
5835 
5836 	readConfigRid(local, 1);
5837 	if ((local->config.opmode & MODE_CFG_MASK) == MODE_STA_ESS)
5838 		status_rid.channel = local->config.channelSet;
5839 	else
5840 		readStatusRid(local, &status_rid, 1);
5841 
5842 	ch = le16_to_cpu(status_rid.channel);
5843 	if((ch > 0) && (ch < 15)) {
5844 		fwrq->m = ieee80211_dsss_chan_to_freq(ch) * 100000;
5845 		fwrq->e = 1;
5846 	} else {
5847 		fwrq->m = ch;
5848 		fwrq->e = 0;
5849 	}
5850 
5851 	return 0;
5852 }
5853 
5854 /*------------------------------------------------------------------*/
5855 /*
5856  * Wireless Handler : set ESSID
5857  */
airo_set_essid(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)5858 static int airo_set_essid(struct net_device *dev,
5859 			  struct iw_request_info *info,
5860 			  struct iw_point *dwrq,
5861 			  char *extra)
5862 {
5863 	struct airo_info *local = dev->ml_priv;
5864 	SsidRid SSID_rid;		/* SSIDs */
5865 
5866 	/* Reload the list of current SSID */
5867 	readSsidRid(local, &SSID_rid);
5868 
5869 	/* Check if we asked for `any' */
5870 	if (dwrq->flags == 0) {
5871 		/* Just send an empty SSID list */
5872 		memset(&SSID_rid, 0, sizeof(SSID_rid));
5873 	} else {
5874 		unsigned index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
5875 
5876 		/* Check the size of the string */
5877 		if (dwrq->length > IW_ESSID_MAX_SIZE)
5878 			return -E2BIG ;
5879 
5880 		/* Check if index is valid */
5881 		if (index >= ARRAY_SIZE(SSID_rid.ssids))
5882 			return -EINVAL;
5883 
5884 		/* Set the SSID */
5885 		memset(SSID_rid.ssids[index].ssid, 0,
5886 		       sizeof(SSID_rid.ssids[index].ssid));
5887 		memcpy(SSID_rid.ssids[index].ssid, extra, dwrq->length);
5888 		SSID_rid.ssids[index].len = cpu_to_le16(dwrq->length);
5889 	}
5890 	SSID_rid.len = cpu_to_le16(sizeof(SSID_rid));
5891 	/* Write it to the card */
5892 	disable_MAC(local, 1);
5893 	writeSsidRid(local, &SSID_rid, 1);
5894 	enable_MAC(local, 1);
5895 
5896 	return 0;
5897 }
5898 
5899 /*------------------------------------------------------------------*/
5900 /*
5901  * Wireless Handler : get ESSID
5902  */
airo_get_essid(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)5903 static int airo_get_essid(struct net_device *dev,
5904 			  struct iw_request_info *info,
5905 			  struct iw_point *dwrq,
5906 			  char *extra)
5907 {
5908 	struct airo_info *local = dev->ml_priv;
5909 	StatusRid status_rid;		/* Card status info */
5910 
5911 	readStatusRid(local, &status_rid, 1);
5912 
5913 	/* Note : if dwrq->flags != 0, we should
5914 	 * get the relevant SSID from the SSID list... */
5915 
5916 	/* Get the current SSID */
5917 	memcpy(extra, status_rid.SSID, le16_to_cpu(status_rid.SSIDlen));
5918 	/* If none, we may want to get the one that was set */
5919 
5920 	/* Push it out ! */
5921 	dwrq->length = le16_to_cpu(status_rid.SSIDlen);
5922 	dwrq->flags = 1; /* active */
5923 
5924 	return 0;
5925 }
5926 
5927 /*------------------------------------------------------------------*/
5928 /*
5929  * Wireless Handler : set AP address
5930  */
airo_set_wap(struct net_device * dev,struct iw_request_info * info,struct sockaddr * awrq,char * extra)5931 static int airo_set_wap(struct net_device *dev,
5932 			struct iw_request_info *info,
5933 			struct sockaddr *awrq,
5934 			char *extra)
5935 {
5936 	struct airo_info *local = dev->ml_priv;
5937 	Cmd cmd;
5938 	Resp rsp;
5939 	APListRid APList_rid;
5940 
5941 	if (awrq->sa_family != ARPHRD_ETHER)
5942 		return -EINVAL;
5943 	else if (is_broadcast_ether_addr(awrq->sa_data) ||
5944 		 is_zero_ether_addr(awrq->sa_data)) {
5945 		memset(&cmd, 0, sizeof(cmd));
5946 		cmd.cmd=CMD_LOSE_SYNC;
5947 		if (down_interruptible(&local->sem))
5948 			return -ERESTARTSYS;
5949 		issuecommand(local, &cmd, &rsp);
5950 		up(&local->sem);
5951 	} else {
5952 		memset(&APList_rid, 0, sizeof(APList_rid));
5953 		APList_rid.len = cpu_to_le16(sizeof(APList_rid));
5954 		memcpy(APList_rid.ap[0], awrq->sa_data, ETH_ALEN);
5955 		disable_MAC(local, 1);
5956 		writeAPListRid(local, &APList_rid, 1);
5957 		enable_MAC(local, 1);
5958 	}
5959 	return 0;
5960 }
5961 
5962 /*------------------------------------------------------------------*/
5963 /*
5964  * Wireless Handler : get AP address
5965  */
airo_get_wap(struct net_device * dev,struct iw_request_info * info,struct sockaddr * awrq,char * extra)5966 static int airo_get_wap(struct net_device *dev,
5967 			struct iw_request_info *info,
5968 			struct sockaddr *awrq,
5969 			char *extra)
5970 {
5971 	struct airo_info *local = dev->ml_priv;
5972 	StatusRid status_rid;		/* Card status info */
5973 
5974 	readStatusRid(local, &status_rid, 1);
5975 
5976 	/* Tentative. This seems to work, wow, I'm lucky !!! */
5977 	memcpy(awrq->sa_data, status_rid.bssid[0], ETH_ALEN);
5978 	awrq->sa_family = ARPHRD_ETHER;
5979 
5980 	return 0;
5981 }
5982 
5983 /*------------------------------------------------------------------*/
5984 /*
5985  * Wireless Handler : set Nickname
5986  */
airo_set_nick(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)5987 static int airo_set_nick(struct net_device *dev,
5988 			 struct iw_request_info *info,
5989 			 struct iw_point *dwrq,
5990 			 char *extra)
5991 {
5992 	struct airo_info *local = dev->ml_priv;
5993 
5994 	/* Check the size of the string */
5995 	if(dwrq->length > 16) {
5996 		return -E2BIG;
5997 	}
5998 	readConfigRid(local, 1);
5999 	memset(local->config.nodeName, 0, sizeof(local->config.nodeName));
6000 	memcpy(local->config.nodeName, extra, dwrq->length);
6001 	set_bit (FLAG_COMMIT, &local->flags);
6002 
6003 	return -EINPROGRESS;		/* Call commit handler */
6004 }
6005 
6006 /*------------------------------------------------------------------*/
6007 /*
6008  * Wireless Handler : get Nickname
6009  */
airo_get_nick(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)6010 static int airo_get_nick(struct net_device *dev,
6011 			 struct iw_request_info *info,
6012 			 struct iw_point *dwrq,
6013 			 char *extra)
6014 {
6015 	struct airo_info *local = dev->ml_priv;
6016 
6017 	readConfigRid(local, 1);
6018 	strncpy(extra, local->config.nodeName, 16);
6019 	extra[16] = '\0';
6020 	dwrq->length = strlen(extra);
6021 
6022 	return 0;
6023 }
6024 
6025 /*------------------------------------------------------------------*/
6026 /*
6027  * Wireless Handler : set Bit-Rate
6028  */
airo_set_rate(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6029 static int airo_set_rate(struct net_device *dev,
6030 			 struct iw_request_info *info,
6031 			 struct iw_param *vwrq,
6032 			 char *extra)
6033 {
6034 	struct airo_info *local = dev->ml_priv;
6035 	CapabilityRid cap_rid;		/* Card capability info */
6036 	u8	brate = 0;
6037 	int	i;
6038 
6039 	/* First : get a valid bit rate value */
6040 	readCapabilityRid(local, &cap_rid, 1);
6041 
6042 	/* Which type of value ? */
6043 	if((vwrq->value < 8) && (vwrq->value >= 0)) {
6044 		/* Setting by rate index */
6045 		/* Find value in the magic rate table */
6046 		brate = cap_rid.supportedRates[vwrq->value];
6047 	} else {
6048 		/* Setting by frequency value */
6049 		u8	normvalue = (u8) (vwrq->value/500000);
6050 
6051 		/* Check if rate is valid */
6052 		for(i = 0 ; i < 8 ; i++) {
6053 			if(normvalue == cap_rid.supportedRates[i]) {
6054 				brate = normvalue;
6055 				break;
6056 			}
6057 		}
6058 	}
6059 	/* -1 designed the max rate (mostly auto mode) */
6060 	if(vwrq->value == -1) {
6061 		/* Get the highest available rate */
6062 		for(i = 0 ; i < 8 ; i++) {
6063 			if(cap_rid.supportedRates[i] == 0)
6064 				break;
6065 		}
6066 		if(i != 0)
6067 			brate = cap_rid.supportedRates[i - 1];
6068 	}
6069 	/* Check that it is valid */
6070 	if(brate == 0) {
6071 		return -EINVAL;
6072 	}
6073 
6074 	readConfigRid(local, 1);
6075 	/* Now, check if we want a fixed or auto value */
6076 	if(vwrq->fixed == 0) {
6077 		/* Fill all the rates up to this max rate */
6078 		memset(local->config.rates, 0, 8);
6079 		for(i = 0 ; i < 8 ; i++) {
6080 			local->config.rates[i] = cap_rid.supportedRates[i];
6081 			if(local->config.rates[i] == brate)
6082 				break;
6083 		}
6084 	} else {
6085 		/* Fixed mode */
6086 		/* One rate, fixed */
6087 		memset(local->config.rates, 0, 8);
6088 		local->config.rates[0] = brate;
6089 	}
6090 	set_bit (FLAG_COMMIT, &local->flags);
6091 
6092 	return -EINPROGRESS;		/* Call commit handler */
6093 }
6094 
6095 /*------------------------------------------------------------------*/
6096 /*
6097  * Wireless Handler : get Bit-Rate
6098  */
airo_get_rate(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6099 static int airo_get_rate(struct net_device *dev,
6100 			 struct iw_request_info *info,
6101 			 struct iw_param *vwrq,
6102 			 char *extra)
6103 {
6104 	struct airo_info *local = dev->ml_priv;
6105 	StatusRid status_rid;		/* Card status info */
6106 
6107 	readStatusRid(local, &status_rid, 1);
6108 
6109 	vwrq->value = le16_to_cpu(status_rid.currentXmitRate) * 500000;
6110 	/* If more than one rate, set auto */
6111 	readConfigRid(local, 1);
6112 	vwrq->fixed = (local->config.rates[1] == 0);
6113 
6114 	return 0;
6115 }
6116 
6117 /*------------------------------------------------------------------*/
6118 /*
6119  * Wireless Handler : set RTS threshold
6120  */
airo_set_rts(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6121 static int airo_set_rts(struct net_device *dev,
6122 			struct iw_request_info *info,
6123 			struct iw_param *vwrq,
6124 			char *extra)
6125 {
6126 	struct airo_info *local = dev->ml_priv;
6127 	int rthr = vwrq->value;
6128 
6129 	if(vwrq->disabled)
6130 		rthr = AIRO_DEF_MTU;
6131 	if((rthr < 0) || (rthr > AIRO_DEF_MTU)) {
6132 		return -EINVAL;
6133 	}
6134 	readConfigRid(local, 1);
6135 	local->config.rtsThres = cpu_to_le16(rthr);
6136 	set_bit (FLAG_COMMIT, &local->flags);
6137 
6138 	return -EINPROGRESS;		/* Call commit handler */
6139 }
6140 
6141 /*------------------------------------------------------------------*/
6142 /*
6143  * Wireless Handler : get RTS threshold
6144  */
airo_get_rts(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6145 static int airo_get_rts(struct net_device *dev,
6146 			struct iw_request_info *info,
6147 			struct iw_param *vwrq,
6148 			char *extra)
6149 {
6150 	struct airo_info *local = dev->ml_priv;
6151 
6152 	readConfigRid(local, 1);
6153 	vwrq->value = le16_to_cpu(local->config.rtsThres);
6154 	vwrq->disabled = (vwrq->value >= AIRO_DEF_MTU);
6155 	vwrq->fixed = 1;
6156 
6157 	return 0;
6158 }
6159 
6160 /*------------------------------------------------------------------*/
6161 /*
6162  * Wireless Handler : set Fragmentation threshold
6163  */
airo_set_frag(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6164 static int airo_set_frag(struct net_device *dev,
6165 			 struct iw_request_info *info,
6166 			 struct iw_param *vwrq,
6167 			 char *extra)
6168 {
6169 	struct airo_info *local = dev->ml_priv;
6170 	int fthr = vwrq->value;
6171 
6172 	if(vwrq->disabled)
6173 		fthr = AIRO_DEF_MTU;
6174 	if((fthr < 256) || (fthr > AIRO_DEF_MTU)) {
6175 		return -EINVAL;
6176 	}
6177 	fthr &= ~0x1;	/* Get an even value - is it really needed ??? */
6178 	readConfigRid(local, 1);
6179 	local->config.fragThresh = cpu_to_le16(fthr);
6180 	set_bit (FLAG_COMMIT, &local->flags);
6181 
6182 	return -EINPROGRESS;		/* Call commit handler */
6183 }
6184 
6185 /*------------------------------------------------------------------*/
6186 /*
6187  * Wireless Handler : get Fragmentation threshold
6188  */
airo_get_frag(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6189 static int airo_get_frag(struct net_device *dev,
6190 			 struct iw_request_info *info,
6191 			 struct iw_param *vwrq,
6192 			 char *extra)
6193 {
6194 	struct airo_info *local = dev->ml_priv;
6195 
6196 	readConfigRid(local, 1);
6197 	vwrq->value = le16_to_cpu(local->config.fragThresh);
6198 	vwrq->disabled = (vwrq->value >= AIRO_DEF_MTU);
6199 	vwrq->fixed = 1;
6200 
6201 	return 0;
6202 }
6203 
6204 /*------------------------------------------------------------------*/
6205 /*
6206  * Wireless Handler : set Mode of Operation
6207  */
airo_set_mode(struct net_device * dev,struct iw_request_info * info,__u32 * uwrq,char * extra)6208 static int airo_set_mode(struct net_device *dev,
6209 			 struct iw_request_info *info,
6210 			 __u32 *uwrq,
6211 			 char *extra)
6212 {
6213 	struct airo_info *local = dev->ml_priv;
6214 	int reset = 0;
6215 
6216 	readConfigRid(local, 1);
6217 	if (sniffing_mode(local))
6218 		reset = 1;
6219 
6220 	switch(*uwrq) {
6221 		case IW_MODE_ADHOC:
6222 			local->config.opmode &= ~MODE_CFG_MASK;
6223 			local->config.opmode |= MODE_STA_IBSS;
6224 			local->config.rmode &= ~RXMODE_FULL_MASK;
6225 			local->config.scanMode = SCANMODE_ACTIVE;
6226 			clear_bit (FLAG_802_11, &local->flags);
6227 			break;
6228 		case IW_MODE_INFRA:
6229 			local->config.opmode &= ~MODE_CFG_MASK;
6230 			local->config.opmode |= MODE_STA_ESS;
6231 			local->config.rmode &= ~RXMODE_FULL_MASK;
6232 			local->config.scanMode = SCANMODE_ACTIVE;
6233 			clear_bit (FLAG_802_11, &local->flags);
6234 			break;
6235 		case IW_MODE_MASTER:
6236 			local->config.opmode &= ~MODE_CFG_MASK;
6237 			local->config.opmode |= MODE_AP;
6238 			local->config.rmode &= ~RXMODE_FULL_MASK;
6239 			local->config.scanMode = SCANMODE_ACTIVE;
6240 			clear_bit (FLAG_802_11, &local->flags);
6241 			break;
6242 		case IW_MODE_REPEAT:
6243 			local->config.opmode &= ~MODE_CFG_MASK;
6244 			local->config.opmode |= MODE_AP_RPTR;
6245 			local->config.rmode &= ~RXMODE_FULL_MASK;
6246 			local->config.scanMode = SCANMODE_ACTIVE;
6247 			clear_bit (FLAG_802_11, &local->flags);
6248 			break;
6249 		case IW_MODE_MONITOR:
6250 			local->config.opmode &= ~MODE_CFG_MASK;
6251 			local->config.opmode |= MODE_STA_ESS;
6252 			local->config.rmode &= ~RXMODE_FULL_MASK;
6253 			local->config.rmode |= RXMODE_RFMON | RXMODE_DISABLE_802_3_HEADER;
6254 			local->config.scanMode = SCANMODE_PASSIVE;
6255 			set_bit (FLAG_802_11, &local->flags);
6256 			break;
6257 		default:
6258 			return -EINVAL;
6259 	}
6260 	if (reset)
6261 		set_bit (FLAG_RESET, &local->flags);
6262 	set_bit (FLAG_COMMIT, &local->flags);
6263 
6264 	return -EINPROGRESS;		/* Call commit handler */
6265 }
6266 
6267 /*------------------------------------------------------------------*/
6268 /*
6269  * Wireless Handler : get Mode of Operation
6270  */
airo_get_mode(struct net_device * dev,struct iw_request_info * info,__u32 * uwrq,char * extra)6271 static int airo_get_mode(struct net_device *dev,
6272 			 struct iw_request_info *info,
6273 			 __u32 *uwrq,
6274 			 char *extra)
6275 {
6276 	struct airo_info *local = dev->ml_priv;
6277 
6278 	readConfigRid(local, 1);
6279 	/* If not managed, assume it's ad-hoc */
6280 	switch (local->config.opmode & MODE_CFG_MASK) {
6281 		case MODE_STA_ESS:
6282 			*uwrq = IW_MODE_INFRA;
6283 			break;
6284 		case MODE_AP:
6285 			*uwrq = IW_MODE_MASTER;
6286 			break;
6287 		case MODE_AP_RPTR:
6288 			*uwrq = IW_MODE_REPEAT;
6289 			break;
6290 		default:
6291 			*uwrq = IW_MODE_ADHOC;
6292 	}
6293 
6294 	return 0;
6295 }
6296 
valid_index(struct airo_info * ai,int index)6297 static inline int valid_index(struct airo_info *ai, int index)
6298 {
6299 	return (index >= 0) && (index <= ai->max_wep_idx);
6300 }
6301 
6302 /*------------------------------------------------------------------*/
6303 /*
6304  * Wireless Handler : set Encryption Key
6305  */
airo_set_encode(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)6306 static int airo_set_encode(struct net_device *dev,
6307 			   struct iw_request_info *info,
6308 			   struct iw_point *dwrq,
6309 			   char *extra)
6310 {
6311 	struct airo_info *local = dev->ml_priv;
6312 	int perm = (dwrq->flags & IW_ENCODE_TEMP ? 0 : 1);
6313 	__le16 currentAuthType = local->config.authType;
6314 	int rc = 0;
6315 
6316 	if (!local->wep_capable)
6317 		return -EOPNOTSUPP;
6318 
6319 	readConfigRid(local, 1);
6320 
6321 	/* Basic checking: do we have a key to set ?
6322 	 * Note : with the new API, it's impossible to get a NULL pointer.
6323 	 * Therefore, we need to check a key size == 0 instead.
6324 	 * New version of iwconfig properly set the IW_ENCODE_NOKEY flag
6325 	 * when no key is present (only change flags), but older versions
6326 	 * don't do it. - Jean II */
6327 	if (dwrq->length > 0) {
6328 		wep_key_t key;
6329 		int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
6330 		int current_index;
6331 
6332 		/* Check the size of the key */
6333 		if (dwrq->length > MAX_KEY_SIZE) {
6334 			return -EINVAL;
6335 		}
6336 
6337 		current_index = get_wep_tx_idx(local);
6338 		if (current_index < 0)
6339 			current_index = 0;
6340 
6341 		/* Check the index (none -> use current) */
6342 		if (!valid_index(local, index))
6343 			index = current_index;
6344 
6345 		/* Set the length */
6346 		if (dwrq->length > MIN_KEY_SIZE)
6347 			key.len = MAX_KEY_SIZE;
6348 		else
6349 			key.len = MIN_KEY_SIZE;
6350 		/* Check if the key is not marked as invalid */
6351 		if(!(dwrq->flags & IW_ENCODE_NOKEY)) {
6352 			/* Cleanup */
6353 			memset(key.key, 0, MAX_KEY_SIZE);
6354 			/* Copy the key in the driver */
6355 			memcpy(key.key, extra, dwrq->length);
6356 			/* Send the key to the card */
6357 			rc = set_wep_key(local, index, key.key, key.len, perm, 1);
6358 			if (rc < 0) {
6359 				airo_print_err(local->dev->name, "failed to set"
6360 				               " WEP key at index %d: %d.",
6361 				               index, rc);
6362 				return rc;
6363 			}
6364 		}
6365 		/* WE specify that if a valid key is set, encryption
6366 		 * should be enabled (user may turn it off later)
6367 		 * This is also how "iwconfig ethX key on" works */
6368 		if((index == current_index) && (key.len > 0) &&
6369 		   (local->config.authType == AUTH_OPEN)) {
6370 			local->config.authType = AUTH_ENCRYPT;
6371 		}
6372 	} else {
6373 		/* Do we want to just set the transmit key index ? */
6374 		int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
6375 		if (valid_index(local, index)) {
6376 			rc = set_wep_tx_idx(local, index, perm, 1);
6377 			if (rc < 0) {
6378 				airo_print_err(local->dev->name, "failed to set"
6379 				               " WEP transmit index to %d: %d.",
6380 				               index, rc);
6381 				return rc;
6382 			}
6383 		} else {
6384 			/* Don't complain if only change the mode */
6385 			if (!(dwrq->flags & IW_ENCODE_MODE))
6386 				return -EINVAL;
6387 		}
6388 	}
6389 	/* Read the flags */
6390 	if(dwrq->flags & IW_ENCODE_DISABLED)
6391 		local->config.authType = AUTH_OPEN;	// disable encryption
6392 	if(dwrq->flags & IW_ENCODE_RESTRICTED)
6393 		local->config.authType = AUTH_SHAREDKEY;	// Only Both
6394 	if(dwrq->flags & IW_ENCODE_OPEN)
6395 		local->config.authType = AUTH_ENCRYPT;	// Only Wep
6396 	/* Commit the changes to flags if needed */
6397 	if (local->config.authType != currentAuthType)
6398 		set_bit (FLAG_COMMIT, &local->flags);
6399 	return -EINPROGRESS;		/* Call commit handler */
6400 }
6401 
6402 /*------------------------------------------------------------------*/
6403 /*
6404  * Wireless Handler : get Encryption Key
6405  */
airo_get_encode(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)6406 static int airo_get_encode(struct net_device *dev,
6407 			   struct iw_request_info *info,
6408 			   struct iw_point *dwrq,
6409 			   char *extra)
6410 {
6411 	struct airo_info *local = dev->ml_priv;
6412 	int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
6413 	int wep_key_len;
6414 	u8 buf[16];
6415 
6416 	if (!local->wep_capable)
6417 		return -EOPNOTSUPP;
6418 
6419 	readConfigRid(local, 1);
6420 
6421 	/* Check encryption mode */
6422 	switch(local->config.authType)	{
6423 		case AUTH_ENCRYPT:
6424 			dwrq->flags = IW_ENCODE_OPEN;
6425 			break;
6426 		case AUTH_SHAREDKEY:
6427 			dwrq->flags = IW_ENCODE_RESTRICTED;
6428 			break;
6429 		default:
6430 		case AUTH_OPEN:
6431 			dwrq->flags = IW_ENCODE_DISABLED;
6432 			break;
6433 	}
6434 	/* We can't return the key, so set the proper flag and return zero */
6435 	dwrq->flags |= IW_ENCODE_NOKEY;
6436 	memset(extra, 0, 16);
6437 
6438 	/* Which key do we want ? -1 -> tx index */
6439 	if (!valid_index(local, index)) {
6440 		index = get_wep_tx_idx(local);
6441 		if (index < 0)
6442 			index = 0;
6443 	}
6444 	dwrq->flags |= index + 1;
6445 
6446 	/* Copy the key to the user buffer */
6447 	wep_key_len = get_wep_key(local, index, &buf[0], sizeof(buf));
6448 	if (wep_key_len < 0) {
6449 		dwrq->length = 0;
6450 	} else {
6451 		dwrq->length = wep_key_len;
6452 		memcpy(extra, buf, dwrq->length);
6453 	}
6454 
6455 	return 0;
6456 }
6457 
6458 /*------------------------------------------------------------------*/
6459 /*
6460  * Wireless Handler : set extended Encryption parameters
6461  */
airo_set_encodeext(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6462 static int airo_set_encodeext(struct net_device *dev,
6463 			   struct iw_request_info *info,
6464 			    union iwreq_data *wrqu,
6465 			    char *extra)
6466 {
6467 	struct airo_info *local = dev->ml_priv;
6468 	struct iw_point *encoding = &wrqu->encoding;
6469 	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
6470 	int perm = ( encoding->flags & IW_ENCODE_TEMP ? 0 : 1 );
6471 	__le16 currentAuthType = local->config.authType;
6472 	int idx, key_len, alg = ext->alg, set_key = 1, rc;
6473 	wep_key_t key;
6474 
6475 	if (!local->wep_capable)
6476 		return -EOPNOTSUPP;
6477 
6478 	readConfigRid(local, 1);
6479 
6480 	/* Determine and validate the key index */
6481 	idx = encoding->flags & IW_ENCODE_INDEX;
6482 	if (idx) {
6483 		if (!valid_index(local, idx - 1))
6484 			return -EINVAL;
6485 		idx--;
6486 	} else {
6487 		idx = get_wep_tx_idx(local);
6488 		if (idx < 0)
6489 			idx = 0;
6490 	}
6491 
6492 	if (encoding->flags & IW_ENCODE_DISABLED)
6493 		alg = IW_ENCODE_ALG_NONE;
6494 
6495 	if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
6496 		/* Only set transmit key index here, actual
6497 		 * key is set below if needed.
6498 		 */
6499 		rc = set_wep_tx_idx(local, idx, perm, 1);
6500 		if (rc < 0) {
6501 			airo_print_err(local->dev->name, "failed to set "
6502 			               "WEP transmit index to %d: %d.",
6503 			               idx, rc);
6504 			return rc;
6505 		}
6506 		set_key = ext->key_len > 0 ? 1 : 0;
6507 	}
6508 
6509 	if (set_key) {
6510 		/* Set the requested key first */
6511 		memset(key.key, 0, MAX_KEY_SIZE);
6512 		switch (alg) {
6513 		case IW_ENCODE_ALG_NONE:
6514 			key.len = 0;
6515 			break;
6516 		case IW_ENCODE_ALG_WEP:
6517 			if (ext->key_len > MIN_KEY_SIZE) {
6518 				key.len = MAX_KEY_SIZE;
6519 			} else if (ext->key_len > 0) {
6520 				key.len = MIN_KEY_SIZE;
6521 			} else {
6522 				return -EINVAL;
6523 			}
6524 			key_len = min (ext->key_len, key.len);
6525 			memcpy(key.key, ext->key, key_len);
6526 			break;
6527 		default:
6528 			return -EINVAL;
6529 		}
6530 		if (key.len == 0) {
6531 			rc = set_wep_tx_idx(local, idx, perm, 1);
6532 			if (rc < 0) {
6533 				airo_print_err(local->dev->name,
6534 					       "failed to set WEP transmit index to %d: %d.",
6535 					       idx, rc);
6536 				return rc;
6537 			}
6538 		} else {
6539 			rc = set_wep_key(local, idx, key.key, key.len, perm, 1);
6540 			if (rc < 0) {
6541 				airo_print_err(local->dev->name,
6542 					       "failed to set WEP key at index %d: %d.",
6543 					       idx, rc);
6544 				return rc;
6545 			}
6546 		}
6547 	}
6548 
6549 	/* Read the flags */
6550 	if(encoding->flags & IW_ENCODE_DISABLED)
6551 		local->config.authType = AUTH_OPEN;	// disable encryption
6552 	if(encoding->flags & IW_ENCODE_RESTRICTED)
6553 		local->config.authType = AUTH_SHAREDKEY;	// Only Both
6554 	if(encoding->flags & IW_ENCODE_OPEN)
6555 		local->config.authType = AUTH_ENCRYPT;	// Only Wep
6556 	/* Commit the changes to flags if needed */
6557 	if (local->config.authType != currentAuthType)
6558 		set_bit (FLAG_COMMIT, &local->flags);
6559 
6560 	return -EINPROGRESS;
6561 }
6562 
6563 
6564 /*------------------------------------------------------------------*/
6565 /*
6566  * Wireless Handler : get extended Encryption parameters
6567  */
airo_get_encodeext(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6568 static int airo_get_encodeext(struct net_device *dev,
6569 			    struct iw_request_info *info,
6570 			    union iwreq_data *wrqu,
6571 			    char *extra)
6572 {
6573 	struct airo_info *local = dev->ml_priv;
6574 	struct iw_point *encoding = &wrqu->encoding;
6575 	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
6576 	int idx, max_key_len, wep_key_len;
6577 	u8 buf[16];
6578 
6579 	if (!local->wep_capable)
6580 		return -EOPNOTSUPP;
6581 
6582 	readConfigRid(local, 1);
6583 
6584 	max_key_len = encoding->length - sizeof(*ext);
6585 	if (max_key_len < 0)
6586 		return -EINVAL;
6587 
6588 	idx = encoding->flags & IW_ENCODE_INDEX;
6589 	if (idx) {
6590 		if (!valid_index(local, idx - 1))
6591 			return -EINVAL;
6592 		idx--;
6593 	} else {
6594 		idx = get_wep_tx_idx(local);
6595 		if (idx < 0)
6596 			idx = 0;
6597 	}
6598 
6599 	encoding->flags = idx + 1;
6600 	memset(ext, 0, sizeof(*ext));
6601 
6602 	/* Check encryption mode */
6603 	switch(local->config.authType) {
6604 		case AUTH_ENCRYPT:
6605 			encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
6606 			break;
6607 		case AUTH_SHAREDKEY:
6608 			encoding->flags = IW_ENCODE_ALG_WEP | IW_ENCODE_ENABLED;
6609 			break;
6610 		default:
6611 		case AUTH_OPEN:
6612 			encoding->flags = IW_ENCODE_ALG_NONE | IW_ENCODE_DISABLED;
6613 			break;
6614 	}
6615 	/* We can't return the key, so set the proper flag and return zero */
6616 	encoding->flags |= IW_ENCODE_NOKEY;
6617 	memset(extra, 0, 16);
6618 
6619 	/* Copy the key to the user buffer */
6620 	wep_key_len = get_wep_key(local, idx, &buf[0], sizeof(buf));
6621 	if (wep_key_len < 0) {
6622 		ext->key_len = 0;
6623 	} else {
6624 		ext->key_len = wep_key_len;
6625 		memcpy(extra, buf, ext->key_len);
6626 	}
6627 
6628 	return 0;
6629 }
6630 
6631 
6632 /*------------------------------------------------------------------*/
6633 /*
6634  * Wireless Handler : set extended authentication parameters
6635  */
airo_set_auth(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6636 static int airo_set_auth(struct net_device *dev,
6637 			       struct iw_request_info *info,
6638 			       union iwreq_data *wrqu, char *extra)
6639 {
6640 	struct airo_info *local = dev->ml_priv;
6641 	struct iw_param *param = &wrqu->param;
6642 	__le16 currentAuthType = local->config.authType;
6643 
6644 	switch (param->flags & IW_AUTH_INDEX) {
6645 	case IW_AUTH_WPA_VERSION:
6646 	case IW_AUTH_CIPHER_PAIRWISE:
6647 	case IW_AUTH_CIPHER_GROUP:
6648 	case IW_AUTH_KEY_MGMT:
6649 	case IW_AUTH_RX_UNENCRYPTED_EAPOL:
6650 	case IW_AUTH_PRIVACY_INVOKED:
6651 		/*
6652 		 * airo does not use these parameters
6653 		 */
6654 		break;
6655 
6656 	case IW_AUTH_DROP_UNENCRYPTED:
6657 		if (param->value) {
6658 			/* Only change auth type if unencrypted */
6659 			if (currentAuthType == AUTH_OPEN)
6660 				local->config.authType = AUTH_ENCRYPT;
6661 		} else {
6662 			local->config.authType = AUTH_OPEN;
6663 		}
6664 
6665 		/* Commit the changes to flags if needed */
6666 		if (local->config.authType != currentAuthType)
6667 			set_bit (FLAG_COMMIT, &local->flags);
6668 		break;
6669 
6670 	case IW_AUTH_80211_AUTH_ALG: {
6671 			/* FIXME: What about AUTH_OPEN?  This API seems to
6672 			 * disallow setting our auth to AUTH_OPEN.
6673 			 */
6674 			if (param->value & IW_AUTH_ALG_SHARED_KEY) {
6675 				local->config.authType = AUTH_SHAREDKEY;
6676 			} else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
6677 				local->config.authType = AUTH_ENCRYPT;
6678 			} else
6679 				return -EINVAL;
6680 
6681 			/* Commit the changes to flags if needed */
6682 			if (local->config.authType != currentAuthType)
6683 				set_bit (FLAG_COMMIT, &local->flags);
6684 			break;
6685 		}
6686 
6687 	case IW_AUTH_WPA_ENABLED:
6688 		/* Silently accept disable of WPA */
6689 		if (param->value > 0)
6690 			return -EOPNOTSUPP;
6691 		break;
6692 
6693 	default:
6694 		return -EOPNOTSUPP;
6695 	}
6696 	return -EINPROGRESS;
6697 }
6698 
6699 
6700 /*------------------------------------------------------------------*/
6701 /*
6702  * Wireless Handler : get extended authentication parameters
6703  */
airo_get_auth(struct net_device * dev,struct iw_request_info * info,union iwreq_data * wrqu,char * extra)6704 static int airo_get_auth(struct net_device *dev,
6705 			       struct iw_request_info *info,
6706 			       union iwreq_data *wrqu, char *extra)
6707 {
6708 	struct airo_info *local = dev->ml_priv;
6709 	struct iw_param *param = &wrqu->param;
6710 	__le16 currentAuthType = local->config.authType;
6711 
6712 	switch (param->flags & IW_AUTH_INDEX) {
6713 	case IW_AUTH_DROP_UNENCRYPTED:
6714 		switch (currentAuthType) {
6715 		case AUTH_SHAREDKEY:
6716 		case AUTH_ENCRYPT:
6717 			param->value = 1;
6718 			break;
6719 		default:
6720 			param->value = 0;
6721 			break;
6722 		}
6723 		break;
6724 
6725 	case IW_AUTH_80211_AUTH_ALG:
6726 		switch (currentAuthType) {
6727 		case AUTH_SHAREDKEY:
6728 			param->value = IW_AUTH_ALG_SHARED_KEY;
6729 			break;
6730 		case AUTH_ENCRYPT:
6731 		default:
6732 			param->value = IW_AUTH_ALG_OPEN_SYSTEM;
6733 			break;
6734 		}
6735 		break;
6736 
6737 	case IW_AUTH_WPA_ENABLED:
6738 		param->value = 0;
6739 		break;
6740 
6741 	default:
6742 		return -EOPNOTSUPP;
6743 	}
6744 	return 0;
6745 }
6746 
6747 
6748 /*------------------------------------------------------------------*/
6749 /*
6750  * Wireless Handler : set Tx-Power
6751  */
airo_set_txpow(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6752 static int airo_set_txpow(struct net_device *dev,
6753 			  struct iw_request_info *info,
6754 			  struct iw_param *vwrq,
6755 			  char *extra)
6756 {
6757 	struct airo_info *local = dev->ml_priv;
6758 	CapabilityRid cap_rid;		/* Card capability info */
6759 	int i;
6760 	int rc = -EINVAL;
6761 	__le16 v = cpu_to_le16(vwrq->value);
6762 
6763 	readCapabilityRid(local, &cap_rid, 1);
6764 
6765 	if (vwrq->disabled) {
6766 		set_bit (FLAG_RADIO_OFF, &local->flags);
6767 		set_bit (FLAG_COMMIT, &local->flags);
6768 		return -EINPROGRESS;		/* Call commit handler */
6769 	}
6770 	if (vwrq->flags != IW_TXPOW_MWATT) {
6771 		return -EINVAL;
6772 	}
6773 	clear_bit (FLAG_RADIO_OFF, &local->flags);
6774 	for (i = 0; i < 8 && cap_rid.txPowerLevels[i]; i++)
6775 		if (v == cap_rid.txPowerLevels[i]) {
6776 			readConfigRid(local, 1);
6777 			local->config.txPower = v;
6778 			set_bit (FLAG_COMMIT, &local->flags);
6779 			rc = -EINPROGRESS;	/* Call commit handler */
6780 			break;
6781 		}
6782 	return rc;
6783 }
6784 
6785 /*------------------------------------------------------------------*/
6786 /*
6787  * Wireless Handler : get Tx-Power
6788  */
airo_get_txpow(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6789 static int airo_get_txpow(struct net_device *dev,
6790 			  struct iw_request_info *info,
6791 			  struct iw_param *vwrq,
6792 			  char *extra)
6793 {
6794 	struct airo_info *local = dev->ml_priv;
6795 
6796 	readConfigRid(local, 1);
6797 	vwrq->value = le16_to_cpu(local->config.txPower);
6798 	vwrq->fixed = 1;	/* No power control */
6799 	vwrq->disabled = test_bit(FLAG_RADIO_OFF, &local->flags);
6800 	vwrq->flags = IW_TXPOW_MWATT;
6801 
6802 	return 0;
6803 }
6804 
6805 /*------------------------------------------------------------------*/
6806 /*
6807  * Wireless Handler : set Retry limits
6808  */
airo_set_retry(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6809 static int airo_set_retry(struct net_device *dev,
6810 			  struct iw_request_info *info,
6811 			  struct iw_param *vwrq,
6812 			  char *extra)
6813 {
6814 	struct airo_info *local = dev->ml_priv;
6815 	int rc = -EINVAL;
6816 
6817 	if(vwrq->disabled) {
6818 		return -EINVAL;
6819 	}
6820 	readConfigRid(local, 1);
6821 	if(vwrq->flags & IW_RETRY_LIMIT) {
6822 		__le16 v = cpu_to_le16(vwrq->value);
6823 		if(vwrq->flags & IW_RETRY_LONG)
6824 			local->config.longRetryLimit = v;
6825 		else if (vwrq->flags & IW_RETRY_SHORT)
6826 			local->config.shortRetryLimit = v;
6827 		else {
6828 			/* No modifier : set both */
6829 			local->config.longRetryLimit = v;
6830 			local->config.shortRetryLimit = v;
6831 		}
6832 		set_bit (FLAG_COMMIT, &local->flags);
6833 		rc = -EINPROGRESS;		/* Call commit handler */
6834 	}
6835 	if(vwrq->flags & IW_RETRY_LIFETIME) {
6836 		local->config.txLifetime = cpu_to_le16(vwrq->value / 1024);
6837 		set_bit (FLAG_COMMIT, &local->flags);
6838 		rc = -EINPROGRESS;		/* Call commit handler */
6839 	}
6840 	return rc;
6841 }
6842 
6843 /*------------------------------------------------------------------*/
6844 /*
6845  * Wireless Handler : get Retry limits
6846  */
airo_get_retry(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)6847 static int airo_get_retry(struct net_device *dev,
6848 			  struct iw_request_info *info,
6849 			  struct iw_param *vwrq,
6850 			  char *extra)
6851 {
6852 	struct airo_info *local = dev->ml_priv;
6853 
6854 	vwrq->disabled = 0;      /* Can't be disabled */
6855 
6856 	readConfigRid(local, 1);
6857 	/* Note : by default, display the min retry number */
6858 	if((vwrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) {
6859 		vwrq->flags = IW_RETRY_LIFETIME;
6860 		vwrq->value = le16_to_cpu(local->config.txLifetime) * 1024;
6861 	} else if((vwrq->flags & IW_RETRY_LONG)) {
6862 		vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_LONG;
6863 		vwrq->value = le16_to_cpu(local->config.longRetryLimit);
6864 	} else {
6865 		vwrq->flags = IW_RETRY_LIMIT;
6866 		vwrq->value = le16_to_cpu(local->config.shortRetryLimit);
6867 		if(local->config.shortRetryLimit != local->config.longRetryLimit)
6868 			vwrq->flags |= IW_RETRY_SHORT;
6869 	}
6870 
6871 	return 0;
6872 }
6873 
6874 /*------------------------------------------------------------------*/
6875 /*
6876  * Wireless Handler : get range info
6877  */
airo_get_range(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)6878 static int airo_get_range(struct net_device *dev,
6879 			  struct iw_request_info *info,
6880 			  struct iw_point *dwrq,
6881 			  char *extra)
6882 {
6883 	struct airo_info *local = dev->ml_priv;
6884 	struct iw_range *range = (struct iw_range *) extra;
6885 	CapabilityRid cap_rid;		/* Card capability info */
6886 	int		i;
6887 	int		k;
6888 
6889 	readCapabilityRid(local, &cap_rid, 1);
6890 
6891 	dwrq->length = sizeof(struct iw_range);
6892 	memset(range, 0, sizeof(*range));
6893 	range->min_nwid = 0x0000;
6894 	range->max_nwid = 0x0000;
6895 	range->num_channels = 14;
6896 	/* Should be based on cap_rid.country to give only
6897 	 * what the current card support */
6898 	k = 0;
6899 	for(i = 0; i < 14; i++) {
6900 		range->freq[k].i = i + 1; /* List index */
6901 		range->freq[k].m = ieee80211_dsss_chan_to_freq(i + 1) * 100000;
6902 		range->freq[k++].e = 1;	/* Values in MHz -> * 10^5 * 10 */
6903 	}
6904 	range->num_frequency = k;
6905 
6906 	range->sensitivity = 65535;
6907 
6908 	/* Hum... Should put the right values there */
6909 	if (local->rssi)
6910 		range->max_qual.qual = 100;	/* % */
6911 	else
6912 		range->max_qual.qual = airo_get_max_quality(&cap_rid);
6913 	range->max_qual.level = 0x100 - 120;	/* -120 dBm */
6914 	range->max_qual.noise = 0x100 - 120;	/* -120 dBm */
6915 
6916 	/* Experimental measurements - boundary 11/5.5 Mb/s */
6917 	/* Note : with or without the (local->rssi), results
6918 	 * are somewhat different. - Jean II */
6919 	if (local->rssi) {
6920 		range->avg_qual.qual = 50;		/* % */
6921 		range->avg_qual.level = 0x100 - 70;	/* -70 dBm */
6922 	} else {
6923 		range->avg_qual.qual = airo_get_avg_quality(&cap_rid);
6924 		range->avg_qual.level = 0x100 - 80;	/* -80 dBm */
6925 	}
6926 	range->avg_qual.noise = 0x100 - 85;		/* -85 dBm */
6927 
6928 	for(i = 0 ; i < 8 ; i++) {
6929 		range->bitrate[i] = cap_rid.supportedRates[i] * 500000;
6930 		if(range->bitrate[i] == 0)
6931 			break;
6932 	}
6933 	range->num_bitrates = i;
6934 
6935 	/* Set an indication of the max TCP throughput
6936 	 * in bit/s that we can expect using this interface.
6937 	 * May be use for QoS stuff... Jean II */
6938 	if(i > 2)
6939 		range->throughput = 5000 * 1000;
6940 	else
6941 		range->throughput = 1500 * 1000;
6942 
6943 	range->min_rts = 0;
6944 	range->max_rts = AIRO_DEF_MTU;
6945 	range->min_frag = 256;
6946 	range->max_frag = AIRO_DEF_MTU;
6947 
6948 	if(cap_rid.softCap & cpu_to_le16(2)) {
6949 		// WEP: RC4 40 bits
6950 		range->encoding_size[0] = 5;
6951 		// RC4 ~128 bits
6952 		if (cap_rid.softCap & cpu_to_le16(0x100)) {
6953 			range->encoding_size[1] = 13;
6954 			range->num_encoding_sizes = 2;
6955 		} else
6956 			range->num_encoding_sizes = 1;
6957 		range->max_encoding_tokens =
6958 			cap_rid.softCap & cpu_to_le16(0x80) ? 4 : 1;
6959 	} else {
6960 		range->num_encoding_sizes = 0;
6961 		range->max_encoding_tokens = 0;
6962 	}
6963 	range->min_pmp = 0;
6964 	range->max_pmp = 5000000;	/* 5 secs */
6965 	range->min_pmt = 0;
6966 	range->max_pmt = 65535 * 1024;	/* ??? */
6967 	range->pmp_flags = IW_POWER_PERIOD;
6968 	range->pmt_flags = IW_POWER_TIMEOUT;
6969 	range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R;
6970 
6971 	/* Transmit Power - values are in mW */
6972 	for(i = 0 ; i < 8 ; i++) {
6973 		range->txpower[i] = le16_to_cpu(cap_rid.txPowerLevels[i]);
6974 		if(range->txpower[i] == 0)
6975 			break;
6976 	}
6977 	range->num_txpower = i;
6978 	range->txpower_capa = IW_TXPOW_MWATT;
6979 	range->we_version_source = 19;
6980 	range->we_version_compiled = WIRELESS_EXT;
6981 	range->retry_capa = IW_RETRY_LIMIT | IW_RETRY_LIFETIME;
6982 	range->retry_flags = IW_RETRY_LIMIT;
6983 	range->r_time_flags = IW_RETRY_LIFETIME;
6984 	range->min_retry = 1;
6985 	range->max_retry = 65535;
6986 	range->min_r_time = 1024;
6987 	range->max_r_time = 65535 * 1024;
6988 
6989 	/* Event capability (kernel + driver) */
6990 	range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
6991 				IW_EVENT_CAPA_MASK(SIOCGIWTHRSPY) |
6992 				IW_EVENT_CAPA_MASK(SIOCGIWAP) |
6993 				IW_EVENT_CAPA_MASK(SIOCGIWSCAN));
6994 	range->event_capa[1] = IW_EVENT_CAPA_K_1;
6995 	range->event_capa[4] = IW_EVENT_CAPA_MASK(IWEVTXDROP);
6996 	return 0;
6997 }
6998 
6999 /*------------------------------------------------------------------*/
7000 /*
7001  * Wireless Handler : set Power Management
7002  */
airo_set_power(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)7003 static int airo_set_power(struct net_device *dev,
7004 			  struct iw_request_info *info,
7005 			  struct iw_param *vwrq,
7006 			  char *extra)
7007 {
7008 	struct airo_info *local = dev->ml_priv;
7009 
7010 	readConfigRid(local, 1);
7011 	if (vwrq->disabled) {
7012 		if (sniffing_mode(local))
7013 			return -EINVAL;
7014 		local->config.powerSaveMode = POWERSAVE_CAM;
7015 		local->config.rmode &= ~RXMODE_MASK;
7016 		local->config.rmode |= RXMODE_BC_MC_ADDR;
7017 		set_bit (FLAG_COMMIT, &local->flags);
7018 		return -EINPROGRESS;		/* Call commit handler */
7019 	}
7020 	if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
7021 		local->config.fastListenDelay = cpu_to_le16((vwrq->value + 500) / 1024);
7022 		local->config.powerSaveMode = POWERSAVE_PSPCAM;
7023 		set_bit (FLAG_COMMIT, &local->flags);
7024 	} else if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_PERIOD) {
7025 		local->config.fastListenInterval =
7026 		local->config.listenInterval =
7027 			cpu_to_le16((vwrq->value + 500) / 1024);
7028 		local->config.powerSaveMode = POWERSAVE_PSPCAM;
7029 		set_bit (FLAG_COMMIT, &local->flags);
7030 	}
7031 	switch (vwrq->flags & IW_POWER_MODE) {
7032 		case IW_POWER_UNICAST_R:
7033 			if (sniffing_mode(local))
7034 				return -EINVAL;
7035 			local->config.rmode &= ~RXMODE_MASK;
7036 			local->config.rmode |= RXMODE_ADDR;
7037 			set_bit (FLAG_COMMIT, &local->flags);
7038 			break;
7039 		case IW_POWER_ALL_R:
7040 			if (sniffing_mode(local))
7041 				return -EINVAL;
7042 			local->config.rmode &= ~RXMODE_MASK;
7043 			local->config.rmode |= RXMODE_BC_MC_ADDR;
7044 			set_bit (FLAG_COMMIT, &local->flags);
7045 		case IW_POWER_ON:
7046 			/* This is broken, fixme ;-) */
7047 			break;
7048 		default:
7049 			return -EINVAL;
7050 	}
7051 	// Note : we may want to factor local->need_commit here
7052 	// Note2 : may also want to factor RXMODE_RFMON test
7053 	return -EINPROGRESS;		/* Call commit handler */
7054 }
7055 
7056 /*------------------------------------------------------------------*/
7057 /*
7058  * Wireless Handler : get Power Management
7059  */
airo_get_power(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)7060 static int airo_get_power(struct net_device *dev,
7061 			  struct iw_request_info *info,
7062 			  struct iw_param *vwrq,
7063 			  char *extra)
7064 {
7065 	struct airo_info *local = dev->ml_priv;
7066 	__le16 mode;
7067 
7068 	readConfigRid(local, 1);
7069 	mode = local->config.powerSaveMode;
7070 	if ((vwrq->disabled = (mode == POWERSAVE_CAM)))
7071 		return 0;
7072 	if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
7073 		vwrq->value = le16_to_cpu(local->config.fastListenDelay) * 1024;
7074 		vwrq->flags = IW_POWER_TIMEOUT;
7075 	} else {
7076 		vwrq->value = le16_to_cpu(local->config.fastListenInterval) * 1024;
7077 		vwrq->flags = IW_POWER_PERIOD;
7078 	}
7079 	if ((local->config.rmode & RXMODE_MASK) == RXMODE_ADDR)
7080 		vwrq->flags |= IW_POWER_UNICAST_R;
7081 	else
7082 		vwrq->flags |= IW_POWER_ALL_R;
7083 
7084 	return 0;
7085 }
7086 
7087 /*------------------------------------------------------------------*/
7088 /*
7089  * Wireless Handler : set Sensitivity
7090  */
airo_set_sens(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)7091 static int airo_set_sens(struct net_device *dev,
7092 			 struct iw_request_info *info,
7093 			 struct iw_param *vwrq,
7094 			 char *extra)
7095 {
7096 	struct airo_info *local = dev->ml_priv;
7097 
7098 	readConfigRid(local, 1);
7099 	local->config.rssiThreshold =
7100 		cpu_to_le16(vwrq->disabled ? RSSI_DEFAULT : vwrq->value);
7101 	set_bit (FLAG_COMMIT, &local->flags);
7102 
7103 	return -EINPROGRESS;		/* Call commit handler */
7104 }
7105 
7106 /*------------------------------------------------------------------*/
7107 /*
7108  * Wireless Handler : get Sensitivity
7109  */
airo_get_sens(struct net_device * dev,struct iw_request_info * info,struct iw_param * vwrq,char * extra)7110 static int airo_get_sens(struct net_device *dev,
7111 			 struct iw_request_info *info,
7112 			 struct iw_param *vwrq,
7113 			 char *extra)
7114 {
7115 	struct airo_info *local = dev->ml_priv;
7116 
7117 	readConfigRid(local, 1);
7118 	vwrq->value = le16_to_cpu(local->config.rssiThreshold);
7119 	vwrq->disabled = (vwrq->value == 0);
7120 	vwrq->fixed = 1;
7121 
7122 	return 0;
7123 }
7124 
7125 /*------------------------------------------------------------------*/
7126 /*
7127  * Wireless Handler : get AP List
7128  * Note : this is deprecated in favor of IWSCAN
7129  */
airo_get_aplist(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)7130 static int airo_get_aplist(struct net_device *dev,
7131 			   struct iw_request_info *info,
7132 			   struct iw_point *dwrq,
7133 			   char *extra)
7134 {
7135 	struct airo_info *local = dev->ml_priv;
7136 	struct sockaddr *address = (struct sockaddr *) extra;
7137 	struct iw_quality *qual;
7138 	BSSListRid BSSList;
7139 	int i;
7140 	int loseSync = capable(CAP_NET_ADMIN) ? 1: -1;
7141 
7142 	qual = kmalloc(IW_MAX_AP * sizeof(*qual), GFP_KERNEL);
7143 	if (!qual)
7144 		return -ENOMEM;
7145 
7146 	for (i = 0; i < IW_MAX_AP; i++) {
7147 		u16 dBm;
7148 		if (readBSSListRid(local, loseSync, &BSSList))
7149 			break;
7150 		loseSync = 0;
7151 		memcpy(address[i].sa_data, BSSList.bssid, ETH_ALEN);
7152 		address[i].sa_family = ARPHRD_ETHER;
7153 		dBm = le16_to_cpu(BSSList.dBm);
7154 		if (local->rssi) {
7155 			qual[i].level = 0x100 - dBm;
7156 			qual[i].qual = airo_dbm_to_pct(local->rssi, dBm);
7157 			qual[i].updated = IW_QUAL_QUAL_UPDATED
7158 					| IW_QUAL_LEVEL_UPDATED
7159 					| IW_QUAL_DBM;
7160 		} else {
7161 			qual[i].level = (dBm + 321) / 2;
7162 			qual[i].qual = 0;
7163 			qual[i].updated = IW_QUAL_QUAL_INVALID
7164 					| IW_QUAL_LEVEL_UPDATED
7165 					| IW_QUAL_DBM;
7166 		}
7167 		qual[i].noise = local->wstats.qual.noise;
7168 		if (BSSList.index == cpu_to_le16(0xffff))
7169 			break;
7170 	}
7171 	if (!i) {
7172 		StatusRid status_rid;		/* Card status info */
7173 		readStatusRid(local, &status_rid, 1);
7174 		for (i = 0;
7175 		     i < min(IW_MAX_AP, 4) &&
7176 			     (status_rid.bssid[i][0]
7177 			      & status_rid.bssid[i][1]
7178 			      & status_rid.bssid[i][2]
7179 			      & status_rid.bssid[i][3]
7180 			      & status_rid.bssid[i][4]
7181 			      & status_rid.bssid[i][5])!=0xff &&
7182 			     (status_rid.bssid[i][0]
7183 			      | status_rid.bssid[i][1]
7184 			      | status_rid.bssid[i][2]
7185 			      | status_rid.bssid[i][3]
7186 			      | status_rid.bssid[i][4]
7187 			      | status_rid.bssid[i][5]);
7188 		     i++) {
7189 			memcpy(address[i].sa_data,
7190 			       status_rid.bssid[i], ETH_ALEN);
7191 			address[i].sa_family = ARPHRD_ETHER;
7192 		}
7193 	} else {
7194 		dwrq->flags = 1; /* Should be define'd */
7195 		memcpy(extra + sizeof(struct sockaddr) * i, qual,
7196 		       sizeof(struct iw_quality) * i);
7197 	}
7198 	dwrq->length = i;
7199 
7200 	kfree(qual);
7201 	return 0;
7202 }
7203 
7204 /*------------------------------------------------------------------*/
7205 /*
7206  * Wireless Handler : Initiate Scan
7207  */
airo_set_scan(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)7208 static int airo_set_scan(struct net_device *dev,
7209 			 struct iw_request_info *info,
7210 			 struct iw_point *dwrq,
7211 			 char *extra)
7212 {
7213 	struct airo_info *ai = dev->ml_priv;
7214 	Cmd cmd;
7215 	Resp rsp;
7216 	int wake = 0;
7217 
7218 	/* Note : you may have realised that, as this is a SET operation,
7219 	 * this is privileged and therefore a normal user can't
7220 	 * perform scanning.
7221 	 * This is not an error, while the device perform scanning,
7222 	 * traffic doesn't flow, so it's a perfect DoS...
7223 	 * Jean II */
7224 	if (ai->flags & FLAG_RADIO_MASK) return -ENETDOWN;
7225 
7226 	if (down_interruptible(&ai->sem))
7227 		return -ERESTARTSYS;
7228 
7229 	/* If there's already a scan in progress, don't
7230 	 * trigger another one. */
7231 	if (ai->scan_timeout > 0)
7232 		goto out;
7233 
7234 	/* Initiate a scan command */
7235 	ai->scan_timeout = RUN_AT(3*HZ);
7236 	memset(&cmd, 0, sizeof(cmd));
7237 	cmd.cmd=CMD_LISTBSS;
7238 	issuecommand(ai, &cmd, &rsp);
7239 	wake = 1;
7240 
7241 out:
7242 	up(&ai->sem);
7243 	if (wake)
7244 		wake_up_interruptible(&ai->thr_wait);
7245 	return 0;
7246 }
7247 
7248 /*------------------------------------------------------------------*/
7249 /*
7250  * Translate scan data returned from the card to a card independent
7251  * format that the Wireless Tools will understand - Jean II
7252  */
airo_translate_scan(struct net_device * dev,struct iw_request_info * info,char * current_ev,char * end_buf,BSSListRid * bss)7253 static inline char *airo_translate_scan(struct net_device *dev,
7254 					struct iw_request_info *info,
7255 					char *current_ev,
7256 					char *end_buf,
7257 					BSSListRid *bss)
7258 {
7259 	struct airo_info *ai = dev->ml_priv;
7260 	struct iw_event		iwe;		/* Temporary buffer */
7261 	__le16			capabilities;
7262 	char *			current_val;	/* For rates */
7263 	int			i;
7264 	char *		buf;
7265 	u16 dBm;
7266 
7267 	/* First entry *MUST* be the AP MAC address */
7268 	iwe.cmd = SIOCGIWAP;
7269 	iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
7270 	memcpy(iwe.u.ap_addr.sa_data, bss->bssid, ETH_ALEN);
7271 	current_ev = iwe_stream_add_event(info, current_ev, end_buf,
7272 					  &iwe, IW_EV_ADDR_LEN);
7273 
7274 	/* Other entries will be displayed in the order we give them */
7275 
7276 	/* Add the ESSID */
7277 	iwe.u.data.length = bss->ssidLen;
7278 	if(iwe.u.data.length > 32)
7279 		iwe.u.data.length = 32;
7280 	iwe.cmd = SIOCGIWESSID;
7281 	iwe.u.data.flags = 1;
7282 	current_ev = iwe_stream_add_point(info, current_ev, end_buf,
7283 					  &iwe, bss->ssid);
7284 
7285 	/* Add mode */
7286 	iwe.cmd = SIOCGIWMODE;
7287 	capabilities = bss->cap;
7288 	if(capabilities & (CAP_ESS | CAP_IBSS)) {
7289 		if(capabilities & CAP_ESS)
7290 			iwe.u.mode = IW_MODE_MASTER;
7291 		else
7292 			iwe.u.mode = IW_MODE_ADHOC;
7293 		current_ev = iwe_stream_add_event(info, current_ev, end_buf,
7294 						  &iwe, IW_EV_UINT_LEN);
7295 	}
7296 
7297 	/* Add frequency */
7298 	iwe.cmd = SIOCGIWFREQ;
7299 	iwe.u.freq.m = le16_to_cpu(bss->dsChannel);
7300 	iwe.u.freq.m = ieee80211_dsss_chan_to_freq(iwe.u.freq.m) * 100000;
7301 	iwe.u.freq.e = 1;
7302 	current_ev = iwe_stream_add_event(info, current_ev, end_buf,
7303 					  &iwe, IW_EV_FREQ_LEN);
7304 
7305 	dBm = le16_to_cpu(bss->dBm);
7306 
7307 	/* Add quality statistics */
7308 	iwe.cmd = IWEVQUAL;
7309 	if (ai->rssi) {
7310 		iwe.u.qual.level = 0x100 - dBm;
7311 		iwe.u.qual.qual = airo_dbm_to_pct(ai->rssi, dBm);
7312 		iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED
7313 				| IW_QUAL_LEVEL_UPDATED
7314 				| IW_QUAL_DBM;
7315 	} else {
7316 		iwe.u.qual.level = (dBm + 321) / 2;
7317 		iwe.u.qual.qual = 0;
7318 		iwe.u.qual.updated = IW_QUAL_QUAL_INVALID
7319 				| IW_QUAL_LEVEL_UPDATED
7320 				| IW_QUAL_DBM;
7321 	}
7322 	iwe.u.qual.noise = ai->wstats.qual.noise;
7323 	current_ev = iwe_stream_add_event(info, current_ev, end_buf,
7324 					  &iwe, IW_EV_QUAL_LEN);
7325 
7326 	/* Add encryption capability */
7327 	iwe.cmd = SIOCGIWENCODE;
7328 	if(capabilities & CAP_PRIVACY)
7329 		iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
7330 	else
7331 		iwe.u.data.flags = IW_ENCODE_DISABLED;
7332 	iwe.u.data.length = 0;
7333 	current_ev = iwe_stream_add_point(info, current_ev, end_buf,
7334 					  &iwe, bss->ssid);
7335 
7336 	/* Rate : stuffing multiple values in a single event require a bit
7337 	 * more of magic - Jean II */
7338 	current_val = current_ev + iwe_stream_lcp_len(info);
7339 
7340 	iwe.cmd = SIOCGIWRATE;
7341 	/* Those two flags are ignored... */
7342 	iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
7343 	/* Max 8 values */
7344 	for(i = 0 ; i < 8 ; i++) {
7345 		/* NULL terminated */
7346 		if(bss->rates[i] == 0)
7347 			break;
7348 		/* Bit rate given in 500 kb/s units (+ 0x80) */
7349 		iwe.u.bitrate.value = ((bss->rates[i] & 0x7f) * 500000);
7350 		/* Add new value to event */
7351 		current_val = iwe_stream_add_value(info, current_ev,
7352 						   current_val, end_buf,
7353 						   &iwe, IW_EV_PARAM_LEN);
7354 	}
7355 	/* Check if we added any event */
7356 	if ((current_val - current_ev) > iwe_stream_lcp_len(info))
7357 		current_ev = current_val;
7358 
7359 	/* Beacon interval */
7360 	buf = kmalloc(30, GFP_KERNEL);
7361 	if (buf) {
7362 		iwe.cmd = IWEVCUSTOM;
7363 		sprintf(buf, "bcn_int=%d", bss->beaconInterval);
7364 		iwe.u.data.length = strlen(buf);
7365 		current_ev = iwe_stream_add_point(info, current_ev, end_buf,
7366 						  &iwe, buf);
7367 		kfree(buf);
7368 	}
7369 
7370 	/* Put WPA/RSN Information Elements into the event stream */
7371 	if (test_bit(FLAG_WPA_CAPABLE, &ai->flags)) {
7372 		unsigned int num_null_ies = 0;
7373 		u16 length = sizeof (bss->extra.iep);
7374 		u8 *ie = (void *)&bss->extra.iep;
7375 
7376 		while ((length >= 2) && (num_null_ies < 2)) {
7377 			if (2 + ie[1] > length) {
7378 				/* Invalid element, don't continue parsing IE */
7379 				break;
7380 			}
7381 
7382 			switch (ie[0]) {
7383 			case WLAN_EID_SSID:
7384 				/* Two zero-length SSID elements
7385 				 * mean we're done parsing elements */
7386 				if (!ie[1])
7387 					num_null_ies++;
7388 				break;
7389 
7390 			case WLAN_EID_VENDOR_SPECIFIC:
7391 				if (ie[1] >= 4 &&
7392 				    ie[2] == 0x00 &&
7393 				    ie[3] == 0x50 &&
7394 				    ie[4] == 0xf2 &&
7395 				    ie[5] == 0x01) {
7396 					iwe.cmd = IWEVGENIE;
7397 					/* 64 is an arbitrary cut-off */
7398 					iwe.u.data.length = min(ie[1] + 2,
7399 								64);
7400 					current_ev = iwe_stream_add_point(
7401 							info, current_ev,
7402 							end_buf, &iwe, ie);
7403 				}
7404 				break;
7405 
7406 			case WLAN_EID_RSN:
7407 				iwe.cmd = IWEVGENIE;
7408 				/* 64 is an arbitrary cut-off */
7409 				iwe.u.data.length = min(ie[1] + 2, 64);
7410 				current_ev = iwe_stream_add_point(
7411 					info, current_ev, end_buf,
7412 					&iwe, ie);
7413 				break;
7414 
7415 			default:
7416 				break;
7417 			}
7418 
7419 			length -= 2 + ie[1];
7420 			ie += 2 + ie[1];
7421 		}
7422 	}
7423 	return current_ev;
7424 }
7425 
7426 /*------------------------------------------------------------------*/
7427 /*
7428  * Wireless Handler : Read Scan Results
7429  */
airo_get_scan(struct net_device * dev,struct iw_request_info * info,struct iw_point * dwrq,char * extra)7430 static int airo_get_scan(struct net_device *dev,
7431 			 struct iw_request_info *info,
7432 			 struct iw_point *dwrq,
7433 			 char *extra)
7434 {
7435 	struct airo_info *ai = dev->ml_priv;
7436 	BSSListElement *net;
7437 	int err = 0;
7438 	char *current_ev = extra;
7439 
7440 	/* If a scan is in-progress, return -EAGAIN */
7441 	if (ai->scan_timeout > 0)
7442 		return -EAGAIN;
7443 
7444 	if (down_interruptible(&ai->sem))
7445 		return -EAGAIN;
7446 
7447 	list_for_each_entry (net, &ai->network_list, list) {
7448 		/* Translate to WE format this entry */
7449 		current_ev = airo_translate_scan(dev, info, current_ev,
7450 						 extra + dwrq->length,
7451 						 &net->bss);
7452 
7453 		/* Check if there is space for one more entry */
7454 		if((extra + dwrq->length - current_ev) <= IW_EV_ADDR_LEN) {
7455 			/* Ask user space to try again with a bigger buffer */
7456 			err = -E2BIG;
7457 			goto out;
7458 		}
7459 	}
7460 
7461 	/* Length of data */
7462 	dwrq->length = (current_ev - extra);
7463 	dwrq->flags = 0;	/* todo */
7464 
7465 out:
7466 	up(&ai->sem);
7467 	return err;
7468 }
7469 
7470 /*------------------------------------------------------------------*/
7471 /*
7472  * Commit handler : called after a bunch of SET operations
7473  */
airo_config_commit(struct net_device * dev,struct iw_request_info * info,void * zwrq,char * extra)7474 static int airo_config_commit(struct net_device *dev,
7475 			      struct iw_request_info *info,	/* NULL */
7476 			      void *zwrq,			/* NULL */
7477 			      char *extra)			/* NULL */
7478 {
7479 	struct airo_info *local = dev->ml_priv;
7480 
7481 	if (!test_bit (FLAG_COMMIT, &local->flags))
7482 		return 0;
7483 
7484 	/* Some of the "SET" function may have modified some of the
7485 	 * parameters. It's now time to commit them in the card */
7486 	disable_MAC(local, 1);
7487 	if (test_bit (FLAG_RESET, &local->flags)) {
7488 		APListRid APList_rid;
7489 		SsidRid SSID_rid;
7490 
7491 		readAPListRid(local, &APList_rid);
7492 		readSsidRid(local, &SSID_rid);
7493 		if (test_bit(FLAG_MPI,&local->flags))
7494 			setup_card(local, dev->dev_addr, 1 );
7495 		else
7496 			reset_airo_card(dev);
7497 		disable_MAC(local, 1);
7498 		writeSsidRid(local, &SSID_rid, 1);
7499 		writeAPListRid(local, &APList_rid, 1);
7500 	}
7501 	if (down_interruptible(&local->sem))
7502 		return -ERESTARTSYS;
7503 	writeConfigRid(local, 0);
7504 	enable_MAC(local, 0);
7505 	if (test_bit (FLAG_RESET, &local->flags))
7506 		airo_set_promisc(local);
7507 	else
7508 		up(&local->sem);
7509 
7510 	return 0;
7511 }
7512 
7513 /*------------------------------------------------------------------*/
7514 /*
7515  * Structures to export the Wireless Handlers
7516  */
7517 
7518 static const struct iw_priv_args airo_private_args[] = {
7519 /*{ cmd,         set_args,                            get_args, name } */
7520   { AIROIOCTL, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | sizeof (aironet_ioctl),
7521     IW_PRIV_TYPE_BYTE | 2047, "airoioctl" },
7522   { AIROIDIFC, IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | sizeof (aironet_ioctl),
7523     IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "airoidifc" },
7524 };
7525 
7526 static const iw_handler		airo_handler[] =
7527 {
7528 	(iw_handler) airo_config_commit,	/* SIOCSIWCOMMIT */
7529 	(iw_handler) airo_get_name,		/* SIOCGIWNAME */
7530 	(iw_handler) NULL,			/* SIOCSIWNWID */
7531 	(iw_handler) NULL,			/* SIOCGIWNWID */
7532 	(iw_handler) airo_set_freq,		/* SIOCSIWFREQ */
7533 	(iw_handler) airo_get_freq,		/* SIOCGIWFREQ */
7534 	(iw_handler) airo_set_mode,		/* SIOCSIWMODE */
7535 	(iw_handler) airo_get_mode,		/* SIOCGIWMODE */
7536 	(iw_handler) airo_set_sens,		/* SIOCSIWSENS */
7537 	(iw_handler) airo_get_sens,		/* SIOCGIWSENS */
7538 	(iw_handler) NULL,			/* SIOCSIWRANGE */
7539 	(iw_handler) airo_get_range,		/* SIOCGIWRANGE */
7540 	(iw_handler) NULL,			/* SIOCSIWPRIV */
7541 	(iw_handler) NULL,			/* SIOCGIWPRIV */
7542 	(iw_handler) NULL,			/* SIOCSIWSTATS */
7543 	(iw_handler) NULL,			/* SIOCGIWSTATS */
7544 	iw_handler_set_spy,			/* SIOCSIWSPY */
7545 	iw_handler_get_spy,			/* SIOCGIWSPY */
7546 	iw_handler_set_thrspy,			/* SIOCSIWTHRSPY */
7547 	iw_handler_get_thrspy,			/* SIOCGIWTHRSPY */
7548 	(iw_handler) airo_set_wap,		/* SIOCSIWAP */
7549 	(iw_handler) airo_get_wap,		/* SIOCGIWAP */
7550 	(iw_handler) NULL,			/* -- hole -- */
7551 	(iw_handler) airo_get_aplist,		/* SIOCGIWAPLIST */
7552 	(iw_handler) airo_set_scan,		/* SIOCSIWSCAN */
7553 	(iw_handler) airo_get_scan,		/* SIOCGIWSCAN */
7554 	(iw_handler) airo_set_essid,		/* SIOCSIWESSID */
7555 	(iw_handler) airo_get_essid,		/* SIOCGIWESSID */
7556 	(iw_handler) airo_set_nick,		/* SIOCSIWNICKN */
7557 	(iw_handler) airo_get_nick,		/* SIOCGIWNICKN */
7558 	(iw_handler) NULL,			/* -- hole -- */
7559 	(iw_handler) NULL,			/* -- hole -- */
7560 	(iw_handler) airo_set_rate,		/* SIOCSIWRATE */
7561 	(iw_handler) airo_get_rate,		/* SIOCGIWRATE */
7562 	(iw_handler) airo_set_rts,		/* SIOCSIWRTS */
7563 	(iw_handler) airo_get_rts,		/* SIOCGIWRTS */
7564 	(iw_handler) airo_set_frag,		/* SIOCSIWFRAG */
7565 	(iw_handler) airo_get_frag,		/* SIOCGIWFRAG */
7566 	(iw_handler) airo_set_txpow,		/* SIOCSIWTXPOW */
7567 	(iw_handler) airo_get_txpow,		/* SIOCGIWTXPOW */
7568 	(iw_handler) airo_set_retry,		/* SIOCSIWRETRY */
7569 	(iw_handler) airo_get_retry,		/* SIOCGIWRETRY */
7570 	(iw_handler) airo_set_encode,		/* SIOCSIWENCODE */
7571 	(iw_handler) airo_get_encode,		/* SIOCGIWENCODE */
7572 	(iw_handler) airo_set_power,		/* SIOCSIWPOWER */
7573 	(iw_handler) airo_get_power,		/* SIOCGIWPOWER */
7574 	(iw_handler) NULL,			/* -- hole -- */
7575 	(iw_handler) NULL,			/* -- hole -- */
7576 	(iw_handler) NULL,			/* SIOCSIWGENIE */
7577 	(iw_handler) NULL,			/* SIOCGIWGENIE */
7578 	(iw_handler) airo_set_auth,		/* SIOCSIWAUTH */
7579 	(iw_handler) airo_get_auth,		/* SIOCGIWAUTH */
7580 	(iw_handler) airo_set_encodeext,	/* SIOCSIWENCODEEXT */
7581 	(iw_handler) airo_get_encodeext,	/* SIOCGIWENCODEEXT */
7582 	(iw_handler) NULL,			/* SIOCSIWPMKSA */
7583 };
7584 
7585 /* Note : don't describe AIROIDIFC and AIROOLDIDIFC in here.
7586  * We want to force the use of the ioctl code, because those can't be
7587  * won't work the iw_handler code (because they simultaneously read
7588  * and write data and iw_handler can't do that).
7589  * Note that it's perfectly legal to read/write on a single ioctl command,
7590  * you just can't use iwpriv and need to force it via the ioctl handler.
7591  * Jean II */
7592 static const iw_handler		airo_private_handler[] =
7593 {
7594 	NULL,				/* SIOCIWFIRSTPRIV */
7595 };
7596 
7597 static const struct iw_handler_def	airo_handler_def =
7598 {
7599 	.num_standard	= ARRAY_SIZE(airo_handler),
7600 	.num_private	= ARRAY_SIZE(airo_private_handler),
7601 	.num_private_args = ARRAY_SIZE(airo_private_args),
7602 	.standard	= airo_handler,
7603 	.private	= airo_private_handler,
7604 	.private_args	= airo_private_args,
7605 	.get_wireless_stats = airo_get_wireless_stats,
7606 };
7607 
7608 /*
7609  * This defines the configuration part of the Wireless Extensions
7610  * Note : irq and spinlock protection will occur in the subroutines
7611  *
7612  * TODO :
7613  *	o Check input value more carefully and fill correct values in range
7614  *	o Test and shakeout the bugs (if any)
7615  *
7616  * Jean II
7617  *
7618  * Javier Achirica did a great job of merging code from the unnamed CISCO
7619  * developer that added support for flashing the card.
7620  */
airo_ioctl(struct net_device * dev,struct ifreq * rq,int cmd)7621 static int airo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
7622 {
7623 	int rc = 0;
7624 	struct airo_info *ai = dev->ml_priv;
7625 
7626 	if (ai->power.event)
7627 		return 0;
7628 
7629 	switch (cmd) {
7630 #ifdef CISCO_EXT
7631 	case AIROIDIFC:
7632 #ifdef AIROOLDIDIFC
7633 	case AIROOLDIDIFC:
7634 #endif
7635 	{
7636 		int val = AIROMAGIC;
7637 		aironet_ioctl com;
7638 		if (copy_from_user(&com,rq->ifr_data,sizeof(com)))
7639 			rc = -EFAULT;
7640 		else if (copy_to_user(com.data,(char *)&val,sizeof(val)))
7641 			rc = -EFAULT;
7642 	}
7643 	break;
7644 
7645 	case AIROIOCTL:
7646 #ifdef AIROOLDIOCTL
7647 	case AIROOLDIOCTL:
7648 #endif
7649 		/* Get the command struct and hand it off for evaluation by
7650 		 * the proper subfunction
7651 		 */
7652 	{
7653 		aironet_ioctl com;
7654 		if (copy_from_user(&com,rq->ifr_data,sizeof(com))) {
7655 			rc = -EFAULT;
7656 			break;
7657 		}
7658 
7659 		/* Separate R/W functions bracket legality here
7660 		 */
7661 		if ( com.command == AIRORSWVERSION ) {
7662 			if (copy_to_user(com.data, swversion, sizeof(swversion)))
7663 				rc = -EFAULT;
7664 			else
7665 				rc = 0;
7666 		}
7667 		else if ( com.command <= AIRORRID)
7668 			rc = readrids(dev,&com);
7669 		else if ( com.command >= AIROPCAP && com.command <= (AIROPLEAPUSR+2) )
7670 			rc = writerids(dev,&com);
7671 		else if ( com.command >= AIROFLSHRST && com.command <= AIRORESTART )
7672 			rc = flashcard(dev,&com);
7673 		else
7674 			rc = -EINVAL;      /* Bad command in ioctl */
7675 	}
7676 	break;
7677 #endif /* CISCO_EXT */
7678 
7679 	// All other calls are currently unsupported
7680 	default:
7681 		rc = -EOPNOTSUPP;
7682 	}
7683 	return rc;
7684 }
7685 
7686 /*
7687  * Get the Wireless stats out of the driver
7688  * Note : irq and spinlock protection will occur in the subroutines
7689  *
7690  * TODO :
7691  *	o Check if work in Ad-Hoc mode (otherwise, use SPY, as in wvlan_cs)
7692  *
7693  * Jean
7694  */
airo_read_wireless_stats(struct airo_info * local)7695 static void airo_read_wireless_stats(struct airo_info *local)
7696 {
7697 	StatusRid status_rid;
7698 	StatsRid stats_rid;
7699 	CapabilityRid cap_rid;
7700 	__le32 *vals = stats_rid.vals;
7701 
7702 	/* Get stats out of the card */
7703 	clear_bit(JOB_WSTATS, &local->jobs);
7704 	if (local->power.event) {
7705 		up(&local->sem);
7706 		return;
7707 	}
7708 	readCapabilityRid(local, &cap_rid, 0);
7709 	readStatusRid(local, &status_rid, 0);
7710 	readStatsRid(local, &stats_rid, RID_STATS, 0);
7711 	up(&local->sem);
7712 
7713 	/* The status */
7714 	local->wstats.status = le16_to_cpu(status_rid.mode);
7715 
7716 	/* Signal quality and co */
7717 	if (local->rssi) {
7718 		local->wstats.qual.level =
7719 			airo_rssi_to_dbm(local->rssi,
7720 					 le16_to_cpu(status_rid.sigQuality));
7721 		/* normalizedSignalStrength appears to be a percentage */
7722 		local->wstats.qual.qual =
7723 			le16_to_cpu(status_rid.normalizedSignalStrength);
7724 	} else {
7725 		local->wstats.qual.level =
7726 			(le16_to_cpu(status_rid.normalizedSignalStrength) + 321) / 2;
7727 		local->wstats.qual.qual = airo_get_quality(&status_rid, &cap_rid);
7728 	}
7729 	if (le16_to_cpu(status_rid.len) >= 124) {
7730 		local->wstats.qual.noise = 0x100 - status_rid.noisedBm;
7731 		local->wstats.qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
7732 	} else {
7733 		local->wstats.qual.noise = 0;
7734 		local->wstats.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | IW_QUAL_NOISE_INVALID | IW_QUAL_DBM;
7735 	}
7736 
7737 	/* Packets discarded in the wireless adapter due to wireless
7738 	 * specific problems */
7739 	local->wstats.discard.nwid = le32_to_cpu(vals[56]) +
7740 				     le32_to_cpu(vals[57]) +
7741 				     le32_to_cpu(vals[58]); /* SSID Mismatch */
7742 	local->wstats.discard.code = le32_to_cpu(vals[6]);/* RxWepErr */
7743 	local->wstats.discard.fragment = le32_to_cpu(vals[30]);
7744 	local->wstats.discard.retries = le32_to_cpu(vals[10]);
7745 	local->wstats.discard.misc = le32_to_cpu(vals[1]) +
7746 				     le32_to_cpu(vals[32]);
7747 	local->wstats.miss.beacon = le32_to_cpu(vals[34]);
7748 }
7749 
airo_get_wireless_stats(struct net_device * dev)7750 static struct iw_statistics *airo_get_wireless_stats(struct net_device *dev)
7751 {
7752 	struct airo_info *local =  dev->ml_priv;
7753 
7754 	if (!test_bit(JOB_WSTATS, &local->jobs)) {
7755 		/* Get stats out of the card if available */
7756 		if (down_trylock(&local->sem) != 0) {
7757 			set_bit(JOB_WSTATS, &local->jobs);
7758 			wake_up_interruptible(&local->thr_wait);
7759 		} else
7760 			airo_read_wireless_stats(local);
7761 	}
7762 
7763 	return &local->wstats;
7764 }
7765 
7766 #ifdef CISCO_EXT
7767 /*
7768  * This just translates from driver IOCTL codes to the command codes to
7769  * feed to the radio's host interface. Things can be added/deleted
7770  * as needed.  This represents the READ side of control I/O to
7771  * the card
7772  */
readrids(struct net_device * dev,aironet_ioctl * comp)7773 static int readrids(struct net_device *dev, aironet_ioctl *comp) {
7774 	unsigned short ridcode;
7775 	unsigned char *iobuf;
7776 	int len;
7777 	struct airo_info *ai = dev->ml_priv;
7778 
7779 	if (test_bit(FLAG_FLASHING, &ai->flags))
7780 		return -EIO;
7781 
7782 	switch(comp->command)
7783 	{
7784 	case AIROGCAP:      ridcode = RID_CAPABILITIES; break;
7785 	case AIROGCFG:      ridcode = RID_CONFIG;
7786 		if (test_bit(FLAG_COMMIT, &ai->flags)) {
7787 			disable_MAC (ai, 1);
7788 			writeConfigRid (ai, 1);
7789 			enable_MAC(ai, 1);
7790 		}
7791 		break;
7792 	case AIROGSLIST:    ridcode = RID_SSID;         break;
7793 	case AIROGVLIST:    ridcode = RID_APLIST;       break;
7794 	case AIROGDRVNAM:   ridcode = RID_DRVNAME;      break;
7795 	case AIROGEHTENC:   ridcode = RID_ETHERENCAP;   break;
7796 	case AIROGWEPKTMP:  ridcode = RID_WEP_TEMP;
7797 		/* Only super-user can read WEP keys */
7798 		if (!capable(CAP_NET_ADMIN))
7799 			return -EPERM;
7800 		break;
7801 	case AIROGWEPKNV:   ridcode = RID_WEP_PERM;
7802 		/* Only super-user can read WEP keys */
7803 		if (!capable(CAP_NET_ADMIN))
7804 			return -EPERM;
7805 		break;
7806 	case AIROGSTAT:     ridcode = RID_STATUS;       break;
7807 	case AIROGSTATSD32: ridcode = RID_STATSDELTA;   break;
7808 	case AIROGSTATSC32: ridcode = RID_STATS;        break;
7809 	case AIROGMICSTATS:
7810 		if (copy_to_user(comp->data, &ai->micstats,
7811 				 min((int)comp->len,(int)sizeof(ai->micstats))))
7812 			return -EFAULT;
7813 		return 0;
7814 	case AIRORRID:      ridcode = comp->ridnum;     break;
7815 	default:
7816 		return -EINVAL;
7817 		break;
7818 	}
7819 
7820 	if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL)
7821 		return -ENOMEM;
7822 
7823 	PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1);
7824 	/* get the count of bytes in the rid  docs say 1st 2 bytes is it.
7825 	 * then return it to the user
7826 	 * 9/22/2000 Honor user given length
7827 	 */
7828 	len = comp->len;
7829 
7830 	if (copy_to_user(comp->data, iobuf, min(len, (int)RIDSIZE))) {
7831 		kfree (iobuf);
7832 		return -EFAULT;
7833 	}
7834 	kfree (iobuf);
7835 	return 0;
7836 }
7837 
7838 /*
7839  * Danger Will Robinson write the rids here
7840  */
7841 
writerids(struct net_device * dev,aironet_ioctl * comp)7842 static int writerids(struct net_device *dev, aironet_ioctl *comp) {
7843 	struct airo_info *ai = dev->ml_priv;
7844 	int  ridcode;
7845         int  enabled;
7846 	static int (* writer)(struct airo_info *, u16 rid, const void *, int, int);
7847 	unsigned char *iobuf;
7848 
7849 	/* Only super-user can write RIDs */
7850 	if (!capable(CAP_NET_ADMIN))
7851 		return -EPERM;
7852 
7853 	if (test_bit(FLAG_FLASHING, &ai->flags))
7854 		return -EIO;
7855 
7856 	ridcode = 0;
7857 	writer = do_writerid;
7858 
7859 	switch(comp->command)
7860 	{
7861 	case AIROPSIDS:     ridcode = RID_SSID;         break;
7862 	case AIROPCAP:      ridcode = RID_CAPABILITIES; break;
7863 	case AIROPAPLIST:   ridcode = RID_APLIST;       break;
7864 	case AIROPCFG: ai->config.len = 0;
7865 			    clear_bit(FLAG_COMMIT, &ai->flags);
7866 			    ridcode = RID_CONFIG;       break;
7867 	case AIROPWEPKEYNV: ridcode = RID_WEP_PERM;     break;
7868 	case AIROPLEAPUSR:  ridcode = RID_LEAPUSERNAME; break;
7869 	case AIROPLEAPPWD:  ridcode = RID_LEAPPASSWORD; break;
7870 	case AIROPWEPKEY:   ridcode = RID_WEP_TEMP; writer = PC4500_writerid;
7871 		break;
7872 	case AIROPLEAPUSR+1: ridcode = 0xFF2A;          break;
7873 	case AIROPLEAPUSR+2: ridcode = 0xFF2B;          break;
7874 
7875 		/* this is not really a rid but a command given to the card
7876 		 * same with MAC off
7877 		 */
7878 	case AIROPMACON:
7879 		if (enable_MAC(ai, 1) != 0)
7880 			return -EIO;
7881 		return 0;
7882 
7883 		/*
7884 		 * Evidently this code in the airo driver does not get a symbol
7885 		 * as disable_MAC. it's probably so short the compiler does not gen one.
7886 		 */
7887 	case AIROPMACOFF:
7888 		disable_MAC(ai, 1);
7889 		return 0;
7890 
7891 		/* This command merely clears the counts does not actually store any data
7892 		 * only reads rid. But as it changes the cards state, I put it in the
7893 		 * writerid routines.
7894 		 */
7895 	case AIROPSTCLR:
7896 		if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL)
7897 			return -ENOMEM;
7898 
7899 		PC4500_readrid(ai,RID_STATSDELTACLEAR,iobuf,RIDSIZE, 1);
7900 
7901 		enabled = ai->micstats.enabled;
7902 		memset(&ai->micstats,0,sizeof(ai->micstats));
7903 		ai->micstats.enabled = enabled;
7904 
7905 		if (copy_to_user(comp->data, iobuf,
7906 				 min((int)comp->len, (int)RIDSIZE))) {
7907 			kfree (iobuf);
7908 			return -EFAULT;
7909 		}
7910 		kfree (iobuf);
7911 		return 0;
7912 
7913 	default:
7914 		return -EOPNOTSUPP;	/* Blarg! */
7915 	}
7916 	if(comp->len > RIDSIZE)
7917 		return -EINVAL;
7918 
7919 	if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL)
7920 		return -ENOMEM;
7921 
7922 	if (copy_from_user(iobuf,comp->data,comp->len)) {
7923 		kfree (iobuf);
7924 		return -EFAULT;
7925 	}
7926 
7927 	if (comp->command == AIROPCFG) {
7928 		ConfigRid *cfg = (ConfigRid *)iobuf;
7929 
7930 		if (test_bit(FLAG_MIC_CAPABLE, &ai->flags))
7931 			cfg->opmode |= MODE_MIC;
7932 
7933 		if ((cfg->opmode & MODE_CFG_MASK) == MODE_STA_IBSS)
7934 			set_bit (FLAG_ADHOC, &ai->flags);
7935 		else
7936 			clear_bit (FLAG_ADHOC, &ai->flags);
7937 	}
7938 
7939 	if((*writer)(ai, ridcode, iobuf,comp->len,1)) {
7940 		kfree (iobuf);
7941 		return -EIO;
7942 	}
7943 	kfree (iobuf);
7944 	return 0;
7945 }
7946 
7947 /*****************************************************************************
7948  * Ancillary flash / mod functions much black magic lurkes here              *
7949  *****************************************************************************
7950  */
7951 
7952 /*
7953  * Flash command switch table
7954  */
7955 
flashcard(struct net_device * dev,aironet_ioctl * comp)7956 static int flashcard(struct net_device *dev, aironet_ioctl *comp) {
7957 	int z;
7958 
7959 	/* Only super-user can modify flash */
7960 	if (!capable(CAP_NET_ADMIN))
7961 		return -EPERM;
7962 
7963 	switch(comp->command)
7964 	{
7965 	case AIROFLSHRST:
7966 		return cmdreset((struct airo_info *)dev->ml_priv);
7967 
7968 	case AIROFLSHSTFL:
7969 		if (!AIRO_FLASH(dev) &&
7970 		    (AIRO_FLASH(dev) = kmalloc(FLASHSIZE, GFP_KERNEL)) == NULL)
7971 			return -ENOMEM;
7972 		return setflashmode((struct airo_info *)dev->ml_priv);
7973 
7974 	case AIROFLSHGCHR: /* Get char from aux */
7975 		if(comp->len != sizeof(int))
7976 			return -EINVAL;
7977 		if (copy_from_user(&z,comp->data,comp->len))
7978 			return -EFAULT;
7979 		return flashgchar((struct airo_info *)dev->ml_priv, z, 8000);
7980 
7981 	case AIROFLSHPCHR: /* Send char to card. */
7982 		if(comp->len != sizeof(int))
7983 			return -EINVAL;
7984 		if (copy_from_user(&z,comp->data,comp->len))
7985 			return -EFAULT;
7986 		return flashpchar((struct airo_info *)dev->ml_priv, z, 8000);
7987 
7988 	case AIROFLPUTBUF: /* Send 32k to card */
7989 		if (!AIRO_FLASH(dev))
7990 			return -ENOMEM;
7991 		if(comp->len > FLASHSIZE)
7992 			return -EINVAL;
7993 		if (copy_from_user(AIRO_FLASH(dev), comp->data, comp->len))
7994 			return -EFAULT;
7995 
7996 		flashputbuf((struct airo_info *)dev->ml_priv);
7997 		return 0;
7998 
7999 	case AIRORESTART:
8000 		if (flashrestart((struct airo_info *)dev->ml_priv, dev))
8001 			return -EIO;
8002 		return 0;
8003 	}
8004 	return -EINVAL;
8005 }
8006 
8007 #define FLASH_COMMAND  0x7e7e
8008 
8009 /*
8010  * STEP 1)
8011  * Disable MAC and do soft reset on
8012  * card.
8013  */
8014 
cmdreset(struct airo_info * ai)8015 static int cmdreset(struct airo_info *ai) {
8016 	disable_MAC(ai, 1);
8017 
8018 	if(!waitbusy (ai)){
8019 		airo_print_info(ai->dev->name, "Waitbusy hang before RESET");
8020 		return -EBUSY;
8021 	}
8022 
8023 	OUT4500(ai,COMMAND,CMD_SOFTRESET);
8024 
8025 	ssleep(1);			/* WAS 600 12/7/00 */
8026 
8027 	if(!waitbusy (ai)){
8028 		airo_print_info(ai->dev->name, "Waitbusy hang AFTER RESET");
8029 		return -EBUSY;
8030 	}
8031 	return 0;
8032 }
8033 
8034 /* STEP 2)
8035  * Put the card in legendary flash
8036  * mode
8037  */
8038 
setflashmode(struct airo_info * ai)8039 static int setflashmode (struct airo_info *ai) {
8040 	set_bit (FLAG_FLASHING, &ai->flags);
8041 
8042 	OUT4500(ai, SWS0, FLASH_COMMAND);
8043 	OUT4500(ai, SWS1, FLASH_COMMAND);
8044 	if (probe) {
8045 		OUT4500(ai, SWS0, FLASH_COMMAND);
8046 		OUT4500(ai, COMMAND,0x10);
8047 	} else {
8048 		OUT4500(ai, SWS2, FLASH_COMMAND);
8049 		OUT4500(ai, SWS3, FLASH_COMMAND);
8050 		OUT4500(ai, COMMAND,0);
8051 	}
8052 	msleep(500);		/* 500ms delay */
8053 
8054 	if(!waitbusy(ai)) {
8055 		clear_bit (FLAG_FLASHING, &ai->flags);
8056 		airo_print_info(ai->dev->name, "Waitbusy hang after setflash mode");
8057 		return -EIO;
8058 	}
8059 	return 0;
8060 }
8061 
8062 /* Put character to SWS0 wait for dwelltime
8063  * x 50us for  echo .
8064  */
8065 
flashpchar(struct airo_info * ai,int byte,int dwelltime)8066 static int flashpchar(struct airo_info *ai,int byte,int dwelltime) {
8067 	int echo;
8068 	int waittime;
8069 
8070 	byte |= 0x8000;
8071 
8072 	if(dwelltime == 0 )
8073 		dwelltime = 200;
8074 
8075 	waittime=dwelltime;
8076 
8077 	/* Wait for busy bit d15 to go false indicating buffer empty */
8078 	while ((IN4500 (ai, SWS0) & 0x8000) && waittime > 0) {
8079 		udelay (50);
8080 		waittime -= 50;
8081 	}
8082 
8083 	/* timeout for busy clear wait */
8084 	if(waittime <= 0 ){
8085 		airo_print_info(ai->dev->name, "flash putchar busywait timeout!");
8086 		return -EBUSY;
8087 	}
8088 
8089 	/* Port is clear now write byte and wait for it to echo back */
8090 	do {
8091 		OUT4500(ai,SWS0,byte);
8092 		udelay(50);
8093 		dwelltime -= 50;
8094 		echo = IN4500(ai,SWS1);
8095 	} while (dwelltime >= 0 && echo != byte);
8096 
8097 	OUT4500(ai,SWS1,0);
8098 
8099 	return (echo == byte) ? 0 : -EIO;
8100 }
8101 
8102 /*
8103  * Get a character from the card matching matchbyte
8104  * Step 3)
8105  */
flashgchar(struct airo_info * ai,int matchbyte,int dwelltime)8106 static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime){
8107 	int           rchar;
8108 	unsigned char rbyte=0;
8109 
8110 	do {
8111 		rchar = IN4500(ai,SWS1);
8112 
8113 		if(dwelltime && !(0x8000 & rchar)){
8114 			dwelltime -= 10;
8115 			mdelay(10);
8116 			continue;
8117 		}
8118 		rbyte = 0xff & rchar;
8119 
8120 		if( (rbyte == matchbyte) && (0x8000 & rchar) ){
8121 			OUT4500(ai,SWS1,0);
8122 			return 0;
8123 		}
8124 		if( rbyte == 0x81 || rbyte == 0x82 || rbyte == 0x83 || rbyte == 0x1a || 0xffff == rchar)
8125 			break;
8126 		OUT4500(ai,SWS1,0);
8127 
8128 	}while(dwelltime > 0);
8129 	return -EIO;
8130 }
8131 
8132 /*
8133  * Transfer 32k of firmware data from user buffer to our buffer and
8134  * send to the card
8135  */
8136 
flashputbuf(struct airo_info * ai)8137 static int flashputbuf(struct airo_info *ai){
8138 	int            nwords;
8139 
8140 	/* Write stuff */
8141 	if (test_bit(FLAG_MPI,&ai->flags))
8142 		memcpy_toio(ai->pciaux + 0x8000, ai->flash, FLASHSIZE);
8143 	else {
8144 		OUT4500(ai,AUXPAGE,0x100);
8145 		OUT4500(ai,AUXOFF,0);
8146 
8147 		for(nwords=0;nwords != FLASHSIZE / 2;nwords++){
8148 			OUT4500(ai,AUXDATA,ai->flash[nwords] & 0xffff);
8149 		}
8150 	}
8151 	OUT4500(ai,SWS0,0x8000);
8152 
8153 	return 0;
8154 }
8155 
8156 /*
8157  *
8158  */
flashrestart(struct airo_info * ai,struct net_device * dev)8159 static int flashrestart(struct airo_info *ai,struct net_device *dev){
8160 	int    i,status;
8161 
8162 	ssleep(1);			/* Added 12/7/00 */
8163 	clear_bit (FLAG_FLASHING, &ai->flags);
8164 	if (test_bit(FLAG_MPI, &ai->flags)) {
8165 		status = mpi_init_descriptors(ai);
8166 		if (status != SUCCESS)
8167 			return status;
8168 	}
8169 	status = setup_card(ai, dev->dev_addr, 1);
8170 
8171 	if (!test_bit(FLAG_MPI,&ai->flags))
8172 		for( i = 0; i < MAX_FIDS; i++ ) {
8173 			ai->fids[i] = transmit_allocate
8174 				( ai, AIRO_DEF_MTU, i >= MAX_FIDS / 2 );
8175 		}
8176 
8177 	ssleep(1);			/* Added 12/7/00 */
8178 	return status;
8179 }
8180 #endif /* CISCO_EXT */
8181 
8182 /*
8183     This program is free software; you can redistribute it and/or
8184     modify it under the terms of the GNU General Public License
8185     as published by the Free Software Foundation; either version 2
8186     of the License, or (at your option) any later version.
8187 
8188     This program is distributed in the hope that it will be useful,
8189     but WITHOUT ANY WARRANTY; without even the implied warranty of
8190     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8191     GNU General Public License for more details.
8192 
8193     In addition:
8194 
8195     Redistribution and use in source and binary forms, with or without
8196     modification, are permitted provided that the following conditions
8197     are met:
8198 
8199     1. Redistributions of source code must retain the above copyright
8200        notice, this list of conditions and the following disclaimer.
8201     2. Redistributions in binary form must reproduce the above copyright
8202        notice, this list of conditions and the following disclaimer in the
8203        documentation and/or other materials provided with the distribution.
8204     3. The name of the author may not be used to endorse or promote
8205        products derived from this software without specific prior written
8206        permission.
8207 
8208     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
8209     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
8210     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
8211     ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
8212     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
8213     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
8214     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
8215     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
8216     STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
8217     IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
8218     POSSIBILITY OF SUCH DAMAGE.
8219 */
8220 
8221 module_init(airo_init_module);
8222 module_exit(airo_cleanup_module);
8223