Kernel: devide: Improve drive detection and timeout code.
authorWill Sowerbutts <will@sowerbutts.com>
Fri, 6 Jan 2017 19:25:36 +0000 (19:25 +0000)
committerWill Sowerbutts <will@sowerbutts.com>
Sun, 8 Jan 2017 23:05:11 +0000 (23:05 +0000)
Kernel/dev/devide.c
Kernel/dev/devide_discard.c

index 6383357..35c088a 100644 (file)
@@ -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;
         }
index c8ad993..819f83f 100644 (file)
@@ -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;