EHC_QH *Qh;\r
QH_HW *QhHw;\r
EHC_QTD *Qtd;\r
+ EFI_PHYSICAL_ADDRESS PciAddr;\r
\r
//\r
// Create an inactive Qtd to terminate the short packet read.\r
//\r
- Qtd = EhcCreateQtd (Ehc, NULL, 0, QTD_PID_INPUT, 0, 64);\r
+ Qtd = EhcCreateQtd (Ehc, NULL, NULL, 0, QTD_PID_INPUT, 0, 64);\r
\r
if (Qtd == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));\r
QhHw = &Qh->QhHw;\r
- QhHw->HorizonLink = QH_LINK (QhHw, EHC_TYPE_QH, FALSE);\r
+ QhHw->HorizonLink = QH_LINK (PciAddr + OFFSET_OF(EHC_QH, QhHw), EHC_TYPE_QH, FALSE);\r
QhHw->Status = QTD_STAT_HALTED;\r
QhHw->ReclaimHead = 1;\r
Ehc->ReclaimHead = Qh;\r
UINTN Index;\r
UINT32 *Desc;\r
EFI_STATUS Status;\r
+ EFI_PHYSICAL_ADDRESS PciAddr;\r
\r
//\r
// First initialize the periodical schedule data:\r
//\r
// Initialize the frame list entries then set the registers\r
//\r
- Desc = (UINT32 *) Ehc->PeriodFrame;\r
+ Desc = (UINT32 *) Ehc->PeriodFrameHost;\r
\r
for (Index = 0; Index < EHC_FRAME_LEN; Index++) {\r
- Desc[Index] = QH_LINK (Ehc->PeriodOne, EHC_TYPE_QH, FALSE);\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (EHC_QH));\r
+ Desc[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);\r
}\r
\r
EhcWriteOpReg (Ehc, EHC_FRAME_BASE_OFFSET, EHC_LOW_32BIT (Ehc->PeriodFrame));\r
// Only need to set the AsynListAddr register to\r
// the reclamation header\r
//\r
- EhcWriteOpReg (Ehc, EHC_ASYNC_HEAD_OFFSET, EHC_LOW_32BIT (Ehc->ReclaimHead));\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ReclaimHead, sizeof (EHC_QH));\r
+ EhcWriteOpReg (Ehc, EHC_ASYNC_HEAD_OFFSET, EHC_LOW_32BIT (PciAddr));\r
return EFI_SUCCESS;\r
}\r
\r
Ehc->MemPool = NULL;\r
}\r
\r
- if (Ehc->PeriodFrame != NULL) {\r
+ if (Ehc->PeriodFrameHost != NULL) {\r
PciIo = Ehc->PciIo;\r
ASSERT (PciIo != NULL);\r
\r
Ehc->PeriodFrameHost\r
);\r
\r
- Ehc->PeriodFrame = NULL;\r
+ Ehc->PeriodFrameHost = NULL;\r
+ Ehc->PeriodFrame = NULL;\r
}\r
}\r
\r
)\r
{\r
EHC_QH *Head;\r
+ EFI_PHYSICAL_ADDRESS PciAddr;\r
\r
//\r
// Append the queue head after the reclaim header, then\r
Qh->NextQh = Head->NextQh;\r
Head->NextQh = Qh;\r
\r
- Qh->QhHw.HorizonLink = QH_LINK (Head, EHC_TYPE_QH, FALSE);;\r
- Head->QhHw.HorizonLink = QH_LINK (Qh, EHC_TYPE_QH, FALSE);\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head, sizeof (EHC_QH));\r
+ Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);;\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));\r
+ Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);\r
}\r
\r
\r
{\r
EHC_QH *Head;\r
EFI_STATUS Status;\r
+ EFI_PHYSICAL_ADDRESS PciAddr;\r
\r
ASSERT (Ehc->ReclaimHead->NextQh == Qh);\r
\r
Head->NextQh = Qh->NextQh;\r
Qh->NextQh = NULL;\r
\r
- Head->QhHw.HorizonLink = QH_LINK (Head, EHC_TYPE_QH, FALSE);\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head, sizeof (EHC_QH));\r
+ Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);\r
\r
//\r
// Set and wait the door bell to synchronize with the hardware\r
UINTN Index;\r
EHC_QH *Prev;\r
EHC_QH *Next;\r
+ EFI_PHYSICAL_ADDRESS PciAddr;\r
\r
- Frames = Ehc->PeriodFrame;\r
+ Frames = Ehc->PeriodFrameHost;\r
\r
for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) {\r
//\r
Prev->NextQh = Qh;\r
\r
Qh->QhHw.HorizonLink = Prev->QhHw.HorizonLink;\r
- Prev->QhHw.HorizonLink = QH_LINK (Qh, EHC_TYPE_QH, FALSE);\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));\r
+ Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);\r
break;\r
}\r
\r
//\r
if (Qh->NextQh == NULL) {\r
Qh->NextQh = Next;\r
- Qh->QhHw.HorizonLink = QH_LINK (Next, EHC_TYPE_QH, FALSE);\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Next, sizeof (EHC_QH));\r
+ Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);\r
}\r
\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));\r
+\r
if (Prev == NULL) {\r
- Frames[Index] = QH_LINK (Qh, EHC_TYPE_QH, FALSE);\r
+ Frames[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);\r
} else {\r
Prev->NextQh = Qh;\r
- Prev->QhHw.HorizonLink = QH_LINK (Qh, EHC_TYPE_QH, FALSE);\r
+ Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);\r
}\r
}\r
}\r
EHC_QH *Prev;\r
EHC_QH *This;\r
\r
- Frames = Ehc->PeriodFrame;\r
+ Frames = Ehc->PeriodFrameHost;\r
\r
for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) {\r
//\r
QTD_HW *QtdHw;\r
UINT8 State;\r
BOOLEAN Finished;\r
+ EFI_PHYSICAL_ADDRESS PciAddr;\r
\r
ASSERT ((Ehc != NULL) && (Urb != NULL) && (Urb->Qh != NULL));\r
\r
// ShortReadStop. If it is a setup transfer, need to check the\r
// Status Stage of the setup transfer to get the finial result\r
//\r
- if (QtdHw->AltNext == QTD_LINK (Ehc->ShortReadStop, FALSE)) {\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ShortReadStop, sizeof (EHC_QTD));\r
+ if (QtdHw->AltNext == QTD_LINK (PciAddr, FALSE)) {\r
DEBUG ((EFI_D_INFO, "EhcCheckUrbResult: Short packet read, break\n"));\r
\r
Finished = TRUE;\r
/**\r
Update the queue head for next round of asynchronous transfer.\r
\r
+ @param Ehc The EHCI device.\r
@param Urb The URB to update.\r
\r
**/\r
VOID\r
EhcUpdateAsyncRequest (\r
+ IN USB2_HC_DEV *Ehc,\r
IN URB *Urb\r
)\r
{\r
EHC_QTD *Qtd;\r
QTD_HW *QtdHw;\r
UINTN Index;\r
+ EFI_PHYSICAL_ADDRESS PciAddr;\r
\r
Qtd = NULL;\r
\r
QhHw->PageHigh[Index] = 0;\r
}\r
\r
- QhHw->NextQtd = QTD_LINK (FirstQtd, FALSE);\r
+ PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, FirstQtd, sizeof (EHC_QTD));\r
+ QhHw->NextQtd = QTD_LINK (PciAddr, FALSE);\r
}\r
\r
return ;\r
ProcBuf = AllocatePool (Urb->Completed);\r
\r
if (ProcBuf == NULL) {\r
- EhcUpdateAsyncRequest (Urb);\r
+ EhcUpdateAsyncRequest (Ehc, Urb);\r
continue;\r
}\r
\r
CopyMem (ProcBuf, Urb->Data, Urb->Completed);\r
}\r
\r
- EhcUpdateAsyncRequest (Urb);\r
+ EhcUpdateAsyncRequest (Ehc, Urb);\r
\r
//\r
// Leave error recovery to its related device driver. A\r
Create a single QTD to hold the data.\r
\r
@param Ehc The EHCI device.\r
- @param Data Current data not associated with a QTD.\r
+ @param Data The cpu memory address of current data not associated with a QTD.\r
+ @param DataPhy The pci bus address of current data not associated with a QTD.\r
@param DataLen The length of the data.\r
@param PktId Packet ID to use in the QTD.\r
@param Toggle Data toggle to use in the QTD.\r
EhcCreateQtd (\r
IN USB2_HC_DEV *Ehc,\r
IN UINT8 *Data,\r
+ IN UINT8 *DataPhy,\r
IN UINTN DataLen,\r
IN UINT8 PktId,\r
IN UINT8 Toggle,\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 (DataPhy);\r
+ QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (DataPhy);\r
\r
- ThisBufLen = QTD_BUF_LEN - (EHC_LOW_32BIT (Data) & QTD_BUF_MASK);\r
+ ThisBufLen = QTD_BUF_LEN - (EHC_LOW_32BIT (DataPhy) & QTD_BUF_MASK);\r
\r
if (Len + ThisBufLen >= DataLen) {\r
Len = DataLen;\r
\r
Len += ThisBufLen;\r
Data += ThisBufLen;\r
+ DataPhy += ThisBufLen;\r
}\r
\r
//\r
UINT8 Toggle;\r
UINTN Len;\r
UINT8 Pid;\r
+ EFI_PHYSICAL_ADDRESS PhyAddr;\r
\r
ASSERT ((Urb != NULL) && (Urb->Qh != NULL));\r
\r
StatusQtd = NULL;\r
AlterNext = QTD_LINK (NULL, TRUE);\r
\r
+ PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ShortReadStop, sizeof (EHC_QTD));\r
if (Ep->Direction == EfiUsbDataIn) {\r
- AlterNext = QTD_LINK (Ehc->ShortReadStop, FALSE);\r
+ AlterNext = QTD_LINK (PhyAddr, FALSE);\r
}\r
\r
//\r
//\r
if (Urb->Ep.Type == EHC_CTRL_TRANSFER) {\r
Len = sizeof (EFI_USB_DEVICE_REQUEST);\r
- Qtd = EhcCreateQtd (Ehc, Urb->RequestPhy, Len, QTD_PID_SETUP, 0, Ep->MaxPacket);\r
+ Qtd = EhcCreateQtd (Ehc, (UINT8 *)Urb->Request, (UINT8 *)Urb->RequestPhy, Len, QTD_PID_SETUP, 0, Ep->MaxPacket);\r
\r
if (Qtd == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
Pid = QTD_PID_INPUT;\r
}\r
\r
- StatusQtd = EhcCreateQtd (Ehc, NULL, 0, Pid, 1, Ep->MaxPacket);\r
+ StatusQtd = EhcCreateQtd (Ehc, NULL, NULL, 0, Pid, 1, Ep->MaxPacket);\r
\r
if (StatusQtd == NULL) {\r
goto ON_ERROR;\r
}\r
\r
if (Ep->Direction == EfiUsbDataIn) {\r
- AlterNext = QTD_LINK (StatusQtd, FALSE);\r
+ PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, StatusQtd, sizeof (EHC_QTD));\r
+ AlterNext = QTD_LINK (PhyAddr, FALSE);\r
}\r
\r
Toggle = 1;\r
while (Len < Urb->DataLen) {\r
Qtd = EhcCreateQtd (\r
Ehc,\r
+ (UINT8 *) Urb->Data + Len,\r
(UINT8 *) Urb->DataPhy + Len,\r
Urb->DataLen - Len,\r
Pid,\r
}\r
\r
NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, EHC_QTD, QtdList);\r
- Qtd->QtdHw.NextQtd = QTD_LINK (NextQtd, FALSE);\r
+ PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));\r
+ Qtd->QtdHw.NextQtd = QTD_LINK (PhyAddr, FALSE);\r
}\r
\r
//\r
// Link the QTDs to the queue head\r
//\r
NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, EHC_QTD, QtdList);\r
- Qh->QhHw.NextQtd = QTD_LINK (NextQtd, FALSE);\r
+ PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));\r
+ Qh->QhHw.NextQtd = QTD_LINK (PhyAddr, FALSE);\r
return EFI_SUCCESS;\r
\r
ON_ERROR:\r