From nobody Mon Feb 9 19:08:09 2026 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Authentication-Results: mx.zoho.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1499145645579224.74818642070818; Mon, 3 Jul 2017 22:20:45 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 8B86E21CAD9BA; Mon, 3 Jul 2017 22:19:00 -0700 (PDT) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 055A521CAD998 for ; Mon, 3 Jul 2017 22:18:59 -0700 (PDT) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Jul 2017 22:20:36 -0700 Received: from ray-dev.ccr.corp.intel.com ([10.239.9.12]) by fmsmga004.fm.intel.com with ESMTP; 03 Jul 2017 22:20:35 -0700 X-Original-To: edk2-devel@lists.01.org X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,307,1496127600"; d="scan'208";a="281840474" From: Ruiyu Ni To: edk2-devel@lists.01.org Date: Tue, 4 Jul 2017 13:20:29 +0800 Message-Id: <20170704052030.226408-4-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.12.2.windows.2 In-Reply-To: <20170704052030.226408-1-ruiyu.ni@intel.com> References: <20170704052030.226408-1-ruiyu.ni@intel.com> Subject: [edk2] [PATCH v2 3/4] MdeModulePkg/XhciDxe: Separate common logic to XhcTransfer X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hao A Wu , Feng Tian , Star Zeng MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The patch separates the common logic in XhcControlTransfer, XhcBulkTransfer and XhcSyncIntTransfer to a sub-routine XhcTransfer. It doesn't have functionality impact. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni Cc: Hao A Wu Cc: Star Zeng Cc: Feng Tian --- MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c | 298 ++++++++++++++++----------------= ---- 1 file changed, 132 insertions(+), 166 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c b/MdeModulePkg/Bus/Pci/Xhc= iDxe/Xhci.c index 2f6137ef57..e3cbdbc800 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c @@ -1,7 +1,7 @@ /** @file The XHCI controller driver. =20 -Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2011 - 2017, 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 @@ -716,6 +716,97 @@ ON_EXIT: return Status; } =20 +/** + Submits a new transaction to a target USB device. + + @param Xhc The XHCI Instance. + @param DeviceAddress The target device address. + @param EndPointAddress Endpoint number and its direction encoded = in bit 7 + @param DeviceSpeed Target device speed. + @param MaximumPacketLength Maximum packet size the default control tr= ansfer + endpoint is capable of sending or receivin= g. + @param Type The transaction type. + @param Request USB device request to send. + @param Data Data buffer to be transmitted or received = from USB + device. + @param DataLength The size (in bytes) of the data buffer. + @param Timeout Indicates the maximum timeout, in millisec= ond. + @param TransferResult Return the result of this control transfer. + + @retval EFI_SUCCESS Transfer was completed successfully. + @retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resourc= es. + @retval EFI_INVALID_PARAMETER Some parameters are invalid. + @retval EFI_TIMEOUT Transfer failed due to timeout. + @retval EFI_DEVICE_ERROR Transfer failed due to host controller or = device error. +**/ +EFI_STATUS +XhcTransfer ( + IN USB_XHCI_INSTANCE *Xhc, + IN UINT8 DeviceAddress, + IN UINT8 EndPointAddress, + IN UINT8 DeviceSpeed, + IN UINTN MaximumPacketLength, + IN UINTN Type, + IN EFI_USB_DEVICE_REQUEST *Request, + IN OUT VOID *Data, + IN OUT UINTN *DataLength, + IN UINTN Timeout, + OUT UINT32 *TransferResult + ) +{ + EFI_STATUS Status; + EFI_STATUS RecoveryStatus; + URB *Urb; + + ASSERT ((Type =3D=3D XHC_CTRL_TRANSFER) || (Type =3D=3D XHC_BULK_TRANSFE= R) || (Type =3D=3D XHC_INT_TRANSFER_SYNC)); + Urb =3D XhcCreateUrb ( + Xhc, + DeviceAddress, + EndPointAddress, + DeviceSpeed, + MaximumPacketLength, + Type, + Request, + Data, + *DataLength, + NULL, + NULL + ); + + if (Urb =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "XhcTransfer[Type=3D%d]: failed to create URB!\n"= , Type)); + return EFI_OUT_OF_RESOURCES; + } + + Status =3D XhcExecTransfer (Xhc, FALSE, Urb, Timeout); + + *TransferResult =3D Urb->Result; + *DataLength =3D Urb->Completed; + + if (Status =3D=3D EFI_TIMEOUT) { + // + // The transfer timed out. Abort the transfer by dequeueing of the TD. + // + RecoveryStatus =3D XhcDequeueTrbFromEndpoint (Xhc, Urb); + if (EFI_ERROR (RecoveryStatus)) { + DEBUG((DEBUG_ERROR, "XhcTransfer[Type=3D%d]: XhcDequeueTrbFromEndpoi= nt failed\n", Type)); + } + } else { + if (*TransferResult =3D=3D EFI_USB_NOERROR) { + Status =3D EFI_SUCCESS; + } else if (*TransferResult =3D=3D EFI_USB_ERR_STALL) { + RecoveryStatus =3D XhcRecoverHaltedEndpoint (Xhc, Urb); + if (EFI_ERROR (RecoveryStatus)) { + DEBUG ((DEBUG_ERROR, "XhcTransfer[Type=3D%d]: XhcRecoverHaltedEndp= oint failed\n", Type)); + } + Status =3D EFI_DEVICE_ERROR; + } + } + + Xhc->PciIo->Flush (Xhc->PciIo); + XhcFreeUrb (Xhc, Urb); + return Status; +} =20 /** Submits control transfer to a target USB device. @@ -758,7 +849,6 @@ XhcControlTransfer ( ) { USB_XHCI_INSTANCE *Xhc; - URB *Urb; UINT8 Endpoint; UINT8 Index; UINT8 DescriptorType; @@ -769,7 +859,6 @@ XhcControlTransfer ( EFI_USB_HUB_DESCRIPTOR *HubDesc; EFI_TPL OldTpl; EFI_STATUS Status; - EFI_STATUS RecoveryStatus; UINTN MapSize; EFI_USB_PORT_STATUS PortStatus; UINT32 State; @@ -876,70 +965,24 @@ XhcControlTransfer ( // combination of Ep addr and its direction. // Endpoint =3D (UINT8) (0 | ((TransferDirection =3D=3D EfiUsbDataIn) ? 0x8= 0 : 0)); - Urb =3D XhcCreateUrb ( - Xhc, - DeviceAddress, - Endpoint, - DeviceSpeed, - MaximumPacketLength, - XHC_CTRL_TRANSFER, - Request, - Data, - *DataLength, - NULL, - NULL - ); + Status =3D XhcTransfer ( + Xhc, + DeviceAddress, + Endpoint, + DeviceSpeed, + MaximumPacketLength, + XHC_CTRL_TRANSFER, + Request, + Data, + DataLength, + Timeout, + TransferResult + ); =20 - if (Urb =3D=3D NULL) { - DEBUG ((EFI_D_ERROR, "XhcControlTransfer: failed to create URB")); - Status =3D EFI_OUT_OF_RESOURCES; + if (EFI_ERROR (Status)) { goto ON_EXIT; } =20 - Status =3D XhcExecTransfer (Xhc, FALSE, Urb, Timeout); - - // - // Get the status from URB. The result is updated in XhcCheckUrbResult - // which is called by XhcExecTransfer - // - *TransferResult =3D Urb->Result; - *DataLength =3D Urb->Completed; - - if (Status =3D=3D EFI_TIMEOUT) { - // - // The transfer timed out. Abort the transfer by dequeueing of the TD. - // - RecoveryStatus =3D XhcDequeueTrbFromEndpoint(Xhc, Urb); - if (EFI_ERROR(RecoveryStatus)) { - DEBUG((EFI_D_ERROR, "XhcControlTransfer: XhcDequeueTrbFromEndpoint f= ailed\n")); - } - goto FREE_URB; - } else { - if (*TransferResult =3D=3D EFI_USB_NOERROR) { - Status =3D EFI_SUCCESS; - } else if (*TransferResult =3D=3D EFI_USB_ERR_STALL) { - RecoveryStatus =3D XhcRecoverHaltedEndpoint(Xhc, Urb); - if (EFI_ERROR (RecoveryStatus)) { - DEBUG ((EFI_D_ERROR, "XhcControlTransfer: XhcRecoverHaltedEndpoint= failed\n")); - } - Status =3D EFI_DEVICE_ERROR; - goto FREE_URB; - } else { - goto FREE_URB; - } - } - - Xhc->PciIo->Flush (Xhc->PciIo); - =20 - if (Urb->DataMap !=3D NULL) { - Status =3D Xhc->PciIo->Unmap (Xhc->PciIo, Urb->DataMap); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - Status =3D EFI_DEVICE_ERROR; - goto FREE_URB; - } =20 - } - // // Hook Get_Descriptor request from UsbBus as we need evaluate context a= nd configure endpoint. // Hook Get_Status request form UsbBus as we need trace device attach/de= tach event happened at hub. @@ -1115,11 +1158,7 @@ XhcControlTransfer ( *(UINT32 *)Data =3D *(UINT32*)&PortStatus; } =20 -FREE_URB: - FreePool (Urb); - ON_EXIT: - if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "XhcControlTransfer: error - %r, transfer - %x\n"= , Status, *TransferResult)); } @@ -1178,10 +1217,8 @@ XhcBulkTransfer ( ) { USB_XHCI_INSTANCE *Xhc; - URB *Urb; UINT8 SlotId; EFI_STATUS Status; - EFI_STATUS RecoveryStatus; EFI_TPL OldTpl; =20 // @@ -1227,56 +1264,21 @@ XhcBulkTransfer ( // Create a new URB, insert it into the asynchronous // schedule list, then poll the execution status. // - Urb =3D XhcCreateUrb ( - Xhc, - DeviceAddress, - EndPointAddress, - DeviceSpeed, - MaximumPacketLength, - XHC_BULK_TRANSFER, - NULL, - Data[0], - *DataLength, - NULL, - NULL - ); - - if (Urb =3D=3D NULL) { - DEBUG ((EFI_D_ERROR, "XhcBulkTransfer: failed to create URB\n")); - Status =3D EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - Status =3D XhcExecTransfer (Xhc, FALSE, Urb, Timeout); - - *TransferResult =3D Urb->Result; - *DataLength =3D Urb->Completed; - - if (Status =3D=3D EFI_TIMEOUT) { - // - // The transfer timed out. Abort the transfer by dequeueing of the TD. - // - RecoveryStatus =3D XhcDequeueTrbFromEndpoint(Xhc, Urb); - if (EFI_ERROR(RecoveryStatus)) { - DEBUG((EFI_D_ERROR, "XhcBulkTransfer: XhcDequeueTrbFromEndpoint fail= ed\n")); - } - } else { - if (*TransferResult =3D=3D EFI_USB_NOERROR) { - Status =3D EFI_SUCCESS; - } else if (*TransferResult =3D=3D EFI_USB_ERR_STALL) { - RecoveryStatus =3D XhcRecoverHaltedEndpoint(Xhc, Urb); - if (EFI_ERROR (RecoveryStatus)) { - DEBUG ((EFI_D_ERROR, "XhcBulkTransfer: XhcRecoverHaltedEndpoint fa= iled\n")); - } - Status =3D EFI_DEVICE_ERROR; - } - } - - Xhc->PciIo->Flush (Xhc->PciIo); - XhcFreeUrb (Xhc, Urb); + Status =3D XhcTransfer ( + Xhc, + DeviceAddress, + EndPointAddress, + DeviceSpeed, + MaximumPacketLength, + XHC_BULK_TRANSFER, + NULL, + Data[0], + DataLength, + Timeout, + TransferResult + ); =20 ON_EXIT: - if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "XhcBulkTransfer: error - %r, transfer - %x\n", S= tatus, *TransferResult)); } @@ -1490,10 +1492,8 @@ XhcSyncInterruptTransfer ( ) { USB_XHCI_INSTANCE *Xhc; - URB *Urb; UINT8 SlotId; EFI_STATUS Status; - EFI_STATUS RecoveryStatus; EFI_TPL OldTpl; =20 // @@ -1534,53 +1534,19 @@ XhcSyncInterruptTransfer ( goto ON_EXIT; } =20 - Urb =3D XhcCreateUrb ( - Xhc, - DeviceAddress, - EndPointAddress, - DeviceSpeed, - MaximumPacketLength, - XHC_INT_TRANSFER_SYNC, - NULL, - Data, - *DataLength, - NULL, - NULL - ); - - if (Urb =3D=3D NULL) { - DEBUG ((EFI_D_ERROR, "XhcSyncInterruptTransfer: failed to create URB\n= ")); - Status =3D EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - Status =3D XhcExecTransfer (Xhc, FALSE, Urb, Timeout); - - *TransferResult =3D Urb->Result; - *DataLength =3D Urb->Completed; - - if (Status =3D=3D EFI_TIMEOUT) { - // - // The transfer timed out. Abort the transfer by dequeueing of the TD. - // - RecoveryStatus =3D XhcDequeueTrbFromEndpoint(Xhc, Urb); - if (EFI_ERROR(RecoveryStatus)) { - DEBUG((EFI_D_ERROR, "XhcSyncInterruptTransfer: XhcDequeueTrbFromEndp= oint failed\n")); - } - } else { - if (*TransferResult =3D=3D EFI_USB_NOERROR) { - Status =3D EFI_SUCCESS; - } else if (*TransferResult =3D=3D EFI_USB_ERR_STALL) { - RecoveryStatus =3D XhcRecoverHaltedEndpoint(Xhc, Urb); - if (EFI_ERROR (RecoveryStatus)) { - DEBUG ((EFI_D_ERROR, "XhcSyncInterruptTransfer: XhcRecoverHaltedEn= dpoint failed\n")); - } - Status =3D EFI_DEVICE_ERROR; - } - } - - Xhc->PciIo->Flush (Xhc->PciIo); - XhcFreeUrb (Xhc, Urb); + Status =3D XhcTransfer ( + Xhc, + DeviceAddress, + EndPointAddress, + DeviceSpeed, + MaximumPacketLength, + XHC_INT_TRANSFER_SYNC, + NULL, + Data, + DataLength, + Timeout, + TransferResult + ); =20 ON_EXIT: if (EFI_ERROR (Status)) { --=20 2.12.2.windows.2 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel