Author: mjmartin Date: Thu Jan 6 18:45:18 2011 New Revision: 50304
URL: http://svn.reactos.org/svn/reactos?rev=50304&view=rev Log: [usb/usbehci]: - EhciDefferedRoutine: Only free Mdl if one was created when the request was added to the queue. - Dont assume that three transfer descriptors need to be freed, use a while moving to each linked and free instead. - Yabba Dabba Doo added to increase size of message. :)
Modified: trunk/reactos/drivers/usb/usbehci/fdo.c
Modified: trunk/reactos/drivers/usb/usbehci/fdo.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbehci/fdo.c?r... ============================================================================== --- trunk/reactos/drivers/usb/usbehci/fdo.c [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbehci/fdo.c [iso-8859-1] Thu Jan 6 18:45:18 2011 @@ -46,12 +46,12 @@ DPRINT("Asyn Complete!\n"); ULONG CurrentAddr, OffSet; PQUEUE_HEAD CompletedQH, NextQH; - PQUEUE_TRANSFER_DESCRIPTOR CompletedTD; + PQUEUE_TRANSFER_DESCRIPTOR CompletedTD, NextTD;
- /* AsyncListAddr Register will have the next QueueHead to execute */ + /* AsyncListAddr Register will have the next QueueHead to execute */ CurrentAddr = GetAsyncListQueueRegister(hcd);
- /* Calculate the VA for the next QueueHead */ + /* Calculate the VA for the next QueueHead */ OffSet = CurrentAddr - (ULONG)FdoDeviceExtension->hcd.CommonBufferPA.LowPart; NextQH = (PQUEUE_HEAD)((ULONG)FdoDeviceExtension->hcd.CommonBufferVA + OffSet);
@@ -62,16 +62,15 @@
//DumpQueueHead(CompletedQH);
- /* Free memory for the Descriptors */ + /* Free memory for the Descriptors */ CompletedTD = CompletedQH->TransferDescriptor; - //DumpTransferDescriptor(CompletedTD); - FreeDescriptor(CompletedTD); - CompletedTD = CompletedTD->NextDescriptor; - //DumpTransferDescriptor(CompletedTD); - FreeDescriptor(CompletedTD); - CompletedTD = CompletedTD->NextDescriptor; - //DumpTransferDescriptor(CompletedTD); - FreeDescriptor(CompletedTD); + NextTD = CompletedTD; + while (NextTD) + { + CompletedTD = NextTD; + NextTD = NextTD->NextDescriptor; + FreeDescriptor(CompletedTD); + }
/* If the Event is set then release waiter */ if (CompletedQH->Event) @@ -79,27 +78,25 @@ KeSetEvent(CompletedQH->Event, IO_NO_INCREMENT, FALSE); }
- /* Free the Mdl */ - ASSERT(CompletedQH->MdlToFree); - IoFreeMdl(CompletedQH->MdlToFree); + /* Free the Mdl if there was one */ + if(CompletedQH->MdlToFree) + IoFreeMdl(CompletedQH->MdlToFree);
/* Is there an IRP that needs to be completed */ if (CompletedQH->IrpToComplete) { - PIRP Irp; - + PIRP Irp; + PIO_STACK_LOCATION Stack; + PURB Urb; + Irp = CompletedQH->IrpToComplete; + Stack = IoGetCurrentIrpStackLocation(Irp); + ASSERT(Stack); + Urb = (PURB) Stack->Parameters.Others.Argument1;
/* Check for error */ if (CStatus & EHCI_ERROR_INT) { - PIO_STACK_LOCATION Stack; - PURB Urb; - - Stack = IoGetCurrentIrpStackLocation(Irp); - ASSERT(Stack); - Urb = (PURB) Stack->Parameters.Others.Argument1; - ASSERT(FALSE); /* Haled bit should be set */ if (CompletedQH->Token.Bits.Halted) {