which is used to enable recovery function from USB Drivers.\r
\r
Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) Microsoft Corporation.<BR>\r
\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions\r
-of the BSD License which accompanies this distribution. The\r
-full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
**/\r
PEI_EHC_QTD *\r
EhcCreateQtd (\r
- IN PEI_USB2_HC_DEV *Ehc,\r
- IN UINT8 *Data,\r
- IN UINTN DataLen,\r
- IN UINT8 PktId,\r
- IN UINT8 Toggle,\r
- IN UINTN MaxPacket\r
+ IN PEI_USB2_HC_DEV *Ehc,\r
+ IN UINT8 *Data,\r
+ IN UINTN DataLen,\r
+ IN UINT8 PktId,\r
+ IN UINT8 Toggle,\r
+ IN UINTN MaxPacket\r
)\r
{\r
- PEI_EHC_QTD *Qtd;\r
- QTD_HW *QtdHw;\r
- UINTN Index;\r
- UINTN Len;\r
- UINTN ThisBufLen;\r
+ PEI_EHC_QTD *Qtd;\r
+ QTD_HW *QtdHw;\r
+ UINTN Index;\r
+ UINTN Len;\r
+ UINTN ThisBufLen;\r
\r
ASSERT (Ehc != NULL);\r
\r
return NULL;\r
}\r
\r
- Qtd->Signature = EHC_QTD_SIG;\r
- Qtd->Data = Data;\r
- Qtd->DataLen = 0;\r
+ Qtd->Signature = EHC_QTD_SIG;\r
+ Qtd->Data = Data;\r
+ Qtd->DataLen = 0;\r
\r
InitializeListHead (&Qtd->QtdList);\r
\r
// compute the offset and clear Reserved fields. This is already\r
// done in the data point.\r
//\r
- QtdHw->Page[Index] = EHC_LOW_32BIT (Data);\r
- QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (Data);\r
+ QtdHw->Page[Index] = EHC_LOW_32BIT (Data);\r
+ QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (Data);\r
\r
- ThisBufLen = QTD_BUF_LEN - (EHC_LOW_32BIT (Data) & QTD_BUF_MASK);\r
+ ThisBufLen = QTD_BUF_LEN - (EHC_LOW_32BIT (Data) & QTD_BUF_MASK);\r
\r
if (Len + ThisBufLen >= DataLen) {\r
Len = DataLen;\r
break;\r
}\r
\r
- Len += ThisBufLen;\r
+ Len += ThisBufLen;\r
Data += ThisBufLen;\r
}\r
\r
Len = Len - Len % MaxPacket;\r
}\r
\r
- QtdHw->TotalBytes = (UINT32) Len;\r
+ QtdHw->TotalBytes = (UINT32)Len;\r
Qtd->DataLen = Len;\r
}\r
\r
**/\r
VOID\r
EhcInitIntQh (\r
- IN USB_ENDPOINT *Ep,\r
- IN QH_HW *QhHw\r
+ IN USB_ENDPOINT *Ep,\r
+ IN QH_HW *QhHw\r
)\r
{\r
//\r
//\r
if (Ep->DevSpeed == EFI_USB_SPEED_HIGH) {\r
QhHw->SMask = QH_MICROFRAME_0;\r
- return ;\r
+ return;\r
}\r
\r
//\r
**/\r
PEI_EHC_QH *\r
EhcCreateQh (\r
- IN PEI_USB2_HC_DEV *Ehci,\r
- IN USB_ENDPOINT *Ep\r
+ IN PEI_USB2_HC_DEV *Ehci,\r
+ IN USB_ENDPOINT *Ep\r
)\r
{\r
- PEI_EHC_QH *Qh;\r
- QH_HW *QhHw;\r
+ PEI_EHC_QH *Qh;\r
+ QH_HW *QhHw;\r
\r
Qh = UsbHcAllocateMem (Ehci, Ehci->MemPool, sizeof (PEI_EHC_QH));\r
\r
return NULL;\r
}\r
\r
- Qh->Signature = EHC_QH_SIG;\r
- Qh->NextQh = NULL;\r
- Qh->Interval = Ep->PollRate;\r
+ Qh->Signature = EHC_QH_SIG;\r
+ Qh->NextQh = NULL;\r
+ Qh->Interval = Ep->PollRate;\r
\r
InitializeListHead (&Qh->Qtds);\r
\r
- QhHw = &Qh->QhHw;\r
- QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE);\r
- QhHw->DeviceAddr = Ep->DevAddr;\r
- QhHw->Inactive = 0;\r
- QhHw->EpNum = Ep->EpAddr;\r
- QhHw->EpSpeed = Ep->DevSpeed;\r
- QhHw->DtCtrl = 0;\r
- QhHw->ReclaimHead = 0;\r
- QhHw->MaxPacketLen = (UINT32) Ep->MaxPacket;\r
- QhHw->CtrlEp = 0;\r
- QhHw->NakReload = QH_NAK_RELOAD;\r
- QhHw->HubAddr = Ep->HubAddr;\r
- QhHw->PortNum = Ep->HubPort;\r
- QhHw->Multiplier = 1;\r
- QhHw->DataToggle = Ep->Toggle;\r
+ QhHw = &Qh->QhHw;\r
+ QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE);\r
+ QhHw->DeviceAddr = Ep->DevAddr;\r
+ QhHw->Inactive = 0;\r
+ QhHw->EpNum = Ep->EpAddr;\r
+ QhHw->EpSpeed = Ep->DevSpeed;\r
+ QhHw->DtCtrl = 0;\r
+ QhHw->ReclaimHead = 0;\r
+ QhHw->MaxPacketLen = (UINT32)Ep->MaxPacket;\r
+ QhHw->CtrlEp = 0;\r
+ QhHw->NakReload = QH_NAK_RELOAD;\r
+ QhHw->HubAddr = Ep->HubAddr;\r
+ QhHw->PortNum = Ep->HubPort;\r
+ QhHw->Multiplier = 1;\r
+ QhHw->DataToggle = Ep->Toggle;\r
\r
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {\r
QhHw->Status |= QTD_STAT_DO_SS;\r
}\r
\r
switch (Ep->Type) {\r
- case EHC_CTRL_TRANSFER:\r
- //\r
- // Special initialization for the control transfer:\r
- // 1. Control transfer initialize data toggle from each QTD\r
- // 2. Set the Control Endpoint Flag (C) for low/full speed endpoint.\r
- //\r
- QhHw->DtCtrl = 1;\r
+ case EHC_CTRL_TRANSFER:\r
+ //\r
+ // Special initialization for the control transfer:\r
+ // 1. Control transfer initialize data toggle from each QTD\r
+ // 2. Set the Control Endpoint Flag (C) for low/full speed endpoint.\r
+ //\r
+ QhHw->DtCtrl = 1;\r
\r
- if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {\r
- QhHw->CtrlEp = 1;\r
- }\r
- break;\r
+ if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {\r
+ QhHw->CtrlEp = 1;\r
+ }\r
\r
- case EHC_INT_TRANSFER_ASYNC:\r
- case EHC_INT_TRANSFER_SYNC:\r
- //\r
- // Special initialization for the interrupt transfer\r
- // to set the S-Mask and C-Mask\r
- //\r
- QhHw->NakReload = 0;\r
- EhcInitIntQh (Ep, QhHw);\r
- break;\r
+ break;\r
\r
- case EHC_BULK_TRANSFER:\r
- if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) {\r
- QhHw->Status |= QTD_STAT_DO_PING;\r
- }\r
+ case EHC_INT_TRANSFER_ASYNC:\r
+ case EHC_INT_TRANSFER_SYNC:\r
+ //\r
+ // Special initialization for the interrupt transfer\r
+ // to set the S-Mask and C-Mask\r
+ //\r
+ QhHw->NakReload = 0;\r
+ EhcInitIntQh (Ep, QhHw);\r
+ break;\r
+\r
+ case EHC_BULK_TRANSFER:\r
+ if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) {\r
+ QhHw->Status |= QTD_STAT_DO_PING;\r
+ }\r
\r
- break;\r
+ break;\r
}\r
\r
return Qh;\r
**/\r
UINTN\r
EhcConvertPollRate (\r
- IN UINTN Interval\r
+ IN UINTN Interval\r
)\r
{\r
- UINTN BitCount;\r
+ UINTN BitCount;\r
\r
if (Interval == 0) {\r
return 1;\r
**/\r
VOID\r
EhcFreeQtds (\r
- IN PEI_USB2_HC_DEV *Ehc,\r
- IN EFI_LIST_ENTRY *Qtds\r
+ IN PEI_USB2_HC_DEV *Ehc,\r
+ IN EFI_LIST_ENTRY *Qtds\r
)\r
{\r
- EFI_LIST_ENTRY *Entry;\r
- EFI_LIST_ENTRY *Next;\r
- PEI_EHC_QTD *Qtd;\r
+ EFI_LIST_ENTRY *Entry;\r
+ EFI_LIST_ENTRY *Next;\r
+ PEI_EHC_QTD *Qtd;\r
\r
- EFI_LIST_FOR_EACH_SAFE (Entry, Next, Qtds) {\r
+ BASE_LIST_FOR_EACH_SAFE (Entry, Next, Qtds) {\r
Qtd = EFI_LIST_CONTAINER (Entry, PEI_EHC_QTD, QtdList);\r
\r
RemoveEntryList (&Qtd->QtdList);\r
**/\r
VOID\r
EhcFreeUrb (\r
- IN PEI_USB2_HC_DEV *Ehc,\r
- IN PEI_URB *Urb\r
+ IN PEI_USB2_HC_DEV *Ehc,\r
+ IN PEI_URB *Urb\r
)\r
{\r
if (Urb->RequestPhy != NULL) {\r
**/\r
EFI_STATUS\r
EhcCreateQtds (\r
- IN PEI_USB2_HC_DEV *Ehc,\r
- IN PEI_URB *Urb\r
+ IN PEI_USB2_HC_DEV *Ehc,\r
+ IN PEI_URB *Urb\r
)\r
{\r
- USB_ENDPOINT *Ep;\r
- PEI_EHC_QH *Qh;\r
- PEI_EHC_QTD *Qtd;\r
- PEI_EHC_QTD *StatusQtd;\r
- PEI_EHC_QTD *NextQtd;\r
- EFI_LIST_ENTRY *Entry;\r
- UINT32 AlterNext;\r
- UINT8 Toggle;\r
- UINTN Len;\r
- UINT8 Pid;\r
+ USB_ENDPOINT *Ep;\r
+ PEI_EHC_QH *Qh;\r
+ PEI_EHC_QTD *Qtd;\r
+ PEI_EHC_QTD *StatusQtd;\r
+ PEI_EHC_QTD *NextQtd;\r
+ EFI_LIST_ENTRY *Entry;\r
+ UINT32 AlterNext;\r
+ UINT8 Toggle;\r
+ UINTN Len;\r
+ UINT8 Pid;\r
\r
ASSERT ((Urb != NULL) && (Urb->Qh != NULL));\r
\r
while (Len < Urb->DataLen) {\r
Qtd = EhcCreateQtd (\r
Ehc,\r
- (UINT8 *) Urb->DataPhy + Len,\r
+ (UINT8 *)Urb->DataPhy + Len,\r
Urb->DataLen - Len,\r
Pid,\r
Toggle,\r
// Switch the Toggle bit if odd number of packets are included in the QTD.\r
//\r
if (((Qtd->DataLen + Ep->MaxPacket - 1) / Ep->MaxPacket) % 2) {\r
- Toggle = (UINT8) (1 - Toggle);\r
+ Toggle = (UINT8)(1 - Toggle);\r
}\r
\r
Len += Qtd->DataLen;\r
//\r
// OK, all the QTDs needed are created. Now, fix the NextQtd point\r
//\r
- EFI_LIST_FOR_EACH (Entry, &Qh->Qtds) {\r
+ BASE_LIST_FOR_EACH (Entry, &Qh->Qtds) {\r
Qtd = EFI_LIST_CONTAINER (Entry, PEI_EHC_QTD, QtdList);\r
\r
//\r
break;\r
}\r
\r
- NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, PEI_EHC_QTD, QtdList);\r
- Qtd->QtdHw.NextQtd = QTD_LINK (NextQtd, FALSE);\r
+ NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, PEI_EHC_QTD, QtdList);\r
+ Qtd->QtdHw.NextQtd = QTD_LINK (NextQtd, FALSE);\r
}\r
\r
//\r
// Link the QTDs to the queue head\r
//\r
- NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, PEI_EHC_QTD, QtdList);\r
- Qh->QhHw.NextQtd = QTD_LINK (NextQtd, FALSE);\r
+ NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, PEI_EHC_QTD, QtdList);\r
+ Qh->QhHw.NextQtd = QTD_LINK (NextQtd, FALSE);\r
return EFI_SUCCESS;\r
\r
ON_ERROR:\r
**/\r
PEI_URB *\r
EhcCreateUrb (\r
- IN PEI_USB2_HC_DEV *Ehc,\r
- IN UINT8 DevAddr,\r
- IN UINT8 EpAddr,\r
- IN UINT8 DevSpeed,\r
- IN UINT8 Toggle,\r
- IN UINTN MaxPacket,\r
- IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,\r
- IN UINTN Type,\r
- IN EFI_USB_DEVICE_REQUEST *Request,\r
- IN VOID *Data,\r
- IN UINTN DataLen,\r
- IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,\r
- IN VOID *Context,\r
- IN UINTN Interval\r
+ IN PEI_USB2_HC_DEV *Ehc,\r
+ IN UINT8 DevAddr,\r
+ IN UINT8 EpAddr,\r
+ IN UINT8 DevSpeed,\r
+ IN UINT8 Toggle,\r
+ IN UINTN MaxPacket,\r
+ IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,\r
+ IN UINTN Type,\r
+ IN EFI_USB_DEVICE_REQUEST *Request,\r
+ IN VOID *Data,\r
+ IN UINTN DataLen,\r
+ IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,\r
+ IN VOID *Context,\r
+ IN UINTN Interval\r
)\r
{\r
- USB_ENDPOINT *Ep;\r
- EFI_PHYSICAL_ADDRESS PhyAddr;\r
- EDKII_IOMMU_OPERATION MapOp;\r
- EFI_STATUS Status;\r
- UINTN Len;\r
- PEI_URB *Urb;\r
- VOID *Map;\r
-\r
- Urb = Ehc->Urb;\r
- Urb->Signature = EHC_URB_SIG;\r
+ USB_ENDPOINT *Ep;\r
+ EFI_PHYSICAL_ADDRESS PhyAddr;\r
+ EDKII_IOMMU_OPERATION MapOp;\r
+ EFI_STATUS Status;\r
+ UINTN Len;\r
+ PEI_URB *Urb;\r
+ VOID *Map;\r
+\r
+ Map = NULL;\r
+\r
+ Urb = Ehc->Urb;\r
+ Urb->Signature = EHC_URB_SIG;\r
InitializeListHead (&Urb->UrbList);\r
\r
- Ep = &Urb->Ep;\r
- Ep->DevAddr = DevAddr;\r
- Ep->EpAddr = (UINT8) (EpAddr & 0x0F);\r
- Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);\r
- Ep->DevSpeed = DevSpeed;\r
- Ep->MaxPacket = MaxPacket;\r
+ Ep = &Urb->Ep;\r
+ Ep->DevAddr = DevAddr;\r
+ Ep->EpAddr = (UINT8)(EpAddr & 0x0F);\r
+ Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);\r
+ Ep->DevSpeed = DevSpeed;\r
+ Ep->MaxPacket = MaxPacket;\r
\r
- Ep->HubAddr = 0;\r
- Ep->HubPort = 0;\r
+ Ep->HubAddr = 0;\r
+ Ep->HubPort = 0;\r
\r
if (DevSpeed != EFI_USB_SPEED_HIGH) {\r
ASSERT (Hub != NULL);\r
\r
- Ep->HubAddr = Hub->TranslatorHubAddress;\r
- Ep->HubPort = Hub->TranslatorPortNumber;\r
+ Ep->HubAddr = Hub->TranslatorHubAddress;\r
+ Ep->HubPort = Hub->TranslatorPortNumber;\r
}\r
\r
- Ep->Toggle = Toggle;\r
- Ep->Type = Type;\r
- Ep->PollRate = EhcConvertPollRate (Interval);\r
+ Ep->Toggle = Toggle;\r
+ Ep->Type = Type;\r
+ Ep->PollRate = EhcConvertPollRate (Interval);\r
\r
- Urb->Request = Request;\r
- Urb->Data = Data;\r
- Urb->DataLen = DataLen;\r
- Urb->Callback = Callback;\r
- Urb->Context = Context;\r
- Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);\r
+ Urb->Request = Request;\r
+ Urb->Data = Data;\r
+ Urb->DataLen = DataLen;\r
+ Urb->Callback = Callback;\r
+ Urb->Context = Context;\r
+ Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);\r
\r
if (Urb->Qh == NULL) {\r
goto ON_ERROR;\r
\r
Urb->RequestPhy = NULL;\r
Urb->RequestMap = NULL;\r
- Urb->DataPhy = NULL;\r
- Urb->DataMap = NULL;\r
+ Urb->DataPhy = NULL;\r
+ Urb->DataMap = NULL;\r
\r
//\r
// Map the request and user data\r
//\r
if (Request != NULL) {\r
- Len = sizeof (EFI_USB_DEVICE_REQUEST);\r
- MapOp = EdkiiIoMmuOperationBusMasterRead;\r
- Status = IoMmuMap (Ehc->IoMmu, MapOp, Request, &Len, &PhyAddr, &Map);\r
+ Len = sizeof (EFI_USB_DEVICE_REQUEST);\r
+ MapOp = EdkiiIoMmuOperationBusMasterRead;\r
+ Status = IoMmuMap (Ehc->IoMmu, MapOp, Request, &Len, &PhyAddr, &Map);\r
\r
if (EFI_ERROR (Status) || (Len != sizeof (EFI_USB_DEVICE_REQUEST))) {\r
goto ON_ERROR;\r
}\r
\r
- Urb->RequestPhy = (VOID *) ((UINTN) PhyAddr);\r
+ Urb->RequestPhy = (VOID *)((UINTN)PhyAddr);\r
Urb->RequestMap = Map;\r
}\r
\r
if (Data != NULL) {\r
- Len = DataLen;\r
+ Len = DataLen;\r
\r
if (Ep->Direction == EfiUsbDataIn) {\r
MapOp = EdkiiIoMmuOperationBusMasterWrite;\r
MapOp = EdkiiIoMmuOperationBusMasterRead;\r
}\r
\r
- Status = IoMmuMap (Ehc->IoMmu, MapOp, Data, &Len, &PhyAddr, &Map);\r
+ Status = IoMmuMap (Ehc->IoMmu, MapOp, Data, &Len, &PhyAddr, &Map);\r
\r
if (EFI_ERROR (Status) || (Len != DataLen)) {\r
goto ON_ERROR;\r
}\r
\r
- Urb->DataPhy = (VOID *) ((UINTN) PhyAddr);\r
- Urb->DataMap = Map;\r
+ Urb->DataPhy = (VOID *)((UINTN)PhyAddr);\r
+ Urb->DataMap = Map;\r
}\r
\r
Status = EhcCreateQtds (Ehc, Urb);\r