M pc/devata.c => pc/devata.c +5 -0
@@ 813,6 813,7 @@ ataprobe(Drive *dp, int cyl, int sec, int head)
cp->status = 0;
cp->nsecs = 1;
cp->sofar = 0;
+ cp->buf = buf;
outb(cp->pbase+Pcount, 1);
outb(cp->pbase+Psector, sec+1);
@@ 1120,6 1121,10 @@ ataintr(Ureg *ur, void *arg)
if(addr){
addr += cp->sofar*dp->bytes;
inss(cp->pbase+Pdata, addr, dp->bytes/2);
+ } else {
+ /* old drives/controllers hang unless the buffer is emptied */
+ for(loop = dp->bytes/2; --loop >= 0;)
+ ins(cp->pbase+Pdata);
}
cp->sofar++;
if(cp->sofar > cp->nsecs)
M pc/devfloppy.c => pc/devfloppy.c +4 -4
@@ 946,11 946,11 @@ floppyxfer(Drive *dp, int cmd, void *a, long off, long n)
if(off + n > dp->t->cap)
n = dp->t->cap - off;
- /* retry on error 3 times */
+ /* retry on error */
tries = 0;
while(waserror()){
DPRINT("floppyxfer: retrying\n");
- if(tries++ >= 3)
+ if(tries++ > 20)
nexterror();
}
@@ 973,9 973,9 @@ floppyxfer(Drive *dp, int cmd, void *a, long off, long n)
/*
* start operation
*/
- cmd = cmd | (dp->t->heads > 1 ? Fmulti : 0);
+ cmd = cmd;
fl.ncmd = 0;
- fl.cmd[fl.ncmd++] = cmd;
+ fl.cmd[fl.ncmd++] = cmd | (dp->t->heads > 1 ? Fmulti : 0);
fl.cmd[fl.ncmd++] = (dp->thead<<2) | dp->dev;
fl.cmd[fl.ncmd++] = dp->tcyl;
fl.cmd[fl.ncmd++] = dp->thead;