Index: firmware/export/config/sansaclipplus.h
===================================================================
--- firmware/export/config/sansaclipplus.h	(revision 31041)
+++ firmware/export/config/sansaclipplus.h	(working copy)
@@ -179,8 +179,8 @@
 
 /* enable these for the experimental usb stack */
 #define HAVE_USBSTACK
-#define USB_HANDLED_BY_OF
-//#define USE_ROCKBOX_USB
+//#define USB_HANDLED_BY_OF
+#define USE_ROCKBOX_USB
 #define USB_VENDOR_ID 0x0781
 #define USB_PRODUCT_ID 0x74d1
 
Index: firmware/export/config/sansaclipv2.h
===================================================================
--- firmware/export/config/sansaclipv2.h	(revision 31041)
+++ firmware/export/config/sansaclipv2.h	(working copy)
@@ -175,8 +175,8 @@
 
 /* enable these for the experimental usb stack */
 #define HAVE_USBSTACK
-#define USB_HANDLED_BY_OF
-//#define USE_ROCKBOX_USB
+//#define USB_HANDLED_BY_OF
+#define USE_ROCKBOX_USB
 #define USB_VENDOR_ID 0x0781
 #define USB_PRODUCT_ID 0x7435
 
Index: firmware/target/arm/as3525/usb-drv-as3525v2.c
===================================================================
--- firmware/target/arm/as3525/usb-drv-as3525v2.c	(revision 31041)
+++ firmware/target/arm/as3525/usb-drv-as3525v2.c	(working copy)
@@ -89,6 +89,7 @@
 /* setup packet for EP0 */
 static struct usb_ctrlrequest _ep0_setup_pkt __attribute__((aligned(32)));
 static struct usb_ctrlrequest *ep0_setup_pkt = AS3525_UNCACHED_ADDR(&_ep0_setup_pkt);
+static int g_usbreset_count = 0;
 
 /* state of EP0 */
 static enum ep0state ep0_state;
@@ -162,7 +163,7 @@
 {
     /* Disconnect */
     DCTL |= DCTL_sftdiscon;
-    sleep(HZ/20);
+    udelay(1000000/20);
     /* Disable clock */
     CGU_USB = 0;
     usb_delay();
@@ -464,6 +465,8 @@
         semaphore_init(&endpoints[ep][DIR_OUT].complete, 1, 0);
     /* Enable global interrupts */
     enable_global_interrupts();
+
+    g_usbreset_count = 0;
 }
 
 void usb_drv_exit(void)
@@ -614,6 +617,19 @@
     {
         logf("usb-drv: bus reset");
 
+        g_usbreset_count++;
+
+        if(g_usbreset_count == 2)
+        {
+            logf("usb-drv: hard reset");
+            logf("--------");
+            logf("--------");
+            DCTL |= DCTL_sftdiscon;
+            usb_delay();
+            usb_drv_exit();
+            usb_drv_init(); /* reset g_usbreset_count here */
+        }
+
         /* Clear the Remote Wakeup Signalling */
         DCTL &= ~DCTL_rmtwkupsig;
