From f845fec5c997fa5fa3c5082c6d3d091104f8247a Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 14 Oct 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-10-14 --- pc/devincon.c | 65 ++++++++++++++++++++++++++++----------------------- pc/devrtc.c | 1 + pc/kbd.c | 4 ++-- pc/main.c | 10 ++++---- port/fcall.c | 4 ++-- 5 files changed, 47 insertions(+), 37 deletions(-) diff --git a/pc/devincon.c b/pc/devincon.c index e0df87608e629a81a9e86b29a66fea66823bf584..e90262e79b0fc069cdc5cdee68cb1fb008b7b6c5 100644 --- a/pc/devincon.c +++ b/pc/devincon.c @@ -10,13 +10,22 @@ /* Centronix parallel (printer) port */ -/* base addresses */ -static int lptbase[] = { - 0x3bc, /* lpt1 */ - 0x378, /* lpt2 (sic) */ - 0x278 /* lpt3 (sic) */ +typedef struct Lptinfo Lptinfo; + +struct Lptinfo +{ + int base; /* port number */ + int ivec; /* interrupt number */ +}; + +static Lptinfo lptinfo[] = { + 0x3bc, Parallelvec, /* lpt1 (safari) */ + 0x378, Parallelvec, /* lpt1 (`official') */ + 0x278, Int0vec+5, /* lpt2 (`official') */ }; -#define NDEV (sizeof lptbase/sizeof lptbase[0]) +#define NDEV (sizeof lptinfo/sizeof lptinfo[0]) + +extern int incondev; /* from config */ /* offsets, and bits in the registers */ enum @@ -60,7 +69,7 @@ typedef struct Incon Incon; #define NOW (MACHP(0)->ticks*MS2HZ) -#define DPRINT /*if(incondebug)k*/print +#define DPRINT if(incondebug)kprint static void inconintr(Ureg *ur); @@ -174,19 +183,20 @@ Dirtab incondir[]={ }; #define NINCON (sizeof incondir/sizeof incondir[0]) -/*static void +static void Xdelay(int n) { while(--n >= 0) ; } #define SDLY 1000 -*/ -#define Xdelay(n) + +/*#define Xdelay(n)*/ static void reset(int dev) /* hardware reset */ { outb(dev+Qpcr, Finitbar); + Xdelay(10000); outb(dev+Qpcr, 0); Xdelay(10000); outb(dev+Qpcr, Finitbar); @@ -195,8 +205,10 @@ reset(int dev) /* hardware reset */ static void wrctl(int dev, int data) /* write control character */ { + Xdelay(SDLY); outb(dev+Qpcr, Finitbar); /* no interrupts, please */ outb(dev+Qdlr, data); + Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Fstrobe); Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Fie); @@ -205,8 +217,10 @@ wrctl(int dev, int data) /* write control character */ static void wrdata(int dev, int data) /* write data character */ { + Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Fsi); outb(dev+Qdlr, data); + Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Fsi|Fstrobe); Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Fsi|Fie); @@ -217,6 +231,7 @@ wrcmd(int dev, int data) /* write command */ { outb(dev+Qpcr, Finitbar|Faf); outb(dev+Qdlr, data); + Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Faf|Fstrobe); Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Faf|Fie); @@ -232,10 +247,8 @@ rdstatus(Incon *ip) /* read status */ outb(dev+Qpcr, Finitbar|Faf|Fsi); outb(dev+Qdlr, 0x01); outb(dev+Qpcr, Finitbar|Faf|Fsi|Fstrobe); - Xdelay(SDLY); data = (inb(dev+Qpsr)&0xf8)<<2; outb(dev+Qpcr, Finitbar|Faf|Fsi); - Xdelay(SDLY); data |= inb(dev+Qpsr)>>3; if(data&(OVERFLOW|CRC_ERROR)){ if(data&OVERFLOW) @@ -245,7 +258,6 @@ rdstatus(Incon *ip) /* read status */ } outb(dev+Qdlr, 0x03); outb(dev+Qpcr, Finitbar|Faf|Fsi|Fstrobe); - Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Faf|Fsi|Fie); return data; @@ -255,6 +267,7 @@ static void iwrcmd(int dev, int data) /* write command at interrupt level */ { outb(dev+Qdlr, data); + Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Faf|Fstrobe); Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Faf); @@ -269,10 +282,8 @@ irdstatus(Incon *ip) /* read status at interrupt level */ outb(dev+Qdlr, 0x01); outb(dev+Qpcr, Finitbar|Faf|Fsi|Fstrobe); - Xdelay(SDLY); data = (inb(dev+Qpsr)&0xf8)<<2; outb(dev+Qpcr, Finitbar|Faf|Fsi); - Xdelay(SDLY); data |= inb(dev+Qpsr)>>3; if(data&(OVERFLOW|CRC_ERROR)){ if(data&OVERFLOW) @@ -291,10 +302,8 @@ irddata(int dev) /* read data at interrupt level */ outb(dev+Qdlr, 0x00); outb(dev+Qpcr, Finitbar|Faf|Fsi|Fstrobe); - Xdelay(SDLY); data = (inb(dev+Qpsr)&0xf8)<<2; outb(dev+Qpcr, Finitbar|Faf|Fsi); - Xdelay(SDLY); data |= inb(dev+Qpsr)>>3; return data; @@ -306,10 +315,8 @@ irdnext(int dev) /* read next data at interrupt level */ int data; outb(dev+Qpcr, Finitbar|Faf|Fsi|Fstrobe); - Xdelay(SDLY); data = (inb(dev+Qpsr)&0xf8)<<2; outb(dev+Qpcr, Finitbar|Faf|Fsi); - Xdelay(SDLY); data |= inb(dev+Qpsr)>>3; return data; @@ -319,14 +326,15 @@ static void irdnop(int dev, int pcr) /* read nop (mux reset) */ { outb(dev+Qdlr, 0x03); + Xdelay(SDLY); outb(dev+Qpcr, Finitbar|Faf|Fsi|Fstrobe); Xdelay(SDLY); outb(dev+Qpcr, pcr); } -/* + int Irdnext(int); #define irdnext Irdnext -*/ + /* * set the incon parameters */ @@ -439,7 +447,6 @@ inconpoll(Incon *ip, int station) break; } } -print("poll: status 0x%.2ux\n", rdstatus(ip)); } /* @@ -496,7 +503,7 @@ inconreset(void) */ /* inconset(&incon[0], 3, 15); /**/ for(i=0; i= Nincon) error(Ebadarg); @@ -790,8 +796,10 @@ inconoput(Queue *q, Block *bp) if(chan<=0) print("bad channel %d\n", chan); - if(incondebug) + if(incondebug){ + kprint("0x%.2ux ", rdstatus(ip)); showpkt("->", chan, ctl, bp, 0); + } /* * make sure there's an incon out there @@ -947,11 +955,11 @@ inconkproc(void *arg) } /* - * send blocks upstream and stage new blocks. if the block is small - * (< 64 bytes) copy into a smaller buffer. + * send blocks upstream and stage new blocks. */ while(ip->ri != ip->wi){ bp = ip->inb[ip->ri]; + bp->flags |= S_DELIM; ip->in += BLEN(bp); PUTNEXT(ip->rq, bp); bp = ip->inb[ip->ri] = allocb(Bsize); @@ -1102,7 +1110,6 @@ inconintr(Ureg *ur) int pcr; Incon *ip; -print("I"); USED(ur); ip = &incon[0]; pcr = inb(ip->dev+Qpcr); diff --git a/pc/devrtc.c b/pc/devrtc.c index d675532c11a5e5d1f697eaf74256d232898c89fd..54c9964ce0c0e985ab2e09382fb230d8fd9b101e 100644 --- a/pc/devrtc.c +++ b/pc/devrtc.c @@ -60,6 +60,7 @@ rtcreset(void) void rtcinit(void) { + print("nvrm(0x2b) == 0x%lux\n", nvramread(0x2b)); } Chan* diff --git a/pc/kbd.c b/pc/kbd.c index 365223ecb1befb3ac1bd4aac2615428ea88a6906..4f999c3bb0fb7098a954d50e3622dbfd812fbfb2 100644 --- a/pc/kbd.c +++ b/pc/kbd.c @@ -130,7 +130,7 @@ outready(void) int tries; for(tries = 0; (inb(Status) & Outbusy); tries++) - if(tries > 1000) + if(tries > 10000) return -1; return 0; } @@ -160,7 +160,7 @@ mousecmd(int cmd) c = 0; do{ - for(tries=0; tries < 10; tries++){ + for(tries=0; tries < 100; tries++){ if(outready() < 0) return -1; outb(Cmd, 0xD4); diff --git a/pc/main.c b/pc/main.c index b06d0376cb6af5a1e52181a2e6bd07b2a3758aa8..9f64fa4b80cac1aa8b8b42063abc008933bff70f 100644 --- a/pc/main.c +++ b/pc/main.c @@ -267,15 +267,17 @@ confinit(void) conf.npage1 = ((i-1)*MB - conf.base1)/BY2PG; conf.npage = conf.npage0 + conf.npage1; - pcnt = screenbits()-1; /* Calculate % of memory for page pool */ - pcnt = 70 - (pcnt*10); - conf.upages = (conf.npage*pcnt)/100; - ktop = PGROUND((ulong)end); ktop = PADDR(ktop); conf.npage0 -= ktop/BY2PG; conf.base0 += ktop; + pcnt = screenbits()-1; /* Calculate % of memory for page pool */ + pcnt = 70 - (pcnt*10); + conf.upages = (conf.npage*pcnt)/100; + if(conf.npage - conf.upages < 1572864/BY2PG) + conf.upages = conf.npage - 1572864/BY2PG; + conf.topofmem = i*MB; conf.monitor = 1; diff --git a/port/fcall.c b/port/fcall.c index 2dc632e9c9b83e565cf1eff1f3b60d78ec28015b..514e04389e40febc3a964279870165dd5caf65e7 100644 --- a/port/fcall.c +++ b/port/fcall.c @@ -20,7 +20,7 @@ convS2M(Fcall *f, char *ap) switch(f->type) { default: - print("fcall: bad type: %d\n", f->type); + print("convS2M: bad type: %d\n", f->type); return 0; case Tnop: @@ -230,7 +230,7 @@ convM2S(char *ap, Fcall *f, int n) switch(f->type) { default: - print("fcall: bad type: %d\n", f->type); + print("convM2S: bad type: %d\n", f->type); return 0; case Tnop: