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.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.mar...@arm.com>
---
 MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c | 9 +++++++++
 MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.c   | 1 +
 MdeModulePkg/Bus/Pci/EhciDxe/EhciUrb.h   | 3 ++-
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c 
b/MdeModulePkg/Bus/Pci/EhciDxe/EhciSched.c
index 5594e66..cc6e77e 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 6afb327..1ad37d5 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 02e9af8..0c80e76 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;
 };
 
-- 
2.1.1


------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to