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