diff --git a/lib/usb/libusbohci b/lib/usb/libusbohci index 8b0039a21..6a0c5fefb 160000 --- a/lib/usb/libusbohci +++ b/lib/usb/libusbohci @@ -1 +1 @@ -Subproject commit 8b0039a21f7d321e5c5235a7539a7d2d7afad730 +Subproject commit 6a0c5fefbcd9db53f4a27ee10df99f93d5bce745 diff --git a/lib/usb/libusbohci_xbox/usbh_xbox.c b/lib/usb/libusbohci_xbox/usbh_xbox.c index 09e8ca447..31f697de9 100644 --- a/lib/usb/libusbohci_xbox/usbh_xbox.c +++ b/lib/usb/libusbohci_xbox/usbh_xbox.c @@ -3,16 +3,26 @@ #include #include #include +#include #include "usbh_config_xbox.h" extern void OHCI_IRQHandler(void); static KINTERRUPT InterruptObject; +static KDPC DpcObject; + static BOOLEAN __stdcall ISR(PKINTERRUPT Interrupt, PVOID ServiceContext) { - OHCI_IRQHandler(); + DISABLE_OHCI_IRQ(); + KeInsertQueueDpc(&DpcObject, NULL, NULL); return TRUE; } +static VOID NTAPI dpcRoutine(PKDPC dpc, PVOID deferredContext, PVOID arg1, PVOID arg2) +{ + OHCI_IRQHandler(); + ENABLE_OHCI_IRQ(); +} + //Initialise the systems ohci irq and irq handler. //The USB stacks handler function (OHCI_IRQHandler) should be called void usbh_ohci_irq_init() { @@ -25,11 +35,13 @@ void usbh_ohci_irq_init() { irql, LevelSensitive, FALSE); + KeInitializeDpc(&DpcObject, dpcRoutine, NULL); KeConnectInterrupt(&InterruptObject); } void usbh_ohci_irq_deinit() { KeDisconnectInterrupt(&InterruptObject); + KeRemoveQueueDpc(&DpcObject); } //Allocate a contiguous memory pool that the ohci hardware can access.