Better probing code
This commit is contained in:
parent
9a6987e9cd
commit
1353798747
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user