X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FBus%2FPci%2FUhciDxe%2FUhciQueue.c;h=fb97326dc0dec58c6c5df5c0b71052e13e1ab73b;hb=9d510e61fceee7b92955ef9a3c20343752d8ce3f;hp=91c2a485017a4695d6afc50b3ce93bf55fd05360;hpb=49fabc83a58379266b99864364a8ed82abeef49c;p=mirror_edk2.git diff --git a/MdeModulePkg/Bus/Pci/UhciDxe/UhciQueue.c b/MdeModulePkg/Bus/Pci/UhciDxe/UhciQueue.c index 91c2a48501..fb97326dc0 100644 --- a/MdeModulePkg/Bus/Pci/UhciDxe/UhciQueue.c +++ b/MdeModulePkg/Bus/Pci/UhciDxe/UhciQueue.c @@ -2,14 +2,8 @@ The UHCI register operation routines. -Copyright (c) 2007 - 2008, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -152,21 +146,25 @@ EXIT: /** Link the TD To QH. + @param Uhc The UHCI device. @param Qh The queue head for the TD to link to. @param Td The TD to link. - @return None. - **/ VOID UhciLinkTdToQh ( + IN USB_HC_DEV *Uhc, IN UHCI_QH_SW *Qh, IN UHCI_TD_SW *Td ) { + EFI_PHYSICAL_ADDRESS PhyAddr; + + PhyAddr = UsbHcGetPciAddressForHostMem (Uhc->MemPool, Td, sizeof (UHCI_TD_HW)); + ASSERT ((Qh != NULL) && (Td != NULL)); - Qh->QhHw.VerticalLink = QH_VLINK (Td, FALSE); + Qh->QhHw.VerticalLink = QH_VLINK (PhyAddr, FALSE); Qh->TDs = (VOID *) Td; } @@ -177,8 +175,6 @@ UhciLinkTdToQh ( @param Qh The queue head to unlink from. @param Td The TD to unlink. - @return None. - **/ VOID UhciUnlinkTdFromQh ( @@ -196,21 +192,25 @@ UhciUnlinkTdFromQh ( /** Append a new TD To the previous TD. + @param Uhc The UHCI device. @param PrevTd Previous UHCI_TD_SW to be linked to. @param ThisTd TD to link. - @return None. - **/ VOID UhciAppendTd ( + IN USB_HC_DEV *Uhc, IN UHCI_TD_SW *PrevTd, IN UHCI_TD_SW *ThisTd ) { + EFI_PHYSICAL_ADDRESS PhyAddr; + + PhyAddr = UsbHcGetPciAddressForHostMem (Uhc->MemPool, ThisTd, sizeof (UHCI_TD_HW)); + ASSERT ((PrevTd != NULL) && (ThisTd != NULL)); - PrevTd->TdHw.NextLink = TD_LINK (ThisTd, TRUE, FALSE); + PrevTd->TdHw.NextLink = TD_LINK (PhyAddr, TRUE, FALSE); PrevTd->NextTd = (VOID *) ThisTd; } @@ -310,7 +310,8 @@ UhciCreateTd ( @param Uhc The UHCI device. @param DevAddr Device address. - @param Request Device request. + @param Request A pointer to cpu memory address of Device request. + @param RequestPhy A pointer to pci memory address of Device request. @param IsLow Full speed or low speed. @return The created setup Td Pointer. @@ -321,6 +322,7 @@ UhciCreateSetupTd ( IN USB_HC_DEV *Uhc, IN UINT8 DevAddr, IN UINT8 *Request, + IN UINT8 *RequestPhy, IN BOOLEAN IsLow ) { @@ -344,10 +346,10 @@ UhciCreateSetupTd ( Td->TdHw.DeviceAddr = DevAddr & 0x7F; Td->TdHw.MaxPacketLen = (UINT32) (sizeof (EFI_USB_DEVICE_REQUEST) - 1); Td->TdHw.PidCode = SETUP_PACKET_ID; - Td->TdHw.DataBuffer = (UINT32) (UINTN) Request; + Td->TdHw.DataBuffer = (UINT32) (UINTN) RequestPhy; Td->Data = Request; - Td->DataLen = sizeof (EFI_USB_DEVICE_REQUEST); + Td->DataLen = (UINT16) sizeof (EFI_USB_DEVICE_REQUEST); return Td; } @@ -359,7 +361,8 @@ UhciCreateSetupTd ( @param Uhc The UHCI device. @param DevAddr Device address. @param Endpoint Endpoint number. - @param DataPtr Data buffer. + @param DataPtr A pointer to cpu memory address of Data buffer. + @param DataPhyPtr A pointer to pci memory address of Data buffer. @param Len Data length. @param PktId Packet ID. @param Toggle Data toggle value. @@ -374,6 +377,7 @@ UhciCreateDataTd ( IN UINT8 DevAddr, IN UINT8 Endpoint, IN UINT8 *DataPtr, + IN UINT8 *DataPhyPtr, IN UINTN Len, IN UINT8 PktId, IN UINT8 Toggle, @@ -397,7 +401,7 @@ UhciCreateDataTd ( Td->TdHw.ShortPacket = FALSE; Td->TdHw.IsIsoch = FALSE; Td->TdHw.IntOnCpl = FALSE; - Td->TdHw.ErrorCount = 0X03; + Td->TdHw.ErrorCount = 0x03; Td->TdHw.Status = USBTD_ACTIVE; Td->TdHw.LowSpeed = IsLow ? 1 : 0; Td->TdHw.DataToggle = Toggle & 0x01; @@ -405,7 +409,7 @@ UhciCreateDataTd ( Td->TdHw.DeviceAddr = DevAddr & 0x7F; Td->TdHw.MaxPacketLen = (UINT32) (Len - 1); Td->TdHw.PidCode = (UINT8) PktId; - Td->TdHw.DataBuffer = (UINT32) (UINTN) DataPtr; + Td->TdHw.DataBuffer = (UINT32) (UINTN) DataPhyPtr; Td->Data = DataPtr; Td->DataLen = (UINT16) Len; @@ -468,8 +472,10 @@ UhciCreateStatusTd ( @param Uhc The UHCI device. @param DeviceAddr The device address. @param DataPktId Packet Identification of Data Tds. - @param Request A pointer to request structure buffer to transfer. - @param Data A pointer to user data buffer to transfer. + @param Request A pointer to cpu memory address of request structure buffer to transfer. + @param RequestPhy A pointer to pci memory address of request structure buffer to transfer. + @param Data A pointer to cpu memory address of user data buffer to transfer. + @param DataPhy A pointer to pci memory address of user data buffer to transfer. @param DataLen Length of user data to transfer. @param MaxPacket Maximum packet size for control transfer. @param IsLow Full speed or low speed. @@ -483,7 +489,9 @@ UhciCreateCtrlTds ( IN UINT8 DeviceAddr, IN UINT8 DataPktId, IN UINT8 *Request, + IN UINT8 *RequestPhy, IN UINT8 *Data, + IN UINT8 *DataPhy, IN UINTN DataLen, IN UINT8 MaxPacket, IN BOOLEAN IsLow @@ -508,7 +516,7 @@ UhciCreateCtrlTds ( // // Create setup packets for the transfer // - SetupTd = UhciCreateSetupTd (Uhc, DeviceAddr, Request, IsLow); + SetupTd = UhciCreateSetupTd (Uhc, DeviceAddr, Request, RequestPhy, IsLow); if (SetupTd == NULL) { return NULL; @@ -529,7 +537,8 @@ UhciCreateCtrlTds ( Uhc, DeviceAddr, 0, - Data, + Data, //cpu memory address + DataPhy, //Pci memory address ThisTdLen, DataPktId, DataToggle, @@ -544,12 +553,13 @@ UhciCreateCtrlTds ( FirstDataTd = DataTd; FirstDataTd->NextTd = NULL; } else { - UhciAppendTd (PrevDataTd, DataTd); + UhciAppendTd (Uhc, PrevDataTd, DataTd); } DataToggle ^= 1; PrevDataTd = DataTd; Data += ThisTdLen; + DataPhy += ThisTdLen; DataLen -= ThisTdLen; } @@ -572,10 +582,10 @@ UhciCreateCtrlTds ( // Link setup Td -> data Tds -> status Td together // if (FirstDataTd != NULL) { - UhciAppendTd (SetupTd, FirstDataTd); - UhciAppendTd (PrevDataTd, StatusTd); + UhciAppendTd (Uhc, SetupTd, FirstDataTd); + UhciAppendTd (Uhc, PrevDataTd, StatusTd); } else { - UhciAppendTd (SetupTd, StatusTd); + UhciAppendTd (Uhc, SetupTd, StatusTd); } return SetupTd; @@ -600,7 +610,8 @@ FREE_TD: @param DevAddr Address of Device. @param EndPoint Endpoint Number. @param PktId Packet Identification of Data Tds. - @param Data A pointer to user data buffer to transfer. + @param Data A pointer to cpu memory address of user data buffer to transfer. + @param DataPhy A pointer to pci memory address of user data buffer to transfer. @param DataLen Length of user data to transfer. @param DataToggle Data Toggle Pointer. @param MaxPacket Maximum packet size for Bulk/Interrupt transfer. @@ -616,6 +627,7 @@ UhciCreateBulkOrIntTds ( IN UINT8 EndPoint, IN UINT8 PktId, IN UINT8 *Data, + IN UINT8 *DataPhy, IN UINTN DataLen, IN OUT UINT8 *DataToggle, IN UINT8 MaxPacket, @@ -649,6 +661,7 @@ UhciCreateBulkOrIntTds ( DevAddr, EndPoint, Data, + DataPhy, ThisTdLen, PktId, *DataToggle, @@ -667,12 +680,13 @@ UhciCreateBulkOrIntTds ( FirstDataTd = DataTd; FirstDataTd->NextTd = NULL; } else { - UhciAppendTd (PrevDataTd, DataTd); + UhciAppendTd (Uhc, PrevDataTd, DataTd); } *DataToggle ^= 1; PrevDataTd = DataTd; Data += ThisTdLen; + DataPhy += ThisTdLen; DataLen -= ThisTdLen; }