Index: drivers/usb/usbehci/usb_request.cpp =================================================================== --- drivers/usb/usbehci/usb_request.cpp (revision 70507) +++ drivers/usb/usbehci/usb_request.cpp (working copy) @@ -842,6 +842,7 @@ // // failed to allocate queue head // + DPRINT1("[EHCI] Failed to create queue head\n"); return STATUS_INSUFFICIENT_RESOURCES; } @@ -856,10 +857,11 @@ Status = BuildSetupPacket(); if (!NT_SUCCESS(Status)) { - // - // failed to allocate setup packet - // - ASSERT(FALSE); + // failed to create setup packet + DPRINT1("[EHCI] Failed to create setup packet\n"); + + //release queue head + m_DmaManager->Release(QueueHead, sizeof(QUEUE_HEAD)); return STATUS_INSUFFICIENT_RESOURCES; } @@ -869,10 +871,17 @@ Status = CreateDescriptor(&SetupDescriptor); if (!NT_SUCCESS(Status)) { - // - // failed to allocate transfer descriptor - // - ASSERT(FALSE); + // failed to create setup transfer descriptor + DPRINT1("[EHCI] Failed to create setup descriptor\n"); + + if (m_DescriptorPacket) + { + // release packet descriptor + m_DmaManager->Release(m_DescriptorPacket, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET)); + } + + // release queue head + m_DmaManager->Release(QueueHead, sizeof(QUEUE_HEAD)); return Status; } @@ -882,10 +891,20 @@ Status = CreateDescriptor(&StatusDescriptor); if (!NT_SUCCESS(Status)) { - // - // failed to allocate transfer descriptor - // - ASSERT(FALSE); + // failed to create status transfer descriptor + DPRINT1("[EHCI] Failed to create status descriptor\n"); + + // release setup transfer descriptor + m_DmaManager->Release(SetupDescriptor, sizeof(QUEUE_TRANSFER_DESCRIPTOR)); + + if (m_DescriptorPacket) + { + // release packet descriptor + m_DmaManager->Release(m_DescriptorPacket, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET)); + } + + // release queue head + m_DmaManager->Release(QueueHead, sizeof(QUEUE_HEAD)); return Status; } @@ -929,10 +948,28 @@ NULL, &DescriptorChainLength); - // - // FIXME handle errors - // - ASSERT(Status == STATUS_SUCCESS); + if (!NT_SUCCESS(Status)) + { + // failed to create descriptor chain + DPRINT1("[EHCI] Failed to create status descriptor\n"); + + // release status transfer descriptor + m_DmaManager->Release(StatusDescriptor, sizeof(QUEUE_TRANSFER_DESCRIPTOR)); + + // release setup transfer descriptor + m_DmaManager->Release(SetupDescriptor, sizeof(QUEUE_TRANSFER_DESCRIPTOR)); + + if (m_DescriptorPacket) + { + // release packet descriptor + m_DmaManager->Release(m_DescriptorPacket, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET)); + } + + // release queue head + m_DmaManager->Release(QueueHead, sizeof(QUEUE_HEAD)); + return Status; + } + if (m_TransferBufferLength != DescriptorChainLength) { DPRINT1("DescriptorChainLength %x\n", DescriptorChainLength); Index: drivers/usb/usbohci/usb_request.cpp =================================================================== --- drivers/usb/usbohci/usb_request.cpp (revision 70507) +++ drivers/usb/usbohci/usb_request.cpp (working copy) @@ -1289,6 +1289,15 @@ &LastDescriptor, &ChainDescriptorLength); + if (!NT_SUCCESS(Status)) + { + // + // failed to build transfer descriptor chain + // + m_DmaManager->Release(EndpointDescriptor, sizeof(OHCI_ENDPOINT_DESCRIPTOR)); + return Status; + } + // // move to next offset // Index: drivers/usb/usbuhci/usb_request.cpp =================================================================== --- drivers/usb/usbuhci/usb_request.cpp (revision 70507) +++ drivers/usb/usbuhci/usb_request.cpp (working copy) @@ -1041,6 +1041,16 @@ &ChainDescriptorLength, NULL); + if (!NT_SUCCESS(Status)) + { + // + // failed to allocate descriptor + // + DPRINT1("[UHCI] Failed to create descriptor chain\n"); + m_DmaManager->Release(QueueHead, sizeof(UHCI_QUEUE_HEAD)); + return Status; + } + // adjust buffer offset m_TransferBufferLengthCompleted += ChainDescriptorLength;