Index: /trunk/include/VBox/vusb.h
===================================================================
--- /trunk/include/VBox/vusb.h	(revision 31229)
+++ /trunk/include/VBox/vusb.h	(revision 31230)
@@ -495,4 +495,14 @@
      */
     DECLR3CALLBACKMEMBER(void, pfnReapAsyncUrbs,(PVUSBIROOTHUBCONNECTOR pInterface, RTMSINTERVAL cMillies));
+
+    /**
+     * Cancels and completes - with CRC failure - all URBs queued on an endpoint.
+     * This is done in response to guest URB cancellation.
+     *
+     * @returns VBox status code.
+     * @param   pInterface  Pointer to this struct.
+     * @param   pUrb        Pointer to a previously submitted URB.
+     */
+    DECLR3CALLBACKMEMBER(int, pfnCancelUrbsEp,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBURB pUrb));
 
     /**
Index: /trunk/src/VBox/Devices/USB/DevOHCI.cpp
===================================================================
--- /trunk/src/VBox/Devices/USB/DevOHCI.cpp	(revision 31229)
+++ /trunk/src/VBox/Devices/USB/DevOHCI.cpp	(revision 31230)
@@ -1585,4 +1585,22 @@
 }
 
+/**
+ * Returns a URB associated with an in-flight TD, if any.
+ *
+ * @returns pointer to URB if TD is in flight.
+ * @returns NULL if not in flight.
+ * @param   pOhci       OHCI instance data.
+ * @param   GCPhysTD    Physical address of the TD.
+ */
+static PVUSBURB ohciTdInFlightUrb(POHCI pOhci, uint32_t GCPhysTD)
+{
+    int i;
+
+    i = ohci_in_flight_find(pOhci, GCPhysTD);
+    if ( i >= 0 )
+        return pOhci->aInFlight[i].pUrb;
+    else
+        return NULL;
+}
 
 /**
@@ -3180,4 +3198,18 @@
             }
 #endif
+        }
+        else
+        {
+            if (Ed.hwinfo & ED_HWINFO_SKIP)
+            {
+                LogFlow(("ohciServiceBulkList: Ed=%#010RX32 Ed.TailP=%#010RX32 SKIP\n", EdAddr, Ed.TailP));
+                /* If the ED is in 'skip' state, no transactions on it are allowed and we must
+                 * cancel outstanding URBs, if any.
+                 */
+                uint32_t TdAddr = Ed.HeadP & ED_PTR_MASK;
+                PVUSBURB pUrb = ohciTdInFlightUrb(pOhci, TdAddr);
+                if (pUrb)
+                    pOhci->RootHub.pIRhConn->pfnCancelUrbsEp(pOhci->RootHub.pIRhConn, pUrb);
+            }
         }
 
Index: /trunk/src/VBox/Devices/USB/DrvVUSBRootHub.cpp
===================================================================
--- /trunk/src/VBox/Devices/USB/DrvVUSBRootHub.cpp	(revision 31229)
+++ /trunk/src/VBox/Devices/USB/DrvVUSBRootHub.cpp	(revision 31230)
@@ -573,4 +573,31 @@
 
 
+/** @copydoc VUSBIROOTHUBCONNECTOR::pfnCancelUrbsEp */
+static DECLCALLBACK(int) vusbRhCancelUrbsEp(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBURB pUrb)
+{
+    PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface);
+    AssertReturn(pRh, VERR_INVALID_PARAMETER);
+    AssertReturn(pUrb, VERR_INVALID_PARAMETER);
+
+    //@todo: This method of URB canceling may not work on non-Linux hosts.
+    /*
+     * Cancel and reap the URB(s) on an endpoint.
+     */
+    LogFlow(("vusbRhCancelUrbsEp: pRh=%p pUrb=%p\n", pRh));
+    vusbUrbCancel(pUrb);
+
+    PVUSBURB pRipe;
+    if (pUrb->enmState == VUSBURBSTATE_REAPED)
+        pRipe = pUrb;
+    else
+        pRipe = pUrb->pUsbIns->pReg->pfnUrbReap(pUrb->pUsbIns, 0);
+    if (pRipe)
+    {
+        pRipe->enmStatus = VUSBSTATUS_CRC;
+        vusbUrbRipe(pRipe);
+    }
+    return VINF_SUCCESS;
+}
+
 /** @copydoc VUSBIROOTHUBCONNECTOR::pfnCancelAllUrbs */
 static DECLCALLBACK(void) vusbRhCancelAllUrbs(PVUSBIROOTHUBCONNECTOR pInterface)
@@ -906,4 +933,5 @@
     pThis->IRhConnector.pfnSubmitUrb    = vusbRhSubmitUrb;
     pThis->IRhConnector.pfnReapAsyncUrbs= vusbRhReapAsyncUrbs;
+    pThis->IRhConnector.pfnCancelUrbsEp = vusbRhCancelUrbsEp;
     pThis->IRhConnector.pfnCancelAllUrbs= vusbRhCancelAllUrbs;
     pThis->IRhConnector.pfnAttachDevice = vusbRhAttachDevice;
Index: /trunk/src/VBox/Devices/USB/VUSBInternal.h
===================================================================
--- /trunk/src/VBox/Devices/USB/VUSBInternal.h	(revision 31229)
+++ /trunk/src/VBox/Devices/USB/VUSBInternal.h	(revision 31230)
@@ -355,5 +355,5 @@
     PVUSBDEV                pDevices;
 #if HC_ARCH_BITS == 32
-    uint32_t                Alignment0;
+//    uint32_t                Alignment0;
 #endif
     /** Availability Bitmap. */
