| 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,5 – 2003/0311/sys/src/9/bitsy/wavelan.c:1,5 (short | long | prev | next) | ||
| 2002/1112 | /* | |
| 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,33 – 2003/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,387 – 2003/0311/sys/src/9/bitsy/wavelan.c:386,392 | ||
| 2002/1112 | ltv_outs(ctlr, WTyp_Prom, (ether->prom?1:0)); | |
| 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,558 – 2003/0311/sys/src/9/bitsy/wavelan.c:533,623 | ||
| 2002/1112 | ctlr->ntx++; } | |
| 2003/0311 | /* save the stats info in the ctlr struct */ static void w_stats(Ctlr* ctlr, int len) | |
| 2002/1112 | { | |
| 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); | |
| 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,594 – 2003/0311/sys/src/9/bitsy/wavelan.c:653,659 | ||
| 2002/1112 | } if(rc & WInfoEv){ ctlr->ninfo++; | |
| 2003/0311 | w_info(ether, ctlr); | |
| 2002/1112 | csr_ack(ctlr, WInfoEv); } if(rc & WTxErrEv){ | |
| 2003/0201/sys/src/9/bitsy/wavelan.c:614,620 – 2003/0311/sys/src/9/bitsy/wavelan.c:679,685 | ||
| 2002/1112 | ctlr->timerproc = up; for(;;){ | |
| 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,661 – 2003/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,799 – 2003/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"); | |
| 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,829 – 2003/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)); | |
| 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,900 – 2003/0311/sys/src/9/bitsy/wavelan.c:959,966 | ||
| 2002/1112 | Cmdbuf *cb; r = 0; | |
| 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,908 – 2003/0311/sys/src/9/bitsy/wavelan.c:968,974 | ||
| 2002/1112 | p = ""; else p = cb->f[1]; | |
| 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,1138 – 2003/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; | |
| 2003/0311 | DEBUG("#l%d: irq %ld port %lx type %s", | |
| 2002/1112 | ether->ctlrno, ether->intnum, ether->ports[0].port, ether->type); | |
| 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,1150 – 2003/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, }; | |