diff options
Diffstat (limited to 'firmware/drivers')
-rw-r--r-- | firmware/drivers/ata_mmc.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/firmware/drivers/ata_mmc.c b/firmware/drivers/ata_mmc.c index 0faf431836..159b007f64 100644 --- a/firmware/drivers/ata_mmc.c +++ b/firmware/drivers/ata_mmc.c | |||
@@ -242,18 +242,24 @@ static unsigned char poll_byte(int timeout) | |||
242 | static unsigned char poll_busy(int timeout) | 242 | static unsigned char poll_busy(int timeout) |
243 | { | 243 | { |
244 | int i; | 244 | int i; |
245 | unsigned char data; | 245 | unsigned char data, dummy; |
246 | 246 | ||
247 | while (!(SSR1 &SCI_TEND)); /* wait for end of transfer */ | 247 | while (!(SSR1 &SCI_TEND)); /* wait for end of transfer */ |
248 | TDR1 = 0xFF; /* send do-nothing data in parallel */ | 248 | TDR1 = 0xFF; /* send do-nothing data in parallel */ |
249 | 249 | ||
250 | /* get data response */ | ||
251 | SSR1 = 0; /* start receiving */ | ||
252 | while (!(SSR1 & SCI_RDRF)); /* wait for data */ | ||
253 | data = RDR1; /* read byte */ | ||
254 | |||
255 | /* wait until the card is ready again */ | ||
250 | i = 0; | 256 | i = 0; |
251 | do { | 257 | do { |
252 | SSR1 = 0; /* start receiving */ | 258 | SSR1 = 0; /* start receiving */ |
253 | while (!(SSR1 & SCI_RDRF)); /* wait for data */ | 259 | while (!(SSR1 & SCI_RDRF)); /* wait for data */ |
254 | data = RDR1; /* read byte */ | 260 | dummy = RDR1; /* read byte */ |
255 | } while ((data == 0x00) && (++i < timeout)); | 261 | } while ((dummy != 0xFF) && (++i < timeout)); |
256 | 262 | ||
257 | return fliptable[(signed char)data]; | 263 | return fliptable[(signed char)data]; |
258 | } | 264 | } |
259 | 265 | ||