diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2002-05-08 08:27:44 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2002-05-08 08:27:44 +0000 |
commit | b900a830463cd2073ee9f67be1ee72b770efdeda (patch) | |
tree | 11ce5e94b0b6d3a6e22a2b3fd978d18328bf01b7 /firmware/drivers/ata.c | |
parent | 3d05c6301a991152f9dacccfa6673794557e14d8 (diff) | |
download | rockbox-b900a830463cd2073ee9f67be1ee72b770efdeda.tar.gz rockbox-b900a830463cd2073ee9f67be1ee72b770efdeda.zip |
Fixed lame timeout handling and wrong return codes.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@508 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers/ata.c')
-rw-r--r-- | firmware/drivers/ata.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c index d75544ef3a..1b7473ce6b 100644 --- a/firmware/drivers/ata.c +++ b/firmware/drivers/ata.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #define ATA_HCYL (*((volatile unsigned char*)0x06100105)) | 32 | #define ATA_HCYL (*((volatile unsigned char*)0x06100105)) |
33 | #define ATA_SELECT (*((volatile unsigned char*)0x06100106)) | 33 | #define ATA_SELECT (*((volatile unsigned char*)0x06100106)) |
34 | #define ATA_COMMAND (*((volatile unsigned char*)0x06100107)) | 34 | #define ATA_COMMAND (*((volatile unsigned char*)0x06100107)) |
35 | #define ATA_STATUS ATA_COMMAND | 35 | #define ATA_STATUS (*((volatile unsigned char*)0x06100107)) |
36 | #define ATA_CONTROL (*((volatile unsigned char*)0x06200306)) | 36 | #define ATA_CONTROL (*((volatile unsigned char*)0x06200306)) |
37 | #define ATA_ALT_STATUS ATA_CONTROL | 37 | #define ATA_ALT_STATUS ATA_CONTROL |
38 | 38 | ||
@@ -55,7 +55,7 @@ | |||
55 | 55 | ||
56 | static int wait_for_bsy(void) | 56 | static int wait_for_bsy(void) |
57 | { | 57 | { |
58 | char timeout = current_tick + HZ; | 58 | int timeout = current_tick + HZ*4; |
59 | while (TIME_BEFORE(current_tick, timeout) && (ATA_ALT_STATUS & STATUS_BSY)) | 59 | while (TIME_BEFORE(current_tick, timeout) && (ATA_ALT_STATUS & STATUS_BSY)) |
60 | yield(); | 60 | yield(); |
61 | 61 | ||
@@ -96,9 +96,12 @@ int ata_read_sectors(unsigned long start, | |||
96 | { | 96 | { |
97 | int i; | 97 | int i; |
98 | 98 | ||
99 | DEBUGF("ata: ata_read_sectors(%d, %d)\n", start, count); | ||
100 | |||
99 | if (!wait_for_rdy()) | 101 | if (!wait_for_rdy()) |
100 | return 0; | 102 | return -1; |
101 | 103 | ||
104 | DEBUGF("ata: reading sector %d\n", start); | ||
102 | led(TRUE); | 105 | led(TRUE); |
103 | 106 | ||
104 | ATA_NSECTOR = count; | 107 | ATA_NSECTOR = count; |
@@ -111,7 +114,7 @@ int ata_read_sectors(unsigned long start, | |||
111 | for (i=0; i<count; i++) { | 114 | for (i=0; i<count; i++) { |
112 | int j; | 115 | int j; |
113 | if (!wait_for_start_of_transfer()) | 116 | if (!wait_for_start_of_transfer()) |
114 | return 0; | 117 | return -1; |
115 | 118 | ||
116 | for (j=0; j<256; j++) | 119 | for (j=0; j<256; j++) |
117 | ((unsigned short*)buf)[j] = SWAB16(ATA_DATA); | 120 | ((unsigned short*)buf)[j] = SWAB16(ATA_DATA); |
@@ -124,7 +127,10 @@ int ata_read_sectors(unsigned long start, | |||
124 | 127 | ||
125 | led(FALSE); | 128 | led(FALSE); |
126 | 129 | ||
127 | return wait_for_end_of_transfer(); | 130 | if(!wait_for_end_of_transfer()) |
131 | return -1; | ||
132 | else | ||
133 | return 0; | ||
128 | } | 134 | } |
129 | 135 | ||
130 | #ifdef DISK_WRITE | 136 | #ifdef DISK_WRITE |