VirtualBox

Changeset 31230 in vbox


Ignore:
Timestamp:
Jul 30, 2010 7:29:31 AM (14 years ago)
Author:
vboxsync
Message:

OHCI/VUSB: Propagate transfer cancellation from the guest to avoid stuck URBs.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vusb.h

    r30788 r31230  
    495495     */
    496496    DECLR3CALLBACKMEMBER(void, pfnReapAsyncUrbs,(PVUSBIROOTHUBCONNECTOR pInterface, RTMSINTERVAL cMillies));
     497
     498    /**
     499     * Cancels and completes - with CRC failure - all URBs queued on an endpoint.
     500     * This is done in response to guest URB cancellation.
     501     *
     502     * @returns VBox status code.
     503     * @param   pInterface  Pointer to this struct.
     504     * @param   pUrb        Pointer to a previously submitted URB.
     505     */
     506    DECLR3CALLBACKMEMBER(int, pfnCancelUrbsEp,(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBURB pUrb));
    497507
    498508    /**
  • trunk/src/VBox/Devices/USB/DevOHCI.cpp

    r30568 r31230  
    15851585}
    15861586
     1587/**
     1588 * Returns a URB associated with an in-flight TD, if any.
     1589 *
     1590 * @returns pointer to URB if TD is in flight.
     1591 * @returns NULL if not in flight.
     1592 * @param   pOhci       OHCI instance data.
     1593 * @param   GCPhysTD    Physical address of the TD.
     1594 */
     1595static PVUSBURB ohciTdInFlightUrb(POHCI pOhci, uint32_t GCPhysTD)
     1596{
     1597    int i;
     1598
     1599    i = ohci_in_flight_find(pOhci, GCPhysTD);
     1600    if ( i >= 0 )
     1601        return pOhci->aInFlight[i].pUrb;
     1602    else
     1603        return NULL;
     1604}
    15871605
    15881606/**
     
    31803198            }
    31813199#endif
     3200        }
     3201        else
     3202        {
     3203            if (Ed.hwinfo & ED_HWINFO_SKIP)
     3204            {
     3205                LogFlow(("ohciServiceBulkList: Ed=%#010RX32 Ed.TailP=%#010RX32 SKIP\n", EdAddr, Ed.TailP));
     3206                /* If the ED is in 'skip' state, no transactions on it are allowed and we must
     3207                 * cancel outstanding URBs, if any.
     3208                 */
     3209                uint32_t TdAddr = Ed.HeadP & ED_PTR_MASK;
     3210                PVUSBURB pUrb = ohciTdInFlightUrb(pOhci, TdAddr);
     3211                if (pUrb)
     3212                    pOhci->RootHub.pIRhConn->pfnCancelUrbsEp(pOhci->RootHub.pIRhConn, pUrb);
     3213            }
    31823214        }
    31833215
  • trunk/src/VBox/Devices/USB/DrvVUSBRootHub.cpp

    r30528 r31230  
    573573
    574574
     575/** @copydoc VUSBIROOTHUBCONNECTOR::pfnCancelUrbsEp */
     576static DECLCALLBACK(int) vusbRhCancelUrbsEp(PVUSBIROOTHUBCONNECTOR pInterface, PVUSBURB pUrb)
     577{
     578    PVUSBROOTHUB pRh = VUSBIROOTHUBCONNECTOR_2_VUSBROOTHUB(pInterface);
     579    AssertReturn(pRh, VERR_INVALID_PARAMETER);
     580    AssertReturn(pUrb, VERR_INVALID_PARAMETER);
     581
     582    //@todo: This method of URB canceling may not work on non-Linux hosts.
     583    /*
     584     * Cancel and reap the URB(s) on an endpoint.
     585     */
     586    LogFlow(("vusbRhCancelUrbsEp: pRh=%p pUrb=%p\n", pRh));
     587    vusbUrbCancel(pUrb);
     588
     589    PVUSBURB pRipe;
     590    if (pUrb->enmState == VUSBURBSTATE_REAPED)
     591        pRipe = pUrb;
     592    else
     593        pRipe = pUrb->pUsbIns->pReg->pfnUrbReap(pUrb->pUsbIns, 0);
     594    if (pRipe)
     595    {
     596        pRipe->enmStatus = VUSBSTATUS_CRC;
     597        vusbUrbRipe(pRipe);
     598    }
     599    return VINF_SUCCESS;
     600}
     601
    575602/** @copydoc VUSBIROOTHUBCONNECTOR::pfnCancelAllUrbs */
    576603static DECLCALLBACK(void) vusbRhCancelAllUrbs(PVUSBIROOTHUBCONNECTOR pInterface)
     
    906933    pThis->IRhConnector.pfnSubmitUrb    = vusbRhSubmitUrb;
    907934    pThis->IRhConnector.pfnReapAsyncUrbs= vusbRhReapAsyncUrbs;
     935    pThis->IRhConnector.pfnCancelUrbsEp = vusbRhCancelUrbsEp;
    908936    pThis->IRhConnector.pfnCancelAllUrbs= vusbRhCancelAllUrbs;
    909937    pThis->IRhConnector.pfnAttachDevice = vusbRhAttachDevice;
  • trunk/src/VBox/Devices/USB/VUSBInternal.h

    r31058 r31230  
    355355    PVUSBDEV                pDevices;
    356356#if HC_ARCH_BITS == 32
    357     uint32_t                Alignment0;
     357//    uint32_t                Alignment0;
    358358#endif
    359359    /** Availability Bitmap. */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette