summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Martin <olivier.martin@arm.com>2014-10-07 10:35:37 +0100
committerLeif Lindholm <leif.lindholm@linaro.org>2015-03-19 16:51:04 +0000
commite715734e97db422b249b7e547e65ba37cfee5200 (patch)
treebc33c83337d8d2232f99c6b639cbddc9d99515f8
parent982a3923ce019622bde07ea105b433b68ffa3e33 (diff)
MdeModulePkg/EhciDxe: Do not process a same URB twicelinaro-topic-leg
After changing the USB stack to make it synchronous at initialization, we were checking if there was a pending interrupt when the USB interrupt was initialized for a specific device. At the first enumeration, all the connected USB devices are initialized. USB device drivers initialize their USB interrupt and process the completed URBs. There was no way to check if a URB was in process because before there was a single periodic task to process these URBs. Note: this change is only required when using the temporary hack to make the USB stack synchronous. Change-Id: I4c56bec2079c3ad5280e4cf4b0094337c6a7a41d
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c9
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c1
-rw-r--r--MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h3
3 files changed, 12 insertions, 1 deletions
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c b/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c
index 5594e6699..cc6e77e38 100644
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c
+++ b/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c
@@ -573,6 +573,12 @@ EhcCheckUrbResult (
ASSERT ((Ehc != NULL) && (Urb != NULL) && (Urb->Qh != NULL));
+ // The URB is already being processed, we do not want the callback to be
+ // called twice for the same URB
+ if (Urb->InProgress) {
+ return FALSE;
+ }
+
Finished = TRUE;
Urb->Completed = 0;
@@ -992,6 +998,9 @@ EhcMonitorAsyncRequests (
continue;
}
+ // Mark the URB as 'in-progress' to prevent the URB to be processed twice.
+ Urb->InProgress = TRUE;
+
//
// Flush any PCI posted write transactions from a PCI host
// bridge to system memory.
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c b/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c
index 6afb327df..1ad37d5bd 100644
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c
+++ b/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c
@@ -600,6 +600,7 @@ EhcCreateUrb (
Urb->DataLen = DataLen;
Urb->Callback = Callback;
Urb->Context = Context;
+ Urb->InProgress = FALSE;
PciIo = Ehc->PciIo;
Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);
diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h b/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h
index 02e9af81b..0c80e7624 100644
--- a/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h
+++ b/MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h
@@ -232,7 +232,8 @@ struct _URB {
// Transaction result
//
UINT32 Result;
- UINTN Completed; // completed data length
+ BOOLEAN InProgress; // defined when the URB is being processed
+ UINTN Completed; // Length of the data being processed
UINT8 DataToggle;
};