summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2002-12-02 10:30:40 +0000
committerBjörn Stenberg <bjorn@haxx.se>2002-12-02 10:30:40 +0000
commit7249c8807c6e8f9d083d3909863097e8a44cc4fe (patch)
tree7448b697a12f9bbe01de6d9d571f4832f21be785
parent657a2f3d1cae6fe436cd7eb5b3ef962f50d4c8c6 (diff)
downloadrockbox-7249c8807c6e8f9d083d3909863097e8a44cc4fe.zip
rockbox-7249c8807c6e8f9d083d3909863097e8a44cc4fe.tar.gz
rockbox-7249c8807c6e8f9d083d3909863097e8a44cc4fe.tar.bz2
rockbox-7249c8807c6e8f9d083d3909863097e8a44cc4fe.tar.xz
Updated power-on procedure
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2896 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/ata.c29
1 files changed, 10 insertions, 19 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c
index 173dab9..f49040a 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -102,6 +102,7 @@ static unsigned short identify_info[SECTOR_SIZE];
static int ata_power_on(void);
static int perform_soft_reset(void);
+static int set_multiple_mode(int sectors);
static int wait_for_bsy(void) __attribute__ ((section (".icode")));
static int wait_for_bsy(void)
@@ -524,21 +525,18 @@ int ata_hard_reset(void)
{
int ret;
- mutex_lock(&ata_mtx);
-
PADR &= ~0x0200;
sleep(2);
PADR |= 0x0200;
- ret = wait_for_rdy();
+ ret = wait_for_bsy();
/* Massage the return code so it is 0 on success and -1 on failure */
ret = ret?0:-1;
sleeping = false;
- mutex_unlock(&ata_mtx);
return ret;
}
@@ -582,26 +580,19 @@ int ata_soft_reset(void)
static int ata_power_on(void)
{
- int ret;
- int retry_count;
-
ide_power_enable(true);
- sleep(HZ/2);
+ if( ata_hard_reset() )
+ return -1;
+ ATA_SELECT = SELECT_LBA;
ATA_CONTROL = CONTROL_nIEN;
- /* This little sucker can take up to 30 seconds */
- retry_count = 8;
- do
- {
- ret = wait_for_rdy();
- } while(!ret && retry_count--);
-
- /* Massage the return code so it is 0 on success and -1 on failure */
- ret = ret?0:-1;
+ if (set_multiple_mode(multisectors))
+ return -2;
sleeping = false;
- return ret;
+ poweroff = false;
+ return 0;
}
static int master_slave_detect(void)
@@ -752,7 +743,7 @@ int ata_init(void)
initialized = true;
}
if (set_multiple_mode(multisectors))
- return -6;
+ return -6;
ATA_SELECT = SELECT_LBA;
ATA_CONTROL = CONTROL_nIEN;