[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:
Stanislav Motylkov 2019-06-28 02:38:10 +03:00 committed by Victor Perevertkin
parent 0a84597679
commit 2a8fc2b411

View file

@ -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)