plan 9 kernel history: overview | file list | diff list

2003/0311/bitsy/wavelan.c (diff list | history)

2003/0201/sys/src/9/bitsy/wavelan.c:1,52003/0311/sys/src/9/bitsy/wavelan.c:1,5 (short | long | prev | next)
2002/1112    
/* 
	Lucent Wavelan IEEE 802.11 pcmcia.  
2003/0311    
	Lucent Wavelan IEEE 802.11 pcmcia. 
2002/1112    
	There is almost no documentation for the card. 
	the driver is done using both the FreeBSD, Linux and 
	original Plan 9 drivers as `documentation'. 
2003/0201/sys/src/9/bitsy/wavelan.c:28,332003/0311/sys/src/9/bitsy/wavelan.c:28,38
2002/1112    
#include "etherif.h" 
#include "wavelan.h" 
 
2003/0311    
enum 
{ 
	MSperTick=	50,	/* ms between ticks of kproc */ 
}; 
 
2002/1112    
/* 
 * When we're using a PCI device and memory-mapped I/O,  
 * the registers are spaced out as though each takes 32 bits, 
2003/0201/sys/src/9/bitsy/wavelan.c:381,3872003/0311/sys/src/9/bitsy/wavelan.c:386,392
2002/1112    
 
	ltv_outs(ctlr, WTyp_Prom, (ether->prom?1:0)); 
 
	if(ctlr->hascrypt){ 
2003/0311    
	if(ctlr->hascrypt && ctlr->crypt){ 
2002/1112    
		ltv_outs(ctlr, WTyp_Crypt, ctlr->crypt); 
		ltv_outs(ctlr, WTyp_TxKey, ctlr->txkey); 
		w_outltv(ctlr, &ctlr->keys); 
2003/0201/sys/src/9/bitsy/wavelan.c:528,5582003/0311/sys/src/9/bitsy/wavelan.c:533,623
2002/1112    
		ctlr->ntx++; 
} 
 
static int 
w_stats(Ctlr* ctlr) 
2003/0311    
/* save the stats info in the ctlr struct */ 
static void 
w_stats(Ctlr* ctlr, int len) 
2002/1112    
{ 
	int i, rc, sp; 
	Wltv ltv; 
2003/0311    
	int i, rc; 
2002/1112    
	ulong* p = (ulong*)&ctlr->WStats; 
	ulong* pend = (ulong*)&ctlr->end; 
 
2003/0311    
	for (i = 0; i < len && p < pend; i++){ 
		rc = csr_ins(ctlr, WR_Data1); 
		if(rc > 0xf000) 
			rc = ~rc & 0xffff; 
		p[i] += rc; 
	} 
} 
 
/* send the base station scan info to any readers */ 
static void 
w_scaninfo(Ether* ether, Ctlr *ctlr, int len) 
{ 
	int i, j; 
	Netfile **ep, *f, **fp; 
	Block *bp; 
	WScan *wsp; 
 
	for (i = 0; i < len ; i++) 
		ctlr->scanbuf[i] = csr_ins(ctlr, WR_Data1); 
 
	len *= 2; 
	i = ether->scan; 
	ep = ðer->f[Ntypes]; 
	for(fp = ether->f; fp < ep && i > 0; fp++){ 
		f = *fp; 
		if(f == nil || f->scan == 0) 
			continue; 
 
		bp = iallocb(2048); 
		if(bp == nil) 
			break; 
		for(j = 0; j < len/(2*25); j++){ 
			wsp = (WScan*)(&ctlr->scanbuf[j*25]); 
			if(wsp->ssid_len > 32) 
				wsp->ssid_len = 32; 
			bp->wp += snprint((char*)bp->wp, 2048, 
				"ssid=%.*s;bssid=%E;signal=%d;noise=%d;chan=%d%s\n", 
				wsp->ssid_len, wsp->ssid, wsp->bssid, wsp->signal, 
				wsp->noise, wsp->chan, (wsp->capinfo&(1<<4))?";wep":""); 
		} 
		qpass(f->in, bp); 
		i--; 
	} 
} 
 
static int 
w_info(Ether *ether, Ctlr* ctlr) 
{ 
	int sp; 
	Wltv ltv; 
 
2002/1112    
	sp = csr_ins(ctlr, WR_InfoId); 
	ltv.len = ltv.type = 0; 
	w_read(ctlr, sp, 0, <v, 4); 
	if(ltv.type == WTyp_Stats){ 
		ltv.len--; 
		for (i = 0; i < ltv.len && p < pend; i++){ 
			rc = csr_ins(ctlr, WR_Data1); 
			if(rc > 0xf000) 
				rc = ~rc & 0xffff; 
			p[i] += rc; 
		} 
2003/0311    
	ltv.len--; 
	switch(ltv.type){ 
	case WTyp_Stats: 
		w_stats(ctlr, ltv.len); 
2002/1112    
		return 0; 
2003/0311    
	case WTyp_Scan: 
		w_scaninfo(ether, ctlr, ltv.len); 
		return 0; 
2002/1112    
	} 
	return -1; 
} 
 
2003/0311    
/* set scanning interval */ 
2002/1112    
static void 
2003/0311    
w_scanbs(void *a, uint secs) 
{ 
	Ether *ether = a; 
	Ctlr* ctlr = (Ctlr*) ether->ctlr; 
 
	ctlr->scanticks = secs*(1000/MSperTick); 
} 
 
static void 
2002/1112    
w_intr(Ether *ether) 
{ 
	int rc, txid; 
2003/0201/sys/src/9/bitsy/wavelan.c:588,5942003/0311/sys/src/9/bitsy/wavelan.c:653,659
2002/1112    
	} 
	if(rc & WInfoEv){ 
		ctlr->ninfo++; 
		w_stats(ctlr); 
2003/0311    
		w_info(ether, ctlr); 
2002/1112    
		csr_ack(ctlr, WInfoEv); 
	} 
	if(rc & WTxErrEv){ 
2003/0201/sys/src/9/bitsy/wavelan.c:614,6202003/0311/sys/src/9/bitsy/wavelan.c:679,685
2002/1112    
 
	ctlr->timerproc = up; 
	for(;;){ 
		tsleep(&ctlr->timer, return0, 0, 50); 
2003/0311    
		tsleep(&ctlr->timer, return0, 0, MSperTick); 
2002/1112    
		ctlr = (Ctlr*)ether->ctlr; 
		if(ctlr == 0) 
			break; 
2003/0201/sys/src/9/bitsy/wavelan.c:656,6612003/0311/sys/src/9/bitsy/wavelan.c:721,730
2002/1112    
			if((ctlr->ticks % 120) == 0) 
			if(ctlr->txbusy == 0) 
2003/0201    
				w_cmd(ctlr, WCmdEnquire, WTyp_Stats); 
2003/0311    
			if(ctlr->scanticks > 0) 
			if((ctlr->ticks % ctlr->scanticks) == 0) 
			if(ctlr->txbusy == 0) 
				w_cmd(ctlr, WCmdEnquire, WTyp_Scan); 
2002/1112    
		} 
		iunlock(ctlr); 
	} 
2003/0201/sys/src/9/bitsy/wavelan.c:793,7992003/0311/sys/src/9/bitsy/wavelan.c:862,868
2002/1112    
	k = ((ctlr->state & Attached) ? "attached" : "not attached"); 
	PRINTSTAT("Card %s", k); 
	k = ((ctlr->state & Power) ? "on" : "off"); 
	PRINTSTAT("PCardower %s", k); 
2003/0311    
	PRINTSTAT(", power %s", k); 
2002/1112    
	k = ((ctlr->txbusy)? ", txbusy" : ""); 
	PRINTSTAT("%s\n", k); 
 
2003/0201/sys/src/9/bitsy/wavelan.c:823,8292003/0311/sys/src/9/bitsy/wavelan.c:892,898
2002/1112    
	PRINTSTAT("Channel: %d\n", ltv_ins(ctlr, WTyp_Chan)); 
	PRINTSTAT("AP density: %d\n", ltv_ins(ctlr, WTyp_ApDens)); 
	PRINTSTAT("Promiscuous mode: %d\n", ltv_ins(ctlr, WTyp_Prom)); 
	if(i == 3) 
2003/0311    
	if(i == WPTypeAdHoc) 
2002/1112    
		PRINTSTAT("SSID name: %s\n", ltv_inname(ctlr, WTyp_NetName)); 
	else { 
		Wltv ltv; 
2003/0201/sys/src/9/bitsy/wavelan.c:890,9002003/0311/sys/src/9/bitsy/wavelan.c:959,966
2002/1112    
	Cmdbuf *cb; 
 
	r = 0; 
	print("here\n"); 
	cb = parsecmd(buf, n); 
	for (i = 0; i < cb->nf; i++) 
		iprint("cb %s\n", cb->f[i]); 
 
2003/0311    
	cb = parsecmd(buf, n); 
2002/1112    
	if(cb->nf < 2) 
		r = -1; 
	else if(cistrcmp(cb->f[0], "essid") == 0){ 
2003/0201/sys/src/9/bitsy/wavelan.c:902,9082003/0311/sys/src/9/bitsy/wavelan.c:968,974
2002/1112    
			p = ""; 
		else 
			p = cb->f[1]; 
		if(ctlr->ptype == 3){ 
2003/0311    
		if(ctlr->ptype == WPTypeAdHoc){ 
2002/1112    
			memset(ctlr->netname, 0, sizeof(ctlr->netname)); 
			strncpy(ctlr->netname, p, WNameLen); 
		} 
2003/0201/sys/src/9/bitsy/wavelan.c:1128,11382003/0311/sys/src/9/bitsy/wavelan.c:1194,1205
2002/1112    
	ether->power = w_power; 
	ether->promiscuous = w_promiscuous; 
	ether->multicast = w_multicast; 
2003/0311    
	ether->scanbs = w_scanbs; 
2002/1112    
	ether->arg = ether; 
 
	iprint("#l%d: irq %ld port %lx type %s", 
2003/0311    
	DEBUG("#l%d: irq %ld port %lx type %s", 
2002/1112    
		ether->ctlrno, ether->intnum, ether->ports[0].port,	ether->type); 
	iprint(" %2.2uX%2.2uX%2.2uX%2.2uX%2.2uX%2.2uX\n", 
2003/0311    
	DEBUG(" %2.2uX%2.2uX%2.2uX%2.2uX%2.2uX%2.2uX\n", 
2002/1112    
		ether->ea[0], ether->ea[1], ether->ea[2], 
		ether->ea[3], ether->ea[4], ether->ea[5]); 
 
2003/0201/sys/src/9/bitsy/wavelan.c:1143,11502003/0311/sys/src/9/bitsy/wavelan.c:1210,1217
2002/1112    
	"WaveLAN/IEEE", 
	"TrueMobile 1150", 
	"Instant Wireless ; Network PC CARD", 
2003/0311    
	"Instant Wireless Network PC Card", 
2002/1112    
	"Avaya Wireless PC Card", 
	"AirLancer MC-11", 
	nil, 
}; 
                 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)