summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-05-08 08:27:44 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-05-08 08:27:44 +0000
commitb900a830463cd2073ee9f67be1ee72b770efdeda (patch)
tree11ce5e94b0b6d3a6e22a2b3fd978d18328bf01b7 /firmware
parent3d05c6301a991152f9dacccfa6673794557e14d8 (diff)
downloadrockbox-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')
-rw-r--r--firmware/drivers/ata.c16
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
56static int wait_for_bsy(void) 56static 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