|
Rockbox mail archiveSubject: Re: Red led dead - this is where it goes wrong!!!Re: Red led dead - this is where it goes wrong!!!
From: Björn Stenberg <bjorn_at_haxx.se>
Date: Thu, 1 May 2003 22:55:36 +0200 Mike Holden wrote: > Basically, when we hit this problem, the ATA_ALT_STATUS __always__ returns > 0x80 (BUSY). [..] This usually happens when called from > perform_soft_reset() in ata_read_sectors() Excellent work! > I have tried changing the perform_soft_reset() call to an > ata_hard_reset(), but it seems that this doesn't always sort out the disk > either, so I need to look at an even more severe reset method. The ATA spec says: "Transition PM3:PM2:, When hardware reset, software reset, or DEVICE RESET command is received the device shall make a transition to the PM2:Standby mode." (PM3 is sleep mode, PM2 is standby mode.) So all of the three should work. If neither hard or soft reset work, you could try the DEVICE RESET command, but I doubt it will work any better. What is definitely worth trying, however, is to use power mode STANDBY instead of SLEEP. It draws a little bit more power, but does not require a reset to wake up. Silly of me not to try this before. Here's a patch: =================================================================== RCS file: /cvsroot/rockbox/firmware/drivers/ata.c,v retrieving revision 1.82 diff -u -b -r1.82 ata.c --- firmware/drivers/ata.c 28 Apr 2003 12:02:14 -0000 1.82 +++ firmware/drivers/ata.c 1 May 2003 20:44:58 -0000 _at__at_ -185,6 +185,7 _at__at_ return -1; } } +#ifdef USE_SLEEP else { if (perform_soft_reset()) { mutex_unlock(&ata_mtx); _at__at_ -192,6 +193,7 _at__at_ return -1; } } +#endif } timeout = current_tick + READ_TIMEOUT; _at__at_ -334,6 +336,7 _at__at_ return -1; } } +#ifdef USE_SLEEP else { if (perform_soft_reset()) { mutex_unlock(&ata_mtx); _at__at_ -341,6 +344,7 _at__at_ return -1; } } +#endif } ATA_SELECT = ata_device; _at__at_ -490,7 +494,11 _at__at_ return -1; } +#ifdef USE_SLEEP ATA_COMMAND = CMD_SLEEP; +#else + ATA_COMMAND = CMD_STANDBY_IMMEDIATE; +#endif if (!wait_for_rdy()) { -- BjörnReceived on 2003-05-01 Page template was last modified "Tue Sep 7 00:00:02 2021" The Rockbox Crew -- Privacy Policy |