1 #define DEBUG if(1){}else print 2 3 #define SEEKEYS 0 4 5 // Lucent's Length-Type-Value records to talk to the wavelan. 6 // most operational parameters are read/set using this. 7 enum 8 { 9 WTyp_Stats = 0xf100, 10 WTyp_Scan = 0xf101, 11 WTyp_Link = 0xf200, 12 WTyp_Ptype = 0xfc00, 13 WTyp_Mac = 0xfc01, 14 WTyp_WantName = 0xfc02, 15 WTyp_Chan = 0xfc03, 16 WTyp_NetName = 0xfc04, 17 WTyp_ApDens = 0xfc06, 18 WTyp_MaxLen = 0xfc07, 19 WTyp_PM = 0xfc09, 20 WTyp_PMWait = 0xfc0c, 21 WTyp_NodeName = 0xfc0e, 22 WTyp_Crypt = 0xfc20, 23 WTyp_XClear = 0xfc22, 24 WTyp_CreateIBSS = 0xfc81, 25 WTyp_RtsThres = 0xfc83, 26 WTyp_TxRate = 0xfc84, 27 WTx1Mbps = 0x0, 28 WTx2Mbps = 0x1, 29 WTxAuto = 0x3, 30 WTyp_Prom = 0xfc85, 31 WTyp_Keys = 0xfcb0, 32 WTyp_TxKey = 0xfcb1, 33 WTyp_StationID = 0xfd20, 34 WTyp_CurName = 0xfd41, 35 WTyp_BaseID = 0xfd42, // ID of the currently connected-to base station 36 WTyp_CurTxRate = 0xfd44, // Current TX rate 37 WTyp_HasCrypt = 0xfd4f, 38 WTyp_Tick = 0xfce0, 39 }; 40 41 // Controller 42 enum 43 { 44 WDfltIRQ = 3, // default irq 45 WDfltIOB = 0x180, // default IO base 46 47 WIOLen = 0x40, // Hermes IO length 48 49 WTmOut = 65536, // Cmd time out 50 51 WPTypeManaged = 1, 52 WPTypeWDS = 2, 53 WPTypeAdHoc = 3, 54 WDfltPType = WPTypeManaged, 55 56 WDfltApDens = 1, 57 WDfltRtsThres = 2347, // == disabled 58 WDfltTxRate = WTxAuto, // 2Mbps 59 60 WMaxLen = 2304, 61 WNameLen = 32, 62 63 WNKeys = 4, 64 WKeyLen = 14, 65 WMinKeyLen = 5, 66 WMaxKeyLen = 13, 67 68 // Wavelan hermes registers 69 WR_Cmd = 0x00, 70 WCmdIni = 0x0000, 71 WCmdEna = 0x0001, 72 WCmdDis = 0x0002, 73 WCmdTx = 0x000b, 74 WCmdMalloc = 0x000a, 75 WCmdEnquire = 0x0011, 76 WCmdMsk = 0x003f, 77 WCmdAccRd = 0x0021, 78 WCmdReclaim = 0x0100, 79 WCmdAccWr = 0x0121, 80 WCmdBusy = 0x8000, 81 WR_Parm0 = 0x02, 82 WR_Parm1 = 0x04, 83 WR_Parm2 = 0x06, 84 WR_Sts = 0x08, 85 WR_InfoId = 0x10, 86 WR_Sel0 = 0x18, 87 WR_Sel1 = 0x1a, 88 WR_Off0 = 0x1c, 89 WR_Off1 = 0x1e, 90 WBusyOff = 0x8000, 91 WErrOff = 0x4000, 92 WResSts = 0x7f00, 93 WR_RXId = 0x20, 94 WR_Alloc = 0x22, 95 WR_EvSts = 0x30, 96 WR_IntEna = 0x32, 97 WCmdEv = 0x0010, 98 WRXEv = 0x0001, 99 WTXEv = 0x0002, 100 WTxErrEv = 0x0004, 101 WAllocEv = 0x0008, 102 WInfoEv = 0x0080, 103 WIDropEv = 0x2000, 104 WTickEv = 0x8000, 105 WEvs = WRXEv|WTXEv|WAllocEv|WInfoEv|WIDropEv, 106 107 WR_EvAck = 0x34, 108 WR_Data0 = 0x36, 109 WR_Data1 = 0x38, 110 111 WR_PciCor = 0x26, 112 WR_PciHcr = 0x2E, 113 114 // Frame stuff 115 116 WF_Err = 0x0003, 117 WF_1042 = 0x2000, 118 WF_Tunnel = 0x4000, 119 WF_WMP = 0x6000, 120 121 WF_Data = 0x0008, 122 123 WSnapK1 = 0xaa, 124 WSnapK2 = 0x00, 125 WSnapCtlr = 0x03, 126 WSnap0 = (WSnapK1|(WSnapK1<<8)), 127 WSnap1 = (WSnapK2|(WSnapCtlr<<8)), 128 WSnapHdrLen = 6, 129 130 WF_802_11_Off = 0x44, 131 WF_802_3_Off = 0x2e, 132 133 }; 134 135 typedef struct Ctlr Ctlr; 136 typedef struct Wltv Wltv; 137 typedef struct WFrame WFrame; 138 typedef struct Stats Stats; 139 typedef struct WStats WStats; 140 typedef struct WScan WScan; 141 typedef struct WKey WKey; 142 143 struct WStats 144 { 145 ulong ntxuframes; // unicast frames 146 ulong ntxmframes; // multicast frames 147 ulong ntxfrags; // fragments 148 ulong ntxubytes; // unicast bytes 149 ulong ntxmbytes; // multicast bytes 150 ulong ntxdeferred; // deferred transmits 151 ulong ntxsretries; // single retries 152 ulong ntxmultiretries; // multiple retries 153 ulong ntxretrylimit; 154 ulong ntxdiscards; 155 ulong nrxuframes; // unicast frames 156 ulong nrxmframes; // multicast frames 157 ulong nrxfrags; // fragments 158 ulong nrxubytes; // unicast bytes 159 ulong nrxmbytes; // multicast bytes 160 ulong nrxfcserr; 161 ulong nrxdropnobuf; 162 ulong nrxdropnosa; 163 ulong nrxcantdecrypt; 164 ulong nrxmsgfrag; 165 ulong nrxmsgbadfrag; 166 ulong end; 167 }; 168 169 struct WScan 170 { 171 ushort chan; /* dss channel */ 172 ushort noise; /* average noise in the air */ 173 ushort signal; /* signal strength */ 174 uchar bssid[Eaddrlen]; /* MAC address of the ap */ 175 ushort interval; /* beacon transmit interval */ 176 ushort capinfo; /* capability bits (0-ess, 1-ibss, 4-privacy [wep]) */ 177 ushort ssid_len; /* ssid length */ 178 char ssid[WNameLen]; /* ssid (ap name) */ 179 }; 180 181 struct WFrame 182 { 183 ushort sts; 184 ushort rsvd0; 185 ushort rsvd1; 186 ushort qinfo; 187 ushort rsvd2; 188 ushort rsvd3; 189 ushort txctl; 190 ushort framectl; 191 ushort id; 192 uchar addr1[Eaddrlen]; 193 uchar addr2[Eaddrlen]; 194 uchar addr3[Eaddrlen]; 195 ushort seqctl; 196 uchar addr4[Eaddrlen]; 197 ushort dlen; 198 uchar dstaddr[Eaddrlen]; 199 uchar srcaddr[Eaddrlen]; 200 ushort len; 201 ushort dat[3]; 202 ushort type; 203 }; 204 205 struct WKey 206 { 207 ushort len; 208 char dat[WKeyLen]; 209 }; 210 211 struct Wltv 212 { 213 ushort len; 214 ushort type; 215 union 216 { 217 struct { 218 ushort val; 219 ushort pad; 220 }; 221 struct { 222 uchar addr[8]; 223 }; 224 struct { 225 ushort slen; 226 char s[WNameLen]; 227 }; 228 struct { 229 char name[WNameLen]; 230 }; 231 struct { 232 WKey keys[WNKeys]; 233 }; 234 }; 235 }; 236 237 // What the driver thinks. Not what the card thinks. 238 struct Stats 239 { 240 ulong nints; 241 ulong ndoubleint; 242 ulong nrx; 243 ulong ntx; 244 ulong ntxrq; 245 ulong nrxerr; 246 ulong ntxerr; 247 ulong nalloc; // allocation (reclaim) events 248 ulong ninfo; 249 ulong nidrop; 250 ulong nwatchdogs; // transmit time outs, actually 251 int ticks; 252 int tickintr; 253 int signal; 254 int noise; 255 }; 256 257 enum { 258 Attached = 0x01, 259 Power = 0x02, 260 }; 261 262 struct Ctlr 263 { 264 Lock; 265 266 int state; // Attached | Power 267 int slot; 268 int iob; 269 int createibss; 270 int ptype; 271 int apdensity; 272 int rtsthres; 273 int txbusy; 274 int txrate; 275 int txdid; 276 int txmid; 277 int txtmout; 278 int maxlen; 279 int chan; 280 int pmena; 281 int pmwait; 282 283 Proc *timerproc; 284 int scanticks; 285 286 char netname[WNameLen]; 287 char wantname[WNameLen]; 288 char nodename[WNameLen]; 289 WFrame txf; 290 uchar txbuf[1536]; 291 292 int hascrypt; // card has encryption 293 int crypt; // encryption off/on 294 int txkey; // transmit key 295 Wltv keys; // default keys 296 int xclear; // exclude clear packets off/on 297 298 int ctlrno; 299 300 ushort *mmb; 301 /* for PCI-based devices */ 302 Ctlr *next; 303 int active; 304 Pcidev *pcidev; 305 306 Stats; 307 WStats; 308 }; 309 310 extern char* wavenames[]; 311 312 void csr_outs(Ctlr*, int, ushort); 313 ushort csr_ins(Ctlr*, int); 314 void w_intdis(Ctlr*); 315 int w_cmd(Ctlr *, ushort, ushort); 316 void ltv_outs(Ctlr*, int, ushort); 317 int ltv_ins(Ctlr*, int); 318 int w_option(Ctlr*, char*, long); 319 int w_inltv(Ctlr*, Wltv*); 320 void w_attach(Ether*); 321 void w_interrupt(Ureg*,void*); 322 void w_transmit(Ether*); 323 long w_ifstat(Ether*, void*, long, ulong); 324 long w_ctl(Ether*, void*, long); 325 void w_promiscuous(void*, int); 326 void w_multicast(void*, uchar*, int); 327 int wavelanreset(Ether*, Ctlr*); 328