From bf48946ab64f5efb633b696dc17f70880b3a2f71 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 14 May 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-05-14 --- pc/devhard.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/pc/devhard.c b/pc/devhard.c index 55482f8ff2ba68cc2d0ef5c5f75437c4c140db1e..e441b4609c58b7f0888caf9e68714a9faf24cdc2 100644 --- a/pc/devhard.c +++ b/pc/devhard.c @@ -27,7 +27,9 @@ enum Pstatus= 7, /* status port (read) */ Sbusy= (1<<7), Sready= (1<<6), + Sdwf= (1<<5), Sdrq= (1<<3), + Scorr= (1<<2), Serr= (1<<0), Pcmd= 7, /* cmd port (write) */ @@ -521,16 +523,16 @@ retry: len = pp->end - lblk; cp->nsecs = len; - cmdreadywait(cp); + cp->cmd = cmd; + cp->dp = dp; /* * start the transfer */ - cp->cmd = cmd; - cp->dp = dp; cp->status = 0; + cmdreadywait(cp); - outb(cp->pbase+Pcount, cp->nsecs-cp->sofar); + outb(cp->pbase+Pcount, cp->nsecs); outb(cp->pbase+Psector, sec); outb(cp->pbase+Pdh, 0x20 | head); outb(cp->pbase+Pcyllsb, cyl); @@ -543,6 +545,7 @@ retry: if(++loop > 10000) panic("hardxfer"); outss(cp->pbase+Pdata, cp->buf, dp->bytes/2); + cp->nsecs--; } sleep(&cp->r, cmddone, cp); @@ -773,6 +776,8 @@ hardintr(Ureg *ur) cp->cmd, inb(cp->pbase+Pstatus)); panic("hardintr: wait busy"); } + if(cp->status & (Sdwf|Scorr)) + print("hardintr: cmd=#%lux, status=#%lux\n", cp->cmd, cp->status); switch(cp->cmd){ case Cwrite: if(cp->status & Serr){ @@ -783,7 +788,7 @@ hardintr(Ureg *ur) return; } cp->sofar++; - if(cp->sofar < cp->nsecs){ + if(cp->nsecs){ loop = 0; while((inb(cp->pbase+Pstatus) & Sdrq) == 0) if(++loop > 10000) { @@ -793,7 +798,8 @@ hardintr(Ureg *ur) } outss(cp->pbase+Pdata, &cp->buf[cp->sofar*dp->bytes], dp->bytes/2); - } else{ + cp->nsecs--; + } else { cp->lastcmd = cp->cmd; cp->cmd = 0; wakeup(&cp->r); @@ -825,7 +831,8 @@ hardintr(Ureg *ur) inss(cp->pbase+Pdata, &cp->buf[cp->sofar*dp->bytes], dp->bytes/2); cp->sofar++; - if(cp->sofar >= cp->nsecs){ + cp->nsecs--; + if(cp->nsecs == 0){ cp->lastcmd = cp->cmd; if (cp->cmd == Cread) cp->cmd = 0;