From: Will Sowerbutts Date: Fri, 6 Jan 2017 19:25:36 +0000 (+0000) Subject: Kernel: devide: Improve drive detection and timeout code. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=7a2d731f3ea03178e81cf1d754b9074016c0958a;p=FUZIX.git Kernel: devide: Improve drive detection and timeout code. --- diff --git a/Kernel/dev/devide.c b/Kernel/dev/devide.c index 63833579..35c088a2 100644 --- a/Kernel/dev/devide.c +++ b/Kernel/dev/devide.c @@ -22,7 +22,7 @@ bool devide_wait(uint8_t bits) uint8_t status; timer_t timeout; - timeout = set_timer_ms(500); + timeout = set_timer_sec(20); while(true){ status = devide_readb(ide_reg_status); @@ -30,7 +30,10 @@ bool devide_wait(uint8_t bits) if((status & (IDE_STATUS_BUSY | IDE_STATUS_ERROR | bits)) == bits) return true; - if((status & (IDE_STATUS_BUSY | IDE_STATUS_ERROR)) == IDE_STATUS_ERROR){ + if(((status & (IDE_STATUS_BUSY | IDE_STATUS_ERROR)) == IDE_STATUS_ERROR) || /* error */ + (status == 0x00) || /* zeta-v2 PPIDE: status=0x00 indicates no slave drive present */ + (status == 0xFF) || /* zeta-v2 PPIDE: status=0xFF indicates neither master nor slave drive present */ + (status == 0x87)){ /* n8vem-mark4: status=0x87 indicates neither master nor slave drive present */ kprintf("ide error, status=%x\n", status); return false; } diff --git a/Kernel/dev/devide_discard.c b/Kernel/dev/devide_discard.c index c8ad9935..819f83f2 100644 --- a/Kernel/dev/devide_discard.c +++ b/Kernel/dev/devide_discard.c @@ -60,12 +60,16 @@ void devide_init_drive(uint8_t drive) default: return; } - kprintf("IDE drive %d: ", drive); - ide_select(drive); + devide_writeb(ide_reg_devhead, select); + kprintf("IDE drive %d: ", drive); + #ifdef IDE_8BIT_ONLY /* set 8-bit mode -- mostly only supported by CF cards */ + if (!devide_wait(IDE_STATUS_READY)) + goto out; + devide_writeb(ide_reg_devhead, select); if (!devide_wait(IDE_STATUS_READY)) goto out;