1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <linux/err.h>
23#include <linux/init.h>
24
25#include <linux/kernel.h>
26#include <linux/module.h>
27#include <linux/proc_fs.h>
28
29#include <linux/sched.h>
30#include <linux/ptrace.h>
31#include <linux/slab.h>
32#include <linux/string.h>
33#include <linux/timer.h>
34#include <linux/interrupt.h>
35#include <linux/in.h>
36#include <linux/bitops.h>
37#include <linux/scatterlist.h>
38#include <linux/crypto.h>
39#include <asm/io.h>
40#include <asm/system.h>
41#include <asm/unaligned.h>
42
43#include <linux/netdevice.h>
44#include <linux/etherdevice.h>
45#include <linux/skbuff.h>
46#include <linux/if_arp.h>
47#include <linux/ioport.h>
48#include <linux/pci.h>
49#include <asm/uaccess.h>
50#include <linux/kthread.h>
51#include <linux/freezer.h>
52
53#include <linux/ieee80211.h>
54
55#include "airo.h"
56
57#define DRV_NAME "airo"
58
59#ifdef CONFIG_PCI
60static struct pci_device_id 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};
70MODULE_DEVICE_TABLE(pci, card_ids);
71
72static int airo_pci_probe(struct pci_dev *, const struct pci_device_id *);
73static void airo_pci_remove(struct pci_dev *);
74static int airo_pci_suspend(struct pci_dev *pdev, pm_message_t state);
75static int airo_pci_resume(struct pci_dev *pdev);
76
77static struct pci_driver airo_driver = {
78 .name = DRV_NAME,
79 .id_table = card_ids,
80 .probe = airo_pci_probe,
81 .remove = __devexit_p(airo_pci_remove),
82 .suspend = airo_pci_suspend,
83 .resume = airo_pci_resume,
84};
85#endif
86
87
88#include <linux/wireless.h>
89#define WIRELESS_SPY
90#include <net/iw_handler.h>
91
92#define CISCO_EXT
93#ifdef CISCO_EXT
94#include <linux/delay.h>
95#endif
96
97
98#define POWER_ON_DOWN
99
100
101
102
103
104
105
106#define IGNLABEL(comment) NULL
107static char *statsLabels[] = {
108 "RxOverrun",
109 IGNLABEL("RxPlcpCrcErr"),
110 IGNLABEL("RxPlcpFormatErr"),
111 IGNLABEL("RxPlcpLengthErr"),
112 "RxMacCrcErr",
113 "RxMacCrcOk",
114 "RxWepErr",
115 "RxWepOk",
116 "RetryLong",
117 "RetryShort",
118 "MaxRetries",
119 "NoAck",
120 "NoCts",
121 "RxAck",
122 "RxCts",
123 "TxAck",
124 "TxRts",
125 "TxCts",
126 "TxMc",
127 "TxBc",
128 "TxUcFrags",
129 "TxUcPackets",
130 "TxBeacon",
131 "RxBeacon",
132 "TxSinColl",
133 "TxMulColl",
134 "DefersNo",
135 "DefersProt",
136 "DefersEngy",
137 "DupFram",
138 "RxFragDisc",
139 "TxAged",
140 "RxAged",
141 "LostSync-MaxRetry",
142 "LostSync-MissedBeacons",
143 "LostSync-ArlExceeded",
144 "LostSync-Deauth",
145 "LostSync-Disassoced",
146 "LostSync-TsfTiming",
147 "HostTxMc",
148 "HostTxBc",
149 "HostTxUc",
150 "HostTxFail",
151 "HostRxMc",
152 "HostRxBc",
153 "HostRxUc",
154 "HostRxDiscard",
155 IGNLABEL("HmacTxMc"),
156 IGNLABEL("HmacTxBc"),
157 IGNLABEL("HmacTxUc"),
158 IGNLABEL("HmacTxFail"),
159 IGNLABEL("HmacRxMc"),
160 IGNLABEL("HmacRxBc"),
161 IGNLABEL("HmacRxUc"),
162 IGNLABEL("HmacRxDiscard"),
163 IGNLABEL("HmacRxAccepted"),
164 "SsidMismatch",
165 "ApMismatch",
166 "RatesMismatch",
167 "AuthReject",
168 "AuthTimeout",
169 "AssocReject",
170 "AssocTimeout",
171 IGNLABEL("ReasonOutsideTable"),
172 IGNLABEL("ReasonStatus1"),
173 IGNLABEL("ReasonStatus2"),
174 IGNLABEL("ReasonStatus3"),
175 IGNLABEL("ReasonStatus4"),
176 IGNLABEL("ReasonStatus5"),
177 IGNLABEL("ReasonStatus6"),
178 IGNLABEL("ReasonStatus7"),
179 IGNLABEL("ReasonStatus8"),
180 IGNLABEL("ReasonStatus9"),
181 IGNLABEL("ReasonStatus10"),
182 IGNLABEL("ReasonStatus11"),
183 IGNLABEL("ReasonStatus12"),
184 IGNLABEL("ReasonStatus13"),
185 IGNLABEL("ReasonStatus14"),
186 IGNLABEL("ReasonStatus15"),
187 IGNLABEL("ReasonStatus16"),
188 IGNLABEL("ReasonStatus17"),
189 IGNLABEL("ReasonStatus18"),
190 IGNLABEL("ReasonStatus19"),
191 "RxMan",
192 "TxMan",
193 "RxRefresh",
194 "TxRefresh",
195 "RxPoll",
196 "TxPoll",
197 "HostRetries",
198 "LostSync-HostReq",
199 "HostTxBytes",
200 "HostRxBytes",
201 "ElapsedUsec",
202 "ElapsedSec",
203 "LostSyncBetterAP",
204 "PrivacyMismatch",
205 "Jammed",
206 "DiscRxNotWepped",
207 "PhyEleMismatch",
208 (char*)-1 };
209#ifndef RUN_AT
210#define RUN_AT(x) (jiffies+(x))
211#endif
212
213
214
215
216
217
218static int rates[8];
219static int basic_rate;
220static char *ssids[3];
221
222static int io[4];
223static int irq[4];
224
225static
226int maxencrypt ;
227
228
229static int auto_wep ;
230static int aux_bap ;
231
232static int adhoc;
233
234static int probe = 1;
235
236static int proc_uid ;
237
238static int proc_gid ;
239
240static int airo_perm = 0555;
241
242static int proc_perm = 0644;
243
244MODULE_AUTHOR("Benjamin Reed");
245MODULE_DESCRIPTION("Support for Cisco/Aironet 802.11 wireless ethernet \
246cards. Direct support for ISA/PCI/MPI cards and support \
247for PCMCIA when used with airo_cs.");
248MODULE_LICENSE("Dual BSD/GPL");
249MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340/350");
250module_param_array(io, int, NULL, 0);
251module_param_array(irq, int, NULL, 0);
252module_param(basic_rate, int, 0);
253module_param_array(rates, int, NULL, 0);
254module_param_array(ssids, charp, NULL, 0);
255module_param(auto_wep, int, 0);
256MODULE_PARM_DESC(auto_wep, "If non-zero, the driver will keep looping through \
257the authentication options until an association is made. The value of \
258auto_wep is number of the wep keys to check. A value of 2 will try using \
259the key at index 0 and index 1.");
260module_param(aux_bap, int, 0);
261MODULE_PARM_DESC(aux_bap, "If non-zero, the driver will switch into a mode \
262than seems to work better for older cards with some older buses. Before \
263switching it checks that the switch is needed.");
264module_param(maxencrypt, int, 0);
265MODULE_PARM_DESC(maxencrypt, "The maximum speed that the card can do \
266encryption. Units are in 512kbs. Zero (default) means there is no limit. \
267Older cards used to be limited to 2mbs (4).");
268module_param(adhoc, int, 0);
269MODULE_PARM_DESC(adhoc, "If non-zero, the card will start in adhoc mode.");
270module_param(probe, int, 0);
271MODULE_PARM_DESC(probe, "If zero, the driver won't start the card.");
272
273module_param(proc_uid, int, 0);
274MODULE_PARM_DESC(proc_uid, "The uid that the /proc files will belong to.");
275module_param(proc_gid, int, 0);
276MODULE_PARM_DESC(proc_gid, "The gid that the /proc files will belong to.");
277module_param(airo_perm, int, 0);
278MODULE_PARM_DESC(airo_perm, "The permission bits of /proc/[driver/]aironet.");
279module_param(proc_perm, int, 0);
280MODULE_PARM_DESC(proc_perm, "The permission bits of the files in /proc");
281
282
283
284
285static int do8bitIO ;
286
287
288#define SUCCESS 0
289#define ERROR -1
290#define NO_PACKET -2
291
292
293#define NOP2 0x0000
294#define MAC_ENABLE 0x0001
295#define MAC_DISABLE 0x0002
296#define CMD_LOSE_SYNC 0x0003
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
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
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
394#define AUX_OFFSET 0x800
395
396#define PKTSIZE 1840
397#define RIDSIZE 2048
398
399#define MAXTXQ 64
400
401
402#define BAP0 0
403#define BAP1 2
404
405
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
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
436#define RID_RW 0x20
437
438
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
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
479typedef struct {
480 u16 cmd;
481 u16 parm0;
482 u16 parm1;
483 u16 parm2;
484} Cmd;
485
486typedef struct {
487 u16 status;
488 u16 rsp0;
489 u16 rsp1;
490 u16 rsp2;
491} Resp;
492
493
494
495
496
497
498
499
500
501typedef struct WepKeyRid WepKeyRid;
502struct WepKeyRid {
503 __le16 len;
504 __le16 kindex;
505 u8 mac[ETH_ALEN];
506 __le16 klen;
507 u8 key[16];
508} __attribute__ ((packed));
509
510
511typedef struct Ssid Ssid;
512struct Ssid {
513 __le16 len;
514 u8 ssid[32];
515} __attribute__ ((packed));
516
517typedef struct SsidRid SsidRid;
518struct SsidRid {
519 __le16 len;
520 Ssid ssids[3];
521} __attribute__ ((packed));
522
523typedef struct ModulationRid ModulationRid;
524struct 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} __attribute__ ((packed));
531
532typedef struct ConfigRid ConfigRid;
533struct ConfigRid {
534 __le16 len;
535 __le16 opmode;
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)
542#define MODE_LLC_HOST cpu_to_le16(1<<8)
543#define MODE_AIRONET_EXTEND cpu_to_le16(1<<9)
544#define MODE_AP_INTERFACE cpu_to_le16(1<<10)
545#define MODE_ANTENNA_ALIGN cpu_to_le16(1<<11)
546#define MODE_ETHER_LLC cpu_to_le16(1<<12)
547#define MODE_LEAF_NODE cpu_to_le16(1<<13)
548#define MODE_CF_POLLABLE cpu_to_le16(1<<14)
549#define MODE_MIC cpu_to_le16(1<<15)
550 __le16 rmode;
551#define RXMODE_BC_MC_ADDR cpu_to_le16(0)
552#define RXMODE_BC_ADDR cpu_to_le16(1)
553#define RXMODE_ADDR cpu_to_le16(2)
554#define RXMODE_RFMON cpu_to_le16(3)
555#define RXMODE_RFMON_ANYBSS cpu_to_le16(4)
556#define RXMODE_LANMON cpu_to_le16(5)
557#define RXMODE_MASK cpu_to_le16(255)
558#define RXMODE_DISABLE_802_3_HEADER cpu_to_le16(1<<8)
559#define RXMODE_FULL_MASK (RXMODE_MASK | RXMODE_DISABLE_802_3_HEADER)
560#define RXMODE_NORMALIZED_RSSI cpu_to_le16(1<<9)
561 __le16 fragThresh;
562 __le16 rtsThres;
563 u8 macAddr[ETH_ALEN];
564 u8 rates[8];
565 __le16 shortRetryLimit;
566 __le16 longRetryLimit;
567 __le16 txLifetime;
568 __le16 rxLifetime;
569 __le16 stationary;
570 __le16 ordering;
571 __le16 u16deviceType;
572 __le16 cfpRate;
573 __le16 cfpDuration;
574 __le16 _reserved1[3];
575
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;
581 __le16 probeEnergyTimeout;
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
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
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
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
639 u8 nodeName[16];
640 __le16 arlThreshold;
641 __le16 arlDecay;
642 __le16 arlDelay;
643 __le16 _reserved4[1];
644
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} __attribute__ ((packed));
655
656typedef struct StatusRid StatusRid;
657struct 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;
684 u8 noisedBm;
685 u8 noiseAvePercent;
686 u8 noiseAvedBm;
687 u8 noiseMaxPercent;
688 u8 noiseMaxdBm;
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} __attribute__ ((packed));
714
715typedef struct StatsRid StatsRid;
716struct StatsRid {
717 __le16 len;
718 __le16 spacer;
719 __le32 vals[100];
720} __attribute__ ((packed));
721
722typedef struct APListRid APListRid;
723struct APListRid {
724 __le16 len;
725 u8 ap[4][ETH_ALEN];
726} __attribute__ ((packed));
727
728typedef struct CapabilityRid CapabilityRid;
729struct 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} __attribute__ ((packed));
757
758
759typedef struct BSSListRidExtra BSSListRidExtra;
760struct BSSListRidExtra {
761 __le16 unknown[4];
762 u8 fixed[12];
763 u8 iep[624];
764} __attribute__ ((packed));
765
766typedef struct BSSListRid BSSListRid;
767struct BSSListRid {
768 __le16 len;
769 __le16 index;
770#define RADIO_FH 1
771#define RADIO_DS 2
772#define RADIO_TMA 4
773 __le16 radioType;
774 u8 bssid[ETH_ALEN];
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];
786 struct {
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
797 BSSListRidExtra extra;
798} __attribute__ ((packed));
799
800typedef struct {
801 BSSListRid bss;
802 struct list_head list;
803} BSSListElement;
804
805typedef struct tdsRssiEntry tdsRssiEntry;
806struct tdsRssiEntry {
807 u8 rssipct;
808 u8 rssidBm;
809} __attribute__ ((packed));
810
811typedef struct tdsRssiRid tdsRssiRid;
812struct tdsRssiRid {
813 u16 len;
814 tdsRssiEntry x[256];
815} __attribute__ ((packed));
816
817typedef struct MICRid MICRid;
818struct MICRid {
819 __le16 len;
820 __le16 state;
821 __le16 multicastValid;
822 u8 multicast[16];
823 __le16 unicastValid;
824 u8 unicast[16];
825} __attribute__ ((packed));
826
827typedef struct MICBuffer MICBuffer;
828struct 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} __attribute__ ((packed));
844
845typedef struct {
846 u8 da[ETH_ALEN];
847 u8 sa[ETH_ALEN];
848} etherHead;
849
850#define TXCTL_TXOK (1<<1)
851#define TXCTL_TXEX (1<<2)
852#define TXCTL_802_3 (0<<3)
853#define TXCTL_802_11 (1<<3)
854#define TXCTL_ETHERNET (0<<4)
855#define TXCTL_LLC (1<<4)
856#define TXCTL_RELEASE (0<<5)
857#define TXCTL_NORELEASE (1<<5)
858
859#define BUSY_FID 0x10000
860
861#ifdef CISCO_EXT
862#define AIROMAGIC 0xa55a
863
864#ifdef SIOCIWFIRSTPRIV
865#ifdef SIOCDEVPRIVATE
866#define AIROOLDIOCTL SIOCDEVPRIVATE
867#define AIROOLDIDIFC AIROOLDIOCTL + 1
868#endif
869#else
870#define SIOCIWFIRSTPRIV SIOCDEVPRIVATE
871#endif
872
873
874
875
876#define AIROIOCTL SIOCIWFIRSTPRIV
877#define AIROIDIFC AIROIOCTL + 1
878
879
880
881#define AIROGCAP 0
882#define AIROGCFG 1
883#define AIROGSLIST 2
884#define AIROGVLIST 3
885#define AIROGDRVNAM 4
886#define AIROGEHTENC 5
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
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
908#define AIROPMACOFF AIROPMACON + 1
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
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
927typedef struct aironet_ioctl {
928 unsigned short command;
929 unsigned short len;
930 unsigned short ridnum;
931 unsigned char __user *data;
932} aironet_ioctl;
933
934static char swversion[] = "2.1";
935#endif
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
942typedef struct {
943 u32 size;
944 u8 enabled;
945 u32 rxSuccess;
946 u32 rxIncorrectMIC;
947 u32 rxNotMICed;
948 u32 rxMICPlummed;
949 u32 rxWrongSequence;
950 u32 reserve[32];
951} mic_statistics;
952
953typedef struct {
954 u32 coeff[((EMMH32_MSGLEN_MAX)+3)>>2];
955 u64 accum;
956 int position;
957 union {
958 u8 d8[4];
959 __be32 d32;
960 } part;
961} emmh32_context;
962
963typedef struct {
964 emmh32_context seed;
965 u32 rx;
966 u32 tx;
967 u32 window;
968 u8 valid;
969 u8 key[16];
970} miccntx;
971
972typedef struct {
973 miccntx mCtx;
974 miccntx uCtx;
975} mic_module;
976
977typedef 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
984typedef 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
992struct rx_hdr {
993 __le16 status, len;
994 u8 rssi[2];
995 u8 rate;
996 u8 freq;
997 __le16 tmp[4];
998} __attribute__ ((packed));
999
1000typedef 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
1010
1011typedef struct {
1012 unsigned char __iomem *card_ram_off;
1013
1014 RxFid rx_desc;
1015 char *virtual_host_addr;
1016
1017 int pending;
1018} HostRxDesc;
1019
1020
1021
1022
1023typedef struct {
1024 unsigned char __iomem *card_ram_off;
1025
1026 TxFid tx_desc;
1027 char *virtual_host_addr;
1028
1029 int pending;
1030} HostTxDesc;
1031
1032
1033
1034
1035typedef struct {
1036 unsigned char __iomem *card_ram_off;
1037
1038 Rid rid_desc;
1039 char *virtual_host_addr;
1040
1041} HostRidDesc;
1042
1043typedef 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)
1050#define HOST_INT_TXERR (1 << 2)
1051#define HOST_LCC_PAYLOAD (1 << 4)
1052#define HOST_DONT_RLSE (1 << 5)
1053#define HOST_DONT_RETRY (1 << 6)
1054#define HOST_CLR_AID (1 << 7)
1055#define HOST_RTS (1 << 9)
1056#define HOST_SHORT (1 << 10)
1057 u16 ctl;
1058 u16 aid;
1059 u16 retries;
1060 u16 fill;
1061} TxCtlHdr;
1062
1063typedef 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
1074typedef struct {
1075 TxCtlHdr ctlhdr;
1076 u16 fill1;
1077 u16 fill2;
1078 WifiHdr wifihdr;
1079 u16 gaplen;
1080 u16 status;
1081} WifiCtlHdr;
1082
1083static WifiCtlHdr wifictlhdr8023 = {
1084 .ctlhdr = {
1085 .ctl = HOST_DONT_RLSE,
1086 }
1087};
1088
1089
1090#define MAX_KEY_SIZE 13
1091#define MIN_KEY_SIZE 5
1092typedef struct wep_key_t {
1093 u16 len;
1094 u8 key[16];
1095} wep_key_t;
1096
1097
1098static const struct iw_handler_def airo_handler_def;
1099
1100static const char version[] = "airo.c 0.6 (Ben Reed & Javier Achirica)";
1101
1102struct airo_info;
1103
1104static int get_dec_u16( char *buffer, int *start, int limit );
1105static void OUT4500( struct airo_info *, u16 register, u16 value );
1106static unsigned short IN4500( struct airo_info *, u16 register );
1107static u16 setup_card(struct airo_info*, u8 *mac, int lock);
1108static int enable_MAC(struct airo_info *ai, int lock);
1109static void disable_MAC(struct airo_info *ai, int lock);
1110static void enable_interrupts(struct airo_info*);
1111static void disable_interrupts(struct airo_info*);
1112static u16 issuecommand(struct airo_info*, Cmd *pCmd, Resp *pRsp);
1113static int bap_setup(struct airo_info*, u16 rid, u16 offset, int whichbap);
1114static int aux_bap_read(struct airo_info*, __le16 *pu16Dst, int bytelen,
1115 int whichbap);
1116static int fast_bap_read(struct airo_info*, __le16 *pu16Dst, int bytelen,
1117 int whichbap);
1118static int bap_write(struct airo_info*, const __le16 *pu16Src, int bytelen,
1119 int whichbap);
1120static int PC4500_accessrid(struct airo_info*, u16 rid, u16 accmd);
1121static int PC4500_readrid(struct airo_info*, u16 rid, void *pBuf, int len, int lock);
1122static int PC4500_writerid(struct airo_info*, u16 rid, const void
1123 *pBuf, int len, int lock);
1124static int do_writerid( struct airo_info*, u16 rid, const void *rid_data,
1125 int len, int dummy );
1126static u16 transmit_allocate(struct airo_info*, int lenPayload, int raw);
1127static int transmit_802_3_packet(struct airo_info*, int len, char *pPacket);
1128static int transmit_802_11_packet(struct airo_info*, int len, char *pPacket);
1129
1130static int mpi_send_packet (struct net_device *dev);
1131static void mpi_unmap_card(struct pci_dev *pci);
1132static void mpi_receive_802_3(struct airo_info *ai);
1133static void mpi_receive_802_11(struct airo_info *ai);
1134static int waitbusy (struct airo_info *ai);
1135
1136static irqreturn_t airo_interrupt( int irq, void* dev_id);
1137static int airo_thread(void *data);
1138static void timer_func( struct net_device *dev );
1139static int airo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
1140static struct iw_statistics *airo_get_wireless_stats (struct net_device *dev);
1141static void airo_read_wireless_stats (struct airo_info *local);
1142#ifdef CISCO_EXT
1143static int readrids(struct net_device *dev, aironet_ioctl *comp);
1144static int writerids(struct net_device *dev, aironet_ioctl *comp);
1145static int flashcard(struct net_device *dev, aironet_ioctl *comp);
1146#endif
1147static void micinit(struct airo_info *ai);
1148static int micsetup(struct airo_info *ai);
1149static int encapsulate(struct airo_info *ai, etherHead *pPacket, MICBuffer *buffer, int len);
1150static int decapsulate(struct airo_info *ai, MICBuffer *mic, etherHead *pPacket, u16 payLen);
1151
1152static u8 airo_rssi_to_dbm (tdsRssiEntry *rssi_rid, u8 rssi);
1153static u8 airo_dbm_to_pct (tdsRssiEntry *rssi_rid, u8 dbm);
1154
1155static void airo_networks_free(struct airo_info *ai);
1156
1157struct airo_info {
1158 struct net_device *dev;
1159 struct list_head dev_list;
1160
1161
1162#define MAX_FIDS 6
1163#define MPI_MAX_FIDS 1
1164 u32 fids[MAX_FIDS];
1165 ConfigRid config;
1166 char keyindex;
1167 char defindex;
1168 struct proc_dir_entry *proc_entry;
1169 spinlock_t aux_lock;
1170#define FLAG_RADIO_OFF 0
1171#define FLAG_RADIO_DOWN 1
1172#define FLAG_RADIO_MASK 0x03
1173#define FLAG_ENABLED 2
1174#define FLAG_ADHOC 3
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
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;
1215 unsigned long scan_timeout;
1216 struct iw_spy_data spy_data;
1217 struct iw_public_data wireless_data;
1218
1219 struct crypto_cipher *tfm;
1220 mic_module mod[2];
1221 mic_statistics micstats;
1222 HostRxDesc rxfids[MPI_MAX_FIDS];
1223 HostTxDesc txfids[MPI_MAX_FIDS];
1224 HostRidDesc config_desc;
1225 unsigned long ridbus;
1226 struct sk_buff_head txq;
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
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
1251static 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
1257static int setup_proc_entry( struct net_device *dev,
1258 struct airo_info *apriv );
1259static int takedown_proc_entry( struct net_device *dev,
1260 struct airo_info *apriv );
1261
1262static int cmdreset(struct airo_info *ai);
1263static int setflashmode (struct airo_info *ai);
1264static int flashgchar(struct airo_info *ai,int matchbyte,int dwelltime);
1265static int flashputbuf(struct airo_info *ai);
1266static 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
1287
1288
1289
1290static int RxSeqValid (struct airo_info *ai,miccntx *context,int mcast,u32 micSeq);
1291static void MoveWindow(miccntx *context, u32 micSeq);
1292static void emmh32_setseed(emmh32_context *context, u8 *pkey, int keylen,
1293 struct crypto_cipher *tfm);
1294static void emmh32_init(emmh32_context *context);
1295static void emmh32_update(emmh32_context *context, u8 *pOctets, int len);
1296static void emmh32_final(emmh32_context *context, u8 digest[4]);
1297static int flashpchar(struct airo_info *ai,int byte,int dwelltime);
1298
1299static void age_mic_context(miccntx *cur, miccntx *old, u8 *key, int key_len,
1300 struct crypto_cipher *tfm)
1301{
1302
1303
1304
1305 if (cur->valid && (memcmp(cur->key, key, key_len) == 0))
1306 return;
1307
1308
1309 memcpy(old, cur, sizeof(*cur));
1310
1311
1312 memcpy(cur->key, key, key_len);
1313 cur->window = 33;
1314 cur->rx = 0;
1315 cur->tx = 0;
1316 cur->valid = 1;
1317
1318
1319 emmh32_setseed(&cur->seed, key, key_len, tfm);
1320}
1321
1322
1323
1324static 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
1335
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
1356
1357static 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
1376static char micsnap[] = {0xAA,0xAA,0x03,0x00,0x40,0x96,0x00,0x02};
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394static int encapsulate(struct airo_info *ai ,etherHead *frame, MICBuffer *mic, int payLen)
1395{
1396 miccntx *context;
1397
1398
1399
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);
1410
1411 memcpy(&mic->u.snap, micsnap, sizeof(micsnap));
1412
1413
1414 mic->seq = htonl(context->tx);
1415 context->tx += 2;
1416
1417 emmh32_init(&context->seed);
1418 emmh32_update(&context->seed,frame->da,ETH_ALEN * 2);
1419 emmh32_update(&context->seed,(u8*)&mic->typelen,10);
1420 emmh32_update(&context->seed,(u8*)&mic->seq,sizeof(mic->seq));
1421 emmh32_update(&context->seed,frame->da + ETH_ALEN * 2,payLen);
1422 emmh32_final(&context->seed, (u8*)&mic->mic);
1423
1424
1425 mic->typelen = 0;
1426 return SUCCESS;
1427}
1428
1429typedef enum {
1430 NONE,
1431 NOMIC,
1432 NOMICPLUMMED,
1433 SEQUENCE,
1434 INCORRECTMIC,
1435} mic_error;
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450static 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
1459
1460 if (!ai->micstats.enabled) {
1461
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
1474 ai->micstats.rxMICPlummed++;
1475 return ERROR;
1476 }
1477
1478 micSEQ = ntohl(mic->seq);
1479
1480
1481
1482
1483
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
1492 context = mcast ? &ai->mod[i].mCtx : &ai->mod[i].uCtx;
1493
1494
1495 if (!context->valid) {
1496 if (i == 0)
1497 micError = NOMICPLUMMED;
1498 continue;
1499 }
1500
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, eth->da + ETH_ALEN*2,payLen);
1510
1511 emmh32_final(&context->seed, digest);
1512
1513 if (memcmp(digest, &mic->mic, 4)) {
1514
1515 if (i == 0)
1516 micError = INCORRECTMIC;
1517 continue;
1518 }
1519
1520
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
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
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554static int RxSeqValid (struct airo_info *ai,miccntx *context,int mcast,u32 micSeq)
1555{
1556 u32 seq,index;
1557
1558
1559
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;
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;
1570 context->rx = 0;
1571 }
1572
1573
1574 seq = micSeq - (context->window - 33);
1575
1576
1577 if ((s32)seq < 0)
1578 return ERROR;
1579
1580 if ( seq > 64 ) {
1581
1582 MoveWindow(context,micSeq);
1583 return SUCCESS;
1584 }
1585
1586
1587 seq >>= 1;
1588 index = 1 << seq;
1589
1590 if (!(context->rx & index)) {
1591
1592
1593 context->rx |= index;
1594
1595 MoveWindow(context,micSeq);
1596
1597 return SUCCESS;
1598 }
1599 return ERROR;
1600}
1601
1602static void MoveWindow(miccntx *context, u32 micSeq)
1603{
1604 u32 shift;
1605
1606
1607 if (micSeq > context->window) {
1608 shift = (micSeq - context->window) >> 1;
1609
1610
1611 if (shift < 32)
1612 context->rx >>= shift;
1613 else
1614 context->rx = 0;
1615
1616 context->window = micSeq;
1617 }
1618}
1619
1620
1621
1622
1623
1624
1625#define MIC_ACCUM(val) \
1626 context->accum += (u64)(val) * context->coeff[coeff_position++];
1627
1628static unsigned char aes_counter[16];
1629
1630
1631static void emmh32_setseed(emmh32_context *context, u8 *pkey, int keylen,
1632 struct crypto_cipher *tfm)
1633{
1634
1635
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
1660static void emmh32_init(emmh32_context *context)
1661{
1662
1663 context->accum = 0;
1664 context->position = 0;
1665}
1666
1667
1668static 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
1677 byte_position = context->position & 3;
1678 if (byte_position) {
1679
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
1690 while (len >= 4) {
1691 MIC_ACCUM(ntohl(*(__be32 *)pOctets));
1692 context->position += 4;
1693 pOctets += 4;
1694 len -= 4;
1695 }
1696
1697
1698 byte_position = 0;
1699 while (len > 0) {
1700 context->part.d8[byte_position++] = *pOctets++;
1701 context->position++;
1702 len--;
1703 }
1704}
1705
1706
1707static u32 mask32[4] = { 0x00000000L, 0xFF000000L, 0xFFFF0000L, 0xFFFFFF00L };
1708
1709
1710static 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
1721 byte_position = context->position & 3;
1722 if (byte_position) {
1723
1724 val = ntohl(context->part.d32);
1725 MIC_ACCUM(val & mask32[byte_position]);
1726 }
1727
1728
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
1743static 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
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
1766static 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
1772static 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
1786static int readSsidRid(struct airo_info*ai, SsidRid *ssidr)
1787{
1788 return PC4500_readrid(ai, RID_SSID, ssidr, sizeof(*ssidr), 1);
1789}
1790
1791static int writeSsidRid(struct airo_info*ai, SsidRid *pssidr, int lock)
1792{
1793 return PC4500_writerid(ai, RID_SSID, pssidr, sizeof(*pssidr), lock);
1794}
1795
1796static 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
1812static inline void checkThrottle(struct airo_info *ai)
1813{
1814 int i;
1815
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
1825static 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
1845static int readStatusRid(struct airo_info *ai, StatusRid *statr, int lock)
1846{
1847 return PC4500_readrid(ai, RID_STATUS, statr, sizeof(*statr), lock);
1848}
1849
1850static int readAPListRid(struct airo_info *ai, APListRid *aplr)
1851{
1852 return PC4500_readrid(ai, RID_APLIST, aplr, sizeof(*aplr), 1);
1853}
1854
1855static int writeAPListRid(struct airo_info *ai, APListRid *aplr, int lock)
1856{
1857 return PC4500_writerid(ai, RID_APLIST, aplr, sizeof(*aplr), lock);
1858}
1859
1860static int readCapabilityRid(struct airo_info *ai, CapabilityRid *capr, int lock)
1861{
1862 return PC4500_readrid(ai, RID_CAPABILITIES, capr, sizeof(*capr), lock);
1863}
1864
1865static 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
1870static void try_auto_wep(struct airo_info *ai)
1871{
1872 if (auto_wep && !(ai->flags & FLAG_RADIO_DOWN)) {
1873 ai->expires = RUN_AT(3*HZ);
1874 wake_up_interruptible(&ai->thr_wait);
1875 }
1876}
1877
1878static 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
1886
1887
1888
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
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
1923static int mpi_start_xmit(struct sk_buff *skb, struct net_device *dev) {
1924 int npacks, pending;
1925 unsigned long flags;
1926 struct airo_info *ai = dev->ml_priv;
1927
1928 if (!skb) {
1929 airo_print_err(dev->name, "%s: skb == NULL!",__func__);
1930 return 0;
1931 }
1932 npacks = skb_queue_len (&ai->txq);
1933
1934 if (npacks >= MAXTXQ - 1) {
1935 netif_stop_queue (dev);
1936 if (npacks > MAXTXQ) {
1937 dev->stats.tx_fifo_errors++;
1938 return 1;
1939 }
1940 skb_queue_tail (&ai->txq, skb);
1941 return 0;
1942 }
1943
1944 spin_lock_irqsave(&ai->aux_lock, flags);
1945 skb_queue_tail (&ai->txq, skb);
1946 pending = test_bit(FLAG_PENDING_XMIT, &ai->flags);
1947 spin_unlock_irqrestore(&ai->aux_lock,flags);
1948 netif_wake_queue (dev);
1949
1950 if (pending == 0) {
1951 set_bit(FLAG_PENDING_XMIT, &ai->flags);
1952 mpi_send_packet (dev);
1953 }
1954 return 0;
1955}
1956
1957
1958
1959
1960
1961
1962
1963
1964static int mpi_send_packet (struct net_device *dev)
1965{
1966 struct sk_buff *skb;
1967 unsigned char *buffer;
1968 s16 len;
1969 __le16 *payloadLen;
1970 struct airo_info *ai = dev->ml_priv;
1971 u8 *sendbuf;
1972
1973
1974
1975 if ((skb = skb_dequeue(&ai->txq)) == NULL) {
1976 airo_print_err(dev->name,
1977 "%s: Dequeue'd zero in send_packet()",
1978 __func__);
1979 return 0;
1980 }
1981
1982
1983 len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
1984 buffer = skb->data;
1985
1986 ai->txfids[0].tx_desc.offset = 0;
1987 ai->txfids[0].tx_desc.valid = 1;
1988 ai->txfids[0].tx_desc.eoc = 1;
1989 ai->txfids[0].tx_desc.len =len+sizeof(WifiHdr);
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999 memcpy((char *)ai->txfids[0].virtual_host_addr,
2000 (char *)&wifictlhdr8023, sizeof(wifictlhdr8023));
2001
2002 payloadLen = (__le16 *)(ai->txfids[0].virtual_host_addr +
2003 sizeof(wifictlhdr8023));
2004 sendbuf = ai->txfids[0].virtual_host_addr +
2005 sizeof(wifictlhdr8023) + 2 ;
2006
2007
2008
2009
2010
2011 if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
2012 (ntohs(((__be16 *)buffer)[6]) != 0x888E)) {
2013 MICBuffer pMic;
2014
2015 if (encapsulate(ai, (etherHead *)buffer, &pMic, len - sizeof(etherHead)) != SUCCESS)
2016 return ERROR;
2017
2018 *payloadLen = cpu_to_le16(len-sizeof(etherHead)+sizeof(pMic));
2019 ai->txfids[0].tx_desc.len += sizeof(pMic);
2020
2021 memcpy (sendbuf, buffer, sizeof(etherHead));
2022 buffer += sizeof(etherHead);
2023 sendbuf += sizeof(etherHead);
2024 memcpy (sendbuf, &pMic, sizeof(pMic));
2025 sendbuf += sizeof(pMic);
2026 memcpy (sendbuf, buffer, len - sizeof(etherHead));
2027 } else {
2028 *payloadLen = cpu_to_le16(len - sizeof(etherHead));
2029
2030 dev->trans_start = jiffies;
2031
2032
2033 memcpy(sendbuf, buffer, len);
2034 }
2035
2036 memcpy_toio(ai->txfids[0].card_ram_off,
2037 &ai->txfids[0].tx_desc, sizeof(TxFid));
2038
2039 OUT4500(ai, EVACK, 8);
2040
2041 dev_kfree_skb_any(skb);
2042 return 1;
2043}
2044
2045static void get_tx_error(struct airo_info *ai, s32 fid)
2046{
2047 __le16 status;
2048
2049 if (fid < 0)
2050 status = ((WifiCtlHdr *)ai->txfids[0].virtual_host_addr)->ctlhdr.status;
2051 else {
2052 if (bap_setup(ai, ai->fids[fid] & 0xffff, 4, BAP0) != SUCCESS)
2053 return;
2054 bap_read(ai, &status, 2, BAP0);
2055 }
2056 if (le16_to_cpu(status) & 2)
2057 ai->dev->stats.tx_aborted_errors++;
2058 if (le16_to_cpu(status) & 4)
2059 ai->dev->stats.tx_heartbeat_errors++;
2060 if (le16_to_cpu(status) & 8)
2061 { }
2062 if (le16_to_cpu(status) & 0x10)
2063 ai->dev->stats.tx_carrier_errors++;
2064 if (le16_to_cpu(status) & 0x20)
2065 { }
2066
2067
2068
2069
2070 if ((le16_to_cpu(status) & 2) ||
2071 (le16_to_cpu(status) & 4)) {
2072 union iwreq_data wrqu;
2073 char junk[0x18];
2074
2075
2076
2077
2078 bap_read(ai, (__le16 *) junk, 0x18, BAP0);
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088 memcpy(wrqu.addr.sa_data, junk + 0x12, ETH_ALEN);
2089 wrqu.addr.sa_family = ARPHRD_ETHER;
2090
2091
2092 wireless_send_event(ai->dev, IWEVTXDROP, &wrqu, NULL);
2093 }
2094}
2095
2096static void airo_end_xmit(struct net_device *dev) {
2097 u16 status;
2098 int i;
2099 struct airo_info *priv = dev->ml_priv;
2100 struct sk_buff *skb = priv->xmit.skb;
2101 int fid = priv->xmit.fid;
2102 u32 *fids = priv->fids;
2103
2104 clear_bit(JOB_XMIT, &priv->jobs);
2105 clear_bit(FLAG_PENDING_XMIT, &priv->flags);
2106 status = transmit_802_3_packet (priv, fids[fid], skb->data);
2107 up(&priv->sem);
2108
2109 i = 0;
2110 if ( status == SUCCESS ) {
2111 dev->trans_start = jiffies;
2112 for (; i < MAX_FIDS / 2 && (priv->fids[i] & 0xffff0000); i++);
2113 } else {
2114 priv->fids[fid] &= 0xffff;
2115 dev->stats.tx_window_errors++;
2116 }
2117 if (i < MAX_FIDS / 2)
2118 netif_wake_queue(dev);
2119 dev_kfree_skb(skb);
2120}
2121
2122static int airo_start_xmit(struct sk_buff *skb, struct net_device *dev) {
2123 s16 len;
2124 int i, j;
2125 struct airo_info *priv = dev->ml_priv;
2126 u32 *fids = priv->fids;
2127
2128 if ( skb == NULL ) {
2129 airo_print_err(dev->name, "%s: skb == NULL!", __func__);
2130 return 0;
2131 }
2132
2133
2134 for( i = 0; i < MAX_FIDS / 2 && (fids[i] & 0xffff0000); i++ );
2135 for( j = i + 1; j < MAX_FIDS / 2 && (fids[j] & 0xffff0000); j++ );
2136
2137 if ( j >= MAX_FIDS / 2 ) {
2138 netif_stop_queue(dev);
2139
2140 if (i == MAX_FIDS / 2) {
2141 dev->stats.tx_fifo_errors++;
2142 return 1;
2143 }
2144 }
2145
2146 len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
2147
2148 fids[i] |= (len << 16);
2149 priv->xmit.skb = skb;
2150 priv->xmit.fid = i;
2151 if (down_trylock(&priv->sem) != 0) {
2152 set_bit(FLAG_PENDING_XMIT, &priv->flags);
2153 netif_stop_queue(dev);
2154 set_bit(JOB_XMIT, &priv->jobs);
2155 wake_up_interruptible(&priv->thr_wait);
2156 } else
2157 airo_end_xmit(dev);
2158 return 0;
2159}
2160
2161static void airo_end_xmit11(struct net_device *dev) {
2162 u16 status;
2163 int i;
2164 struct airo_info *priv = dev->ml_priv;
2165 struct sk_buff *skb = priv->xmit11.skb;
2166 int fid = priv->xmit11.fid;
2167 u32 *fids = priv->fids;
2168
2169 clear_bit(JOB_XMIT11, &priv->jobs);
2170 clear_bit(FLAG_PENDING_XMIT11, &priv->flags);
2171 status = transmit_802_11_packet (priv, fids[fid], skb->data);
2172 up(&priv->sem);
2173
2174 i = MAX_FIDS / 2;
2175 if ( status == SUCCESS ) {
2176 dev->trans_start = jiffies;
2177 for (; i < MAX_FIDS && (priv->fids[i] & 0xffff0000); i++);
2178 } else {
2179 priv->fids[fid] &= 0xffff;
2180 dev->stats.tx_window_errors++;
2181 }
2182 if (i < MAX_FIDS)
2183 netif_wake_queue(dev);
2184 dev_kfree_skb(skb);
2185}
2186
2187static int airo_start_xmit11(struct sk_buff *skb, struct net_device *dev) {
2188 s16 len;
2189 int i, j;
2190 struct airo_info *priv = dev->ml_priv;
2191 u32 *fids = priv->fids;
2192
2193 if (test_bit(FLAG_MPI, &priv->flags)) {
2194
2195 netif_stop_queue(dev);
2196 return -ENETDOWN;
2197 }
2198
2199 if ( skb == NULL ) {
2200 airo_print_err(dev->name, "%s: skb == NULL!", __func__);
2201 return 0;
2202 }
2203
2204
2205 for( i = MAX_FIDS / 2; i < MAX_FIDS && (fids[i] & 0xffff0000); i++ );
2206 for( j = i + 1; j < MAX_FIDS && (fids[j] & 0xffff0000); j++ );
2207
2208 if ( j >= MAX_FIDS ) {
2209 netif_stop_queue(dev);
2210
2211 if (i == MAX_FIDS) {
2212 dev->stats.tx_fifo_errors++;
2213 return 1;
2214 }
2215 }
2216
2217 len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
2218
2219 fids[i] |= (len << 16);
2220 priv->xmit11.skb = skb;
2221 priv->xmit11.fid = i;
2222 if (down_trylock(&priv->sem) != 0) {
2223 set_bit(FLAG_PENDING_XMIT11, &priv->flags);
2224 netif_stop_queue(dev);
2225 set_bit(JOB_XMIT11, &priv->jobs);
2226 wake_up_interruptible(&priv->thr_wait);
2227 } else
2228 airo_end_xmit11(dev);
2229 return 0;
2230}
2231
2232static void airo_read_stats(struct net_device *dev)
2233{
2234 struct airo_info *ai = dev->ml_priv;
2235 StatsRid stats_rid;
2236 __le32 *vals = stats_rid.vals;
2237
2238 clear_bit(JOB_STATS, &ai->jobs);
2239 if (ai->power.event) {
2240 up(&ai->sem);
2241 return;
2242 }
2243 readStatsRid(ai, &stats_rid, RID_STATS, 0);
2244 up(&ai->sem);
2245
2246 dev->stats.rx_packets = le32_to_cpu(vals[43]) + le32_to_cpu(vals[44]) +
2247 le32_to_cpu(vals[45]);
2248 dev->stats.tx_packets = le32_to_cpu(vals[39]) + le32_to_cpu(vals[40]) +
2249 le32_to_cpu(vals[41]);
2250 dev->stats.rx_bytes = le32_to_cpu(vals[92]);
2251 dev->stats.tx_bytes = le32_to_cpu(vals[91]);
2252 dev->stats.rx_errors = le32_to_cpu(vals[0]) + le32_to_cpu(vals[2]) +
2253 le32_to_cpu(vals[3]) + le32_to_cpu(vals[4]);
2254 dev->stats.tx_errors = le32_to_cpu(vals[42]) +
2255 dev->stats.tx_fifo_errors;
2256 dev->stats.multicast = le32_to_cpu(vals[43]);
2257 dev->stats.collisions = le32_to_cpu(vals[89]);
2258
2259
2260 dev->stats.rx_length_errors = le32_to_cpu(vals[3]);
2261 dev->stats.rx_crc_errors = le32_to_cpu(vals[4]);
2262 dev->stats.rx_frame_errors = le32_to_cpu(vals[2]);
2263 dev->stats.rx_fifo_errors = le32_to_cpu(vals[0]);
2264}
2265
2266static struct net_device_stats *airo_get_stats(struct net_device *dev)
2267{
2268 struct airo_info *local = dev->ml_priv;
2269
2270 if (!test_bit(JOB_STATS, &local->jobs)) {
2271
2272 if (down_trylock(&local->sem) != 0) {
2273 set_bit(JOB_STATS, &local->jobs);
2274 wake_up_interruptible(&local->thr_wait);
2275 } else
2276 airo_read_stats(dev);
2277 }
2278
2279 return &dev->stats;
2280}
2281
2282static void airo_set_promisc(struct airo_info *ai) {
2283 Cmd cmd;
2284 Resp rsp;
2285
2286 memset(&cmd, 0, sizeof(cmd));
2287 cmd.cmd=CMD_SETMODE;
2288 clear_bit(JOB_PROMISC, &ai->jobs);
2289 cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC;
2290 issuecommand(ai, &cmd, &rsp);
2291 up(&ai->sem);
2292}
2293
2294static void airo_set_multicast_list(struct net_device *dev) {
2295 struct airo_info *ai = dev->ml_priv;
2296
2297 if ((dev->flags ^ ai->flags) & IFF_PROMISC) {
2298 change_bit(FLAG_PROMISC, &ai->flags);
2299 if (down_trylock(&ai->sem) != 0) {
2300 set_bit(JOB_PROMISC, &ai->jobs);
2301 wake_up_interruptible(&ai->thr_wait);
2302 } else
2303 airo_set_promisc(ai);
2304 }
2305
2306 if ((dev->flags&IFF_ALLMULTI)||dev->mc_count>0) {
2307
2308 }
2309}
2310
2311static int airo_set_mac_address(struct net_device *dev, void *p)
2312{
2313 struct airo_info *ai = dev->ml_priv;
2314 struct sockaddr *addr = p;
2315
2316 readConfigRid(ai, 1);
2317 memcpy (ai->config.macAddr, addr->sa_data, dev->addr_len);
2318 set_bit (FLAG_COMMIT, &ai->flags);
2319 disable_MAC(ai, 1);
2320 writeConfigRid (ai, 1);
2321 enable_MAC(ai, 1);
2322 memcpy (ai->dev->dev_addr, addr->sa_data, dev->addr_len);
2323 if (ai->wifidev)
2324 memcpy (ai->wifidev->dev_addr, addr->sa_data, dev->addr_len);
2325 return 0;
2326}
2327
2328static int airo_change_mtu(struct net_device *dev, int new_mtu)
2329{
2330 if ((new_mtu < 68) || (new_mtu > 2400))
2331 return -EINVAL;
2332 dev->mtu = new_mtu;
2333 return 0;
2334}
2335
2336static LIST_HEAD(airo_devices);
2337
2338static void add_airo_dev(struct airo_info *ai)
2339{
2340
2341
2342 if (!ai->pci)
2343 list_add_tail(&ai->dev_list, &airo_devices);
2344}
2345
2346static void del_airo_dev(struct airo_info *ai)
2347{
2348 if (!ai->pci)
2349 list_del(&ai->dev_list);
2350}
2351
2352static int airo_close(struct net_device *dev) {
2353 struct airo_info *ai = dev->ml_priv;
2354
2355 netif_stop_queue(dev);
2356
2357 if (ai->wifidev != dev) {
2358#ifdef POWER_ON_DOWN
2359
2360
2361
2362
2363
2364 set_bit(FLAG_RADIO_DOWN, &ai->flags);
2365 disable_MAC(ai, 1);
2366#endif
2367 disable_interrupts( ai );
2368
2369 free_irq(dev->irq, dev);
2370
2371 set_bit(JOB_DIE, &ai->jobs);
2372 kthread_stop(ai->airo_thread_task);
2373 }
2374 return 0;
2375}
2376
2377void stop_airo_card( struct net_device *dev, int freeres )
2378{
2379 struct airo_info *ai = dev->ml_priv;
2380
2381 set_bit(FLAG_RADIO_DOWN, &ai->flags);
2382 disable_MAC(ai, 1);
2383 disable_interrupts(ai);
2384 takedown_proc_entry( dev, ai );
2385 if (test_bit(FLAG_REGISTERED, &ai->flags)) {
2386 unregister_netdev( dev );
2387 if (ai->wifidev) {
2388 unregister_netdev(ai->wifidev);
2389 free_netdev(ai->wifidev);
2390 ai->wifidev = NULL;
2391 }
2392 clear_bit(FLAG_REGISTERED, &ai->flags);
2393 }
2394
2395
2396
2397 if (test_bit(FLAG_MPI, &ai->flags) && !skb_queue_empty(&ai->txq)) {
2398 struct sk_buff *skb = NULL;
2399 for (;(skb = skb_dequeue(&ai->txq));)
2400 dev_kfree_skb(skb);
2401 }
2402
2403 airo_networks_free (ai);
2404
2405 kfree(ai->flash);
2406 kfree(ai->rssi);
2407 kfree(ai->APList);
2408 kfree(ai->SSID);
2409 if (freeres) {
2410
2411 release_region( dev->base_addr, 64 );
2412 if (test_bit(FLAG_MPI, &ai->flags)) {
2413 if (ai->pci)
2414 mpi_unmap_card(ai->pci);
2415 if (ai->pcimem)
2416 iounmap(ai->pcimem);
2417 if (ai->pciaux)
2418 iounmap(ai->pciaux);
2419 pci_free_consistent(ai->pci, PCI_SHARED_LEN,
2420 ai->shared, ai->shared_dma);
2421 }
2422 }
2423 crypto_free_cipher(ai->tfm);
2424 del_airo_dev(ai);
2425 free_netdev( dev );
2426}
2427
2428EXPORT_SYMBOL(stop_airo_card);
2429
2430static int wll_header_parse(const struct sk_buff *skb, unsigned char *haddr)
2431{
2432 memcpy(haddr, skb_mac_header(skb) + 10, ETH_ALEN);
2433 return ETH_ALEN;
2434}
2435
2436static void mpi_unmap_card(struct pci_dev *pci)
2437{
2438 unsigned long mem_start = pci_resource_start(pci, 1);
2439 unsigned long mem_len = pci_resource_len(pci, 1);
2440 unsigned long aux_start = pci_resource_start(pci, 2);
2441 unsigned long aux_len = AUXMEMSIZE;
2442
2443 release_mem_region(aux_start, aux_len);
2444 release_mem_region(mem_start, mem_len);
2445}
2446
2447
2448
2449
2450
2451
2452
2453
2454static int mpi_init_descriptors (struct airo_info *ai)
2455{
2456 Cmd cmd;
2457 Resp rsp;
2458 int i;
2459 int rc = SUCCESS;
2460
2461
2462 netif_stop_queue(ai->dev);
2463
2464 memset(&rsp,0,sizeof(rsp));
2465 memset(&cmd,0,sizeof(cmd));
2466
2467 cmd.cmd = CMD_ALLOCATEAUX;
2468 cmd.parm0 = FID_RX;
2469 cmd.parm1 = (ai->rxfids[0].card_ram_off - ai->pciaux);
2470 cmd.parm2 = MPI_MAX_FIDS;
2471 rc=issuecommand(ai, &cmd, &rsp);
2472 if (rc != SUCCESS) {
2473 airo_print_err(ai->dev->name, "Couldn't allocate RX FID");
2474 return rc;
2475 }
2476
2477 for (i=0; i<MPI_MAX_FIDS; i++) {
2478 memcpy_toio(ai->rxfids[i].card_ram_off,
2479 &ai->rxfids[i].rx_desc, sizeof(RxFid));
2480 }
2481
2482
2483
2484 memset(&rsp,0,sizeof(rsp));
2485 memset(&cmd,0,sizeof(cmd));
2486
2487 cmd.cmd = CMD_ALLOCATEAUX;
2488 cmd.parm0 = FID_TX;
2489 cmd.parm1 = (ai->txfids[0].card_ram_off - ai->pciaux);
2490 cmd.parm2 = MPI_MAX_FIDS;
2491
2492 for (i=0; i<MPI_MAX_FIDS; i++) {
2493 ai->txfids[i].tx_desc.valid = 1;
2494 memcpy_toio(ai->txfids[i].card_ram_off,
2495 &ai->txfids[i].tx_desc, sizeof(TxFid));
2496 }
2497 ai->txfids[i-1].tx_desc.eoc = 1;
2498
2499 rc=issuecommand(ai, &cmd, &rsp);
2500 if (rc != SUCCESS) {
2501 airo_print_err(ai->dev->name, "Couldn't allocate TX FID");
2502 return rc;
2503 }
2504
2505
2506 memset(&rsp,0,sizeof(rsp));
2507 memset(&cmd,0,sizeof(cmd));
2508
2509 cmd.cmd = CMD_ALLOCATEAUX;
2510 cmd.parm0 = RID_RW;
2511 cmd.parm1 = (ai->config_desc.card_ram_off - ai->pciaux);
2512 cmd.parm2 = 1;
2513 rc=issuecommand(ai, &cmd, &rsp);
2514 if (rc != SUCCESS) {
2515 airo_print_err(ai->dev->name, "Couldn't allocate RID");
2516 return rc;
2517 }
2518
2519 memcpy_toio(ai->config_desc.card_ram_off,
2520 &ai->config_desc.rid_desc, sizeof(Rid));
2521
2522 return rc;
2523}
2524
2525
2526
2527
2528
2529
2530
2531static int mpi_map_card(struct airo_info *ai, struct pci_dev *pci)
2532{
2533 unsigned long mem_start, mem_len, aux_start, aux_len;
2534 int rc = -1;
2535 int i;
2536 dma_addr_t busaddroff;
2537 unsigned char *vpackoff;
2538 unsigned char __iomem *pciaddroff;
2539
2540 mem_start = pci_resource_start(pci, 1);
2541 mem_len = pci_resource_len(pci, 1);
2542 aux_start = pci_resource_start(pci, 2);
2543 aux_len = AUXMEMSIZE;
2544
2545 if (!request_mem_region(mem_start, mem_len, DRV_NAME)) {
2546 airo_print_err("", "Couldn't get region %x[%x]",
2547 (int)mem_start, (int)mem_len);
2548 goto out;
2549 }
2550 if (!request_mem_region(aux_start, aux_len, DRV_NAME)) {
2551 airo_print_err("", "Couldn't get region %x[%x]",
2552 (int)aux_start, (int)aux_len);
2553 goto free_region1;
2554 }
2555
2556 ai->pcimem = ioremap(mem_start, mem_len);
2557 if (!ai->pcimem) {
2558 airo_print_err("", "Couldn't map region %x[%x]",
2559 (int)mem_start, (int)mem_len);
2560 goto free_region2;
2561 }
2562 ai->pciaux = ioremap(aux_start, aux_len);
2563 if (!ai->pciaux) {
2564 airo_print_err("", "Couldn't map region %x[%x]",
2565 (int)aux_start, (int)aux_len);
2566 goto free_memmap;
2567 }
2568
2569
2570 ai->shared = pci_alloc_consistent(pci, PCI_SHARED_LEN, &ai->shared_dma);
2571 if (!ai->shared) {
2572 airo_print_err("", "Couldn't alloc_consistent %d",
2573 PCI_SHARED_LEN);
2574 goto free_auxmap;
2575 }
2576
2577
2578
2579
2580 busaddroff = ai->shared_dma;
2581 pciaddroff = ai->pciaux + AUX_OFFSET;
2582 vpackoff = ai->shared;
2583
2584
2585 for(i = 0; i < MPI_MAX_FIDS; i++) {
2586 ai->rxfids[i].pending = 0;
2587 ai->rxfids[i].card_ram_off = pciaddroff;
2588 ai->rxfids[i].virtual_host_addr = vpackoff;
2589 ai->rxfids[i].rx_desc.host_addr = busaddroff;
2590 ai->rxfids[i].rx_desc.valid = 1;
2591 ai->rxfids[i].rx_desc.len = PKTSIZE;
2592 ai->rxfids[i].rx_desc.rdy = 0;
2593
2594 pciaddroff += sizeof(RxFid);
2595 busaddroff += PKTSIZE;
2596 vpackoff += PKTSIZE;
2597 }
2598
2599
2600 for(i = 0; i < MPI_MAX_FIDS; i++) {
2601 ai->txfids[i].card_ram_off = pciaddroff;
2602 ai->txfids[i].virtual_host_addr = vpackoff;
2603 ai->txfids[i].tx_desc.valid = 1;
2604 ai->txfids[i].tx_desc.host_addr = busaddroff;
2605 memcpy(ai->txfids[i].virtual_host_addr,
2606 &wifictlhdr8023, sizeof(wifictlhdr8023));
2607
2608 pciaddroff += sizeof(TxFid);
2609 busaddroff += PKTSIZE;
2610 vpackoff += PKTSIZE;
2611 }
2612 ai->txfids[i-1].tx_desc.eoc = 1;
2613
2614
2615 ai->config_desc.card_ram_off = pciaddroff;
2616 ai->config_desc.virtual_host_addr = vpackoff;
2617 ai->config_desc.rid_desc.host_addr = busaddroff;
2618 ai->ridbus = busaddroff;
2619 ai->config_desc.rid_desc.rid = 0;
2620 ai->config_desc.rid_desc.len = RIDSIZE;
2621 ai->config_desc.rid_desc.valid = 1;
2622 pciaddroff += sizeof(Rid);
2623 busaddroff += RIDSIZE;
2624 vpackoff += RIDSIZE;
2625
2626
2627 if (mpi_init_descriptors (ai) != SUCCESS)
2628 goto free_shared;
2629
2630 return 0;
2631 free_shared:
2632 pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma);
2633 free_auxmap:
2634 iounmap(ai->pciaux);
2635 free_memmap:
2636 iounmap(ai->pcimem);
2637 free_region2:
2638 release_mem_region(aux_start, aux_len);
2639 free_region1:
2640 release_mem_region(mem_start, mem_len);
2641 out:
2642 return rc;
2643}
2644
2645static const struct header_ops airo_header_ops = {
2646 .parse = wll_header_parse,
2647};
2648
2649static const struct net_device_ops airo11_netdev_ops = {
2650 .ndo_open = airo_open,
2651 .ndo_stop = airo_close,
2652 .ndo_start_xmit = airo_start_xmit11,
2653 .ndo_get_stats = airo_get_stats,
2654 .ndo_set_mac_address = airo_set_mac_address,
2655 .ndo_do_ioctl = airo_ioctl,
2656 .ndo_change_mtu = airo_change_mtu,
2657};
2658
2659static void wifi_setup(struct net_device *dev)
2660{
2661 dev->netdev_ops = &airo11_netdev_ops;
2662 dev->header_ops = &airo_header_ops;
2663 dev->wireless_handlers = &airo_handler_def;
2664
2665 dev->type = ARPHRD_IEEE80211;
2666 dev->hard_header_len = ETH_HLEN;
2667 dev->mtu = AIRO_DEF_MTU;
2668 dev->addr_len = ETH_ALEN;
2669 dev->tx_queue_len = 100;
2670
2671 memset(dev->broadcast,0xFF, ETH_ALEN);
2672
2673 dev->flags = IFF_BROADCAST|IFF_MULTICAST;
2674}
2675
2676static struct net_device *init_wifidev(struct airo_info *ai,
2677 struct net_device *ethdev)
2678{
2679 int err;
2680 struct net_device *dev = alloc_netdev(0, "wifi%d", wifi_setup);
2681 if (!dev)
2682 return NULL;
2683 dev->ml_priv = ethdev->ml_priv;
2684 dev->irq = ethdev->irq;
2685 dev->base_addr = ethdev->base_addr;
2686 dev->wireless_data = ethdev->wireless_data;
2687 SET_NETDEV_DEV(dev, ethdev->dev.parent);
2688 memcpy(dev->dev_addr, ethdev->dev_addr, dev->addr_len);
2689 err = register_netdev(dev);
2690 if (err<0) {
2691 free_netdev(dev);
2692 return NULL;
2693 }
2694 return dev;
2695}
2696
2697static int reset_card( struct net_device *dev , int lock) {
2698 struct airo_info *ai = dev->ml_priv;
2699
2700 if (lock && down_interruptible(&ai->sem))
2701 return -1;
2702 waitbusy (ai);
2703 OUT4500(ai,COMMAND,CMD_SOFTRESET);
2704 msleep(200);
2705 waitbusy (ai);
2706 msleep(200);
2707 if (lock)
2708 up(&ai->sem);
2709 return 0;
2710}
2711
2712#define AIRO_MAX_NETWORK_COUNT 64
2713static int airo_networks_allocate(struct airo_info *ai)
2714{
2715 if (ai->networks)
2716 return 0;
2717
2718 ai->networks =
2719 kzalloc(AIRO_MAX_NETWORK_COUNT * sizeof(BSSListElement),
2720 GFP_KERNEL);
2721 if (!ai->networks) {
2722 airo_print_warn("", "Out of memory allocating beacons");
2723 return -ENOMEM;
2724 }
2725
2726 return 0;
2727}
2728
2729static void airo_networks_free(struct airo_info *ai)
2730{
2731 kfree(ai->networks);
2732 ai->networks = NULL;
2733}
2734
2735static void airo_networks_initialize(struct airo_info *ai)
2736{
2737 int i;
2738
2739 INIT_LIST_HEAD(&ai->network_free_list);
2740 INIT_LIST_HEAD(&ai->network_list);
2741 for (i = 0; i < AIRO_MAX_NETWORK_COUNT; i++)
2742 list_add_tail(&ai->networks[i].list,
2743 &ai->network_free_list);
2744}
2745
2746static const struct net_device_ops airo_netdev_ops = {
2747 .ndo_open = airo_open,
2748 .ndo_stop = airo_close,
2749 .ndo_start_xmit = airo_start_xmit,
2750 .ndo_get_stats = airo_get_stats,
2751 .ndo_set_multicast_list = airo_set_multicast_list,
2752 .ndo_set_mac_address = airo_set_mac_address,
2753 .ndo_do_ioctl = airo_ioctl,
2754 .ndo_change_mtu = airo_change_mtu,
2755 .ndo_validate_addr = eth_validate_addr,
2756};
2757
2758static const struct net_device_ops mpi_netdev_ops = {
2759 .ndo_open = airo_open,
2760 .ndo_stop = airo_close,
2761 .ndo_start_xmit = mpi_start_xmit,
2762 .ndo_get_stats = airo_get_stats,
2763 .ndo_set_multicast_list = airo_set_multicast_list,
2764 .ndo_set_mac_address = airo_set_mac_address,
2765 .ndo_do_ioctl = airo_ioctl,
2766 .ndo_change_mtu = airo_change_mtu,
2767 .ndo_validate_addr = eth_validate_addr,
2768};
2769
2770
2771static struct net_device *_init_airo_card( unsigned short irq, int port,
2772 int is_pcmcia, struct pci_dev *pci,
2773 struct device *dmdev )
2774{
2775 struct net_device *dev;
2776 struct airo_info *ai;
2777 int i, rc;
2778 CapabilityRid cap_rid;
2779
2780
2781 dev = alloc_netdev(sizeof(*ai), "", ether_setup);
2782 if (!dev) {
2783 airo_print_err("", "Couldn't alloc_etherdev");
2784 return NULL;
2785 }
2786
2787 ai = dev->ml_priv = netdev_priv(dev);
2788 ai->wifidev = NULL;
2789 ai->flags = 1 << FLAG_RADIO_DOWN;
2790 ai->jobs = 0;
2791 ai->dev = dev;
2792 if (pci && (pci->device == 0x5000 || pci->device == 0xa504)) {
2793 airo_print_dbg("", "Found an MPI350 card");
2794 set_bit(FLAG_MPI, &ai->flags);
2795 }
2796 spin_lock_init(&ai->aux_lock);
2797 sema_init(&ai->sem, 1);
2798 ai->config.len = 0;
2799 ai->pci = pci;
2800 init_waitqueue_head (&ai->thr_wait);
2801 ai->tfm = NULL;
2802 add_airo_dev(ai);
2803
2804 if (airo_networks_allocate (ai))
2805 goto err_out_free;
2806 airo_networks_initialize (ai);
2807
2808 skb_queue_head_init (&ai->txq);
2809
2810
2811 if (test_bit(FLAG_MPI,&ai->flags))
2812 dev->netdev_ops = &mpi_netdev_ops;
2813 else
2814 dev->netdev_ops = &airo_netdev_ops;
2815 dev->wireless_handlers = &airo_handler_def;
2816 ai->wireless_data.spy_data = &ai->spy_data;
2817 dev->wireless_data = &ai->wireless_data;
2818 dev->irq = irq;
2819 dev->base_addr = port;
2820
2821 SET_NETDEV_DEV(dev, dmdev);
2822
2823 reset_card (dev, 1);
2824 msleep(400);
2825
2826 if (!is_pcmcia) {
2827 if (!request_region(dev->base_addr, 64, DRV_NAME)) {
2828 rc = -EBUSY;
2829 airo_print_err(dev->name, "Couldn't request region");
2830 goto err_out_nets;
2831 }
2832 }
2833
2834 if (test_bit(FLAG_MPI,&ai->flags)) {
2835 if (mpi_map_card(ai, pci)) {
2836 airo_print_err("", "Could not map memory");
2837 goto err_out_res;
2838 }
2839 }
2840
2841 if (probe) {
2842 if (setup_card(ai, dev->dev_addr, 1) != SUCCESS) {
2843 airo_print_err(dev->name, "MAC could not be enabled" );
2844 rc = -EIO;
2845 goto err_out_map;
2846 }
2847 } else if (!test_bit(FLAG_MPI,&ai->flags)) {
2848 ai->bap_read = fast_bap_read;
2849 set_bit(FLAG_FLASHING, &ai->flags);
2850 }
2851
2852 strcpy(dev->name, "eth%d");
2853 rc = register_netdev(dev);
2854 if (rc) {
2855 airo_print_err(dev->name, "Couldn't register_netdev");
2856 goto err_out_map;
2857 }
2858 ai->wifidev = init_wifidev(ai, dev);
2859 if (!ai->wifidev)
2860 goto err_out_reg;
2861
2862 rc = readCapabilityRid(ai, &cap_rid, 1);
2863 if (rc != SUCCESS) {
2864 rc = -EIO;
2865 goto err_out_wifi;
2866 }
2867
2868 ai->wep_capable = (cap_rid.softCap & cpu_to_le16(0x02)) ? 1 : 0;
2869 ai->max_wep_idx = (cap_rid.softCap & cpu_to_le16(0x80)) ? 3 : 0;
2870
2871 airo_print_info(dev->name, "Firmware version %x.%x.%02x",
2872 ((le16_to_cpu(cap_rid.softVer) >> 8) & 0xF),
2873 (le16_to_cpu(cap_rid.softVer) & 0xFF),
2874 le16_to_cpu(cap_rid.softSubVer));
2875
2876
2877
2878 if (le16_to_cpu(cap_rid.softVer) > 0x530
2879 || (le16_to_cpu(cap_rid.softVer) == 0x530
2880 && le16_to_cpu(cap_rid.softSubVer) >= 17)) {
2881 airo_print_info(ai->dev->name, "WPA supported.");
2882
2883 set_bit(FLAG_WPA_CAPABLE, &ai->flags);
2884 ai->bssListFirst = RID_WPA_BSSLISTFIRST;
2885 ai->bssListNext = RID_WPA_BSSLISTNEXT;
2886 ai->bssListRidLen = sizeof(BSSListRid);
2887 } else {
2888 airo_print_info(ai->dev->name, "WPA unsupported with firmware "
2889 "versions older than 5.30.17.");
2890
2891 ai->bssListFirst = RID_BSSLISTFIRST;
2892 ai->bssListNext = RID_BSSLISTNEXT;
2893 ai->bssListRidLen = sizeof(BSSListRid) - sizeof(BSSListRidExtra);
2894 }
2895
2896 set_bit(FLAG_REGISTERED,&ai->flags);
2897 airo_print_info(dev->name, "MAC enabled %pM", dev->dev_addr);
2898
2899
2900 if (probe && !test_bit(FLAG_MPI,&ai->flags))
2901 for( i = 0; i < MAX_FIDS; i++ )
2902 ai->fids[i] = transmit_allocate(ai,AIRO_DEF_MTU,i>=MAX_FIDS/2);
2903
2904 if (setup_proc_entry(dev, dev->ml_priv) < 0)
2905 goto err_out_wifi;
2906
2907 return dev;
2908
2909err_out_wifi:
2910 unregister_netdev(ai->wifidev);
2911 free_netdev(ai->wifidev);
2912err_out_reg:
2913 unregister_netdev(dev);
2914err_out_map:
2915 if (test_bit(FLAG_MPI,&ai->flags) && pci) {
2916 pci_free_consistent(pci, PCI_SHARED_LEN, ai->shared, ai->shared_dma);
2917 iounmap(ai->pciaux);
2918 iounmap(ai->pcimem);
2919 mpi_unmap_card(ai->pci);
2920 }
2921err_out_res:
2922 if (!is_pcmcia)
2923 release_region( dev->base_addr, 64 );
2924err_out_nets:
2925 airo_networks_free(ai);
2926 del_airo_dev(ai);
2927err_out_free:
2928 free_netdev(dev);
2929 return NULL;
2930}
2931
2932struct net_device *init_airo_card( unsigned short irq, int port, int is_pcmcia,
2933 struct device *dmdev)
2934{
2935 return _init_airo_card ( irq, port, is_pcmcia, NULL, dmdev);
2936}
2937
2938EXPORT_SYMBOL(init_airo_card);
2939
2940static int waitbusy (struct airo_info *ai) {
2941 int delay = 0;
2942 while ((IN4500(ai, COMMAND) & COMMAND_BUSY) && (delay < 10000)) {
2943 udelay (10);
2944 if ((++delay % 20) == 0)
2945 OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
2946 }
2947 return delay < 10000;
2948}
2949
2950int reset_airo_card( struct net_device *dev )
2951{
2952 int i;
2953 struct airo_info *ai = dev->ml_priv;
2954
2955 if (reset_card (dev, 1))
2956 return -1;
2957
2958 if ( setup_card(ai, dev->dev_addr, 1 ) != SUCCESS ) {
2959 airo_print_err(dev->name, "MAC could not be enabled");
2960 return -1;
2961 }
2962 airo_print_info(dev->name, "MAC enabled %pM", dev->dev_addr);
2963
2964 if (!test_bit(FLAG_MPI,&ai->flags))
2965 for( i = 0; i < MAX_FIDS; i++ )
2966 ai->fids[i] = transmit_allocate (ai,AIRO_DEF_MTU,i>=MAX_FIDS/2);
2967
2968 enable_interrupts( ai );
2969 netif_wake_queue(dev);
2970 return 0;
2971}
2972
2973EXPORT_SYMBOL(reset_airo_card);
2974
2975static void airo_send_event(struct net_device *dev) {
2976 struct airo_info *ai = dev->ml_priv;
2977 union iwreq_data wrqu;
2978 StatusRid status_rid;
2979
2980 clear_bit(JOB_EVENT, &ai->jobs);
2981 PC4500_readrid(ai, RID_STATUS, &status_rid, sizeof(status_rid), 0);
2982 up(&ai->sem);
2983 wrqu.data.length = 0;
2984 wrqu.data.flags = 0;
2985 memcpy(wrqu.ap_addr.sa_data, status_rid.bssid[0], ETH_ALEN);
2986 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
2987
2988
2989 wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
2990}
2991
2992static void airo_process_scan_results (struct airo_info *ai) {
2993 union iwreq_data wrqu;
2994 BSSListRid bss;
2995 int rc;
2996 BSSListElement * loop_net;
2997 BSSListElement * tmp_net;
2998
2999
3000 list_for_each_entry_safe (loop_net, tmp_net, &ai->network_list, list) {
3001 list_move_tail (&loop_net->list, &ai->network_free_list);
3002
3003 memset (loop_net, 0, sizeof (loop_net->bss));
3004 }
3005
3006
3007 rc = PC4500_readrid(ai, ai->bssListFirst, &bss, ai->bssListRidLen, 0);
3008 if((rc) || (bss.index == cpu_to_le16(0xffff))) {
3009
3010 goto out;
3011 }
3012
3013
3014 tmp_net = NULL;
3015 while((!rc) && (bss.index != cpu_to_le16(0xffff))) {
3016
3017 if (!list_empty(&ai->network_free_list)) {
3018 tmp_net = list_entry(ai->network_free_list.next,
3019 BSSListElement, list);
3020 list_del(ai->network_free_list.next);
3021 }
3022
3023 if (tmp_net != NULL) {
3024 memcpy(tmp_net, &bss, sizeof(tmp_net->bss));
3025 list_add_tail(&tmp_net->list, &ai->network_list);
3026 tmp_net = NULL;
3027 }
3028
3029
3030 rc = PC4500_readrid(ai, ai->bssListNext,
3031 &bss, ai->bssListRidLen, 0);
3032 }
3033
3034out:
3035 ai->scan_timeout = 0;
3036 clear_bit(JOB_SCAN_RESULTS, &ai->jobs);
3037 up(&ai->sem);
3038
3039
3040
3041
3042
3043
3044
3045
3046 wrqu.data.length = 0;
3047 wrqu.data.flags = 0;
3048 wireless_send_event(ai->dev, SIOCGIWSCAN, &wrqu, NULL);
3049}
3050
3051static int airo_thread(void *data) {
3052 struct net_device *dev = data;
3053 struct airo_info *ai = dev->ml_priv;
3054 int locked;
3055
3056 set_freezable();
3057 while(1) {
3058
3059 try_to_freeze();
3060
3061 if (test_bit(JOB_DIE, &ai->jobs))
3062 break;
3063
3064 if (ai->jobs) {
3065 locked = down_interruptible(&ai->sem);
3066 } else {
3067 wait_queue_t wait;
3068
3069 init_waitqueue_entry(&wait, current);
3070 add_wait_queue(&ai->thr_wait, &wait);
3071 for (;;) {
3072 set_current_state(TASK_INTERRUPTIBLE);
3073 if (ai->jobs)
3074 break;
3075 if (ai->expires || ai->scan_timeout) {
3076 if (ai->scan_timeout &&
3077 time_after_eq(jiffies,ai->scan_timeout)){
3078 set_bit(JOB_SCAN_RESULTS, &ai->jobs);
3079 break;
3080 } else if (ai->expires &&
3081 time_after_eq(jiffies,ai->expires)){
3082 set_bit(JOB_AUTOWEP, &ai->jobs);
3083 break;
3084 }
3085 if (!kthread_should_stop() &&
3086 !freezing(current)) {
3087 unsigned long wake_at;
3088 if (!ai->expires || !ai->scan_timeout) {
3089 wake_at = max(ai->expires,
3090 ai->scan_timeout);
3091 } else {
3092 wake_at = min(ai->expires,
3093 ai->scan_timeout);
3094 }
3095 schedule_timeout(wake_at - jiffies);
3096 continue;
3097 }
3098 } else if (!kthread_should_stop() &&
3099 !freezing(current)) {
3100 schedule();
3101 continue;
3102 }
3103 break;
3104 }
3105 current->state = TASK_RUNNING;
3106 remove_wait_queue(&ai->thr_wait, &wait);
3107 locked = 1;
3108 }
3109
3110 if (locked)
3111 continue;
3112
3113 if (test_bit(JOB_DIE, &ai->jobs)) {
3114 up(&ai->sem);
3115 break;
3116 }
3117
3118 if (ai->power.event || test_bit(FLAG_FLASHING, &ai->flags)) {
3119 up(&ai->sem);
3120 continue;
3121 }
3122
3123 if (test_bit(JOB_XMIT, &ai->jobs))
3124 airo_end_xmit(dev);
3125 else if (test_bit(JOB_XMIT11, &ai->jobs))
3126 airo_end_xmit11(dev);
3127 else if (test_bit(JOB_STATS, &ai->jobs))
3128 airo_read_stats(dev);
3129 else if (test_bit(JOB_WSTATS, &ai->jobs))
3130 airo_read_wireless_stats(ai);
3131 else if (test_bit(JOB_PROMISC, &ai->jobs))
3132 airo_set_promisc(ai);
3133 else if (test_bit(JOB_MIC, &ai->jobs))
3134 micinit(ai);
3135 else if (test_bit(JOB_EVENT, &ai->jobs))
3136 airo_send_event(dev);
3137 else if (test_bit(JOB_AUTOWEP, &ai->jobs))
3138 timer_func(dev);
3139 else if (test_bit(JOB_SCAN_RESULTS, &ai->jobs))
3140 airo_process_scan_results(ai);
3141 else
3142 up(&ai->sem);
3143 }
3144
3145 return 0;
3146}
3147
3148static int header_len(__le16 ctl)
3149{
3150 u16 fc = le16_to_cpu(ctl);
3151 switch (fc & 0xc) {
3152 case 4:
3153 if ((fc & 0xe0) == 0xc0)
3154 return 10;
3155 return 16;
3156 case 8:
3157 if ((fc & 0x300) == 0x300)
3158 return 30;
3159 }
3160 return 24;
3161}
3162
3163static void airo_handle_cisco_mic(struct airo_info *ai)
3164{
3165 if (test_bit(FLAG_MIC_CAPABLE, &ai->flags)) {
3166 set_bit(JOB_MIC, &ai->jobs);
3167 wake_up_interruptible(&ai->thr_wait);
3168 }
3169}
3170
3171
3172#define STAT_NOBEACON 0x8000
3173#define STAT_MAXRETRIES 0x8001
3174#define STAT_MAXARL 0x8002
3175#define STAT_FORCELOSS 0x8003
3176#define STAT_TSFSYNC 0x8004
3177#define STAT_DEAUTH 0x8100
3178#define STAT_DISASSOC 0x8200
3179#define STAT_ASSOC_FAIL 0x8400
3180#define STAT_AUTH_FAIL 0x0300
3181#define STAT_ASSOC 0x0400
3182#define STAT_REASSOC 0x0600
3183
3184static void airo_print_status(const char *devname, u16 status)
3185{
3186 u8 reason = status & 0xFF;
3187
3188 switch (status) {
3189 case STAT_NOBEACON:
3190 airo_print_dbg(devname, "link lost (missed beacons)");
3191 break;
3192 case STAT_MAXRETRIES:
3193 case STAT_MAXARL:
3194 airo_print_dbg(devname, "link lost (max retries)");
3195 break;
3196 case STAT_FORCELOSS:
3197 airo_print_dbg(devname, "link lost (local choice)");
3198 break;
3199 case STAT_TSFSYNC:
3200 airo_print_dbg(devname, "link lost (TSF sync lost)");
3201 break;
3202 case STAT_DEAUTH:
3203 airo_print_dbg(devname, "deauthenticated (reason: %d)", reason);
3204 break;
3205 case STAT_DISASSOC:
3206 airo_print_dbg(devname, "disassociated (reason: %d)", reason);
3207 break;
3208 case STAT_ASSOC_FAIL:
3209 airo_print_dbg(devname, "association failed (reason: %d)",
3210 reason);
3211 break;
3212 case STAT_AUTH_FAIL:
3213 airo_print_dbg(devname, "authentication failed (reason: %d)",
3214 reason);
3215 break;
3216 default:
3217 break;
3218 }
3219}
3220
3221static void airo_handle_link(struct airo_info *ai)
3222{
3223 union iwreq_data wrqu;
3224 int scan_forceloss = 0;
3225 u16 status;
3226
3227
3228 status = le16_to_cpu(IN4500(ai, LINKSTAT));
3229 OUT4500(ai, EVACK, EV_LINK);
3230
3231 if ((status == STAT_FORCELOSS) && (ai->scan_timeout > 0))
3232 scan_forceloss = 1;
3233
3234 airo_print_status(ai->dev->name, status);
3235
3236 if ((status == STAT_ASSOC) || (status == STAT_REASSOC)) {
3237 if (auto_wep)
3238 ai->expires = 0;
3239 if (ai->list_bss_task)
3240 wake_up_process(ai->list_bss_task);
3241 set_bit(FLAG_UPDATE_UNI, &ai->flags);
3242 set_bit(FLAG_UPDATE_MULTI, &ai->flags);
3243
3244 if (down_trylock(&ai->sem) != 0) {
3245 set_bit(JOB_EVENT, &ai->jobs);
3246 wake_up_interruptible(&ai->thr_wait);
3247 } else
3248 airo_send_event(ai->dev);
3249 } else if (!scan_forceloss) {
3250 if (auto_wep && !ai->expires) {
3251 ai->expires = RUN_AT(3*HZ);
3252 wake_up_interruptible(&ai->thr_wait);
3253 }
3254
3255
3256 memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN);
3257 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
3258 wireless_send_event(ai->dev, SIOCGIWAP, &wrqu, NULL);
3259 }
3260}
3261
3262static void airo_handle_rx(struct airo_info *ai)
3263{
3264 struct sk_buff *skb = NULL;
3265 __le16 fc, v, *buffer, tmpbuf[4];
3266 u16 len, hdrlen = 0, gap, fid;
3267 struct rx_hdr hdr;
3268 int success = 0;
3269
3270 if (test_bit(FLAG_MPI, &ai->flags)) {
3271 if (test_bit(FLAG_802_11, &ai->flags))
3272 mpi_receive_802_11(ai);
3273 else
3274 mpi_receive_802_3(ai);
3275 OUT4500(ai, EVACK, EV_RX);
3276 return;
3277 }
3278
3279 fid = IN4500(ai, RXFID);
3280
3281
3282 if (test_bit(FLAG_802_11, &ai->flags)) {
3283 bap_setup (ai, fid, 4, BAP0);
3284 bap_read (ai, (__le16*)&hdr, sizeof(hdr), BAP0);
3285
3286 if (le16_to_cpu(hdr.status) & 2)
3287 hdr.len = 0;
3288 if (ai->wifidev == NULL)
3289 hdr.len = 0;
3290 } else {
3291 bap_setup(ai, fid, 0x36, BAP0);
3292 bap_read(ai, &hdr.len, 2, BAP0);
3293 }
3294 len = le16_to_cpu(hdr.len);
3295
3296 if (len > AIRO_DEF_MTU) {
3297 airo_print_err(ai->dev->name, "Bad size %d", len);
3298 goto done;
3299 }
3300 if (len == 0)
3301 goto done;
3302
3303 if (test_bit(FLAG_802_11, &ai->flags)) {
3304 bap_read(ai, &fc, sizeof (fc), BAP0);
3305 hdrlen = header_len(fc);
3306 } else
3307 hdrlen = ETH_ALEN * 2;
3308
3309 skb = dev_alloc_skb(len + hdrlen + 2 + 2);
3310 if (!skb) {
3311 ai->dev->stats.rx_dropped++;
3312 goto done;
3313 }
3314
3315 skb_reserve(skb, 2);
3316 buffer = (__le16 *) skb_put(skb, len + hdrlen);
3317 if (test_bit(FLAG_802_11, &ai->flags)) {
3318 buffer[0] = fc;
3319 bap_read(ai, buffer + 1, hdrlen - 2, BAP0);
3320 if (hdrlen == 24)
3321 bap_read(ai, tmpbuf, 6, BAP0);
3322
3323 bap_read(ai, &v, sizeof(v), BAP0);
3324 gap = le16_to_cpu(v);
3325 if (gap) {
3326 if (gap <= 8) {
3327 bap_read(ai, tmpbuf, gap, BAP0);
3328 } else {
3329 airo_print_err(ai->dev->name, "gaplen too "
3330 "big. Problems will follow...");
3331 }
3332 }
3333 bap_read(ai, buffer + hdrlen/2, len, BAP0);
3334 } else {
3335 MICBuffer micbuf;
3336
3337 bap_read(ai, buffer, ETH_ALEN * 2, BAP0);
3338 if (ai->micstats.enabled) {
3339 bap_read(ai, (__le16 *) &micbuf, sizeof (micbuf), BAP0);
3340 if (ntohs(micbuf.typelen) > 0x05DC)
3341 bap_setup(ai, fid, 0x44, BAP0);
3342 else {
3343 if (len <= sizeof (micbuf)) {
3344 dev_kfree_skb_irq(skb);
3345 goto done;
3346 }
3347
3348 len -= sizeof(micbuf);
3349 skb_trim(skb, len + hdrlen);
3350 }
3351 }
3352
3353 bap_read(ai, buffer + ETH_ALEN, len, BAP0);
3354 if (decapsulate(ai, &micbuf, (etherHead*) buffer, len))
3355 dev_kfree_skb_irq (skb);
3356 else
3357 success = 1;
3358 }
3359
3360#ifdef WIRELESS_SPY
3361 if (success && (ai->spy_data.spy_number > 0)) {
3362 char *sa;
3363 struct iw_quality wstats;
3364
3365
3366 if (!test_bit(FLAG_802_11, &ai->flags)) {
3367 sa = (char *) buffer + 6;
3368 bap_setup(ai, fid, 8, BAP0);
3369 bap_read(ai, (__le16 *) hdr.rssi, 2, BAP0);
3370 } else
3371 sa = (char *) buffer + 10;
3372 wstats.qual = hdr.rssi[0];
3373 if (ai->rssi)
3374 wstats.level = 0x100 - ai->rssi[hdr.rssi[1]].rssidBm;
3375 else
3376 wstats.level = (hdr.rssi[1] + 321) / 2;
3377 wstats.noise = ai->wstats.qual.noise;
3378 wstats.updated = IW_QUAL_LEVEL_UPDATED
3379 | IW_QUAL_QUAL_UPDATED
3380 | IW_QUAL_DBM;
3381
3382 wireless_spy_update(ai->dev, sa, &wstats);
3383 }
3384#endif
3385
3386done:
3387 OUT4500(ai, EVACK, EV_RX);
3388
3389 if (success) {
3390 if (test_bit(FLAG_802_11, &ai->flags)) {
3391 skb_reset_mac_header(skb);
3392 skb->pkt_type = PACKET_OTHERHOST;
3393 skb->dev = ai->wifidev;
3394 skb->protocol = htons(ETH_P_802_2);
3395 } else
3396 skb->protocol = eth_type_trans(skb, ai->dev);
3397 skb->ip_summed = CHECKSUM_NONE;
3398
3399 netif_rx(skb);
3400 }
3401}
3402
3403static void airo_handle_tx(struct airo_info *ai, u16 status)
3404{
3405 int i, len = 0, index = -1;
3406 u16 fid;
3407
3408 if (test_bit(FLAG_MPI, &ai->flags)) {
3409 unsigned long flags;
3410
3411 if (status & EV_TXEXC)
3412 get_tx_error(ai, -1);
3413
3414 spin_lock_irqsave(&ai->aux_lock, flags);
3415 if (!skb_queue_empty(&ai->txq)) {
3416 spin_unlock_irqrestore(&ai->aux_lock,flags);
3417 mpi_send_packet(ai->dev);
3418 } else {
3419 clear_bit(FLAG_PENDING_XMIT, &ai->flags);
3420 spin_unlock_irqrestore(&ai->aux_lock,flags);
3421 netif_wake_queue(ai->dev);
3422 }
3423 OUT4500(ai, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC));
3424 return;
3425 }
3426
3427 fid = IN4500(ai, TXCOMPLFID);
3428
3429 for(i = 0; i < MAX_FIDS; i++) {
3430 if ((ai->fids[i] & 0xffff) == fid) {
3431 len = ai->fids[i] >> 16;
3432 index = i;
3433 }
3434 }
3435
3436 if (index != -1) {
3437 if (status & EV_TXEXC)
3438 get_tx_error(ai, index);
3439
3440 OUT4500(ai, EVACK, status & (EV_TX | EV_TXEXC));
3441
3442
3443 ai->fids[index] &= 0xffff;
3444 if (index < MAX_FIDS / 2) {
3445 if (!test_bit(FLAG_PENDING_XMIT, &ai->flags))
3446 netif_wake_queue(ai->dev);
3447 } else {
3448 if (!test_bit(FLAG_PENDING_XMIT11, &ai->flags))
3449 netif_wake_queue(ai->wifidev);
3450 }
3451 } else {
3452 OUT4500(ai, EVACK, status & (EV_TX | EV_TXCPY | EV_TXEXC));
3453 airo_print_err(ai->dev->name, "Unallocated FID was used to xmit");
3454 }
3455}
3456
3457static irqreturn_t airo_interrupt(int irq, void *dev_id)
3458{
3459 struct net_device *dev = dev_id;
3460 u16 status, savedInterrupts = 0;
3461 struct airo_info *ai = dev->ml_priv;
3462 int handled = 0;
3463
3464 if (!netif_device_present(dev))
3465 return IRQ_NONE;
3466
3467 for (;;) {
3468 status = IN4500(ai, EVSTAT);
3469 if (!(status & STATUS_INTS) || (status == 0xffff))
3470 break;
3471
3472 handled = 1;
3473
3474 if (status & EV_AWAKE) {
3475 OUT4500(ai, EVACK, EV_AWAKE);
3476 OUT4500(ai, EVACK, EV_AWAKE);
3477 }
3478
3479 if (!savedInterrupts) {
3480 savedInterrupts = IN4500(ai, EVINTEN);
3481 OUT4500(ai, EVINTEN, 0);
3482 }
3483
3484 if (status & EV_MIC) {
3485 OUT4500(ai, EVACK, EV_MIC);
3486 airo_handle_cisco_mic(ai);
3487 }
3488
3489 if (status & EV_LINK) {
3490
3491 airo_handle_link(ai);
3492 }
3493
3494
3495 if (status & EV_RX)
3496 airo_handle_rx(ai);
3497
3498
3499 if (status & (EV_TX | EV_TXCPY | EV_TXEXC))
3500 airo_handle_tx(ai, status);
3501
3502 if ( status & ~STATUS_INTS & ~IGNORE_INTS ) {
3503 airo_print_warn(ai->dev->name, "Got weird status %x",
3504 status & ~STATUS_INTS & ~IGNORE_INTS );
3505 }
3506 }
3507
3508 if (savedInterrupts)
3509 OUT4500(ai, EVINTEN, savedInterrupts);
3510
3511 return IRQ_RETVAL(handled);
3512}
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523static void OUT4500( struct airo_info *ai, u16 reg, u16 val ) {
3524 if (test_bit(FLAG_MPI,&ai->flags))
3525 reg <<= 1;
3526 if ( !do8bitIO )
3527 outw( val, ai->dev->base_addr + reg );
3528 else {
3529 outb( val & 0xff, ai->dev->base_addr + reg );
3530 outb( val >> 8, ai->dev->base_addr + reg + 1 );
3531 }
3532}
3533
3534static u16 IN4500( struct airo_info *ai, u16 reg ) {
3535 unsigned short rc;
3536
3537 if (test_bit(FLAG_MPI,&ai->flags))
3538 reg <<= 1;
3539 if ( !do8bitIO )
3540 rc = inw( ai->dev->base_addr + reg );
3541 else {
3542 rc = inb( ai->dev->base_addr + reg );
3543 rc += ((int)inb( ai->dev->base_addr + reg + 1 )) << 8;
3544 }
3545 return rc;
3546}
3547
3548static int enable_MAC(struct airo_info *ai, int lock)
3549{
3550 int rc;
3551 Cmd cmd;
3552 Resp rsp;
3553
3554
3555
3556
3557
3558
3559
3560 if (ai->flags & FLAG_RADIO_MASK) return SUCCESS;
3561
3562 if (lock && down_interruptible(&ai->sem))
3563 return -ERESTARTSYS;
3564
3565 if (!test_bit(FLAG_ENABLED, &ai->flags)) {
3566 memset(&cmd, 0, sizeof(cmd));
3567 cmd.cmd = MAC_ENABLE;
3568 rc = issuecommand(ai, &cmd, &rsp);
3569 if (rc == SUCCESS)
3570 set_bit(FLAG_ENABLED, &ai->flags);
3571 } else
3572 rc = SUCCESS;
3573
3574 if (lock)
3575 up(&ai->sem);
3576
3577 if (rc)
3578 airo_print_err(ai->dev->name, "Cannot enable MAC");
3579 else if ((rsp.status & 0xFF00) != 0) {
3580 airo_print_err(ai->dev->name, "Bad MAC enable reason=%x, "
3581 "rid=%x, offset=%d", rsp.rsp0, rsp.rsp1, rsp.rsp2);
3582 rc = ERROR;
3583 }
3584 return rc;
3585}
3586
3587static void disable_MAC( struct airo_info *ai, int lock ) {
3588 Cmd cmd;
3589 Resp rsp;
3590
3591 if (lock && down_interruptible(&ai->sem))
3592 return;
3593
3594 if (test_bit(FLAG_ENABLED, &ai->flags)) {
3595 memset(&cmd, 0, sizeof(cmd));
3596 cmd.cmd = MAC_DISABLE;
3597 issuecommand(ai, &cmd, &rsp);
3598 clear_bit(FLAG_ENABLED, &ai->flags);
3599 }
3600 if (lock)
3601 up(&ai->sem);
3602}
3603
3604static void enable_interrupts( struct airo_info *ai ) {
3605
3606 OUT4500( ai, EVINTEN, STATUS_INTS );
3607}
3608
3609static void disable_interrupts( struct airo_info *ai ) {
3610 OUT4500( ai, EVINTEN, 0 );
3611}
3612
3613static void mpi_receive_802_3(struct airo_info *ai)
3614{
3615 RxFid rxd;
3616 int len = 0;
3617 struct sk_buff *skb;
3618 char *buffer;
3619 int off = 0;
3620 MICBuffer micbuf;
3621
3622 memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd));
3623
3624 if (rxd.rdy && rxd.valid == 0) {
3625 len = rxd.len + 12;
3626 if (len < 12 || len > 2048)
3627 goto badrx;
3628
3629 skb = dev_alloc_skb(len);
3630 if (!skb) {
3631 ai->dev->stats.rx_dropped++;
3632 goto badrx;
3633 }
3634 buffer = skb_put(skb,len);
3635 memcpy(buffer, ai->rxfids[0].virtual_host_addr, ETH_ALEN * 2);
3636 if (ai->micstats.enabled) {
3637 memcpy(&micbuf,
3638 ai->rxfids[0].virtual_host_addr + ETH_ALEN * 2,
3639 sizeof(micbuf));
3640 if (ntohs(micbuf.typelen) <= 0x05DC) {
3641 if (len <= sizeof(micbuf) + ETH_ALEN * 2)
3642 goto badmic;
3643
3644 off = sizeof(micbuf);
3645 skb_trim (skb, len - off);
3646 }
3647 }
3648 memcpy(buffer + ETH_ALEN * 2,
3649 ai->rxfids[0].virtual_host_addr + ETH_ALEN * 2 + off,
3650 len - ETH_ALEN * 2 - off);
3651 if (decapsulate (ai, &micbuf, (etherHead*)buffer, len - off - ETH_ALEN * 2)) {
3652badmic:
3653 dev_kfree_skb_irq (skb);
3654 goto badrx;
3655 }
3656#ifdef WIRELESS_SPY
3657 if (ai->spy_data.spy_number > 0) {
3658 char *sa;
3659 struct iw_quality wstats;
3660
3661 sa = buffer + ETH_ALEN;
3662 wstats.qual = 0;
3663 wstats.level = 0;
3664 wstats.updated = 0;
3665
3666 wireless_spy_update(ai->dev, sa, &wstats);
3667 }
3668#endif
3669
3670 skb->ip_summed = CHECKSUM_NONE;
3671 skb->protocol = eth_type_trans(skb, ai->dev);
3672 netif_rx(skb);
3673 }
3674badrx:
3675 if (rxd.valid == 0) {
3676 rxd.valid = 1;
3677 rxd.rdy = 0;
3678 rxd.len = PKTSIZE;
3679 memcpy_toio(ai->rxfids[0].card_ram_off, &rxd, sizeof(rxd));
3680 }
3681}
3682
3683static void mpi_receive_802_11(struct airo_info *ai)
3684{
3685 RxFid rxd;
3686 struct sk_buff *skb = NULL;
3687 u16 len, hdrlen = 0;
3688 __le16 fc;
3689 struct rx_hdr hdr;
3690 u16 gap;
3691 u16 *buffer;
3692 char *ptr = ai->rxfids[0].virtual_host_addr + 4;
3693
3694 memcpy_fromio(&rxd, ai->rxfids[0].card_ram_off, sizeof(rxd));
3695 memcpy ((char *)&hdr, ptr, sizeof(hdr));
3696 ptr += sizeof(hdr);
3697
3698 if (le16_to_cpu(hdr.status) & 2)
3699 hdr.len = 0;
3700 if (ai->wifidev == NULL)
3701 hdr.len = 0;
3702 len = le16_to_cpu(hdr.len);
3703 if (len > AIRO_DEF_MTU) {
3704 airo_print_err(ai->dev->name, "Bad size %d", len);
3705 goto badrx;
3706 }
3707 if (len == 0)
3708 goto badrx;
3709
3710 fc = get_unaligned((__le16 *)ptr);
3711 hdrlen = header_len(fc);
3712
3713 skb = dev_alloc_skb( len + hdrlen + 2 );
3714 if ( !skb ) {
3715 ai->dev->stats.rx_dropped++;
3716 goto badrx;
3717 }
3718 buffer = (u16*)skb_put (skb, len + hdrlen);
3719 memcpy ((char *)buffer, ptr, hdrlen);
3720 ptr += hdrlen;
3721 if (hdrlen == 24)
3722 ptr += 6;
3723 gap = get_unaligned_le16(ptr);
3724 ptr += sizeof(__le16);
3725 if (gap) {
3726 if (gap <= 8)
3727 ptr += gap;
3728 else
3729 airo_print_err(ai->dev->name,
3730 "gaplen too big. Problems will follow...");
3731 }
3732 memcpy ((char *)buffer + hdrlen, ptr, len);
3733 ptr += len;
3734#ifdef IW_WIRELESS_SPY
3735 if (ai->spy_data.spy_number > 0) {
3736 char *sa;
3737 struct iw_quality wstats;
3738
3739 sa = (char*)buffer + 10;
3740 wstats.qual = hdr.rssi[0];
3741 if (ai->rssi)
3742 wstats.level = 0x100 - ai->rssi[hdr.rssi[1]].rssidBm;
3743 else
3744 wstats.level = (hdr.rssi[1] + 321) / 2;
3745 wstats.noise = ai->wstats.qual.noise;
3746 wstats.updated = IW_QUAL_QUAL_UPDATED
3747 | IW_QUAL_LEVEL_UPDATED
3748 | IW_QUAL_DBM;
3749
3750 wireless_spy_update(ai->dev, sa, &wstats);
3751 }
3752#endif
3753 skb_reset_mac_header(skb);
3754 skb->pkt_type = PACKET_OTHERHOST;
3755 skb->dev = ai->wifidev;
3756 skb->protocol = htons(ETH_P_802_2);
3757 skb->ip_summed = CHECKSUM_NONE;
3758 netif_rx( skb );
3759
3760badrx:
3761 if (rxd.valid == 0) {
3762 rxd.valid = 1;
3763 rxd.rdy = 0;
3764 rxd.len = PKTSIZE;
3765 memcpy_toio(ai->rxfids[0].card_ram_off, &rxd, sizeof(rxd));
3766 }
3767}
3768
3769static u16 setup_card(struct airo_info *ai, u8 *mac, int lock)
3770{
3771 Cmd cmd;
3772 Resp rsp;
3773 int status;
3774 SsidRid mySsid;
3775 __le16 lastindex;
3776 WepKeyRid wkr;
3777 int rc;
3778
3779 memset( &mySsid, 0, sizeof( mySsid ) );
3780 kfree (ai->flash);
3781 ai->flash = NULL;
3782
3783
3784 cmd.cmd = NOP;
3785 cmd.parm0 = cmd.parm1 = cmd.parm2 = 0;
3786 if (lock && down_interruptible(&ai->sem))
3787 return ERROR;
3788 if ( issuecommand( ai, &cmd, &rsp ) != SUCCESS ) {
3789 if (lock)
3790 up(&ai->sem);
3791 return ERROR;
3792 }
3793 disable_MAC( ai, 0);
3794
3795
3796 if (!test_bit(FLAG_MPI,&ai->flags)) {
3797 cmd.cmd = CMD_ENABLEAUX;
3798 if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
3799 if (lock)
3800 up(&ai->sem);
3801 airo_print_err(ai->dev->name, "Error checking for AUX port");
3802 return ERROR;
3803 }
3804 if (!aux_bap || rsp.status & 0xff00) {
3805 ai->bap_read = fast_bap_read;
3806 airo_print_dbg(ai->dev->name, "Doing fast bap_reads");
3807 } else {
3808 ai->bap_read = aux_bap_read;
3809 airo_print_dbg(ai->dev->name, "Doing AUX bap_reads");
3810 }
3811 }
3812 if (lock)
3813 up(&ai->sem);
3814 if (ai->config.len == 0) {
3815 int i;
3816 tdsRssiRid rssi_rid;
3817 CapabilityRid cap_rid;
3818
3819 kfree(ai->APList);
3820 ai->APList = NULL;
3821 kfree(ai->SSID);
3822 ai->SSID = NULL;
3823
3824 status = readConfigRid(ai, lock);
3825 if ( status != SUCCESS ) return ERROR;
3826
3827 status = readCapabilityRid(ai, &cap_rid, lock);
3828 if ( status != SUCCESS ) return ERROR;
3829
3830 status = PC4500_readrid(ai,RID_RSSI,&rssi_rid,sizeof(rssi_rid),lock);
3831 if ( status == SUCCESS ) {
3832 if (ai->rssi || (ai->rssi = kmalloc(512, GFP_KERNEL)) != NULL)
3833 memcpy(ai->rssi, (u8*)&rssi_rid + 2, 512);
3834 }
3835 else {
3836 kfree(ai->rssi);
3837 ai->rssi = NULL;
3838 if (cap_rid.softCap & cpu_to_le16(8))
3839 ai->config.rmode |= RXMODE_NORMALIZED_RSSI;
3840 else
3841 airo_print_warn(ai->dev->name, "unknown received signal "
3842 "level scale");
3843 }
3844 ai->config.opmode = adhoc ? MODE_STA_IBSS : MODE_STA_ESS;
3845 ai->config.authType = AUTH_OPEN;
3846 ai->config.modulation = MOD_CCK;
3847
3848 if (le16_to_cpu(cap_rid.len) >= sizeof(cap_rid) &&
3849 (cap_rid.extSoftCap & cpu_to_le16(1)) &&
3850 micsetup(ai) == SUCCESS) {
3851 ai->config.opmode |= MODE_MIC;
3852 set_bit(FLAG_MIC_CAPABLE, &ai->flags);
3853 }
3854
3855
3856 for( i = 0; i < ETH_ALEN; i++ ) {
3857 mac[i] = ai->config.macAddr[i];
3858 }
3859
3860
3861
3862 if ( rates[0] ) {
3863 memset(ai->config.rates,0,sizeof(ai->config.rates));
3864 for( i = 0; i < 8 && rates[i]; i++ ) {
3865 ai->config.rates[i] = rates[i];
3866 }
3867 }
3868 if ( basic_rate > 0 ) {
3869 for( i = 0; i < 8; i++ ) {
3870 if ( ai->config.rates[i] == basic_rate ||
3871 !ai->config.rates ) {
3872 ai->config.rates[i] = basic_rate | 0x80;
3873 break;
3874 }
3875 }
3876 }
3877 set_bit (FLAG_COMMIT, &ai->flags);
3878 }
3879
3880
3881 if ( ssids[0] ) {
3882 int i;
3883 for( i = 0; i < 3 && ssids[i]; i++ ) {
3884 size_t len = strlen(ssids[i]);
3885 if (len > 32)
3886 len = 32;
3887 mySsid.ssids[i].len = cpu_to_le16(len);
3888 memcpy(mySsid.ssids[i].ssid, ssids[i], len);
3889 }
3890 mySsid.len = cpu_to_le16(sizeof(mySsid));
3891 }
3892
3893 status = writeConfigRid(ai, lock);
3894 if ( status != SUCCESS ) return ERROR;
3895
3896
3897 if ( ssids[0] ) {
3898 status = writeSsidRid(ai, &mySsid, lock);
3899 if ( status != SUCCESS ) return ERROR;
3900 }
3901
3902 status = enable_MAC(ai, lock);
3903 if (status != SUCCESS)
3904 return ERROR;
3905
3906
3907 rc = readWepKeyRid(ai, &wkr, 1, lock);
3908 if (rc == SUCCESS) do {
3909 lastindex = wkr.kindex;
3910 if (wkr.kindex == cpu_to_le16(0xffff)) {
3911 ai->defindex = wkr.mac[0];
3912 }
3913 rc = readWepKeyRid(ai, &wkr, 0, lock);
3914 } while(lastindex != wkr.kindex);
3915
3916 try_auto_wep(ai);
3917
3918 return SUCCESS;
3919}
3920
3921static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) {
3922
3923 int max_tries = 600000;
3924
3925 if (IN4500(ai, EVSTAT) & EV_CMD)
3926 OUT4500(ai, EVACK, EV_CMD);
3927
3928 OUT4500(ai, PARAM0, pCmd->parm0);
3929 OUT4500(ai, PARAM1, pCmd->parm1);
3930 OUT4500(ai, PARAM2, pCmd->parm2);
3931 OUT4500(ai, COMMAND, pCmd->cmd);
3932
3933 while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) {
3934 if ((IN4500(ai, COMMAND)) == pCmd->cmd)
3935
3936 OUT4500(ai, COMMAND, pCmd->cmd);
3937 if (!in_atomic() && (max_tries & 255) == 0)
3938 schedule();
3939 }
3940
3941 if ( max_tries == -1 ) {
3942 airo_print_err(ai->dev->name,
3943 "Max tries exceeded when issueing command");
3944 if (IN4500(ai, COMMAND) & COMMAND_BUSY)
3945 OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
3946 return ERROR;
3947 }
3948
3949
3950 pRsp->status = IN4500(ai, STATUS);
3951 pRsp->rsp0 = IN4500(ai, RESP0);
3952 pRsp->rsp1 = IN4500(ai, RESP1);
3953 pRsp->rsp2 = IN4500(ai, RESP2);
3954 if ((pRsp->status & 0xff00)!=0 && pCmd->cmd != CMD_SOFTRESET)
3955 airo_print_err(ai->dev->name,
3956 "cmd:%x status:%x rsp0:%x rsp1:%x rsp2:%x",
3957 pCmd->cmd, pRsp->status, pRsp->rsp0, pRsp->rsp1,
3958 pRsp->rsp2);
3959
3960
3961 if (IN4500(ai, COMMAND) & COMMAND_BUSY) {
3962 OUT4500(ai, EVACK, EV_CLEARCOMMANDBUSY);
3963 }
3964
3965 OUT4500(ai, EVACK, EV_CMD);
3966
3967 return SUCCESS;
3968}
3969
3970
3971
3972
3973static int bap_setup(struct airo_info *ai, u16 rid, u16 offset, int whichbap )
3974{
3975 int timeout = 50;
3976 int max_tries = 3;
3977
3978 OUT4500(ai, SELECT0+whichbap, rid);
3979 OUT4500(ai, OFFSET0+whichbap, offset);
3980 while (1) {
3981 int status = IN4500(ai, OFFSET0+whichbap);
3982 if (status & BAP_BUSY) {
3983
3984
3985 if (timeout--) {
3986 continue;
3987 }
3988 } else if ( status & BAP_ERR ) {
3989
3990 airo_print_err(ai->dev->name, "BAP error %x %d",
3991 status, whichbap );
3992 return ERROR;
3993 } else if (status & BAP_DONE) {
3994 return SUCCESS;
3995 }
3996 if ( !(max_tries--) ) {
3997 airo_print_err(ai->dev->name,
3998 "BAP setup error too many retries\n");
3999 return ERROR;
4000 }
4001
4002 OUT4500(ai, SELECT0+whichbap, rid);
4003 OUT4500(ai, OFFSET0+whichbap, offset);
4004 timeout = 50;
4005 }
4006}
4007
4008
4009
4010
4011static u16 aux_setup(struct airo_info *ai, u16 page,
4012 u16 offset, u16 *len)
4013{
4014 u16 next;
4015
4016 OUT4500(ai, AUXPAGE, page);
4017 OUT4500(ai, AUXOFF, 0);
4018 next = IN4500(ai, AUXDATA);
4019 *len = IN4500(ai, AUXDATA)&0xff;
4020 if (offset != 4) OUT4500(ai, AUXOFF, offset);
4021 return next;
4022}
4023
4024
4025static int aux_bap_read(struct airo_info *ai, __le16 *pu16Dst,
4026 int bytelen, int whichbap)
4027{
4028 u16 len;
4029 u16 page;
4030 u16 offset;
4031 u16 next;
4032 int words;
4033 int i;
4034 unsigned long flags;
4035
4036 spin_lock_irqsave(&ai->aux_lock, flags);
4037 page = IN4500(ai, SWS0+whichbap);
4038 offset = IN4500(ai, SWS2+whichbap);
4039 next = aux_setup(ai, page, offset, &len);
4040 words = (bytelen+1)>>1;
4041
4042 for (i=0; i<words;) {
4043 int count;
4044 count = (len>>1) < (words-i) ? (len>>1) : (words-i);
4045 if ( !do8bitIO )
4046 insw( ai->dev->base_addr+DATA0+whichbap,
4047 pu16Dst+i,count );
4048 else
4049 insb( ai->dev->base_addr+DATA0+whichbap,
4050 pu16Dst+i, count << 1 );
4051 i += count;
4052 if (i<words) {
4053 next = aux_setup(ai, next, 4, &len);
4054 }
4055 }
4056 spin_unlock_irqrestore(&ai->aux_lock, flags);
4057 return SUCCESS;
4058}
4059
4060
4061
4062static int fast_bap_read(struct airo_info *ai, __le16 *pu16Dst,
4063 int bytelen, int whichbap)
4064{
4065 bytelen = (bytelen + 1) & (~1);
4066 if ( !do8bitIO )
4067 insw( ai->dev->base_addr+DATA0+whichbap, pu16Dst, bytelen>>1 );
4068 else
4069 insb( ai->dev->base_addr+DATA0+whichbap, pu16Dst, bytelen );
4070 return SUCCESS;
4071}
4072
4073
4074static int bap_write(struct airo_info *ai, const __le16 *pu16Src,
4075 int bytelen, int whichbap)
4076{
4077 bytelen = (bytelen + 1) & (~1);
4078 if ( !do8bitIO )
4079 outsw( ai->dev->base_addr+DATA0+whichbap,
4080 pu16Src, bytelen>>1 );
4081 else
4082 outsb( ai->dev->base_addr+DATA0+whichbap, pu16Src, bytelen );
4083 return SUCCESS;
4084}
4085
4086static int PC4500_accessrid(struct airo_info *ai, u16 rid, u16 accmd)
4087{
4088 Cmd cmd;
4089 Resp rsp;
4090 u16 status;
4091
4092 memset(&cmd, 0, sizeof(cmd));
4093 cmd.cmd = accmd;
4094 cmd.parm0 = rid;
4095 status = issuecommand(ai, &cmd, &rsp);
4096 if (status != 0) return status;
4097 if ( (rsp.status & 0x7F00) != 0) {
4098 return (accmd << 8) + (rsp.rsp0 & 0xFF);
4099 }
4100 return 0;
4101}
4102
4103
4104
4105static int PC4500_readrid(struct airo_info *ai, u16 rid, void *pBuf, int len, int lock)
4106{
4107 u16 status;
4108 int rc = SUCCESS;
4109
4110 if (lock) {
4111 if (down_interruptible(&ai->sem))
4112 return ERROR;
4113 }
4114 if (test_bit(FLAG_MPI,&ai->flags)) {
4115 Cmd cmd;
4116 Resp rsp;
4117
4118 memset(&cmd, 0, sizeof(cmd));
4119 memset(&rsp, 0, sizeof(rsp));
4120 ai->config_desc.rid_desc.valid = 1;
4121 ai->config_desc.rid_desc.len = RIDSIZE;
4122 ai->config_desc.rid_desc.rid = 0;
4123 ai->config_desc.rid_desc.host_addr = ai->ridbus;
4124
4125 cmd.cmd = CMD_ACCESS;
4126 cmd.parm0 = rid;
4127
4128 memcpy_toio(ai->config_desc.card_ram_off,
4129 &ai->config_desc.rid_desc, sizeof(Rid));
4130
4131 rc = issuecommand(ai, &cmd, &rsp);
4132
4133 if (rsp.status & 0x7f00)
4134 rc = rsp.rsp0;
4135 if (!rc)
4136 memcpy(pBuf, ai->config_desc.virtual_host_addr, len);
4137 goto done;
4138 } else {
4139 if ((status = PC4500_accessrid(ai, rid, CMD_ACCESS))!=SUCCESS) {
4140 rc = status;
4141 goto done;
4142 }
4143 if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) {
4144 rc = ERROR;
4145 goto done;
4146 }
4147
4148 bap_read(ai, pBuf, 2, BAP1);
4149
4150 len = min(len, (int)le16_to_cpu(*(__le16*)pBuf)) - 2;
4151
4152 if ( len <= 2 ) {
4153 airo_print_err(ai->dev->name,
4154 "Rid %x has a length of %d which is too short",
4155 (int)rid, (int)len );
4156 rc = ERROR;
4157 goto done;
4158 }
4159
4160 rc = bap_read(ai, ((__le16*)pBuf)+1, len, BAP1);
4161 }
4162done:
4163 if (lock)
4164 up(&ai->sem);
4165 return rc;
4166}
4167
4168
4169
4170static int PC4500_writerid(struct airo_info *ai, u16 rid,
4171 const void *pBuf, int len, int lock)
4172{
4173 u16 status;
4174 int rc = SUCCESS;
4175
4176 *(__le16*)pBuf = cpu_to_le16((u16)len);
4177
4178 if (lock) {
4179 if (down_interruptible(&ai->sem))
4180 return ERROR;
4181 }
4182 if (test_bit(FLAG_MPI,&ai->flags)) {
4183 Cmd cmd;
4184 Resp rsp;
4185
4186 if (test_bit(FLAG_ENABLED, &ai->flags) && (RID_WEP_TEMP != rid))
4187 airo_print_err(ai->dev->name,
4188 "%s: MAC should be disabled (rid=%04x)",
4189 __func__, rid);
4190 memset(&cmd, 0, sizeof(cmd));
4191 memset(&rsp, 0, sizeof(rsp));
4192
4193 ai->config_desc.rid_desc.valid = 1;
4194 ai->config_desc.rid_desc.len = *((u16 *)pBuf);
4195 ai->config_desc.rid_desc.rid = 0;
4196
4197 cmd.cmd = CMD_WRITERID;
4198 cmd.parm0 = rid;
4199
4200 memcpy_toio(ai->config_desc.card_ram_off,
4201 &ai->config_desc.rid_desc, sizeof(Rid));
4202
4203 if (len < 4 || len > 2047) {
4204 airo_print_err(ai->dev->name, "%s: len=%d", __func__, len);
4205 rc = -1;
4206 } else {
4207 memcpy((char *)ai->config_desc.virtual_host_addr,
4208 pBuf, len);
4209
4210 rc = issuecommand(ai, &cmd, &rsp);
4211 if ((rc & 0xff00) != 0) {
4212 airo_print_err(ai->dev->name, "%s: Write rid Error %d",
4213 __func__, rc);
4214 airo_print_err(ai->dev->name, "%s: Cmd=%04x",
4215 __func__, cmd.cmd);
4216 }
4217
4218 if ((rsp.status & 0x7f00))
4219 rc = rsp.rsp0;
4220 }
4221 } else {
4222
4223 if ( (status = PC4500_accessrid(ai, rid, CMD_ACCESS)) != 0) {
4224 rc = status;
4225 goto done;
4226 }
4227
4228 if (bap_setup(ai, rid, 0, BAP1) != SUCCESS) {
4229 rc = ERROR;
4230 goto done;
4231 }
4232 bap_write(ai, pBuf, len, BAP1);
4233
4234 rc = PC4500_accessrid(ai, rid, 0x100|CMD_ACCESS);
4235 }
4236done:
4237 if (lock)
4238 up(&ai->sem);
4239 return rc;
4240}
4241
4242
4243
4244static u16 transmit_allocate(struct airo_info *ai, int lenPayload, int raw)
4245{
4246 unsigned int loop = 3000;
4247 Cmd cmd;
4248 Resp rsp;
4249 u16 txFid;
4250 __le16 txControl;
4251
4252 cmd.cmd = CMD_ALLOCATETX;
4253 cmd.parm0 = lenPayload;
4254 if (down_interruptible(&ai->sem))
4255 return ERROR;
4256 if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
4257 txFid = ERROR;
4258 goto done;
4259 }
4260 if ( (rsp.status & 0xFF00) != 0) {
4261 txFid = ERROR;
4262 goto done;
4263 }
4264
4265
4266
4267 while (((IN4500(ai, EVSTAT) & EV_ALLOC) == 0) && --loop);
4268 if (!loop) {
4269 txFid = ERROR;
4270 goto done;
4271 }
4272
4273
4274 txFid = IN4500(ai, TXALLOCFID);
4275 OUT4500(ai, EVACK, EV_ALLOC);
4276
4277
4278
4279
4280
4281
4282 if (raw)
4283 txControl = cpu_to_le16(TXCTL_TXOK | TXCTL_TXEX | TXCTL_802_11
4284 | TXCTL_ETHERNET | TXCTL_NORELEASE);
4285 else
4286 txControl = cpu_to_le16(TXCTL_TXOK | TXCTL_TXEX | TXCTL_802_3
4287 | TXCTL_ETHERNET | TXCTL_NORELEASE);
4288 if (bap_setup(ai, txFid, 0x0008, BAP1) != SUCCESS)
4289 txFid = ERROR;
4290 else
4291 bap_write(ai, &txControl, sizeof(txControl), BAP1);
4292
4293done:
4294 up(&ai->sem);
4295
4296 return txFid;
4297}
4298
4299
4300
4301
4302static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket)
4303{
4304 __le16 payloadLen;
4305 Cmd cmd;
4306 Resp rsp;
4307 int miclen = 0;
4308 u16 txFid = len;
4309 MICBuffer pMic;
4310
4311 len >>= 16;
4312
4313 if (len <= ETH_ALEN * 2) {
4314 airo_print_warn(ai->dev->name, "Short packet %d", len);
4315 return ERROR;
4316 }
4317 len -= ETH_ALEN * 2;
4318
4319 if (test_bit(FLAG_MIC_CAPABLE, &ai->flags) && ai->micstats.enabled &&
4320 (ntohs(((__be16 *)pPacket)[6]) != 0x888E)) {
4321 if (encapsulate(ai,(etherHead *)pPacket,&pMic,len) != SUCCESS)
4322 return ERROR;
4323 miclen = sizeof(pMic);
4324 }
4325
4326
4327 if (bap_setup(ai, txFid, 0x0036, BAP1) != SUCCESS) return ERROR;
4328
4329
4330 payloadLen = cpu_to_le16(len + miclen);
4331 bap_write(ai, &payloadLen, sizeof(payloadLen),BAP1);
4332 bap_write(ai, (__le16*)pPacket, sizeof(etherHead), BAP1);
4333 if (miclen)
4334 bap_write(ai, (__le16*)&pMic, miclen, BAP1);
4335 bap_write(ai, (__le16*)(pPacket + sizeof(etherHead)), len, BAP1);
4336
4337 memset( &cmd, 0, sizeof( cmd ) );
4338 cmd.cmd = CMD_TRANSMIT;
4339 cmd.parm0 = txFid;
4340 if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
4341 if ( (rsp.status & 0xFF00) != 0) return ERROR;
4342 return SUCCESS;
4343}
4344
4345static int transmit_802_11_packet(struct airo_info *ai, int len, char *pPacket)
4346{
4347 __le16 fc, payloadLen;
4348 Cmd cmd;
4349 Resp rsp;
4350 int hdrlen;
4351 static u8 tail[(30-10) + 2 + 6] = {[30-10] = 6};
4352
4353 u16 txFid = len;
4354 len >>= 16;
4355
4356 fc = *(__le16*)pPacket;
4357 hdrlen = header_len(fc);
4358
4359 if (len < hdrlen) {
4360 airo_print_warn(ai->dev->name, "Short packet %d", len);
4361 return ERROR;
4362 }
4363
4364
4365
4366 if (bap_setup(ai, txFid, 6, BAP1) != SUCCESS) return ERROR;
4367
4368
4369 payloadLen = cpu_to_le16(len-hdrlen);
4370 bap_write(ai, &payloadLen, sizeof(payloadLen),BAP1);
4371 if (bap_setup(ai, txFid, 0x0014, BAP1) != SUCCESS) return ERROR;
4372 bap_write(ai, (__le16 *)pPacket, hdrlen, BAP1);
4373 bap_write(ai, (__le16 *)(tail + (hdrlen - 10)), 38 - hdrlen, BAP1);
4374
4375 bap_write(ai, (__le16 *)(pPacket + hdrlen), len - hdrlen, BAP1);
4376
4377 memset( &cmd, 0, sizeof( cmd ) );
4378 cmd.cmd = CMD_TRANSMIT;
4379 cmd.parm0 = txFid;
4380 if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
4381 if ( (rsp.status & 0xFF00) != 0) return ERROR;
4382 return SUCCESS;
4383}
4384
4385
4386
4387
4388
4389
4390static ssize_t proc_read( struct file *file,
4391 char __user *buffer,
4392 size_t len,
4393 loff_t *offset);
4394
4395static ssize_t proc_write( struct file *file,
4396 const char __user *buffer,
4397 size_t len,
4398 loff_t *offset );
4399static int proc_close( struct inode *inode, struct file *file );
4400
4401static int proc_stats_open( struct inode *inode, struct file *file );
4402static int proc_statsdelta_open( struct inode *inode, struct file *file );
4403static int proc_status_open( struct inode *inode, struct file *file );
4404static int proc_SSID_open( struct inode *inode, struct file *file );
4405static int proc_APList_open( struct inode *inode, struct file *file );
4406static int proc_BSSList_open( struct inode *inode, struct file *file );
4407static int proc_config_open( struct inode *inode, struct file *file );
4408static int proc_wepkey_open( struct inode *inode, struct file *file );
4409
4410static const struct file_operations proc_statsdelta_ops = {
4411 .owner = THIS_MODULE,
4412 .read = proc_read,
4413 .open = proc_statsdelta_open,
4414 .release = proc_close
4415};
4416
4417static const struct file_operations proc_stats_ops = {
4418 .owner = THIS_MODULE,
4419 .read = proc_read,
4420 .open = proc_stats_open,
4421 .release = proc_close
4422};
4423
4424static const struct file_operations proc_status_ops = {
4425 .owner = THIS_MODULE,
4426 .read = proc_read,
4427 .open = proc_status_open,
4428 .release = proc_close
4429};
4430
4431static const struct file_operations proc_SSID_ops = {
4432 .owner = THIS_MODULE,
4433 .read = proc_read,
4434 .write = proc_write,
4435 .open = proc_SSID_open,
4436 .release = proc_close
4437};
4438
4439static const struct file_operations proc_BSSList_ops = {
4440 .owner = THIS_MODULE,
4441 .read = proc_read,
4442 .write = proc_write,
4443 .open = proc_BSSList_open,
4444 .release = proc_close
4445};
4446
4447static const struct file_operations proc_APList_ops = {
4448 .owner = THIS_MODULE,
4449 .read = proc_read,
4450 .write = proc_write,
4451 .open = proc_APList_open,
4452 .release = proc_close
4453};
4454
4455static const struct file_operations proc_config_ops = {
4456 .owner = THIS_MODULE,
4457 .read = proc_read,
4458 .write = proc_write,
4459 .open = proc_config_open,
4460 .release = proc_close
4461};
4462
4463static const struct file_operations proc_wepkey_ops = {
4464 .owner = THIS_MODULE,
4465 .read = proc_read,
4466 .write = proc_write,
4467 .open = proc_wepkey_open,
4468 .release = proc_close
4469};
4470
4471static struct proc_dir_entry *airo_entry;
4472
4473struct proc_data {
4474 int release_buffer;
4475 int readlen;
4476 char *rbuffer;
4477 int writelen;
4478 int maxwritelen;
4479 char *wbuffer;
4480 void (*on_close) (struct inode *, struct file *);
4481};
4482
4483static int setup_proc_entry( struct net_device *dev,
4484 struct airo_info *apriv ) {
4485 struct proc_dir_entry *entry;
4486
4487 strcpy(apriv->proc_name,dev->name);
4488 apriv->proc_entry = create_proc_entry(apriv->proc_name,
4489 S_IFDIR|airo_perm,
4490 airo_entry);
4491 if (!apriv->proc_entry)
4492 goto fail;
4493 apriv->proc_entry->uid = proc_uid;
4494 apriv->proc_entry->gid = proc_gid;
4495
4496
4497 entry = proc_create_data("StatsDelta",
4498 S_IFREG | (S_IRUGO&proc_perm),
4499 apriv->proc_entry, &proc_statsdelta_ops, dev);
4500 if (!entry)
4501 goto fail_stats_delta;
4502 entry->uid = proc_uid;
4503 entry->gid = proc_gid;
4504
4505
4506 entry = proc_create_data("Stats",
4507 S_IFREG | (S_IRUGO&proc_perm),
4508 apriv->proc_entry, &proc_stats_ops, dev);
4509 if (!entry)
4510 goto fail_stats;
4511 entry->uid = proc_uid;
4512 entry->gid = proc_gid;
4513
4514
4515 entry = proc_create_data("Status",
4516 S_IFREG | (S_IRUGO&proc_perm),
4517 apriv->proc_entry, &proc_status_ops, dev);
4518 if (!entry)
4519 goto fail_status;
4520 entry->uid = proc_uid;
4521 entry->gid = proc_gid;
4522
4523
4524 entry = proc_create_data("Config",
4525 S_IFREG | proc_perm,
4526 apriv->proc_entry, &proc_config_ops, dev);
4527 if (!entry)
4528 goto fail_config;
4529 entry->uid = proc_uid;
4530 entry->gid = proc_gid;
4531
4532
4533 entry = proc_create_data("SSID",
4534 S_IFREG | proc_perm,
4535 apriv->proc_entry, &proc_SSID_ops, dev);
4536 if (!entry)
4537 goto fail_ssid;
4538 entry->uid = proc_uid;
4539 entry->gid = proc_gid;
4540
4541
4542 entry = proc_create_data("APList",
4543 S_IFREG | proc_perm,
4544 apriv->proc_entry, &proc_APList_ops, dev);
4545 if (!entry)
4546 goto fail_aplist;
4547 entry->uid = proc_uid;
4548 entry->gid = proc_gid;
4549
4550
4551 entry = proc_create_data("BSSList",
4552 S_IFREG | proc_perm,
4553 apriv->proc_entry, &proc_BSSList_ops, dev);
4554 if (!entry)
4555 goto fail_bsslist;
4556 entry->uid = proc_uid;
4557 entry->gid = proc_gid;
4558
4559
4560 entry = proc_create_data("WepKey",
4561 S_IFREG | proc_perm,
4562 apriv->proc_entry, &proc_wepkey_ops, dev);
4563 if (!entry)
4564 goto fail_wepkey;
4565 entry->uid = proc_uid;
4566 entry->gid = proc_gid;
4567
4568 return 0;
4569
4570fail_wepkey:
4571 remove_proc_entry("BSSList", apriv->proc_entry);
4572fail_bsslist:
4573 remove_proc_entry("APList", apriv->proc_entry);
4574fail_aplist:
4575 remove_proc_entry("SSID", apriv->proc_entry);
4576fail_ssid:
4577 remove_proc_entry("Config", apriv->proc_entry);
4578fail_config:
4579 remove_proc_entry("Status", apriv->proc_entry);
4580fail_status:
4581 remove_proc_entry("Stats", apriv->proc_entry);
4582fail_stats:
4583 remove_proc_entry("StatsDelta", apriv->proc_entry);
4584fail_stats_delta:
4585 remove_proc_entry(apriv->proc_name, airo_entry);
4586fail:
4587 return -ENOMEM;
4588}
4589
4590static int takedown_proc_entry( struct net_device *dev,
4591 struct airo_info *apriv ) {
4592 if ( !apriv->proc_entry->namelen ) return 0;
4593 remove_proc_entry("Stats",apriv->proc_entry);
4594 remove_proc_entry("StatsDelta",apriv->proc_entry);
4595 remove_proc_entry("Status",apriv->proc_entry);
4596 remove_proc_entry("Config",apriv->proc_entry);
4597 remove_proc_entry("SSID",apriv->proc_entry);
4598 remove_proc_entry("APList",apriv->proc_entry);
4599 remove_proc_entry("BSSList",apriv->proc_entry);
4600 remove_proc_entry("WepKey",apriv->proc_entry);
4601 remove_proc_entry(apriv->proc_name,airo_entry);
4602 return 0;
4603}
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617static ssize_t proc_read( struct file *file,
4618 char __user *buffer,
4619 size_t len,
4620 loff_t *offset )
4621{
4622 struct proc_data *priv = file->private_data;
4623
4624 if (!priv->rbuffer)
4625 return -EINVAL;
4626
4627 return simple_read_from_buffer(buffer, len, offset, priv->rbuffer,
4628 priv->readlen);
4629}
4630
4631
4632
4633
4634
4635static ssize_t proc_write( struct file *file,
4636 const char __user *buffer,
4637 size_t len,
4638 loff_t *offset )
4639{
4640 loff_t pos = *offset;
4641 struct proc_data *priv = (struct proc_data*)file->private_data;
4642
4643 if (!priv->wbuffer)
4644 return -EINVAL;
4645
4646 if (pos < 0)
4647 return -EINVAL;
4648 if (pos >= priv->maxwritelen)
4649 return 0;
4650 if (len > priv->maxwritelen - pos)
4651 len = priv->maxwritelen - pos;
4652 if (copy_from_user(priv->wbuffer + pos, buffer, len))
4653 return -EFAULT;
4654 if ( pos + len > priv->writelen )
4655 priv->writelen = len + file->f_pos;
4656 *offset = pos + len;
4657 return len;
4658}
4659
4660static int proc_status_open(struct inode *inode, struct file *file)
4661{
4662 struct proc_data *data;
4663 struct proc_dir_entry *dp = PDE(inode);
4664 struct net_device *dev = dp->data;
4665 struct airo_info *apriv = dev->ml_priv;
4666 CapabilityRid cap_rid;
4667 StatusRid status_rid;
4668 u16 mode;
4669 int i;
4670
4671 if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
4672 return -ENOMEM;
4673 data = (struct proc_data *)file->private_data;
4674 if ((data->rbuffer = kmalloc( 2048, GFP_KERNEL )) == NULL) {
4675 kfree (file->private_data);
4676 return -ENOMEM;
4677 }
4678
4679 readStatusRid(apriv, &status_rid, 1);
4680 readCapabilityRid(apriv, &cap_rid, 1);
4681
4682 mode = le16_to_cpu(status_rid.mode);
4683
4684 i = sprintf(data->rbuffer, "Status: %s%s%s%s%s%s%s%s%s\n",
4685 mode & 1 ? "CFG ": "",
4686 mode & 2 ? "ACT ": "",
4687 mode & 0x10 ? "SYN ": "",
4688 mode & 0x20 ? "LNK ": "",
4689 mode & 0x40 ? "LEAP ": "",
4690 mode & 0x80 ? "PRIV ": "",
4691 mode & 0x100 ? "KEY ": "",
4692 mode & 0x200 ? "WEP ": "",
4693 mode & 0x8000 ? "ERR ": "");
4694 sprintf( data->rbuffer+i, "Mode: %x\n"
4695 "Signal Strength: %d\n"
4696 "Signal Quality: %d\n"
4697 "SSID: %-.*s\n"
4698 "AP: %-.16s\n"
4699 "Freq: %d\n"
4700 "BitRate: %dmbs\n"
4701 "Driver Version: %s\n"
4702 "Device: %s\nManufacturer: %s\nFirmware Version: %s\n"
4703 "Radio type: %x\nCountry: %x\nHardware Version: %x\n"
4704 "Software Version: %x\nSoftware Subversion: %x\n"
4705 "Boot block version: %x\n",
4706 le16_to_cpu(status_rid.mode),
4707 le16_to_cpu(status_rid.normalizedSignalStrength),
4708 le16_to_cpu(status_rid.signalQuality),
4709 le16_to_cpu(status_rid.SSIDlen),
4710 status_rid.SSID,
4711 status_rid.apName,
4712 le16_to_cpu(status_rid.channel),
4713 le16_to_cpu(status_rid.currentXmitRate) / 2,
4714 version,
4715 cap_rid.prodName,
4716 cap_rid.manName,
4717 cap_rid.prodVer,
4718 le16_to_cpu(cap_rid.radioType),
4719 le16_to_cpu(cap_rid.country),
4720 le16_to_cpu(cap_rid.hardVer),
4721 le16_to_cpu(cap_rid.softVer),
4722 le16_to_cpu(cap_rid.softSubVer),
4723 le16_to_cpu(cap_rid.bootBlockVer));
4724 data->readlen = strlen( data->rbuffer );
4725 return 0;
4726}
4727
4728static int proc_stats_rid_open(struct inode*, struct file*, u16);
4729static int proc_statsdelta_open( struct inode *inode,
4730 struct file *file ) {
4731 if (file->f_mode&FMODE_WRITE) {
4732 return proc_stats_rid_open(inode, file, RID_STATSDELTACLEAR);
4733 }
4734 return proc_stats_rid_open(inode, file, RID_STATSDELTA);
4735}
4736
4737static int proc_stats_open( struct inode *inode, struct file *file ) {
4738 return proc_stats_rid_open(inode, file, RID_STATS);
4739}
4740
4741static int proc_stats_rid_open( struct inode *inode,
4742 struct file *file,
4743 u16 rid )
4744{
4745 struct proc_data *data;
4746 struct proc_dir_entry *dp = PDE(inode);
4747 struct net_device *dev = dp->data;
4748 struct airo_info *apriv = dev->ml_priv;
4749 StatsRid stats;
4750 int i, j;
4751 __le32 *vals = stats.vals;
4752 int len;
4753
4754 if ((file->private_data = kzalloc(sizeof(struct proc_data ), GFP_KERNEL)) == NULL)
4755 return -ENOMEM;
4756 data = (struct proc_data *)file->private_data;
4757 if ((data->rbuffer = kmalloc( 4096, GFP_KERNEL )) == NULL) {
4758 kfree (file->private_data);
4759 return -ENOMEM;
4760 }
4761
4762 readStatsRid(apriv, &stats, rid, 1);
4763 len = le16_to_cpu(stats.len);
4764
4765 j = 0;
4766 for(i=0; statsLabels[i]!=(char *)-1 && i*4<len; i++) {
4767 if (!statsLabels[i]) continue;
4768 if (j+strlen(statsLabels[i])+16>4096) {
4769 airo_print_warn(apriv->dev->name,
4770 "Potentially disasterous buffer overflow averted!");
4771 break;
4772 }
4773 j+=sprintf(data->rbuffer+j, "%s: %u\n", statsLabels[i],
4774 le32_to_cpu(vals[i]));
4775 }
4776 if (i*4 >= len) {
4777 airo_print_warn(apriv->dev->name, "Got a short rid");
4778 }
4779 data->readlen = j;
4780 return 0;
4781}
4782
4783static int get_dec_u16( char *buffer, int *start, int limit ) {
4784 u16 value;
4785 int valid = 0;
4786 for( value = 0; buffer[*start] >= '0' &&
4787 buffer[*start] <= '9' &&
4788 *start < limit; (*start)++ ) {
4789 valid = 1;
4790 value *= 10;
4791 value += buffer[*start] - '0';
4792 }
4793 if ( !valid ) return -1;
4794 return value;
4795}
4796
4797static int airo_config_commit(struct net_device *dev,
4798 struct iw_request_info *info, void *zwrq,
4799 char *extra);
4800
4801static inline int sniffing_mode(struct airo_info *ai)
4802{
4803 return le16_to_cpu(ai->config.rmode & RXMODE_MASK) >=
4804 le16_to_cpu(RXMODE_RFMON);
4805}
4806
4807static void proc_config_on_close(struct inode *inode, struct file *file)
4808{
4809 struct proc_data *data = file->private_data;
4810 struct proc_dir_entry *dp = PDE(inode);
4811 struct net_device *dev = dp->data;
4812 struct airo_info *ai = dev->ml_priv;
4813 char *line;
4814
4815 if ( !data->writelen ) return;
4816
4817 readConfigRid(ai, 1);
4818 set_bit (FLAG_COMMIT, &ai->flags);
4819
4820 line = data->wbuffer;
4821 while( line[0] ) {
4822
4823 if ( !strncmp( line, "Mode: ", 6 ) ) {
4824 line += 6;
4825 if (sniffing_mode(ai))
4826 set_bit (FLAG_RESET, &ai->flags);
4827 ai->config.rmode &= ~RXMODE_FULL_MASK;
4828 clear_bit (FLAG_802_11, &ai->flags);
4829 ai->config.opmode &= ~MODE_CFG_MASK;
4830 ai->config.scanMode = SCANMODE_ACTIVE;
4831 if ( line[0] == 'a' ) {
4832 ai->config.opmode |= MODE_STA_IBSS;
4833 } else {
4834 ai->config.opmode |= MODE_STA_ESS;
4835 if ( line[0] == 'r' ) {
4836 ai->config.rmode |= RXMODE_RFMON | RXMODE_DISABLE_802_3_HEADER;
4837 ai->config.scanMode = SCANMODE_PASSIVE;
4838 set_bit (FLAG_802_11, &ai->flags);
4839 } else if ( line[0] == 'y' ) {
4840 ai->config.rmode |= RXMODE_RFMON_ANYBSS | RXMODE_DISABLE_802_3_HEADER;
4841 ai->config.scanMode = SCANMODE_PASSIVE;
4842 set_bit (FLAG_802_11, &ai->flags);
4843 } else if ( line[0] == 'l' )
4844 ai->config.rmode |= RXMODE_LANMON;
4845 }
4846 set_bit (FLAG_COMMIT, &ai->flags);
4847 }
4848
4849
4850 else if (!strncmp(line,"Radio: ", 7)) {
4851 line += 7;
4852 if (!strncmp(line,"off",3)) {
4853 set_bit (FLAG_RADIO_OFF, &ai->flags);
4854 } else {
4855 clear_bit (FLAG_RADIO_OFF, &ai->flags);
4856 }
4857 }
4858
4859 else if ( !strncmp( line, "NodeName: ", 10 ) ) {
4860 int j;
4861
4862 line += 10;
4863 memset( ai->config.nodeName, 0, 16 );
4864
4865 for( j = 0; j < 16 && line[j] != '\n'; j++ ) {
4866 ai->config.nodeName[j] = line[j];
4867 }
4868 set_bit (FLAG_COMMIT, &ai->flags);
4869 }
4870
4871
4872 else if ( !strncmp( line, "PowerMode: ", 11 ) ) {
4873 line += 11;
4874 if ( !strncmp( line, "PSPCAM", 6 ) ) {
4875 ai->config.powerSaveMode = POWERSAVE_PSPCAM;
4876 set_bit (FLAG_COMMIT, &ai->flags);
4877 } else if ( !strncmp( line, "PSP", 3 ) ) {
4878 ai->config.powerSaveMode = POWERSAVE_PSP;
4879 set_bit (FLAG_COMMIT, &ai->flags);
4880 } else {
4881 ai->config.powerSaveMode = POWERSAVE_CAM;
4882 set_bit (FLAG_COMMIT, &ai->flags);
4883 }
4884 } else if ( !strncmp( line, "DataRates: ", 11 ) ) {
4885 int v, i = 0, k = 0;
4886
4887
4888 line += 11;
4889 while((v = get_dec_u16(line, &i, 3))!=-1) {
4890 ai->config.rates[k++] = (u8)v;
4891 line += i + 1;
4892 i = 0;
4893 }
4894 set_bit (FLAG_COMMIT, &ai->flags);
4895 } else if ( !strncmp( line, "Channel: ", 9 ) ) {
4896 int v, i = 0;
4897 line += 9;
4898 v = get_dec_u16(line, &i, i+3);
4899 if ( v != -1 ) {
4900 ai->config.channelSet = cpu_to_le16(v);
4901 set_bit (FLAG_COMMIT, &ai->flags);
4902 }
4903 } else if ( !strncmp( line, "XmitPower: ", 11 ) ) {
4904 int v, i = 0;
4905 line += 11;
4906 v = get_dec_u16(line, &i, i+3);
4907 if ( v != -1 ) {
4908 ai->config.txPower = cpu_to_le16(v);
4909 set_bit (FLAG_COMMIT, &ai->flags);
4910 }
4911 } else if ( !strncmp( line, "WEP: ", 5 ) ) {
4912 line += 5;
4913 switch( line[0] ) {
4914 case 's':
4915 ai->config.authType = AUTH_SHAREDKEY;
4916 break;
4917 case 'e':
4918 ai->config.authType = AUTH_ENCRYPT;
4919 break;
4920 default:
4921 ai->config.authType = AUTH_OPEN;
4922 break;
4923 }
4924 set_bit (FLAG_COMMIT, &ai->flags);
4925 } else if ( !strncmp( line, "LongRetryLimit: ", 16 ) ) {
4926 int v, i = 0;
4927
4928 line += 16;
4929 v = get_dec_u16(line, &i, 3);
4930 v = (v<0) ? 0 : ((v>255) ? 255 : v);
4931 ai->config.longRetryLimit = cpu_to_le16(v);
4932 set_bit (FLAG_COMMIT, &ai->flags);
4933 } else if ( !strncmp( line, "ShortRetryLimit: ", 17 ) ) {
4934 int v, i = 0;
4935