uint8_t status;
timer_t timeout;
- timeout = set_timer_ms(500);
+ timeout = set_timer_sec(20);
while(true){
status = devide_readb(ide_reg_status);
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;
}
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;