~kris/9p

9hist

c59efa05ac069005ef559093493c0cdc06f8cc78 — David du Colombier 35 years ago 64e77d4
Plan 9 from Bell Labs 1991-08-15
1 files changed, 10 insertions(+), 14 deletions(-)

M pc/devhard.c
M pc/devhard.c => pc/devhard.c +10 -14
@@ 137,8 137,9 @@ struct Controller
	int	tsec;		/* target sector */
	int	tbyte;		/* target byte */
	int	len;		/* length of transfer (bytes) */
	int	secs;		/* sectors to be xferred */
	int	toxfer;		/* bytes to be xferred */
	int	sofar;		/* bytes transferred so far */
	int	toskip;		/* bytes to skip over */
	int	status;
	int	error;
	Drive	*dp;		/* drive being accessed */


@@ 390,13 391,8 @@ hardxfer(Drive *dp, Partition *pp, int cmd, void *va, long off, long len)

	if(dp->online == 0)
		errors("disk offline");
	if(len % dp->bytes)
		errors("bad length");	/* BUG - this shouldn't be a problem */
	if(off % dp->bytes)
		errors("bad offset");	/* BUG - this shouldn't be a problem */

print("hardxfer %ld %ld\n", off, len);
print("hardxfer part %s %ld %ld\n", pp->name, pp->start, pp->end);
	if(len > Maxxfer)
		len = Maxxfer;

	cp = dp->cp;
	qlock(cp);


@@ 417,9 413,9 @@ print("hardxfer part %s %ld %ld\n", pp->name, pp->start, pp->end);
	cp->thead = (lsec/dp->sectors) % dp->heads;

	/*
	 *  can't xfer across cylinder boundaries.
	 *  can't xfer across cylinder boundaries or end of disk
	 */
	lsec = (off+len)/dp->bytes;
	lsec = (off+len+dp->bytes-1)/dp->bytes;
	lsec += pp->start;
	if(lsec > pp->end)
		errors("xfer past end of partition\n");


@@ 434,7 430,7 @@ print("hardxfer part %s %ld %ld\n", pp->name, pp->start, pp->end);
	/*
	 *  start the transfer
	 */
	cp->secs = cp->len/dp->bytes;
	cp->toskip = off % dp->bytes;
	cp->sofar = 0;
	cp->cmd = cmd;
	cp->dp = dp;


@@ 510,7 506,7 @@ print("waserror in hardident\n");
	cmdreadywait(cp);

	cp->len = 512;
	cp->secs = 1;
	cp->toskip = 0;
	cp->sofar = 0;
	cp->cmd = Cident;
	cp->dp = dp;


@@ 643,8 639,8 @@ hardintr(Ureg *ur)
				panic("hardintr 2");
		inss(cp->pbase+Pdata, &cp->buf[cp->sofar*cp->dp->bytes],
			cp->dp->bytes/2);
		cp->sofar++;
		if(cp->sofar == cp->secs){
		cp->sofar += cp->dp->bytes;
		if(cp->sofar >= cp->len){
			cp->cmd = 0;
			wakeup(&cp->r);
		}