~kris/9p

9hist

f845fec5c997fa5fa3c5082c6d3d091104f8247a — David du Colombier 33 years ago f15aa24
Plan 9 from Bell Labs 1992-10-14
5 files changed, 47 insertions(+), 37 deletions(-)

M pc/devincon.c
M pc/devrtc.c
M pc/kbd.c
M pc/main.c
M port/fcall.c
M pc/devincon.c => pc/devincon.c +36 -29
@@ 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; i++){
		incon[i].dev = lptbase[1/*i*/];
		incon[i].dev = lptinfo[incondev].base;
		incon[i].state = Notliving;
		reset(incon[i].dev);
		incon[i].ri = incon[i].wi = 0;


@@ 521,8 528,7 @@ inconattach(char *spec)
	int i;
	Chan *c;

	/*setvec(Parallelvec, inconintr);*/
setvec(Int0vec+5, inconintr);
	setvec(lptinfo[incondev].ivec, inconintr);
	i = strtoul(spec, 0, 0);
	if(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);

M pc/devrtc.c => pc/devrtc.c +1 -0
@@ 60,6 60,7 @@ rtcreset(void)
void
rtcinit(void)
{
	print("nvrm(0x2b) == 0x%lux\n", nvramread(0x2b));
}

Chan*

M pc/kbd.c => pc/kbd.c +2 -2
@@ 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);

M pc/main.c => pc/main.c +6 -4
@@ 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;

M port/fcall.c => port/fcall.c +2 -2
@@ 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: