mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 17:56:00 +00:00
[USBOHCI_NEW] Refactor OHCI_AbortTransfer function
- Added SAL annotation - Simplified local variables - Replace counterintuitive `do {} while ()` loops with nice `for` loops - Get rid of goto and its label, it can be simply avoided
This commit is contained in:
parent
0a84597679
commit
2a8fc2b411
1 changed files with 40 additions and 71 deletions
|
@ -1660,6 +1660,14 @@ OHCI_ProcessDoneIsoTD(IN POHCI_EXTENSION OhciExtension,
|
||||||
DPRINT1("OHCI_ProcessDoneIsoTD: UNIMPLEMENTED. FIXME\n");
|
DPRINT1("OHCI_ProcessDoneIsoTD: UNIMPLEMENTED. FIXME\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Aborts the transfer descriptor chain in a given endpoint
|
||||||
|
*
|
||||||
|
* @param[in] ohciExtension The ohci extension
|
||||||
|
* @param[in] ohciEndpoint The ohci endpoint
|
||||||
|
* @param[in] ohciTransfer The ohci transfer
|
||||||
|
* @param[out] CompletedLength
|
||||||
|
*/
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
OHCI_AbortTransfer(IN PVOID ohciExtension,
|
OHCI_AbortTransfer(IN PVOID ohciExtension,
|
||||||
|
@ -1670,32 +1678,19 @@ OHCI_AbortTransfer(IN PVOID ohciExtension,
|
||||||
POHCI_EXTENSION OhciExtension = ohciExtension;
|
POHCI_EXTENSION OhciExtension = ohciExtension;
|
||||||
POHCI_ENDPOINT OhciEndpoint = ohciEndpoint;
|
POHCI_ENDPOINT OhciEndpoint = ohciEndpoint;
|
||||||
POHCI_TRANSFER OhciTransfer = ohciTransfer;
|
POHCI_TRANSFER OhciTransfer = ohciTransfer;
|
||||||
POHCI_TRANSFER TmpTransfer;
|
POHCI_HCD_ED ED = OhciEndpoint->HcdED;
|
||||||
POHCI_HCD_ED ED;
|
|
||||||
ULONG_PTR NextTdPA;
|
ULONG_PTR NextTdPA;
|
||||||
POHCI_HCD_TD NextTD;
|
POHCI_HCD_TD TD, NextTD, LastTD;
|
||||||
POHCI_HCD_TD TD;
|
|
||||||
POHCI_HCD_TD PrevTD;
|
|
||||||
POHCI_HCD_TD LastTD;
|
|
||||||
POHCI_HCD_TD td = NULL;
|
|
||||||
ULONG ix;
|
ULONG ix;
|
||||||
BOOLEAN IsIsoEndpoint = FALSE;
|
BOOLEAN IsIsoEndpoint;
|
||||||
BOOLEAN IsProcessed = FALSE;
|
BOOLEAN IsProcessed = FALSE;
|
||||||
|
|
||||||
DPRINT("OHCI_AbortTransfer: ohciEndpoint - %p, ohciTransfer - %p\n",
|
DPRINT("OHCI_AbortTransfer: ohciEndpoint - %p, ohciTransfer - %p\n",
|
||||||
OhciEndpoint,
|
OhciEndpoint,
|
||||||
OhciTransfer);
|
OhciTransfer);
|
||||||
|
|
||||||
if (OhciEndpoint->EndpointProperties.TransferType ==
|
IsIsoEndpoint = (OhciEndpoint->EndpointProperties.TransferType == USBPORT_TRANSFER_TYPE_ISOCHRONOUS);
|
||||||
USBPORT_TRANSFER_TYPE_ISOCHRONOUS)
|
NextTD = RegPacket.UsbPortGetMappedVirtualAddress(ED->HwED.HeadPointer & OHCI_ED_HEAD_POINTER_MASK,
|
||||||
{
|
|
||||||
IsIsoEndpoint = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ED = OhciEndpoint->HcdED;
|
|
||||||
NextTdPA = ED->HwED.HeadPointer & OHCI_ED_HEAD_POINTER_MASK;
|
|
||||||
|
|
||||||
NextTD = RegPacket.UsbPortGetMappedVirtualAddress(NextTdPA,
|
|
||||||
OhciExtension,
|
OhciExtension,
|
||||||
OhciEndpoint);
|
OhciEndpoint);
|
||||||
|
|
||||||
|
@ -1703,6 +1698,7 @@ OHCI_AbortTransfer(IN PVOID ohciExtension,
|
||||||
{
|
{
|
||||||
LastTD = OhciTransfer->NextTD;
|
LastTD = OhciTransfer->NextTD;
|
||||||
|
|
||||||
|
/* Keeping the carry bit from previous pointer value */
|
||||||
ED->HwED.HeadPointer = LastTD->PhysicalAddress |
|
ED->HwED.HeadPointer = LastTD->PhysicalAddress |
|
||||||
(ED->HwED.HeadPointer & OHCI_ED_HEAD_POINTER_CARRY);
|
(ED->HwED.HeadPointer & OHCI_ED_HEAD_POINTER_CARRY);
|
||||||
|
|
||||||
|
@ -1712,94 +1708,67 @@ OHCI_AbortTransfer(IN PVOID ohciExtension,
|
||||||
{
|
{
|
||||||
TD = &OhciEndpoint->FirstTD[ix];
|
TD = &OhciEndpoint->FirstTD[ix];
|
||||||
|
|
||||||
if (TD->OhciTransfer == OhciTransfer)
|
if (TD->OhciTransfer != OhciTransfer)
|
||||||
{
|
continue;
|
||||||
if (IsIsoEndpoint)
|
|
||||||
OHCI_ProcessDoneIsoTD(OhciExtension, TD, FALSE);
|
if (IsIsoEndpoint)
|
||||||
else
|
OHCI_ProcessDoneIsoTD(OhciExtension, TD, FALSE);
|
||||||
OHCI_ProcessDoneTD(OhciExtension, TD, FALSE);
|
else
|
||||||
}
|
OHCI_ProcessDoneTD(OhciExtension, TD, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
*CompletedLength = OhciTransfer->TransferLen;
|
*CompletedLength = OhciTransfer->TransferLen;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TD = OhciEndpoint->HcdHeadP;
|
if (NextTD == OhciEndpoint->HcdHeadP)
|
||||||
|
IsProcessed = TRUE;
|
||||||
|
|
||||||
if (TD == NextTD)
|
for (TD = OhciEndpoint->HcdHeadP; TD != NextTD; TD = TD->NextTDVa)
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
{
|
||||||
if (TD->OhciTransfer == ohciTransfer)
|
if (TD->OhciTransfer != OhciTransfer)
|
||||||
{
|
continue;
|
||||||
PrevTD = TD;
|
|
||||||
TD = TD->NextTDVa;
|
|
||||||
|
|
||||||
if (PrevTD == OhciEndpoint->HcdHeadP)
|
if (OhciEndpoint->HcdHeadP == TD)
|
||||||
OhciEndpoint->HcdHeadP = TD;
|
OhciEndpoint->HcdHeadP = TD->NextTDVa;
|
||||||
|
|
||||||
if (IsIsoEndpoint)
|
if (IsIsoEndpoint)
|
||||||
OHCI_ProcessDoneIsoTD(OhciExtension, PrevTD, FALSE);
|
OHCI_ProcessDoneIsoTD(OhciExtension, TD, FALSE);
|
||||||
else
|
|
||||||
OHCI_ProcessDoneTD(OhciExtension, PrevTD, FALSE);
|
|
||||||
|
|
||||||
IsProcessed = TRUE;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
OHCI_ProcessDoneTD(OhciExtension, TD, FALSE);
|
||||||
TD = TD->NextTDVa;
|
|
||||||
}
|
IsProcessed = TRUE;
|
||||||
}
|
}
|
||||||
while (TD != NextTD);
|
|
||||||
|
|
||||||
if (!IsProcessed)
|
if (!IsProcessed)
|
||||||
{
|
{
|
||||||
TD = OhciEndpoint->HcdHeadP;
|
for (TD = OhciEndpoint->HcdHeadP; TD->OhciTransfer != OhciTransfer; TD = TD->NextTDVa)
|
||||||
|
|
||||||
LastTD = TD;
|
|
||||||
td = NULL;
|
|
||||||
|
|
||||||
while (TD != OhciEndpoint->HcdTailP)
|
|
||||||
{
|
{
|
||||||
if (TD->OhciTransfer == OhciTransfer)
|
if (TD == OhciEndpoint->HcdTailP)
|
||||||
{
|
{
|
||||||
td = TD;
|
TD = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LastTD = TD;
|
LastTD = TD;
|
||||||
|
|
||||||
TD = TD->NextTDVa;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TD = td;
|
for (; TD->OhciTransfer == OhciTransfer; TD = TD->NextTDVa)
|
||||||
|
|
||||||
do
|
|
||||||
{
|
{
|
||||||
if (TD == OhciEndpoint->HcdTailP)
|
if (TD == OhciEndpoint->HcdTailP)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
PrevTD = TD;
|
|
||||||
TD = TD->NextTDVa;
|
|
||||||
|
|
||||||
if (IsIsoEndpoint)
|
if (IsIsoEndpoint)
|
||||||
OHCI_ProcessDoneIsoTD(OhciExtension, PrevTD, FALSE);
|
OHCI_ProcessDoneIsoTD(OhciExtension, TD, FALSE);
|
||||||
else
|
else
|
||||||
OHCI_ProcessDoneTD(OhciExtension, PrevTD, FALSE);
|
OHCI_ProcessDoneTD(OhciExtension, TD, FALSE);
|
||||||
}
|
}
|
||||||
while (TD->OhciTransfer == OhciTransfer);
|
|
||||||
|
|
||||||
TmpTransfer = LastTD->OhciTransfer;
|
LastTD->OhciTransfer->NextTD = TD;
|
||||||
TmpTransfer->NextTD = TD;
|
|
||||||
|
|
||||||
LastTD->NextTDVa = TD;
|
LastTD->NextTDVa = TD;
|
||||||
LastTD->HwTD.gTD.NextTD = TD->PhysicalAddress;
|
LastTD->HwTD.gTD.NextTD = TD->PhysicalAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
Exit:
|
|
||||||
|
|
||||||
*CompletedLength = OhciTransfer->TransferLen;
|
*CompletedLength = OhciTransfer->TransferLen;
|
||||||
|
|
||||||
if (OhciTransfer->TransferLen)
|
if (OhciTransfer->TransferLen)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue