sdide: inquery times on qemu, make pktio timeout

This commit is contained in:
cinap_lenrek 2011-07-18 01:47:02 +02:00
parent 1c5d8e24e3
commit ab80f73f61

View file

@ -640,6 +640,7 @@ retry:
if(drive->feat & Datapi16) if(drive->feat & Datapi16)
drive->pkt = 16; drive->pkt = 16;
}else{ }else{
drive->pkt = 0;
if(drive->feat & Dlba) if(drive->feat & Dlba)
drive->dev |= Lba; drive->dev |= Lba;
atarwmmode(drive, cmdport, ctlport, dev); atarwmmode(drive, cmdport, ctlport, dev);
@ -1165,7 +1166,7 @@ static int
atapktio0(Drive *drive, SDreq *r) atapktio0(Drive *drive, SDreq *r)
{ {
uchar *cmd; uchar *cmd;
int as, cmdport, ctlport, len, rv, timeo; int as, cmdport, ctlport, len, rv;
Ctlr *ctlr; Ctlr *ctlr;
rv = SDok; rv = SDok;
@ -1217,21 +1218,14 @@ atapktio0(Drive *drive, SDreq *r)
} }
iunlock(ctlr); iunlock(ctlr);
while(waserror()) if(iowait(drive, 20*1000, 1) <= 0){
;
if(!drive->pktdma)
sleep(ctlr, atadone, ctlr);
else for(timeo = 0; !ctlr->done; timeo++){
tsleep(ctlr, atadone, ctlr, 1000);
if(ctlr->done)
break;
ilock(ctlr); ilock(ctlr);
atadmainterrupt(drive, 0); if(!drive->error){
if(!drive->error && timeo > 20){
ataabort(drive, 0); ataabort(drive, 0);
atadmastop(ctlr); if(drive->pktdma){
drive->dmactl = 0; atadmastop(ctlr);
drive->error |= Abrt; drive->dmactl = 0;
}
} }
if(drive->error){ if(drive->error){
drive->status |= Chk; drive->status |= Chk;
@ -1239,7 +1233,6 @@ atapktio0(Drive *drive, SDreq *r)
} }
iunlock(ctlr); iunlock(ctlr);
} }
poperror();
if(drive->status & Chk) if(drive->status & Chk)
rv = SDcheck; rv = SDcheck;
@ -1456,7 +1449,7 @@ atagenio(Drive* drive, SDreq *r)
if(drive->status & Err){ if(drive->status & Err){
qunlock(ctlr); qunlock(ctlr);
print("atagenio: %llud:%d\n", lba, drive->count); print("atagenio: %llud:%d\n", lba, drive->count);
return sdsetsense(r, SDcheck, 4, 8, drive->error); return sdsetsense(r, SDcheck, 4, 8, drive->error);
} }
count -= drive->count; count -= drive->count;