~kris/9p

9hist

501a0fc55c7eb4d5a9feffca7d8a2624f459204e — David du Colombier 30 years ago 8ac9e76
Plan 9 from Bell Labs 1996-06-22
3 files changed, 43 insertions(+), 27 deletions(-)

M pc/ether82557.c
M pc/etherif.h
M pc/scsi.c
M pc/ether82557.c => pc/ether82557.c +16 -16
@@ 183,7 183,7 @@ typedef struct Ctlr {

	uchar	configdata[24];

	Lock	rlock;			/* registers */
	Lock	lock;

	Block*	rfd[Nrfd];		/* receive side */
	int	rfdl;


@@ 193,7 193,7 @@ typedef struct Ctlr {
	Block*	cbqtail;
	int	cbqbusy;

	Lock	dlock;		/* dump statistical counters */
	Lock	dlock;			/* dump statistical counters */
	ulong	dump[17];
} Ctlr;



@@ 274,7 274,7 @@ attach(Ether* ether)
	Ctlr *ctlr;

	ctlr = ether->ctlr;
	ilock(&ctlr->rlock);
	ilock(&ctlr->lock);
	status = csr16r(ctlr, Status);
	if((status & RUstatus) == RUidle){
		while(csr8r(ctlr, Command))


@@ 282,7 282,7 @@ attach(Ether* ether)
		csr32w(ctlr, General, PADDR(ctlr->rfd[ctlr->rfdx]->rp));
		csr8w(ctlr, Command, RUstart);
	}
	iunlock(&ctlr->rlock);
	iunlock(&ctlr->lock);
}

static Block*


@@ 313,9 313,9 @@ promiscuous(void* arg, int on)
	ctlr = ((Ether*)arg)->ctlr;
	bp = configure(ctlr, on);

	ilock(&ctlr->rlock);
	ilock(&ctlr->lock);
	action(ctlr, bp);
	iunlock(&ctlr->rlock);
	iunlock(&ctlr->lock);
}

static long


@@ 329,11 329,11 @@ ifstat(Ether* ether, void* a, long n, ulong offset)
	lock(&ctlr->dlock);
	ctlr->dump[16] = 0;

	ilock(&ctlr->rlock);
	ilock(&ctlr->lock);
	while(csr8r(ctlr, Command))
		;
	csr8w(ctlr, Command, DumpSC);
	iunlock(&ctlr->rlock);
	iunlock(&ctlr->lock);

	/*
	 * Wait for completion status, should be 0xA005.


@@ 397,9 397,9 @@ write(Ether* ether, void* buf, long n)
	bp->wp += n;

	ctlr = ether->ctlr;
	ilock(&ctlr->rlock);
	ilock(&ctlr->lock);
	action(ctlr, bp);
	iunlock(&ctlr->rlock);
	iunlock(&ctlr->lock);

	ether->outpackets++;



@@ 418,7 418,7 @@ interrupt(Ureg*, void* arg)
	ether = arg;
	ctlr = ether->ctlr;

	ilock(&ctlr->rlock);
	ilock(&ctlr->lock);
	for(;;){
		status = csr16r(ctlr, Status);
		csr8w(ctlr, Ack, (status>>8) & 0xFF);


@@ 481,7 481,7 @@ interrupt(Ureg*, void* arg)
		if(status & (StatCX|StatFR|StatCNA|StatRNR|StatMDI|StatSWI))
			panic("%s#%d: status %uX\n", ctlr->type,  ctlr->ctlrno, status);
	}
	iunlock(&ctlr->rlock);
	iunlock(&ctlr->lock);
}

static void


@@ 600,7 600,7 @@ struct Adapter {
static Adapter *adapter;

static int
i82557(Ether* ether, int* pcidevno)
i82557pci(Ether* ether, int* pcidevno)
{
	PCIcfg pcicfg;
	static int devno = 0;


@@ 666,7 666,7 @@ reset(Ether* ether)
			break;
		}
	}
	if(port == 0 && (port = i82557(ether, &pcidevno)) == 0)
	if(port == 0 && (port = i82557pci(ether, &pcidevno)) == 0)
		return -1;

	/*


@@ 683,7 683,7 @@ reset(Ether* ether)
	ctlr->type = ether->type;
	ctlr->port = port;

	ilock(&ctlr->rlock);
	ilock(&ctlr->lock);

	csr32w(ctlr, Port, 0);
	delay(1);


@@ 763,7 763,7 @@ reset(Ether* ether)
	memmove(cb->data, ether->ea, Eaddrlen);
	action(ctlr, bp);

	iunlock(&ctlr->rlock);
	iunlock(&ctlr->lock);

	/*
	 * Linkage to the generic ethernet driver.

M pc/etherif.h => pc/etherif.h +1 -0
@@ 54,5 54,6 @@ extern void *dp8390write(Dp8390*, ulong, void*, ulong);
extern void dp8390setea(Ether*);

#define NEXT(x, l)	(((x)+1)%(l))
#define PREV(x, l)	(((x) == 0) ? (l)-1: (x)-1)
#define	HOWMANY(x, y)	(((x)+((y)-1))/(y))
#define ROUNDUP(x, y)	(HOWMANY((x), (y))*(y))

M pc/scsi.c => pc/scsi.c +26 -11
@@ 290,8 290,8 @@ scsicap(Target *t, char lun, ulong *size, ulong *bsize)

	s = scsiexec(t, SCSIread, cmd, sizeof(cmd), d, &nbytes);
	if(s == STok) {
		*size  = nhgetl(d+0);
		*bsize = nhgetl(d+4);
		*size = (d[0]<<24)|(d[1]<<16)|(d[2]<<8)|d[3];
		*bsize = (d[4]<<24)|(d[5]<<16)|(d[6]<<8)|d[7];
	}
	scsifree(d);
	return s;


@@ 303,14 303,15 @@ scsibio(Target *t, char lun, int dir, void *b, long n, long bsize, long bno)
	uchar cmd[10];
	int s, cdbsiz, nbytes;

	memset(cmd, 0, sizeof cmd);
	if(bno <= 0x1fffff && n < 256) {
		cmd[0] = 0x0A;
		if(dir == SCSIread)
			cmd[0] = 0x08;
		cmd[1] = (lun<<5) | bno >> 16;
		hnputs(cmd+2, bno);
		cmd[2] = bno>>8;
		cmd[3] = bno;
		cmd[4] = n;
		cmd[5] = 0;
		cdbsiz = 6;
	}
	else {


@@ 318,8 319,13 @@ scsibio(Target *t, char lun, int dir, void *b, long n, long bsize, long bno)
		if(dir == SCSIread)
			cmd[0] = 0x28;
		cmd[1] = (lun<<5);
		hnputl(cmd+2, bno);
		hnputs(cmd+7, n);
		cmd[2] = bno>>24;
		cmd[3] = bno>>16;
		cmd[4] = bno>>8;
		cmd[5] = bno;
		cmd[7] = n>>8;
		cmd[8] = n;
		cmd[9] = 0;
		cdbsiz = 10;
	}
	nbytes = n*bsize;


@@ 432,7 438,8 @@ scsidiskinfo(Target *t, char lun, int track, uchar *data)
	cmd[0] = 0x43;
	cmd[1] = lun<<5;
	cmd[6] = track;
	hnputs(cmd+7, nbytes);
	cmd[7] = nbytes>>8;
	cmd[8] = nbytes;

	d = scsialloc(nbytes);
	if(d == 0)


@@ 457,7 464,8 @@ scsitrackinfo(Target *t, char lun, int track, uchar *data)
	cmd[0] = 0xe5;
	cmd[1] = lun<<5;
	cmd[5] = track;
	hnputs(cmd+7, nbytes);
	cmd[7] = nbytes>>8;
	cmd[8] = nbytes;

	d = scsialloc(nbytes);
	if(d == 0)


@@ 491,7 499,10 @@ scsibufsize(Target *t, char lun, int size)

	memset(d, 0, nbytes);
	d[3] = 8;
	hnputl(d+8, size);
	d[8] = size>>24;
	d[9] = size>>16;
	d[10] = size>>8;
	d[11] = size;

	s = scsiexec(t, SCSIwrite, cmd, sizeof(cmd), d, &nbytes);
	scsifree(d);


@@ 508,8 519,12 @@ scsireadcdda(Target *t, char lun, int, void *b, long n, long bsize, long bno)

	cmd[0] = 0xd8;
	cmd[1] = (lun<<5);
	hnputl(cmd+2, bno);
	hnputl(cmd+6, n);
	cmd[2] = bno>>24;
	cmd[3] = bno>>16;
	cmd[4] = bno>>8;
	cmd[5] = bno;
	cmd[6] = n>>8;
	cmd[7] = n;

	nbytes = n*bsize;
	s = scsiexec(t, SCSIread, cmd, sizeof(cmd), b, &nbytes);