summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Bus/Pci
diff options
context:
space:
mode:
authorFeng Tian <feng.tian@intel.com>2013-06-24 03:03:55 +0000
committererictian <erictian@6f19259b-4bc3-4df7-8a09-765794883524>2013-06-24 03:03:55 +0000
commitca243131657ba03f58206a417b938aa14cff585c (patch)
tree0f5fec27fca4a707241570bea8b8eff56cf2ff2c /MdeModulePkg/Bus/Pci
parent22feb630eb1bbe975c4c14ff859156dcbf6f87e3 (diff)
downloadedk2-platforms-ca243131657ba03f58206a417b938aa14cff585c.tar.xz
MdeModulePkg/Usb: Boost the r/w performance by reducing stall time on polling cmd execution status
Signed-off-by: Feng Tian <feng.tian@intel.com> Reviewed-by: Star Zeng <star.zeng@intel.com> Reviewed-by: Elvin Li <elvin.li@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14442 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg/Bus/Pci')
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c6
-rw-r--r--MdeModulePkg/Bus/Pci/EhciPei/EhcPeim.c6
-rw-r--r--MdeModulePkg/Bus/Pci/EhciPei/EhciSched.c20
-rw-r--r--MdeModulePkg/Bus/Pci/UhciDxe/UhciSched.c6
-rw-r--r--MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c37
-rw-r--r--MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h3
-rw-r--r--MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h6
-rw-r--r--MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c6
8 files changed, 65 insertions, 25 deletions
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c b/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c
index 4dc8e1abf1..366ab84dcf 100644
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c
+++ b/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c
@@ -2,7 +2,7 @@
EHCI transfer scheduling routines.
-Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
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
@@ -694,7 +694,7 @@ EhcExecTransfer (
BOOLEAN InfiniteLoop;
Status = EFI_SUCCESS;
- Loop = (TimeOut * EHC_1_MILLISECOND / EHC_SYNC_POLL_INTERVAL) + 1;
+ Loop = TimeOut * EHC_1_MILLISECOND;
Finished = FALSE;
InfiniteLoop = FALSE;
@@ -714,7 +714,7 @@ EhcExecTransfer (
break;
}
- gBS->Stall (EHC_SYNC_POLL_INTERVAL);
+ gBS->Stall (EHC_1_MICROSECOND);
}
if (!Finished) {
diff --git a/MdeModulePkg/Bus/Pci/EhciPei/EhcPeim.c b/MdeModulePkg/Bus/Pci/EhciPei/EhcPeim.c
index cefdf09915..09769eaf24 100644
--- a/MdeModulePkg/Bus/Pci/EhciPei/EhcPeim.c
+++ b/MdeModulePkg/Bus/Pci/EhciPei/EhcPeim.c
@@ -2,7 +2,7 @@
PEIM to produce gPeiUsb2HostControllerPpiGuid based on gPeiUsbControllerPpiGuid
which is used to enable recovery function from USB Drivers.
-Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions
@@ -532,6 +532,8 @@ EhcInitHC (
the subsequent bulk transfer.
@param TimeOut Indicates the maximum time, in millisecond, which the
transfer is allowed to complete.
+ If Timeout is 0, then the caller must wait for the function
+ to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
@param Translator A pointr to the transaction translator data.
@param TransferResult A pointer to the detailed result information of the
bulk transfer.
@@ -995,6 +997,8 @@ ON_EXIT:
@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 millisecond.
+ If Timeout is 0, then the caller must wait for the function
+ to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
@param Translator Transaction translator to be used by this device.
@param TransferResult Return the result of this control transfer.
diff --git a/MdeModulePkg/Bus/Pci/EhciPei/EhciSched.c b/MdeModulePkg/Bus/Pci/EhciPei/EhciSched.c
index 1821a278da..e992d4f287 100644
--- a/MdeModulePkg/Bus/Pci/EhciPei/EhciSched.c
+++ b/MdeModulePkg/Bus/Pci/EhciPei/EhciSched.c
@@ -2,7 +2,7 @@
PEIM to produce gPeiUsb2HostControllerPpiGuid based on gPeiUsbControllerPpiGuid
which is used to enable recovery function from USB Drivers.
-Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions
@@ -425,19 +425,29 @@ EhcExecTransfer (
UINTN Index;
UINTN Loop;
BOOLEAN Finished;
+ BOOLEAN InfiniteLoop;
Status = EFI_SUCCESS;
- Loop = (TimeOut * EHC_1_MILLISECOND / EHC_SYNC_POLL_INTERVAL) + 1;
- Finished = FALSE;
+ Loop = TimeOut * EHC_1_MILLISECOND;
+ Finished = FALSE;
+ InfiniteLoop = FALSE;
- for (Index = 0; Index < Loop; Index++) {
+ //
+ // If Timeout is 0, then the caller must wait for the function to be completed
+ // until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
+ //
+ if (TimeOut == 0) {
+ InfiniteLoop = TRUE;
+ }
+
+ for (Index = 0; InfiniteLoop || (Index < Loop); Index++) {
Finished = EhcCheckUrbResult (Ehc, Urb);
if (Finished) {
break;
}
- MicroSecondDelay (EHC_SYNC_POLL_INTERVAL);
+ MicroSecondDelay (EHC_1_MICROSECOND);
}
if (!Finished) {
diff --git a/MdeModulePkg/Bus/Pci/UhciDxe/UhciSched.c b/MdeModulePkg/Bus/Pci/UhciDxe/UhciSched.c
index 0d97bccaba..af3f4e5ecd 100644
--- a/MdeModulePkg/Bus/Pci/UhciDxe/UhciSched.c
+++ b/MdeModulePkg/Bus/Pci/UhciDxe/UhciSched.c
@@ -2,7 +2,7 @@
The EHCI register operation routines.
-Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>
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
@@ -580,7 +580,7 @@ UhciExecuteTransfer (
Finished = FALSE;
Status = EFI_SUCCESS;
- Delay = (TimeOut * UHC_1_MILLISECOND / UHC_SYNC_POLL_INTERVAL) + 1;
+ Delay = TimeOut * UHC_1_MILLISECOND;
InfiniteLoop = FALSE;
//
@@ -602,7 +602,7 @@ UhciExecuteTransfer (
break;
}
- gBS->Stall (UHC_SYNC_POLL_INTERVAL);
+ gBS->Stall (UHC_1_MICROSECOND);
}
if (!Finished) {
diff --git a/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c b/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c
index f58b6943f2..33f8c45d81 100644
--- a/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c
+++ b/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.c
@@ -2,7 +2,7 @@
PEIM to produce gPeiUsbHostControllerPpiGuid based on gPeiUsbControllerPpiGuid
which is used to enable recovery function from USB Drivers.
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved. <BR>
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved. <BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions
@@ -153,6 +153,8 @@ UhcPeimEntry (
@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 millisecond.
+ If Timeout is 0, then the caller must wait for the function
+ to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
@param TransferResult Return the result of this control transfer.
@retval EFI_SUCCESS Transfer was completed successfully.
@@ -391,6 +393,8 @@ UhcControlTransfer (
the subsequent bulk transfer.
@param TimeOut Indicates the maximum time, in millisecond, which the
transfer is allowed to complete.
+ If Timeout is 0, then the caller must wait for the function
+ to be completed until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
@param TransferResult A pointer to the detailed result information of the
bulk transfer.
@@ -2508,12 +2512,21 @@ ExecuteControlTransfer (
{
UINTN ErrTDPos;
UINTN Delay;
+ BOOLEAN InfiniteLoop;
ErrTDPos = 0;
*TransferResult = EFI_USB_NOERROR;
*ActualLen = 0;
+ InfiniteLoop = FALSE;
- Delay = (TimeOut * STALL_1_MILLI_SECOND / 200) + 1;
+ Delay = TimeOut * STALL_1_MILLI_SECOND;
+ //
+ // If Timeout is 0, then the caller must wait for the function to be completed
+ // until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
+ //
+ if (TimeOut == 0) {
+ InfiniteLoop = TRUE;
+ }
do {
@@ -2525,11 +2538,10 @@ ExecuteControlTransfer (
if ((*TransferResult & EFI_USB_ERR_NOTEXECUTE) != EFI_USB_ERR_NOTEXECUTE) {
break;
}
- MicroSecondDelay (200);
+ MicroSecondDelay (STALL_1_MICRO_SECOND);
Delay--;
- } while (Delay != 0);
-
+ } while (InfiniteLoop || (Delay != 0));
if (*TransferResult != EFI_USB_NOERROR) {
return EFI_DEVICE_ERROR;
@@ -2566,12 +2578,21 @@ ExecBulkTransfer (
UINTN ErrTDPos;
UINTN ScrollNum;
UINTN Delay;
+ BOOLEAN InfiniteLoop;
ErrTDPos = 0;
*TransferResult = EFI_USB_NOERROR;
*ActualLen = 0;
+ InfiniteLoop = FALSE;
- Delay = (TimeOut * STALL_1_MILLI_SECOND / 200) + 1;
+ Delay = TimeOut * STALL_1_MILLI_SECOND;
+ //
+ // If Timeout is 0, then the caller must wait for the function to be completed
+ // until EFI_SUCCESS or EFI_DEVICE_ERROR is returned.
+ //
+ if (TimeOut == 0) {
+ InfiniteLoop = TRUE;
+ }
do {
@@ -2582,10 +2603,10 @@ ExecBulkTransfer (
if ((*TransferResult & EFI_USB_ERR_NOTEXECUTE) != EFI_USB_ERR_NOTEXECUTE) {
break;
}
- MicroSecondDelay (200);
+ MicroSecondDelay (STALL_1_MICRO_SECOND);
Delay--;
- } while (Delay != 0);
+ } while (InfiniteLoop || (Delay != 0));
//
// has error
diff --git a/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h b/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h
index dc697ce105..460db7eab9 100644
--- a/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h
+++ b/MdeModulePkg/Bus/Pci/UhciPei/UhcPeim.h
@@ -1,7 +1,7 @@
/** @file
Private Header file for Usb Host Controller PEIM
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions
@@ -94,6 +94,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#define OUTPUT_PACKET_ID 0xE1
#define ERROR_PACKET_ID 0x55
+#define STALL_1_MICRO_SECOND 1
#define STALL_1_MILLI_SECOND 1000
diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h
index ae56b1e6fe..ada961f611 100644
--- a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h
+++ b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.h
@@ -2,7 +2,7 @@
Provides some data structure definitions used by the XHCI host controller driver.
-Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
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
@@ -42,6 +42,10 @@ typedef struct _USB_DEV_CONTEXT USB_DEV_CONTEXT;
#include "ComponentName.h"
//
+// The unit is microsecond, setting it as 1us.
+//
+#define XHC_1_MICROSECOND (1)
+//
// Convert millisecond to microsecond.
//
#define XHC_1_MILLISECOND (1000)
diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c
index e6c0d15642..f80ef81834 100644
--- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c
+++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c
@@ -2,7 +2,7 @@
XHCI transfer scheduling routines.
-Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>
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
@@ -1101,7 +1101,7 @@ XhcExecTransfer (
}
Status = EFI_SUCCESS;
- Loop = (Timeout * XHC_1_MILLISECOND / XHC_POLL_DELAY) + 1;
+ Loop = Timeout * XHC_1_MILLISECOND;
if (Timeout == 0) {
Loop = 0xFFFFFFFF;
}
@@ -1113,7 +1113,7 @@ XhcExecTransfer (
if (Urb->Finished) {
break;
}
- gBS->Stall (XHC_POLL_DELAY);
+ gBS->Stall (XHC_1_MICROSECOND);
}
if (Index == Loop) {