diff --git a/drivers/usb/usbehci_new/usb_queue.cpp b/drivers/usb/usbehci_new/usb_queue.cpp index a7936b2e714..ed605d1e540 100644 --- a/drivers/usb/usbehci_new/usb_queue.cpp +++ b/drivers/usb/usbehci_new/usb_queue.cpp @@ -695,6 +695,7 @@ CUSBQueue::QueueHeadCleanup( IUSBRequest * Request; BOOLEAN ShouldReleaseWhenDone; USBD_STATUS UrbStatus; + KIRQL OldLevel; // // sanity checks @@ -763,11 +764,21 @@ CUSBQueue::QueueHeadCleanup( // if (Request->GetQueueHead(&NewQueueHead) == STATUS_SUCCESS) { + // + // first acquire request lock + // + KeAcquireSpinLock(&m_Lock, &OldLevel); + // // add to pending list // InsertTailList(&m_PendingRequestAsyncList, &NewQueueHead->LinkedQueueHeads); + // + // release queue head + // + KeReleaseSpinLock(&m_Lock, OldLevel); + // // Done for now // @@ -859,10 +870,20 @@ CUSBQueue::CompleteAsyncRequests() // Request = (IUSBRequest*) CurrentQH->Request; + // + // release lock + // + KeReleaseSpinLock(&m_Lock, OldLevel); + // // complete request now // QueueHeadCleanup(CurrentQH); + + // + // first acquire request lock + // + KeAcquireSpinLock(&m_Lock, &OldLevel); } //