xref: /plan9/sys/src/9/pc/wavelan.h (revision 7c881178665bb2c60319a9d7087bda946bd96483)
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