~kris/9p

9hist

6fe50c058537ee12fae0071eeda53909bc1b2223 — David du Colombier 24 years ago b6788f7
Plan 9 from Bell Labs 2002-09-20
5 files changed, 61 insertions(+), 16 deletions(-)

M ip/ethermedium.c
M pc/ether82557.c
M pc/screen.c
M pc/sdata.c
M pc/vga.c
M ip/ethermedium.c => ip/ethermedium.c +8 -2
@@ 573,6 573,7 @@ recvarp(Ipifc *ifc)
	Block *ebp, *rbp;
	Etherarp *e, *r;
	uchar ip[IPaddrlen];
	static uchar eprinted[4];
	Etherrock *er = ifc->arg;

	ebp = devtab[er->achan->type]->bread(er->achan, ifc->maxmtu, 0);


@@ 608,8 609,13 @@ recvarp(Ipifc *ifc)
		/* check for machine using my ip or ether address */
		v4tov6(ip, e->spa);
		if(iplocalonifc(ifc, ip) || ipproxyifc(er->f, ifc, ip)){
			if(memcmp(e->sha, ifc->mac, sizeof(e->sha)) != 0)
				print("arpreq: 0x%E also has ip addr %V\n", e->sha, e->spa);
			if(memcmp(e->sha, ifc->mac, sizeof(e->sha)) != 0){
				if (memcmp(eprinted, e->spa, sizeof(e->spa))){
					/* print only once */
					print("arpreq: 0x%E also has ip addr %V\n", e->sha, e->spa);
					memmove(eprinted, e->spa, sizeof(e->spa));
				}
			}
		} else {
			if(memcmp(e->sha, ifc->mac, sizeof(e->sha)) == 0){
				print("arpreq: %V also has ether addr %E\n", e->spa, e->sha);

M pc/ether82557.c => pc/ether82557.c +32 -2
@@ 261,12 261,42 @@ static uchar configdata[24] = {
#define csr16w(c, r, w)	(outs((c)->port+(r), (ushort)(w)))
#define csr32w(c, r, l)	(outl((c)->port+(r), (ulong)(l)))

int
waitfordone(Ctlr *ctlr)
{
	int loops;

	/* fast wait, we usually get lucky */
	for(loops = 0; loops < 100; loops++){
		if(csr8r(ctlr, CommandR) == 0)
			return 0;
	}

	/* slow wait */
	for(loops = 0; loops < 1000; loops++){
		if(csr8r(ctlr, CommandR) == 0)
			return 0;
		microdelay(1);
	}
	return -1;
}

static void
command(Ctlr* ctlr, int c, int v)
{
	ilock(&ctlr->rlock);

	/*
	 *  on a 10 Mbs half-duplex connection, we seem to
	 *  hang unless we do a nop before each command.
	 *  This comes from a fix for a chip errata that jmk
	 *  saw in a Linux driver.
	 */
	if(waitfordone(ctlr) < 0)
		print("82557: lastcmd %x, cmd nop \n", ctlr->command);
	csr8w(ctlr, CommandR, CUnop);

	/*
	 * Only back-to-back CUresume can be done
	 * without waiting for any previous command to complete.
	 * This should be the common case.


@@ 279,8 309,8 @@ command(Ctlr* ctlr, int c, int v)
	}
	 */

	while(csr8r(ctlr, CommandR))
		;
	if(waitfordone(ctlr) < 0)
		print("82557: lastcmd %x, cmd %x(%x) \n", ctlr->command, c, v);

	switch(c){


M pc/screen.c => pc/screen.c +0 -12
@@ 392,15 392,3 @@ blankscreen(int blank)
			vgablank(scr, blank);
	}
}

void
screensignal(int x)
{
	VGAscr *scr;

	scr = &vgascreen[0];
	if(scr->aperture == 0)
		return;

	memset(scr->aperture, x, 8*1024);
}

M pc/sdata.c => pc/sdata.c +1 -0
@@ 1701,6 1701,7 @@ atapnp(void)
			break;
		case (0x4D38<<16)|0x105A:	/* Promise PDC20262 */
		case (0x4D30<<16)|0x105A:	/* Promise PDC202xx */
		case (0x0004<<16)|0x1103:	/* HighPoint HPT-370 */
			pi = 0x85;
			break;
		case (0x0640<<16)|0x1095:	/* CMD 640B */

M pc/vga.c => pc/vga.c +20 -0
@@ 232,3 232,23 @@ addvgaseg(char *name, ulong pa, ulong size)
	addphysseg(&seg);
}

void
cornerstring(char *s)
{
	int h, w;
	VGAscr *scr;
	Rectangle r;
	Point p;

	scr = &vgascreen[0];
	if(scr->aperture == 0 || screenputs != vgascreenputs)
		return;
	p = memsubfontwidth(scr->memdefont, s);
	w = p.x;
	h = scr->memdefont->height;

	r = Rect(0, 0, w, h);
	memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min);
	memimagestring(scr->gscreen, r.min, conscol, ZP, scr->memdefont, s);
//	flushmemscreen(r);
}