X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FStorage%2FATA%2Fio.c;h=28ae89964b69b9261b73de5d607b3f88552292c1;hb=4196f2f4fbded54889dcd5f41118565fde65fa51;hp=9f471b7d493075192e3e516f48104e89c2378787;hpb=4d130516b522943672edbf6586aa198fff32fb14;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Storage/ATA/io.c b/KernelLand/Modules/Storage/ATA/io.c index 9f471b7d..28ae8996 100644 --- a/KernelLand/Modules/Storage/ATA/io.c +++ b/KernelLand/Modules/Storage/ATA/io.c @@ -249,15 +249,22 @@ Uint64 ATA_GetDiskSize(int Disk) } // Poll until BSY clears or ERR is set + tTime endtime = now() + 2*1000; // 2 second timeout // TODO: Timeout? - while( (val & 0x80) && !(val & 1) ) + while( (val & 0x80) && !(val & 1) && now() < endtime ) val = inb(base+7); LOG("BSY unset (0x%x)", val); // and, wait for DRQ to set - while( !(val & 0x08) && !(val & 1)) + while( !(val & 0x08) && !(val & 1) && now() < endtime ) val = inb(base+7); LOG("DRQ set (0x%x)", val); + if(now() >= endtime) { + Log_Warning("ATA", "Timeout on ATA IDENTIFY (Disk %i)", Disk); + LEAVE('i', 0); + return 0; + } + // Check for an error if(val & 1) { LEAVE('i', 0); @@ -298,7 +305,7 @@ int ATA_DoDMA(Uint8 Disk, Uint64 Address, Uint Count, int bWrite, void *Buffer) int cont = (Disk>>1)&1; // Controller ID int disk = Disk & 1; Uint16 base; - int bUseBounceBuffer; + int bUseBounceBuffer = 0; ENTER("iDisk XAddress iCount bbWrite pBuffer", Disk, Address, Count, bWrite, Buffer);