/* Unlink an asynchronous request's from UHC's asynchronus list. also remove the queue head from the frame list. If FreeNow, release its resource also. Otherwise, add the request to the UHC's recycle list to wait for a while before release the memory. Until then, hardware won't hold point to the request. */
VOID UhciUnlinkAsyncReq(IN USB_HC_DEV *Uhc, IN UHCI_ASYNC_REQUEST *AsyncReq, IN BOOLEAN FreeNow)
/* Unlink an asynchronous request's from UHC's asynchronus list. also remove the queue head from the frame list. If FreeNow, release its resource also. Otherwise, add the request to the UHC's recycle list to wait for a while before release the memory. Until then, hardware won't hold point to the request. */
VOID UhciUnlinkAsyncReq(IN USB_HC_DEV *Uhc, IN UHCI_ASYNC_REQUEST *AsyncReq, IN BOOLEAN FreeNow)
{
  ASSERT ((Uhc != NULL) && (AsyncReq != NULL));
  RemoveEntryList (&(AsyncReq->Link));
  UhciUnlinkQhFromFrameList (Uhc, AsyncReq->QhSw);
  if (FreeNow) {
    UhciFreeAsyncReq (Uhc, AsyncReq);
  } else {
    AsyncReq->QhSw->QhHw.VerticalLink = QH_VLINK (NULL, TRUE);
    AsyncReq->Recycle                 = Uhc->RecycleWait;
    Uhc->RecycleWait                  = AsyncReq;
  }
}