summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Halpin <jack.halpin@gmail.com>2009-11-24 17:43:53 +0000
committerJack Halpin <jack.halpin@gmail.com>2009-11-24 17:43:53 +0000
commitcb9dff0a95cc98d83d6e1445c20bdad53614fe00 (patch)
tree960f0c1cc1225ed47e30f90cc160e6899cb99dd4
parent1511d75f9d965cba0e1ef9d2fddb94149196638c (diff)
downloadrockbox-cb9dff0a95cc98d83d6e1445c20bdad53614fe00.tar.gz
rockbox-cb9dff0a95cc98d83d6e1445c20bdad53614fe00.zip
AMS Sansa: Include time spent yielding when figuring timeout in sd_wait_for_state().
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23738 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/target/arm/as3525/ata_sd_as3525.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/firmware/target/arm/as3525/ata_sd_as3525.c b/firmware/target/arm/as3525/ata_sd_as3525.c
index 9f2514d8ba..e71c886021 100644
--- a/firmware/target/arm/as3525/ata_sd_as3525.c
+++ b/firmware/target/arm/as3525/ata_sd_as3525.c
@@ -539,13 +539,10 @@ bool sd_present(IF_MD_NONVOID(int drive))
539static int sd_wait_for_state(const int drive, unsigned int state) 539static int sd_wait_for_state(const int drive, unsigned int state)
540{ 540{
541 unsigned long response = 0; 541 unsigned long response = 0;
542 unsigned int timeout = 100; /* ticks */ 542 unsigned int timeout = current_tick + 100; /* 100 ticks timeout */
543 long t = current_tick;
544 543
545 while (1) 544 while (1)
546 { 545 {
547 long tick;
548
549 if(!send_cmd(drive, SD_SEND_STATUS, card_info[drive].rca, 546 if(!send_cmd(drive, SD_SEND_STATUS, card_info[drive].rca,
550 MCI_RESP|MCI_ARG, &response)) 547 MCI_RESP|MCI_ARG, &response))
551 return -1; 548 return -1;
@@ -553,14 +550,13 @@ static int sd_wait_for_state(const int drive, unsigned int state)
553 if (((response >> 9) & 0xf) == state) 550 if (((response >> 9) & 0xf) == state)
554 return 0; 551 return 0;
555 552
556 if(TIME_AFTER(current_tick, t + timeout)) 553 if(TIME_AFTER(current_tick, timeout))
557 return -2; 554 return -2;
558 555
559 if (TIME_AFTER((tick = current_tick), next_yield)) 556 if (TIME_AFTER(current_tick, next_yield))
560 { 557 {
561 yield(); 558 yield();
562 timeout += current_tick - tick; 559 next_yield = current_tick + MIN_YIELD_PERIOD;
563 next_yield = tick + MIN_YIELD_PERIOD;
564 } 560 }
565 } 561 }
566} 562}