\r
The UHCI register operation routines.\r
\r
-Copyright (c) 2007 - 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php\r
/**\r
Link the TD To QH.\r
\r
+ @param Uhc The UHCI device.\r
@param Qh The queue head for the TD to link to.\r
@param Td The TD to link.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
UhciLinkTdToQh (\r
+ IN USB_HC_DEV *Uhc,\r
IN UHCI_QH_SW *Qh,\r
IN UHCI_TD_SW *Td\r
)\r
{\r
+ EFI_PHYSICAL_ADDRESS PhyAddr;\r
+\r
+ PhyAddr = UsbHcGetPciAddressForHostMem (Uhc->MemPool, Td, sizeof (UHCI_TD_HW));\r
+\r
ASSERT ((Qh != NULL) && (Td != NULL));\r
\r
- Qh->QhHw.VerticalLink = QH_VLINK (Td, FALSE);\r
+ Qh->QhHw.VerticalLink = QH_VLINK (PhyAddr, FALSE);\r
Qh->TDs = (VOID *) Td;\r
}\r
\r
@param Qh The queue head to unlink from.\r
@param Td The TD to unlink.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
UhciUnlinkTdFromQh (\r
/**\r
Append a new TD To the previous TD.\r
\r
+ @param Uhc The UHCI device.\r
@param PrevTd Previous UHCI_TD_SW to be linked to.\r
@param ThisTd TD to link.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
UhciAppendTd (\r
+ IN USB_HC_DEV *Uhc,\r
IN UHCI_TD_SW *PrevTd,\r
IN UHCI_TD_SW *ThisTd\r
)\r
{\r
+ EFI_PHYSICAL_ADDRESS PhyAddr;\r
+\r
+ PhyAddr = UsbHcGetPciAddressForHostMem (Uhc->MemPool, ThisTd, sizeof (UHCI_TD_HW));\r
+\r
ASSERT ((PrevTd != NULL) && (ThisTd != NULL));\r
\r
- PrevTd->TdHw.NextLink = TD_LINK (ThisTd, TRUE, FALSE);\r
+ PrevTd->TdHw.NextLink = TD_LINK (PhyAddr, TRUE, FALSE);\r
PrevTd->NextTd = (VOID *) ThisTd;\r
}\r
\r
\r
@param Uhc The UHCI device.\r
@param DevAddr Device address.\r
- @param Request Device request.\r
+ @param Request A pointer to cpu memory address of Device request.\r
+ @param RequestPhy A pointer to pci memory address of Device request.\r
@param IsLow Full speed or low speed.\r
\r
@return The created setup Td Pointer.\r
IN USB_HC_DEV *Uhc,\r
IN UINT8 DevAddr,\r
IN UINT8 *Request,\r
+ IN UINT8 *RequestPhy,\r
IN BOOLEAN IsLow\r
)\r
{\r
Td->TdHw.DeviceAddr = DevAddr & 0x7F;\r
Td->TdHw.MaxPacketLen = (UINT32) (sizeof (EFI_USB_DEVICE_REQUEST) - 1);\r
Td->TdHw.PidCode = SETUP_PACKET_ID;\r
- Td->TdHw.DataBuffer = (UINT32) (UINTN) Request;\r
+ Td->TdHw.DataBuffer = (UINT32) (UINTN) RequestPhy;\r
\r
Td->Data = Request;\r
- Td->DataLen = sizeof (EFI_USB_DEVICE_REQUEST);\r
+ Td->DataLen = (UINT16) sizeof (EFI_USB_DEVICE_REQUEST);\r
\r
return Td;\r
}\r
@param Uhc The UHCI device.\r
@param DevAddr Device address.\r
@param Endpoint Endpoint number.\r
- @param DataPtr Data buffer.\r
+ @param DataPtr A pointer to cpu memory address of Data buffer.\r
+ @param DataPhyPtr A pointer to pci memory address of Data buffer.\r
@param Len Data length.\r
@param PktId Packet ID.\r
@param Toggle Data toggle value.\r
IN UINT8 DevAddr,\r
IN UINT8 Endpoint,\r
IN UINT8 *DataPtr,\r
+ IN UINT8 *DataPhyPtr,\r
IN UINTN Len,\r
IN UINT8 PktId,\r
IN UINT8 Toggle,\r
Td->TdHw.ShortPacket = FALSE;\r
Td->TdHw.IsIsoch = FALSE;\r
Td->TdHw.IntOnCpl = FALSE;\r
- Td->TdHw.ErrorCount = 0X03;\r
+ Td->TdHw.ErrorCount = 0x03;\r
Td->TdHw.Status = USBTD_ACTIVE;\r
Td->TdHw.LowSpeed = IsLow ? 1 : 0;\r
Td->TdHw.DataToggle = Toggle & 0x01;\r
Td->TdHw.DeviceAddr = DevAddr & 0x7F;\r
Td->TdHw.MaxPacketLen = (UINT32) (Len - 1);\r
Td->TdHw.PidCode = (UINT8) PktId;\r
- Td->TdHw.DataBuffer = (UINT32) (UINTN) DataPtr;\r
+ Td->TdHw.DataBuffer = (UINT32) (UINTN) DataPhyPtr;\r
\r
Td->Data = DataPtr;\r
Td->DataLen = (UINT16) Len;\r
@param Uhc The UHCI device.\r
@param DeviceAddr The device address.\r
@param DataPktId Packet Identification of Data Tds.\r
- @param Request A pointer to request structure buffer to transfer.\r
- @param Data A pointer to user data buffer to transfer.\r
+ @param Request A pointer to cpu memory address of request structure buffer to transfer.\r
+ @param RequestPhy A pointer to pci memory address of request structure buffer to transfer.\r
+ @param Data A pointer to cpu memory address of user data buffer to transfer.\r
+ @param DataPhy A pointer to pci memory address of user data buffer to transfer.\r
@param DataLen Length of user data to transfer.\r
@param MaxPacket Maximum packet size for control transfer.\r
@param IsLow Full speed or low speed.\r
IN UINT8 DeviceAddr,\r
IN UINT8 DataPktId,\r
IN UINT8 *Request,\r
+ IN UINT8 *RequestPhy,\r
IN UINT8 *Data,\r
+ IN UINT8 *DataPhy,\r
IN UINTN DataLen,\r
IN UINT8 MaxPacket,\r
IN BOOLEAN IsLow\r
//\r
// Create setup packets for the transfer\r
//\r
- SetupTd = UhciCreateSetupTd (Uhc, DeviceAddr, Request, IsLow);\r
+ SetupTd = UhciCreateSetupTd (Uhc, DeviceAddr, Request, RequestPhy, IsLow);\r
\r
if (SetupTd == NULL) {\r
return NULL;\r
Uhc,\r
DeviceAddr,\r
0,\r
- Data,\r
+ Data, //cpu memory address\r
+ DataPhy, //Pci memory address\r
ThisTdLen,\r
DataPktId,\r
DataToggle,\r
FirstDataTd = DataTd;\r
FirstDataTd->NextTd = NULL;\r
} else {\r
- UhciAppendTd (PrevDataTd, DataTd);\r
+ UhciAppendTd (Uhc, PrevDataTd, DataTd);\r
}\r
\r
DataToggle ^= 1;\r
PrevDataTd = DataTd;\r
Data += ThisTdLen;\r
+ DataPhy += ThisTdLen;\r
DataLen -= ThisTdLen;\r
}\r
\r
// Link setup Td -> data Tds -> status Td together\r
//\r
if (FirstDataTd != NULL) {\r
- UhciAppendTd (SetupTd, FirstDataTd);\r
- UhciAppendTd (PrevDataTd, StatusTd);\r
+ UhciAppendTd (Uhc, SetupTd, FirstDataTd);\r
+ UhciAppendTd (Uhc, PrevDataTd, StatusTd);\r
} else {\r
- UhciAppendTd (SetupTd, StatusTd);\r
+ UhciAppendTd (Uhc, SetupTd, StatusTd);\r
}\r
\r
return SetupTd;\r
@param DevAddr Address of Device.\r
@param EndPoint Endpoint Number.\r
@param PktId Packet Identification of Data Tds.\r
- @param Data A pointer to user data buffer to transfer.\r
+ @param Data A pointer to cpu memory address of user data buffer to transfer.\r
+ @param DataPhy A pointer to pci memory address of user data buffer to transfer.\r
@param DataLen Length of user data to transfer.\r
@param DataToggle Data Toggle Pointer.\r
@param MaxPacket Maximum packet size for Bulk/Interrupt transfer.\r
IN UINT8 EndPoint,\r
IN UINT8 PktId,\r
IN UINT8 *Data,\r
+ IN UINT8 *DataPhy,\r
IN UINTN DataLen,\r
IN OUT UINT8 *DataToggle,\r
IN UINT8 MaxPacket,\r
DevAddr,\r
EndPoint,\r
Data,\r
+ DataPhy,\r
ThisTdLen,\r
PktId,\r
*DataToggle,\r
FirstDataTd = DataTd;\r
FirstDataTd->NextTd = NULL;\r
} else {\r
- UhciAppendTd (PrevDataTd, DataTd);\r
+ UhciAppendTd (Uhc, PrevDataTd, DataTd);\r
}\r
\r
*DataToggle ^= 1;\r
PrevDataTd = DataTd;\r
Data += ThisTdLen;\r
+ DataPhy += ThisTdLen;\r
DataLen -= ThisTdLen;\r
}\r
\r