summaryrefslogtreecommitdiff
path: root/src/VBox/Devices/USB/VUSBUrb.cpp
diff options
context:
space:
mode:
authorvboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2016-04-15 10:21:32 +0000
committervboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f>2016-04-15 10:21:32 +0000
commit090a1aa90b0ee6dfd1888c3b4c1b9c6e75e9bc87 (patch)
tree217b07762a700098a18a5c355e027711c4aea701 /src/VBox/Devices/USB/VUSBUrb.cpp
parentb8c439d8a26b26f4cc63ee23ddf4e1ad45d1222f (diff)
downloadVirtualBox-svn-090a1aa90b0ee6dfd1888c3b4c1b9c6e75e9bc87.tar.gz
VUSB: Allow bulk/interrupt transfer mixing (most USB stack do not distinguish them.
git-svn-id: https://www.virtualbox.org/svn/vbox/trunk@60515 cfe28804-0f27-0410-a406-dd0f0b0b656f
Diffstat (limited to 'src/VBox/Devices/USB/VUSBUrb.cpp')
-rw-r--r--src/VBox/Devices/USB/VUSBUrb.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/VBox/Devices/USB/VUSBUrb.cpp b/src/VBox/Devices/USB/VUSBUrb.cpp
index 725e2f21dc2..a97e909641b 100644
--- a/src/VBox/Devices/USB/VUSBUrb.cpp
+++ b/src/VBox/Devices/USB/VUSBUrb.cpp
@@ -1144,10 +1144,26 @@ int vusbUrbSubmit(PVUSBURB pUrb)
*/
if ((pEndPtDesc->Core.bmAttributes & 0x3) != pUrb->enmType)
{
- Log(("%s: pDev=%p[%s]: SUBMIT: %s transfer requested for %#x endpoint on DstAddress=%i ep=%i dir=%s\n",
- pUrb->pszDesc, pDev, pDev->pUsbIns->pszName, vusbUrbTypeName(pUrb->enmType), pEndPtDesc->Core.bmAttributes,
- pUrb->DstAddress, pUrb->EndPt, vusbUrbDirName(pUrb->enmDir)));
- return vusbUrbSubmitHardError(pUrb);
+ /* Bulk and interrupt transfers are identical on the bus level (the only difference
+ * is in how they are scheduled by the HCD/HC) and need an exemption.
+ * Atheros AR9271 is a known offender; its configuration descriptors include
+ * interrupt endpoints, but drivers (Win7/8, Linux kernel pre-3.05) treat them
+ * as bulk endpoints.
+ */
+ if ( (pUrb->enmType == VUSBXFERTYPE_BULK && (pEndPtDesc->Core.bmAttributes & 0x3) == VUSBXFERTYPE_INTR)
+ || (pUrb->enmType == VUSBXFERTYPE_INTR && (pEndPtDesc->Core.bmAttributes & 0x3) == VUSBXFERTYPE_BULK))
+ {
+ Log2(("%s: pDev=%p[%s]: SUBMIT: mixing bulk/interrupt transfers on DstAddress=%i ep=%i dir=%s\n",
+ pUrb->pszDesc, pDev, pDev->pUsbIns->pszName,
+ pUrb->DstAddress, pUrb->EndPt, vusbUrbDirName(pUrb->enmDir)));
+ }
+ else
+ {
+ Log(("%s: pDev=%p[%s]: SUBMIT: %s transfer requested for %#x endpoint on DstAddress=%i ep=%i dir=%s\n",
+ pUrb->pszDesc, pDev, pDev->pUsbIns->pszName, vusbUrbTypeName(pUrb->enmType), pEndPtDesc->Core.bmAttributes,
+ pUrb->DstAddress, pUrb->EndPt, vusbUrbDirName(pUrb->enmDir)));
+ return vusbUrbSubmitHardError(pUrb);
+ }
}
/*