Index: /trunk/src/VBox/Main/src-server/generic/USBProxyBackendUsbIp.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/generic/USBProxyBackendUsbIp.cpp	(revision 60712)
+++ /trunk/src/VBox/Main/src-server/generic/USBProxyBackendUsbIp.cpp	(revision 60713)
@@ -412,5 +412,4 @@
     Assert(aDevice->i_getUnistate() == kHostUSBDeviceState_Capturing);
     devLock.release();
-    interruptWait();
 
     return VINF_SUCCESS;
@@ -431,5 +430,4 @@
     Assert(aDevice->i_getUnistate() == kHostUSBDeviceState_ReleasingToHost);
     devLock.release();
-    interruptWait();
 
     return VINF_SUCCESS;
@@ -504,8 +502,9 @@
             else if (uIdReady == USBIP_POLL_ID_SOCKET)
             {
-                if (fEventsRecv & RTPOLL_EVT_ERROR)
+                if (fEventsRecv & RTPOLL_EVT_READ)
+                    rc = receiveData();
+                else if (fEventsRecv & RTPOLL_EVT_ERROR)
                     rc = VERR_NET_SHUTDOWN;
-                else
-                    rc = receiveData();
+
                 if (RT_SUCCESS(rc))
                 {
@@ -788,14 +787,24 @@
 int USBProxyBackendUsbIp::receiveData()
 {
+    int rc = VINF_SUCCESS;
     size_t cbRecvd = 0;
-    int rc = RTTcpReadNB(m->hSocket, m->pbRecvBuf, m->cbResidualRecv, &cbRecvd);
-    if (RT_SUCCESS(rc))
-    {
-        m->cbResidualRecv -= cbRecvd;
-        m->pbRecvBuf      += cbRecvd;
-        /* In case we received everything for the current state process the data. */
-        if (!m->cbResidualRecv)
-            rc = processData();
-    }
+
+    do
+    {
+        rc = RTTcpReadNB(m->hSocket, m->pbRecvBuf, m->cbResidualRecv, &cbRecvd);
+        if (RT_SUCCESS(rc))
+        {
+            m->cbResidualRecv -= cbRecvd;
+            m->pbRecvBuf      += cbRecvd;
+            /* In case we received everything for the current state process the data. */
+            if (!m->cbResidualRecv)
+            {
+                rc = processData();
+                if (   RT_SUCCESS(rc)
+                    && m->enmRecvState == kUsbIpRecvState_None)
+                    break;
+            }
+        }
+    } while (RT_SUCCESS(rc) && cbRecvd > 0);
 
     return rc;
