1348
* Creates a USB device timer.
1350
* @returns VBox status.
1351
* @param pVM The VM to create the timer in.
1352
* @param pUsbIns The USB device instance.
1353
* @param enmClock The clock to use on this timer.
1354
* @param pfnCallback Callback function.
1355
* @param pvUser The user argument to the callback.
1356
* @param fFlags Timer creation flags, see grp_tm_timer_flags.
1357
* @param pszDesc Pointer to description string which must stay around
1358
* until the timer is fully destroyed (i.e. a bit after TMTimerDestroy()).
1359
* @param ppTimer Where to store the timer on success.
1361
VMM_INT_DECL(int) TMR3TimerCreateUsb(PVM pVM, PPDMUSBINS pUsbIns, TMCLOCK enmClock,
1362
PFNTMTIMERUSB pfnCallback, void *pvUser,
1363
uint32_t fFlags, const char *pszDesc, PPTMTIMERR3 ppTimer)
1365
AssertReturn(!(fFlags & ~(TMTIMER_FLAGS_NO_CRIT_SECT)), VERR_INVALID_PARAMETER);
1368
* Allocate and init stuff.
1370
int rc = tmr3TimerCreate(pVM, enmClock, pszDesc, ppTimer);
1373
(*ppTimer)->enmType = TMTIMERTYPE_USB;
1374
(*ppTimer)->u.Usb.pfnTimer = pfnCallback;
1375
(*ppTimer)->u.Usb.pUsbIns = pUsbIns;
1376
(*ppTimer)->pvUser = pvUser;
1377
//if (!(fFlags & TMTIMER_FLAGS_NO_CRIT_SECT))
1379
// if (pDevIns->pCritSectR3)
1380
// (*ppTimer)->pCritSect = pUsbIns->pCritSectR3;
1382
// (*ppTimer)->pCritSect = IOMR3GetCritSect(pVM);
1384
Log(("TM: Created USB device timer %p clock %d callback %p '%s'\n", (*ppTimer), enmClock, pfnCallback, pszDesc));
1346
1392
* Creates a driver timer.
1688
* Destroy all timers owned by a USB device.
1690
* @returns VBox status.
1691
* @param pVM VM handle.
1692
* @param pUsbIns USB device which timers should be destroyed.
1694
VMM_INT_DECL(int) TMR3TimerDestroyUsb(PVM pVM, PPDMUSBINS pUsbIns)
1696
LogFlow(("TMR3TimerDestroyUsb: pUsbIns=%p\n", pUsbIns));
1698
return VERR_INVALID_PARAMETER;
1701
PTMTIMER pCur = pVM->tm.s.pCreated;
1704
PTMTIMER pDestroy = pCur;
1705
pCur = pDestroy->pBigNext;
1706
if ( pDestroy->enmType == TMTIMERTYPE_USB
1707
&& pDestroy->u.Usb.pUsbIns == pUsbIns)
1709
int rc = TMR3TimerDestroy(pDestroy);
1715
LogFlow(("TMR3TimerDestroyUsb: returns VINF_SUCCESS\n"));
1716
return VINF_SUCCESS;
1642
1721
* Destroy all timers owned by a driver.
1644
1723
* @returns VBox status.
1928
2007
switch (pTimer->enmType)
1930
2009
case TMTIMERTYPE_DEV: pTimer->u.Dev.pfnTimer(pTimer->u.Dev.pDevIns, pTimer, pTimer->pvUser); break;
2010
case TMTIMERTYPE_USB: pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer, pTimer->pvUser); break;
1931
2011
case TMTIMERTYPE_DRV: pTimer->u.Drv.pfnTimer(pTimer->u.Drv.pDrvIns, pTimer, pTimer->pvUser); break;
1932
2012
case TMTIMERTYPE_INTERNAL: pTimer->u.Internal.pfnTimer(pVM, pTimer, pTimer->pvUser); break;
1933
2013
case TMTIMERTYPE_EXTERNAL: pTimer->u.External.pfnTimer(pTimer->pvUser); break;
2110
2190
switch (pTimer->enmType)
2112
2192
case TMTIMERTYPE_DEV: pTimer->u.Dev.pfnTimer(pTimer->u.Dev.pDevIns, pTimer, pTimer->pvUser); break;
2193
case TMTIMERTYPE_USB: pTimer->u.Usb.pfnTimer(pTimer->u.Usb.pUsbIns, pTimer, pTimer->pvUser); break;
2113
2194
case TMTIMERTYPE_DRV: pTimer->u.Drv.pfnTimer(pTimer->u.Drv.pDrvIns, pTimer, pTimer->pvUser); break;
2114
2195
case TMTIMERTYPE_INTERNAL: pTimer->u.Internal.pfnTimer(pVM, pTimer, pTimer->pvUser); break;
2115
2196
case TMTIMERTYPE_EXTERNAL: pTimer->u.External.pfnTimer(pTimer->pvUser); break;