]> Zhao Yanbai Git Server - minix.git/commitdiff
Better probing code
authorPhilip Homburg <philip@cs.vu.nl>
Thu, 9 Mar 2006 15:05:43 +0000 (15:05 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Thu, 9 Mar 2006 15:05:43 +0000 (15:05 +0000)
drivers/at_wini/at_wini.c

index 39f870ed710dfcd13dc3135fe3c47ccf186efb51..7b8069c58cac7d8f6b6942e52ddcf6f80ab81b87 100644 (file)
@@ -95,6 +95,8 @@
 #define REG_CTL_ALTSTAT 0      /* alternate status register */
 
 /* Identify words */
+#define ID_GENERAL             0x00    /* General configuration information */
+#define                ID_GEN_NOT_ATA          0x8000  /* Not an ATA device */
 #define ID_CAPABILITIES                0x31    /* Capabilities (49)*/
 #define                ID_CAP_LBA              0x0200  /* LBA supported */
 #define                ID_CAP_DMA              0x0100  /* DMA supported */
@@ -754,14 +756,22 @@ PRIVATE int w_identify()
   /* Try to identify the device. */
   cmd.ldh     = wn->ldhpref;
   cmd.command = ATA_IDENTIFY;
-  if (com_simple(&cmd) == OK) {
-       /* This is an ATA device. */
-       wn->state |= SMART;
+  if (com_simple(&cmd) == OK && w_waitfor(STATUS_DRQ, STATUS_DRQ) &&
+       !(wn->w_status & (STATUS_ERR|STATUS_WF))) {
 
        /* Device information. */
        if ((s=sys_insw(wn->base_cmd + REG_DATA, SELF, tmp_buf, SECTOR_SIZE)) != OK)
                panic(w_name(),"Call to sys_insw() failed", s);
 
+       if (id_word(0) & ID_GEN_NOT_ATA)
+       {
+               printf("%s: not an ATA device?\n", w_name());
+               return ERR;
+       }
+
+       /* This is an ATA device. */
+       wn->state |= SMART;
+
        /* Why are the strings byte swapped??? */
        for (i = 0; i < 40; i++) w_id_string[i] = id_byte(27)[i^1];
 
@@ -900,7 +910,9 @@ PRIVATE int w_identify()
        }
 #if ENABLE_ATAPI
   } else
-  if (cmd.command = ATAPI_IDENTIFY, com_simple(&cmd) == OK) {
+  if (cmd.command = ATAPI_IDENTIFY,
+       com_simple(&cmd) == OK && w_waitfor(STATUS_DRQ, STATUS_DRQ) &&
+       !(wn->w_status & (STATUS_ERR|STATUS_WF))) {
        /* An ATAPI device. */
        wn->state |= ATAPI;
 
@@ -1242,7 +1254,12 @@ unsigned nr_req;         /* length of request vector */
                                break;
                        }
                        else
+                       {
+#if 0
+                               printf("DMA buffer too small\n");
+#endif
                                panic(w_name(), "DMA buffer too small", NO_NUM);
+                       }
                }
                else if (v & DMA_ST_BM_ACTIVE)
                        panic(w_name(), "DMA buffer too large", NO_NUM);