summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2002-12-03 13:29:35 +0000
committerBjörn Stenberg <bjorn@haxx.se>2002-12-03 13:29:35 +0000
commitc032e65034c23d3c48bc60bb76e120898b26efd3 (patch)
treeed39b981552d89770dedad08520afff7cd4eed62 /firmware/drivers
parent4a931c6285d4aa86edae488354331ace63fdbd12 (diff)
downloadrockbox-c032e65034c23d3c48bc60bb76e120898b26efd3.zip
rockbox-c032e65034c23d3c48bc60bb76e120898b26efd3.tar.gz
rockbox-c032e65034c23d3c48bc60bb76e120898b26efd3.tar.bz2
rockbox-c032e65034c23d3c48bc60bb76e120898b26efd3.tar.xz
Bug fix: Master/slave was not always properly selected after powerdown.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2910 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/ata.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c
index 1b2cbd3..0b7a37e 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -188,6 +188,7 @@ int ata_read_sectors(unsigned long start,
poweroff = false;
}
+ ATA_SELECT = ata_device;
if (!wait_for_rdy())
{
mutex_unlock(&ata_mtx);
@@ -308,6 +309,7 @@ int ata_write_sectors(unsigned long start,
poweroff = false;
}
+ ATA_SELECT = ata_device;
if (!wait_for_rdy())
{
mutex_unlock(&ata_mtx);
@@ -398,6 +400,8 @@ static int check_registers(void)
static int freeze_lock(void)
{
+ ATA_SELECT = ata_device;
+
if (!wait_for_rdy())
return -1;
@@ -435,13 +439,14 @@ static int ata_perform_sleep(void)
mutex_lock(&ata_mtx);
+ ATA_SELECT = ata_device;
+
if(!wait_for_rdy()) {
DEBUGF("ata_perform_sleep() - not RDY\n");
mutex_unlock(&ata_mtx);
return -1;
}
- ATA_SELECT = ata_device;
ATA_COMMAND = CMD_SLEEP;
if (!wait_for_rdy())
@@ -537,6 +542,7 @@ int ata_hard_reset(void)
sleep(1); /* > 2ms */
/* state HRR2 */
+ ATA_SELECT = ata_device; /* select the right device */
ret = wait_for_bsy();
/* Massage the return code so it is 0 on success and -1 on failure */
@@ -590,12 +596,12 @@ static int ata_power_on(void)
if( ata_hard_reset() )
return -1;
- ATA_SELECT = SELECT_LBA;
- ATA_CONTROL = CONTROL_nIEN;
-
if (set_multiple_mode(multisectors))
return -2;
+ if (freeze_lock())
+ return -3;
+
sleeping = false;
poweroff = false;
return 0;
@@ -676,12 +682,13 @@ static int identify(void)
{
int i;
+ ATA_SELECT = ata_device;
+
if(!wait_for_rdy()) {
DEBUGF("identify() - not RDY\n");
return -1;
}
- ATA_SELECT = ata_device;
ATA_COMMAND = CMD_IDENTIFY;
if (!wait_for_start_of_transfer())
@@ -699,12 +706,13 @@ static int identify(void)
static int set_multiple_mode(int sectors)
{
+ ATA_SELECT = ata_device;
+
if(!wait_for_rdy()) {
DEBUGF("set_multiple_mode() - not RDY\n");
return -1;
}
- ATA_SELECT = ata_device;
ATA_NSECTOR = sectors;
ATA_COMMAND = CMD_SET_MULTIPLE_MODE;
@@ -756,8 +764,5 @@ int ata_init(void)
if (set_multiple_mode(multisectors))
return -6;
- ATA_SELECT = SELECT_LBA;
- ATA_CONTROL = CONTROL_nIEN;
-
return 0;
}