summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2007-03-09 08:03:18 +0000
committerMichael Sevakis <jethead71@rockbox.org>2007-03-09 08:03:18 +0000
commitdee43ece2086e15894934b754e47cb7ce5882cda (patch)
tree9238a5c80fe4382975387ec90eca61bda8d4ed8f /firmware/drivers
parentf4b83e68594f076cdfe510cd2e23b7f57fd158b5 (diff)
downloadrockbox-dee43ece2086e15894934b754e47cb7ce5882cda.tar.gz
rockbox-dee43ece2086e15894934b754e47cb7ce5882cda.zip
Put an end to priority inversion in the ata driver. Gave up trying to have fully atomic dual use mutexes so just replaced the ata driver locking with spins. Maybe I'll have better luck later. Things should run smoothly with database updates and such happening in the background.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12688 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/ata.c44
1 files changed, 22 insertions, 22 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c
index 76c0090a12..d2c80e0ae0 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -104,7 +104,7 @@ STATICIRAM int wait_for_bsy(void)
104 long timeout = current_tick + HZ*30; 104 long timeout = current_tick + HZ*30;
105 while (TIME_BEFORE(current_tick, timeout) && (ATA_STATUS & STATUS_BSY)) { 105 while (TIME_BEFORE(current_tick, timeout) && (ATA_STATUS & STATUS_BSY)) {
106 last_disk_activity = current_tick; 106 last_disk_activity = current_tick;
107 yield(); 107 priority_yield();
108 } 108 }
109 109
110 if (TIME_BEFORE(current_tick, timeout)) 110 if (TIME_BEFORE(current_tick, timeout))
@@ -126,7 +126,7 @@ STATICIRAM int wait_for_rdy(void)
126 while (TIME_BEFORE(current_tick, timeout) && 126 while (TIME_BEFORE(current_tick, timeout) &&
127 !(ATA_ALT_STATUS & STATUS_RDY)) { 127 !(ATA_ALT_STATUS & STATUS_RDY)) {
128 last_disk_activity = current_tick; 128 last_disk_activity = current_tick;
129 yield(); 129 priority_yield();
130 } 130 }
131 131
132 if (TIME_BEFORE(current_tick, timeout)) 132 if (TIME_BEFORE(current_tick, timeout))
@@ -216,7 +216,7 @@ int ata_read_sectors(IF_MV2(int drive,)
216#ifdef HAVE_MULTIVOLUME 216#ifdef HAVE_MULTIVOLUME
217 (void)drive; /* unused for now */ 217 (void)drive; /* unused for now */
218#endif 218#endif
219 mutex_lock(&ata_mtx); 219 spinlock_lock(&ata_mtx);
220 220
221 last_disk_activity = current_tick; 221 last_disk_activity = current_tick;
222 spinup_start = current_tick; 222 spinup_start = current_tick;
@@ -227,14 +227,14 @@ int ata_read_sectors(IF_MV2(int drive,)
227 spinup = true; 227 spinup = true;
228 if (poweroff) { 228 if (poweroff) {
229 if (ata_power_on()) { 229 if (ata_power_on()) {
230 mutex_unlock(&ata_mtx); 230 spinlock_unlock(&ata_mtx);
231 ata_led(false); 231 ata_led(false);
232 return -1; 232 return -1;
233 } 233 }
234 } 234 }
235 else { 235 else {
236 if (perform_soft_reset()) { 236 if (perform_soft_reset()) {
237 mutex_unlock(&ata_mtx); 237 spinlock_unlock(&ata_mtx);
238 ata_led(false); 238 ata_led(false);
239 return -1; 239 return -1;
240 } 240 }
@@ -246,7 +246,7 @@ int ata_read_sectors(IF_MV2(int drive,)
246 SET_REG(ATA_SELECT, ata_device); 246 SET_REG(ATA_SELECT, ata_device);
247 if (!wait_for_rdy()) 247 if (!wait_for_rdy())
248 { 248 {
249 mutex_unlock(&ata_mtx); 249 spinlock_unlock(&ata_mtx);
250 ata_led(false); 250 ata_led(false);
251 return -2; 251 return -2;
252 } 252 }
@@ -359,7 +359,7 @@ int ata_read_sectors(IF_MV2(int drive,)
359 } 359 }
360 ata_led(false); 360 ata_led(false);
361 361
362 mutex_unlock(&ata_mtx); 362 spinlock_unlock(&ata_mtx);
363 363
364 return ret; 364 return ret;
365} 365}
@@ -417,7 +417,7 @@ int ata_write_sectors(IF_MV2(int drive,)
417 if (start == 0) 417 if (start == 0)
418 panicf("Writing on sector 0\n"); 418 panicf("Writing on sector 0\n");
419 419
420 mutex_lock(&ata_mtx); 420 spinlock_lock(&ata_mtx);
421 421
422 last_disk_activity = current_tick; 422 last_disk_activity = current_tick;
423 spinup_start = current_tick; 423 spinup_start = current_tick;
@@ -428,14 +428,14 @@ int ata_write_sectors(IF_MV2(int drive,)
428 spinup = true; 428 spinup = true;
429 if (poweroff) { 429 if (poweroff) {
430 if (ata_power_on()) { 430 if (ata_power_on()) {
431 mutex_unlock(&ata_mtx); 431 spinlock_unlock(&ata_mtx);
432 ata_led(false); 432 ata_led(false);
433 return -1; 433 return -1;
434 } 434 }
435 } 435 }
436 else { 436 else {
437 if (perform_soft_reset()) { 437 if (perform_soft_reset()) {
438 mutex_unlock(&ata_mtx); 438 spinlock_unlock(&ata_mtx);
439 ata_led(false); 439 ata_led(false);
440 return -1; 440 return -1;
441 } 441 }
@@ -445,7 +445,7 @@ int ata_write_sectors(IF_MV2(int drive,)
445 SET_REG(ATA_SELECT, ata_device); 445 SET_REG(ATA_SELECT, ata_device);
446 if (!wait_for_rdy()) 446 if (!wait_for_rdy())
447 { 447 {
448 mutex_unlock(&ata_mtx); 448 spinlock_unlock(&ata_mtx);
449 ata_led(false); 449 ata_led(false);
450 return -2; 450 return -2;
451 } 451 }
@@ -507,7 +507,7 @@ int ata_write_sectors(IF_MV2(int drive,)
507 507
508 ata_led(false); 508 ata_led(false);
509 509
510 mutex_unlock(&ata_mtx); 510 spinlock_unlock(&ata_mtx);
511 511
512 return ret; 512 return ret;
513} 513}
@@ -572,13 +572,13 @@ static int ata_perform_sleep(void)
572{ 572{
573 int ret = 0; 573 int ret = 0;
574 574
575 mutex_lock(&ata_mtx); 575 spinlock_lock(&ata_mtx);
576 576
577 SET_REG(ATA_SELECT, ata_device); 577 SET_REG(ATA_SELECT, ata_device);
578 578
579 if(!wait_for_rdy()) { 579 if(!wait_for_rdy()) {
580 DEBUGF("ata_perform_sleep() - not RDY\n"); 580 DEBUGF("ata_perform_sleep() - not RDY\n");
581 mutex_unlock(&ata_mtx); 581 spinlock_unlock(&ata_mtx);
582 return -1; 582 return -1;
583 } 583 }
584 584
@@ -591,7 +591,7 @@ static int ata_perform_sleep(void)
591 } 591 }
592 592
593 sleeping = true; 593 sleeping = true;
594 mutex_unlock(&ata_mtx); 594 spinlock_unlock(&ata_mtx);
595 return ret; 595 return ret;
596} 596}
597 597
@@ -649,9 +649,9 @@ static void ata_thread(void)
649 if ( !spinup && sleeping && !poweroff && 649 if ( !spinup && sleeping && !poweroff &&
650 TIME_AFTER( current_tick, last_sleep + ATA_POWER_OFF_TIMEOUT )) 650 TIME_AFTER( current_tick, last_sleep + ATA_POWER_OFF_TIMEOUT ))
651 { 651 {
652 mutex_lock(&ata_mtx); 652 spinlock_lock(&ata_mtx);
653 ide_power_enable(false); 653 ide_power_enable(false);
654 mutex_unlock(&ata_mtx); 654 spinlock_unlock(&ata_mtx);
655 poweroff = true; 655 poweroff = true;
656 } 656 }
657#endif 657#endif
@@ -663,11 +663,11 @@ static void ata_thread(void)
663#ifndef USB_NONE 663#ifndef USB_NONE
664 case SYS_USB_CONNECTED: 664 case SYS_USB_CONNECTED:
665 if (poweroff) { 665 if (poweroff) {
666 mutex_lock(&ata_mtx); 666 spinlock_lock(&ata_mtx);
667 ata_led(true); 667 ata_led(true);
668 ata_power_on(); 668 ata_power_on();
669 ata_led(false); 669 ata_led(false);
670 mutex_unlock(&ata_mtx); 670 spinlock_unlock(&ata_mtx);
671 } 671 }
672 672
673 /* Tell the USB thread that we are safe */ 673 /* Tell the USB thread that we are safe */
@@ -741,11 +741,11 @@ int ata_soft_reset(void)
741{ 741{
742 int ret; 742 int ret;
743 743
744 mutex_lock(&ata_mtx); 744 spinlock_lock(&ata_mtx);
745 745
746 ret = perform_soft_reset(); 746 ret = perform_soft_reset();
747 747
748 mutex_unlock(&ata_mtx); 748 spinlock_unlock(&ata_mtx);
749 return ret; 749 return ret;
750} 750}
751 751
@@ -936,7 +936,7 @@ int ata_init(void)
936 bool coldstart = ata_is_coldstart(); 936 bool coldstart = ata_is_coldstart();
937 /* must be called before ata_device_init() */ 937 /* must be called before ata_device_init() */
938 938
939 mutex_init(&ata_mtx); 939 spinlock_init(&ata_mtx);
940 940
941 ata_led(false); 941 ata_led(false);
942 ata_device_init(); 942 ata_device_init();