From 6681582dcce3a08ce3cb3042b2f4a09e9d3c9d72 Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Mon, 22 Oct 2018 16:29:03 +0800 Subject: [PATCH] MdeModulePkg XhciDxe: Extract new XhciInsertAsyncIntTransfer function V3: Match function parameter name and description between XhciSched.c and XhciSched.h. V2: Add the missing "FreePool (Data);". Remove the unnecessary indentation change. REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1274 Extract new XhciInsertAsyncIntTransfer function from XhcAsyncInterruptTransfer. It is code preparation for following patch, no essential functional change. Cc: Ruiyu Ni Cc: Hao Wu Cc: Jian J Wang Cc: Jiewen Yao Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng Reviewed-by: Hao Wu --- MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c | 18 +------ MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c | 65 ++++++++++++++++++++++++ MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h | 28 ++++++++++ 3 files changed, 94 insertions(+), 17 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c index f1c60bef01..7f64f9c7c9 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c @@ -1346,7 +1346,6 @@ XhcAsyncInterruptTransfer ( EFI_STATUS Status; UINT8 SlotId; UINT8 Index; - UINT8 *Data; EFI_TPL OldTpl; // @@ -1413,36 +1412,21 @@ XhcAsyncInterruptTransfer ( goto ON_EXIT; } - Data = AllocateZeroPool (DataLength); - - if (Data == NULL) { - DEBUG ((EFI_D_ERROR, "XhcAsyncInterruptTransfer: failed to allocate buffer\n")); - Status = EFI_OUT_OF_RESOURCES; - goto ON_EXIT; - } - - Urb = XhcCreateUrb ( + Urb = XhciInsertAsyncIntTransfer ( Xhc, DeviceAddress, EndPointAddress, DeviceSpeed, MaximumPacketLength, - XHC_INT_TRANSFER_ASYNC, - NULL, - Data, DataLength, CallBackFunction, Context ); - if (Urb == NULL) { - DEBUG ((EFI_D_ERROR, "XhcAsyncInterruptTransfer: failed to create URB\n")); - FreePool (Data); Status = EFI_OUT_OF_RESOURCES; goto ON_EXIT; } - InsertHeadList (&Xhc->AsyncIntTransfers, &Urb->UrbList); // // Ring the doorbell // diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c index 166c44bf5e..75959ae083 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c @@ -1410,6 +1410,71 @@ XhciDelAllAsyncIntTransfers ( } } +/** + Insert a single asynchronous interrupt transfer for + the device and endpoint. + + @param Xhc The XHCI Instance + @param BusAddr The logical device address assigned by UsbBus driver + @param EpAddr Endpoint addrress + @param DevSpeed The device speed + @param MaxPacket The max packet length of the endpoint + @param DataLen The length of data buffer + @param Callback The function to call when data is transferred + @param Context The context to the callback + + @return Created URB or NULL + +**/ +URB * +XhciInsertAsyncIntTransfer ( + IN USB_XHCI_INSTANCE *Xhc, + IN UINT8 BusAddr, + IN UINT8 EpAddr, + IN UINT8 DevSpeed, + IN UINTN MaxPacket, + IN UINTN DataLen, + IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, + IN VOID *Context + ) +{ + VOID *Data; + URB *Urb; + + Data = AllocateZeroPool (DataLen); + if (Data == NULL) { + DEBUG ((DEBUG_ERROR, "%a: failed to allocate buffer\n", __FUNCTION__)); + return NULL; + } + + Urb = XhcCreateUrb ( + Xhc, + BusAddr, + EpAddr, + DevSpeed, + MaxPacket, + XHC_INT_TRANSFER_ASYNC, + NULL, + Data, + DataLen, + Callback, + Context + ); + if (Urb == NULL) { + DEBUG ((DEBUG_ERROR, "%a: failed to create URB\n", __FUNCTION__)); + FreePool (Data); + return NULL; + } + + // + // New asynchronous transfer must inserted to the head. + // Check the comments in XhcMoniteAsyncRequests + // + InsertHeadList (&Xhc->AsyncIntTransfers, &Urb->UrbList); + + return Urb; +} + /** Update the queue head for next round of asynchronous transfer diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h index 097408828a..b5e192c3b5 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.h @@ -852,6 +852,34 @@ XhciDelAllAsyncIntTransfers ( IN USB_XHCI_INSTANCE *Xhc ); +/** + Insert a single asynchronous interrupt transfer for + the device and endpoint. + + @param Xhc The XHCI Instance + @param BusAddr The logical device address assigned by UsbBus driver + @param EpAddr Endpoint addrress + @param DevSpeed The device speed + @param MaxPacket The max packet length of the endpoint + @param DataLen The length of data buffer + @param Callback The function to call when data is transferred + @param Context The context to the callback + + @return Created URB or NULL + +**/ +URB * +XhciInsertAsyncIntTransfer ( + IN USB_XHCI_INSTANCE *Xhc, + IN UINT8 BusAddr, + IN UINT8 EpAddr, + IN UINT8 DevSpeed, + IN UINTN MaxPacket, + IN UINTN DataLen, + IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, + IN VOID *Context + ); + /** Set Bios Ownership -- 2.39.2