Fix bug reported by Mike Brown <mbrown@vmware.com>, in which a
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 13 Jul 2005 17:40:23 +0000 (17:40 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 13 Jul 2005 17:40:23 +0000 (17:40 +0000)
secondary device was always detected on an IDE channel that had a
primary device.  Both qemu and Bochs report error/lbam/lbah register
values that are invalid for a device that exists in such a situation,
but GSX Server reports 1/0/0, which indicates a valid device.
Fortunately, GSX Server does report a useful value in the status
register, so the bug fix adds a check for that value also.

src/devices/disk.c

index 0a131740b00711bc94af611330518d9e919b18f5..2bae0577ff044ec07657711cae1d7586338b9c49 100644 (file)
@@ -30,6 +30,7 @@
 
 /* Alternate Status Register bits. */
 #define STA_BSY 0x80            /* Busy. */
+#define STA_DRDY 0x40           /* Device Ready. */
 #define STA_DRQ 0x08            /* Data Request. */
 
 /* Control Register bits. */
@@ -331,15 +332,18 @@ static bool
 check_device_type (struct disk *d) 
 {
   struct channel *c = d->channel;
-  uint8_t error, lbam, lbah;
+  uint8_t error, lbam, lbah, status;
 
   select_device (d);
 
   error = inb (reg_error (c));
   lbam = inb (reg_lbam (c));
   lbah = inb (reg_lbah (c));
+  status = inb (reg_status (c));
 
-  if (error != 1 && (error != 0x81 || d->dev_no == 1)) 
+  if ((error != 1 && (error != 0x81 || d->dev_no == 1))
+      || (status & STA_DRDY) == 0
+      || (status & STA_BSY) != 0)
     {
       d->is_ata = false;
       return error != 0x81;