[USBEHCI]

- Don't complete irps with lock held

svn path=/branches/usb-bringup-trunk/; revision=55091
This commit is contained in:
Johannes Anderwald 2012-01-23 04:22:11 +00:00
parent b434c46463
commit 1cdf0e1d0d

View file

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