From 1855f195a02bf76af1a49b834512dc0952fb2caa Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 15 Sep 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-09-15 --- pc/devether.c | 75 ++++++++++++++++++++++++++++++--------------------- pc/main.c | 2 +- port/devmnt.c | 2 +- 3 files changed, 46 insertions(+), 33 deletions(-) diff --git a/pc/devether.c b/pc/devether.c index 64bfae1ad68baadcebfb896b4cd4b3ab31cf1e1a..454072a577ebebd953a8aebf7f238134e97ae7b1 100644 --- a/pc/devether.c +++ b/pc/devether.c @@ -20,6 +20,7 @@ struct Hw { void (*receive)(Ctlr*); void (*transmit)(Ctlr*); void (*intr)(Ureg*); + void (*tweek)(Ctlr*); int addr; /* interface address */ uchar *ram; /* interface shared memory address */ int bt16; /* true if a 16 bit interface */ @@ -464,7 +465,8 @@ etherkproc(void *arg) } cp->kproc = 1; for(;;){ - sleep(&cp->rr, isinput, cp); + tsleep(&cp->rr, isinput, cp, 500); + (*cp->hw->tweek)(cp); /* * process any internal loopback packets @@ -660,10 +662,12 @@ wd8013reset(Ctlr *cp) uchar irr; ulong ram; - cp->rb = xspanalloc(sizeof(Buffer)*Nrb, BY2PG, 0); - cp->nrb = Nrb; - cp->tb = xspanalloc(sizeof(Buffer)*Ntb, BY2PG, 0); - cp->ntb = Ntb; + if(cp->rb == 0){ + cp->rb = xspanalloc(sizeof(Buffer)*Nrb, BY2PG, 0); + cp->nrb = Nrb; + cp->tb = xspanalloc(sizeof(Buffer)*Ntb, BY2PG, 0); + cp->ntb = Ntb; + } msr = IN(hw, msr); icr = IN(hw, icr); @@ -698,13 +702,13 @@ wd8013reset(Ctlr *cp) hw->pstart = HOWMANY(sizeof(Etherpkt), 256); hw->pstop = HOWMANY(hw->size, 256); -print("ether width %d addr %lux size %d lvl %d\n", hw->bt16?16:8, - hw->ram, hw->size, hw->lvl); +/* print("ether width %d addr %lux size %d lvl %d\n", hw->bt16?16:8, + hw->ram, hw->size, hw->lvl);/**/ /* enable interface RAM, set interface width */ OUT(hw, msr, MENB|msr); if(hw->bt16) - OUT(hw, laar, laar|L16EN); + OUT(hw, laar, laar|L16EN|M16EN); (*hw->init)(cp); setvec(Int0vec + hw->lvl, hw->intr); @@ -734,12 +738,15 @@ dp8390init(Ctlr *cp) OUT(hw, w.cr, 0x21); /* Page0|RD2|STP */ if(hw->bt16) - OUT(hw, w.dcr, 0x49); /* 16 bit interface, DMA burst size 8 */ + OUT(hw, w.dcr, 0x61); /* 16 bit interface */ else OUT(hw, w.dcr, 0x48); /* FT1|LS */ OUT(hw, w.rbcr0, 0); OUT(hw, w.rbcr1, 0); - OUT(hw, w.rcr, 0x04); /* AB */ + if(cp->prom) + OUT(hw, w.rcr, 0x14); /* PRO|AB */ + else + OUT(hw, w.rcr, 0x04); /* AB */ OUT(hw, w.tcr, 0x20); /* LB0 */ OUT(hw, w.bnry, hw->pstart); @@ -781,6 +788,28 @@ wd8013online(Ctlr *cp, int on) OUT(cp->hw, w.tcr, 0); } +static void +wd8013tweek(Ctlr *cp) +{ + uchar msr; + Hw *hw = cp->hw; + int s; + + s = splhi(); + msr = IN(hw, msr); + if((msr & MENB) == 0){ + /* board has reset itself, start again */ + delay(100); + + (*hw->reset)(cp); + etherinit(); + + wakeup(&cp->tr); + wakeup(&cp->rr); + } + splx(s); +} + static void wd8013receive(Ctlr *cp) { @@ -804,8 +833,9 @@ wd8013receive(Ctlr *cp) p = &((Ring*)hw->ram)[next]; len = ((p->len1<<8)|p->len0)-4; if(p->next < hw->pstart || p->next >= hw->pstop || len < 60){ - print("%d/%d : #%2.2ux #%2.2ux #%2.2ux #%2.2ux\n", next, len, +/* print("%d/%d : #%2.2ux #%2.2ux #%2.2ux #%2.2ux\n", next, len, p->status, p->next, p->len0, p->len1);/**/ + delay(100); dp8390rinit(cp); break; } @@ -830,6 +860,7 @@ wd8013receive(Ctlr *cp) if(bnry < hw->pstart) bnry = hw->pstop-1; OUT(hw, w.bnry, bnry); + break; } } @@ -839,26 +870,16 @@ wd8013transmit(Ctlr *cp) Hw *hw; Buffer *tb; int s; - uchar laar; s = splhi(); hw = cp->hw; tb = &cp->tb[cp->ti]; if(tb->busy == 0 && tb->owner == Interface){ - if(hw->bt16){ - OUT(hw, w.imr, 0x0); - laar = IN(hw, laar); - OUT(hw, laar, laar|M16EN); - } memmove(hw->ram, tb->pkt, tb->len); OUT(hw, w.tbcr0, tb->len & 0xFF); OUT(hw, w.tbcr1, (tb->len>>8) & 0xFF); OUT(hw, w.cr, 0x26); /* Page0|RD2|TXP|STA */ tb->busy = 1; - if(hw->bt16 && (laar&M16EN)==0){ - OUT(hw, laar, laar); - OUT(hw, w.imr, 0x1F); - } } splx(s); } @@ -869,13 +890,8 @@ wd8013intr(Ureg *ur) Ctlr *cp = &ctlr[0]; Hw *hw = cp->hw; Buffer *tb; - uchar isr, laar; + uchar isr; - if(hw->bt16){ - laar = IN(hw, laar); - OUT(hw, w.imr, 0x0); - OUT(hw, laar, laar|M16EN); - } USED(ur); while(isr = IN(hw, r.isr)){ OUT(hw, w.isr, isr); @@ -911,10 +927,6 @@ wd8013intr(Ureg *ur) wakeup(&cp->rr); } } - if(hw->bt16){ - OUT(hw, laar, laar); - OUT(hw, w.imr, 0x1F); - } } static Hw wd8013 = @@ -926,5 +938,6 @@ static Hw wd8013 = wd8013receive, wd8013transmit, wd8013intr, + wd8013tweek, 0x360, /* I/O base address */ }; diff --git a/pc/main.c b/pc/main.c index 1b1c8ab0871b8e3b3fc6c170b6b4fad760b03ebe..b40a2b2293dffcf87552ba1e09fac5ff77734aa3 100644 --- a/pc/main.c +++ b/pc/main.c @@ -266,7 +266,7 @@ confinit(void) conf.base1 = 1*MB; conf.npage1 = ((i-1)*MB - conf.base1)/BY2PG; conf.npage = conf.npage0 + conf.npage1; - conf.upages = (conf.npage*70)/100; + conf.upages = (conf.npage*60)/100; ktop = PGROUND((ulong)end); ktop = PADDR(ktop); diff --git a/port/devmnt.c b/port/devmnt.c index c77d3f0900398282c173e90ca8e3e40cdd2234c9..06a0f17ef0c40e6bc1eb061aa453775bf7ed4231 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -137,7 +137,7 @@ mntattach(char *muxattach) m->rip = 0; m->c = c; m->c->flag |= CMSG; - m->blocksize = MAXFDATA; + m->blocksize = MAXFDATA;/**/ switch(devchar[m->c->type]) { default: