summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/drivers/ata.c10
-rw-r--r--firmware/export/ata.h1
-rw-r--r--firmware/target/arm/ipod/usb-ipod.c3
3 files changed, 13 insertions, 1 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c
index 0de2eb1804..d0cca2e148 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -1215,6 +1215,15 @@ void ata_sleep(void)
queue_post(&ata_queue, Q_SLEEP, NULL);
}
+void ata_sleepnow(void)
+{
+ if (!spinup && !sleeping && !ata_mtx.locked)
+ {
+ call_ata_idle_notifys(false);
+ ata_perform_sleep();
+ }
+}
+
void ata_spin(void)
{
last_user_activity = current_tick;
@@ -1288,7 +1297,6 @@ static void ata_thread(void)
call_ata_idle_notifys(false);
last_disk_activity = current_tick - sleep_timeout + (HZ/2);
break;
-
}
}
}
diff --git a/firmware/export/ata.h b/firmware/export/ata.h
index c2ba974544..a2cb8ab975 100644
--- a/firmware/export/ata.h
+++ b/firmware/export/ata.h
@@ -40,6 +40,7 @@ extern void ata_enable(bool on);
extern void ata_spindown(int seconds);
extern void ata_poweroff(bool enable);
extern void ata_sleep(void);
+extern void ata_sleepnow(void);
extern bool ata_disk_is_active(void);
extern int ata_hard_reset(void);
extern int ata_soft_reset(void);
diff --git a/firmware/target/arm/ipod/usb-ipod.c b/firmware/target/arm/ipod/usb-ipod.c
index c481355768..9298d65ff7 100644
--- a/firmware/target/arm/ipod/usb-ipod.c
+++ b/firmware/target/arm/ipod/usb-ipod.c
@@ -94,6 +94,9 @@ void usb_enable(bool on)
#elif defined(IPOD_NANO) || defined(IPOD_VIDEO) || defined(IPOD_MINI2G)
unsigned char* storage_ptr = (unsigned char *)0x4001FF00;
#endif
+
+ ata_sleepnow(); /* Immediately spindown the disk. */
+ sleep(HZ*2);
memcpy(storage_ptr, "diskmode\0\0hotstuff\0\0\1", 21);
DEV_RS |= 4; /* Reboot */
}