diff options
Diffstat (limited to 'firmware/drivers')
-rw-r--r-- | firmware/drivers/ata.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c index 584c8549e6..1a8ff37cb7 100644 --- a/firmware/drivers/ata.c +++ b/firmware/drivers/ata.c | |||
@@ -122,9 +122,25 @@ static int wait_for_bsy(void) | |||
122 | static int wait_for_rdy(void) __attribute__ ((section (".icode"))); | 122 | static int wait_for_rdy(void) __attribute__ ((section (".icode"))); |
123 | static int wait_for_rdy(void) | 123 | static int wait_for_rdy(void) |
124 | { | 124 | { |
125 | int timeout; | ||
126 | |||
125 | if (!wait_for_bsy()) | 127 | if (!wait_for_bsy()) |
126 | return 0; | 128 | return 0; |
127 | return ATA_ALT_STATUS & STATUS_RDY; | 129 | |
130 | timeout = current_tick + HZ*4; | ||
131 | |||
132 | while (TIME_BEFORE(current_tick, timeout) && | ||
133 | !(ATA_ALT_STATUS & STATUS_RDY)) | ||
134 | yield(); | ||
135 | |||
136 | if (TIME_BEFORE(current_tick, timeout)) | ||
137 | { | ||
138 | return STATUS_RDY; | ||
139 | } | ||
140 | else | ||
141 | { | ||
142 | return 0; /* timeout */ | ||
143 | } | ||
128 | } | 144 | } |
129 | 145 | ||
130 | static int wait_for_start_of_transfer(void) __attribute__ ((section (".icode"))); | 146 | static int wait_for_start_of_transfer(void) __attribute__ ((section (".icode"))); |