summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2009-01-13 16:27:35 +0000
committerMichael Sevakis <jethead71@rockbox.org>2009-01-13 16:27:35 +0000
commit6da8b4eb4925f167588c868a64d2d057ca3bf85f (patch)
tree1441169e97f7ece3422a49e51dc512c8be0b31ae /firmware/drivers
parent30414d56c9f8b4fc35ac2918c4d22e5e2ded0eb6 (diff)
USB retweaking: Take out the USB_REQUEST/RELEASE_DISK scheme and simply ask the USB core whether or not any drivers require exclusive access at the moment of connect. Doing anthing else just produces nasty effects on Windows because it expects some communication just for enabling the PHY and not allowing it to mount volumes if a thread doesn't ack causes annoying error message boxes. Make behavior of each USB type identical from the system perspective. Some miscellaneous changes (simplify, ata->storage naming, define only used USB_* enums values were possible).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19762 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/ata.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c
index edef507e0d..5f5829736f 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -61,8 +61,9 @@
#define CMD_SET_FEATURES 0xEF
#define CMD_SECURITY_FREEZE_LOCK 0xF5
-#define Q_SLEEP 0
-#define Q_CLOSE 1
+/* Should all be < 0x100 (which are reserved for control messages) */
+#define Q_SLEEP 0
+#define Q_CLOSE 1
#define READ_TIMEOUT 5*HZ
@@ -143,7 +144,7 @@ static void ata_lock_unlock(struct ata_lock *l)
#define mutex_unlock ata_lock_unlock
#endif /* MAX_PHYS_SECTOR_SIZE */
-#if defined(HAVE_USBSTACK) && defined(USE_ROCKBOX_USB) && !defined(BOOTLOADER)
+#if defined(HAVE_USBSTACK) && defined(USE_ROCKBOX_USB)
#define ALLOW_USB_SPINDOWN
#endif
@@ -164,7 +165,7 @@ static bool lba48 = false; /* set for 48 bit addressing */
#endif
static long ata_stack[(DEFAULT_STACK_SIZE*3)/sizeof(long)];
static const char ata_thread_name[] = "ata";
-static struct event_queue ata_queue;
+static struct event_queue ata_queue SHAREDBSS_ATTR;
static bool initialized = false;
static long last_user_activity = -1;
@@ -910,7 +911,9 @@ static void ata_thread(void)
#ifdef ALLOW_USB_SPINDOWN
if(!usb_mode)
#endif
+ {
call_storage_idle_notifys(false);
+ }
last_seen_mtx_unlock = 0;
}
}
@@ -923,7 +926,9 @@ static void ata_thread(void)
#ifdef ALLOW_USB_SPINDOWN
if(!usb_mode)
#endif
+ {
call_storage_idle_notifys(true);
+ }
ata_perform_sleep();
last_sleep = current_tick;
}
@@ -935,14 +940,21 @@ static void ata_thread(void)
{
mutex_lock(&ata_mtx);
ide_power_enable(false);
- mutex_unlock(&ata_mtx);
poweroff = true;
+ mutex_unlock(&ata_mtx);
}
#endif
break;
#ifndef USB_NONE
case SYS_USB_CONNECTED:
+ /* Tell the USB thread that we are safe */
+ DEBUGF("ata_thread got SYS_USB_CONNECTED\n");
+#ifdef ALLOW_USB_SPINDOWN
+ usb_mode = true;
+ usb_acknowledge(SYS_USB_CONNECTED_ACK);
+ /* There is no need to force ATA power on */
+#else
if (poweroff) {
mutex_lock(&ata_mtx);
ata_led(true);
@@ -951,14 +963,8 @@ static void ata_thread(void)
mutex_unlock(&ata_mtx);
}
- /* Tell the USB thread that we are safe */
- DEBUGF("ata_thread got SYS_USB_CONNECTED\n");
- usb_acknowledge(SYS_USB_CONNECTED_ACK);
-
-#ifdef ALLOW_USB_SPINDOWN
- usb_mode = true;
-#else
/* Wait until the USB cable is extracted again */
+ usb_acknowledge(SYS_USB_CONNECTED_ACK);
usb_wait_for_disconnect(&ata_queue);
#endif
break;
@@ -971,12 +977,15 @@ static void ata_thread(void)
usb_mode = false;
break;
#endif
-#endif
+#endif /* USB_NONE */
+
case Q_SLEEP:
#ifdef ALLOW_USB_SPINDOWN
if(!usb_mode)
#endif
+ {
call_storage_idle_notifys(false);
+ }
last_disk_activity = current_tick - sleep_timeout + (HZ/2);
break;