Index: redboot/current/src/fs/ide.c =================================================================== RCS file: /home/cvsroot/Projects/ecos/packages/redboot/current/src/fs/ide.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -5 -w -r1.1.1.1 -r1.2 --- redboot/current/src/fs/ide.c 28 Mar 2004 18:52:37 -0000 1.1.1.1 +++ redboot/current/src/fs/ide.c 16 May 2004 20:08:20 -0000 1.2 @@ -82,16 +82,18 @@ cyg_uint8 status; CYGACC_CALL_IF_DELAY_US(10); do { HAL_IDE_READ_UINT8(ctlr, IDE_REG_STATUS, status); + if (!(status & IDE_STAT_BSY)) { if (status & IDE_STAT_DRQ) return 1; - } while (status & IDE_STAT_BSY); - + else return 0; } + } while (1); +} static int ide_reset(int ctlr) { cyg_uint8 status; @@ -100,20 +102,20 @@ HAL_IDE_WRITE_CONTROL(ctlr, 6); // polled mode, reset asserted CYGACC_CALL_IF_DELAY_US(5000); HAL_IDE_WRITE_CONTROL(ctlr, 2); // polled mode, reset cleared CYGACC_CALL_IF_DELAY_US((cyg_uint32)50000); - // wait 30 seconds max for not busy + // wait 30 seconds max for not busy and drive ready for (delay = 0; delay < 300; ++delay) { CYGACC_CALL_IF_DELAY_US((cyg_uint32)100000); HAL_IDE_READ_UINT8(ctlr, IDE_REG_STATUS, status); - // bail out early on bogus status - if ((status & (IDE_STAT_BSY|IDE_STAT_DRDY)) == (IDE_STAT_BSY|IDE_STAT_DRDY)) - break; - if (!(status & IDE_STAT_BSY)) + if (!(status & IDE_STAT_BSY)) { + if (status & IDE_STAT_DRDY) { return 1; } + } + } return 0; } static int ide_ident(int ctlr, int dev, int is_packet_dev, cyg_uint16 *buf) Index: redboot/current/ChangeLog =================================================================== RCS file: /home/cvsroot/Projects/ecos/packages/redboot/current/ChangeLog,v retrieving revision 1.3 diff -u -5 -w -r1.3 ChangeLog --- redboot/current/ChangeLog 16 May 2004 22:05:16 -0000 1.3 +++ redboot/current/ChangeLog 16 May 2004 22:48:54 -0000 @@ -1,5 +1,10 @@ +2004-05-16 Andrew Dyer + + * src/fs/ide.c: make sure IDE_STAT_BSY is 0 before checking other + bits in the status register + 2004-05-05 Gary Thomas * src/flash.c (fis_load): CRC check on load was broken (the CDL option changed names)