diff options
author | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2016-04-15 10:21:32 +0000 |
---|---|---|
committer | vboxsync <vboxsync@cfe28804-0f27-0410-a406-dd0f0b0b656f> | 2016-04-15 10:21:32 +0000 |
commit | 090a1aa90b0ee6dfd1888c3b4c1b9c6e75e9bc87 (patch) | |
tree | 217b07762a700098a18a5c355e027711c4aea701 /src/VBox/Devices/USB/VUSBUrb.cpp | |
parent | b8c439d8a26b26f4cc63ee23ddf4e1ad45d1222f (diff) | |
download | VirtualBox-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.cpp | 24 |
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); + } } /* |