From f84a76ce2b7ace61a7777259c1e4dbc2c55f6834 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 7 Sep 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-09-07 --- pc/devpccard.c | 31 ++++++++++++++++--------------- pc/etherwavelan.c | 34 ++++++++++++++++++++++------------ pc/sdata.c | 21 ++++----------------- pc/sdmylex.c | 4 +++- port/devsd.c | 11 ++++++++++- 5 files changed, 55 insertions(+), 46 deletions(-) diff --git a/pc/devpccard.c b/pc/devpccard.c index 88a49973d6a37ba7640ac8d24f7503bbe3cce514..5cce16036c7a852f8408b54b29f148e43f3f5e22 100644 --- a/pc/devpccard.c +++ b/pc/devpccard.c @@ -329,8 +329,8 @@ engine(cb_t *cb, int message) powerdown(cb); break; default: - print("#Y%d: Invalid message %s in SlotFull state\n", - (int)(cb - cbslots), messages[message]); + //print("#Y%d: Invalid message %s in SlotFull state\n", + // (int)(cb - cbslots), messages[message]); break; } break; @@ -453,8 +453,12 @@ interrupt(Ureg *, void *) if (event & SE_CCD) { cb->cb_regs[SocketEvent] |= SE_CCD; /* Ack interrupt */ - if (state & SE_CCD) - iengine(cb, CardEjected); + if (state & SE_CCD) { + if (cb->cb_state != SlotEmpty) { + print("#Y: take cardejected interrupt\n"); + iengine(cb, CardEjected); + } + } else iengine(cb, CardDetected); } @@ -525,11 +529,8 @@ devpccardlink(void) /* Don't really know what to do with this... */ i82365probe(cb, LegacyAddr, LegacyAddr + 1); - print("#Y%ld: %s, %.8ulX intl %d (%s%s)\n", cb - cbslots, - variant[i].r_name, baddr, pci->intl, - states[cb->cb_state], - (cb->cb_state == SlotEmpty)? "": - (cb->cb_type == PC16)? "PCMCIA": "CB"); + print("#Y%ld: %s, %.8ulX intl %d\n", cb - cbslots, + variant[i].r_name, baddr, pci->intl); } if (nslots == 0) @@ -564,7 +565,7 @@ powerup(cb_t *cb) if ((state = cb->cb_regs[SocketState]) & SS_PC16) { - print("#Y%ld: Probed a PC16 card, powering up card\n", cb - cbslots); + // print("#Y%ld: Probed a PC16 card, powering up card\n", cb - cbslots); cb->cb_type = PC16; memset(&cb->cb_linfo, 0, sizeof(pcminfo_t)); @@ -600,9 +601,9 @@ powerup(cb_t *cb) return 0; } - print("#Y%ld: card %spowered at %d volt\n", cb - cbslots, - (state & SS_POWER)? "": "not ", - (state & SS_3V)? 3: (state & SS_5V)? 5: -1); + //print("#Y%ld: card %spowered at %d volt\n", cb - cbslots, + // (state & SS_POWER)? "": "not ", + // (state & SS_3V)? 3: (state & SS_5V)? 5: -1); /* Power up the card * and make sure the secondary bus is not in reset. @@ -645,7 +646,7 @@ configure(cb_t *cb) int i; Pcidev *pci; - print("configuring slot %d (%s)\n", (int)(cb - cbslots), states[cb->cb_state]); + //print("configuring slot %d (%s)\n", (int)(cb - cbslots), states[cb->cb_state]); if (cb->cb_state == SlotConfigured) return; engine(cb, CardConfigured); @@ -882,7 +883,7 @@ pccard_pcmspecial(char *idstr, ISAConf *isa) } if (i == nslots) { - print("#Y: %s not found\n", idstr); + // print("#Y: %s not found\n", idstr); return -1; } diff --git a/pc/etherwavelan.c b/pc/etherwavelan.c index f8044a9231e39dc3631913944bf99a34fbb88ace..472b6cfa95880e1dec5df9301587c95530c73a48 100644 --- a/pc/etherwavelan.c +++ b/pc/etherwavelan.c @@ -29,7 +29,7 @@ #define DEBUG if(1)print -#define SEEKEYS 1 +#define SEEKEYS 0 typedef struct Ctlr Ctlr; typedef struct Wltv Wltv; @@ -114,7 +114,9 @@ enum WTyp_Prom = 0xfc85, WTyp_Keys = 0xfcb0, WTyp_TxKey = 0xfcb1, + WTyp_StationID = 0xfd20, WTyp_CurName = 0xfd41, + WTyp_BaseID = 0xfd42, // ID of the currently connected-to base station WTyp_CurTxRate = 0xfd44, // Current TX rate WTyp_HasCrypt = 0xfd4f, }; @@ -432,7 +434,10 @@ ltv_outstr(Ctlr* ctlr, int type, char* val) memset(<v, 0, sizeof(ltv)); ltv.len = (sizeof(ltv.type)+sizeof(ltv.slen)+sizeof(ltv.s))/2; ltv.type = type; + +// This should be ltv.slen = len; according to Axel Belinfante ltv.slen = (len+1) & ~1; + strncpy(ltv.s, val, len); w_outltv(ctlr, <v); } @@ -912,7 +917,7 @@ ifstat(Ether* ether, void* a, long n, ulong offset) k = ((ctlr->txbusy)? ", txbusy" : ""); PRINTSTAT("%s\n", k); - if (ctlr->txkey){ + if (ctlr->hascrypt){ PRINTSTR("Keys: "); for (i = 0; i < WNKeys; i++){ if (ctlr->keys.keys[i].len == 0) @@ -940,8 +945,16 @@ ifstat(Ether* ether, void* a, long n, ulong offset) PRINTSTAT("Promiscuous mode: %d\n", ltv_ins(ctlr, WTyp_Prom)); if(i == 3) PRINTSTAT("SSID name: %s\n", ltv_inname(ctlr, WTyp_NetName)); - else + else { + Wltv ltv; PRINTSTAT("Current name: %s\n", ltv_inname(ctlr, WTyp_CurName)); + ltv.type = WTyp_BaseID; + ltv.len = 4; + if (w_inltv(ctlr, <v)) + print("#l%d: unable to read base station mac addr\n", ether->ctlrno); + l += snprint(p+l, READSTR-l, "Base station: %2.2x%2.2x%2.2x%2.2x%2.2x%2.2x\n", + ltv.addr[0], ltv.addr[1], ltv.addr[2], ltv.addr[3], ltv.addr[4], ltv.addr[5]); + } PRINTSTAT("Net name: %s\n", ltv_inname(ctlr, WTyp_WantName)); PRINTSTAT("Node name: %s\n", ltv_inname(ctlr, WTyp_NodeName)); if (ltv_ins(ctlr, WTyp_HasCrypt) == 0) @@ -1168,11 +1181,6 @@ reset(Ether* ether) Ctlr* ctlr; char *p; - if (ether->ctlr){ - print("#l%d: only one card supported\n", ether->ctlrno); - return -1; - } - if((ctlr = malloc(sizeof(Ctlr))) == nil) return -1; @@ -1191,11 +1199,13 @@ reset(Ether* ether) } if ((ctlr->slot = pcmspecial("WaveLAN/IEEE", ether))<0){ - DEBUG("no wavelan found\n"); - goto abort; + if ((ctlr->slot = pcmspecial("TrueMobile 1150", ether))<0){ + DEBUG("no wavelan found\n"); + goto abort; + } } -// DEBUG("#l%d: port=0x%lx irq=%ld\n", -// ether->ctlrno, ether->port, ether->irq); + // DEBUG("#l%d: port=0x%lx irq=%ld\n", + // ether->ctlrno, ether->port, ether->irq); w_intdis(ctlr); if (w_cmd(ctlr,WCmdIni,0)){ diff --git a/pc/sdata.c b/pc/sdata.c index f3180a6a59a2a115e1cf1757862c83084aefe12f..b8a230b65ed68b0394ae898cae238f0c019b4417 100644 --- a/pc/sdata.c +++ b/pc/sdata.c @@ -756,21 +756,6 @@ tryedd1: goto release; } memset(sdev, 0, sizeof(SDev)); - if ((sdev->unit = (SDunit **)malloc(2 * sizeof(SDunit *))) == nil) { - free(sdev); - free(ctlr); - free(drive); - goto release; - } - memset(sdev->unit, 0, sizeof(SDunit *) * 2); - if ((sdev->unitflg = (int *)malloc(2 * sizeof(int))) == nil) { - free(sdev->unit); - free(sdev); - free(ctlr); - free(drive); - goto release; - } - memset(sdev->unitflg, 0, sizeof(int) * 2); drive->ctlr = ctlr; if(dev == Dev0){ ctlr->drive[0] = drive; @@ -825,8 +810,10 @@ ataclear(SDev *sdev) free(ctlr->drive[1]); if (sdev->name) free(sdev->name); - free(sdev->unitflg); - free(sdev->unit); + if (sdev->unitflg) + free(sdev->unitflg); + if (sdev->unit) + free(sdev->unit); free(ctlr); free(sdev); } diff --git a/pc/sdmylex.c b/pc/sdmylex.c index 14099e6c7dde2ac25d91d4e910f055128f48c391..32182a69c8676d72ee46f1d4ff3f1c7a011404ff 100644 --- a/pc/sdmylex.c +++ b/pc/sdmylex.c @@ -831,7 +831,7 @@ mylexprobe(int port, int irq) if(ioalloc(port, 0x3, 0, "mylex") < 0) return nil; ctlr = nil; - + sdev = nil; /* * Attempt to hard-reset the board and reset * the SCSI bus. If the board state doesn't settle to @@ -852,6 +852,8 @@ mylexprobe(int port, int irq) buggery: if(ctlr != nil) free(ctlr); + if (sdev != nil) + free(sdev); iofree(port); return nil; } diff --git a/port/devsd.c b/port/devsd.c index 520aac89d51e3023ee72adcdbffeb339dc298ee7..984606825718939929fc7c14bf7ccb2797c36bc6 100644 --- a/port/devsd.c +++ b/port/devsd.c @@ -323,8 +323,14 @@ sdreset(void) tail->next = sdev; else sdlist = sdev; - for(tail = sdev; tail->next != nil; tail = tail->next) + for(tail = sdev; tail->next != nil; tail = tail->next) { + tail->unit = (SDunit **)malloc(tail->nunit * sizeof(SDunit *)); + tail->unitflg = (int *)malloc(tail->nunit * sizeof(int)); + assert(tail->unit && tail->unitflg); ndevs++; + } + tail->unit = (SDunit **)malloc(tail->nunit * sizeof(SDunit *)); + tail->unitflg = (int *)malloc(tail->nunit * sizeof(int)); ndevs++; } @@ -566,6 +572,9 @@ sdgen(Chan* c, char*, Dirtab*, int, int s, Dir* dp) qunlock(&unit->ctl); decref(&sdev->r); return r; + case Qtopctl: + case Qtopstat: + return sd1gen(c, TYPE(c->qid), dp); default: break; }