implement user mode catchable exceptions, refactor system status codes to use NTLSTATUS_ prefix, update build scripts to use shared literal macros for linker arguments, update named queue lifetime cleanup to include KeNamedQueueUnpublishHandle.

This commit is contained in:
maksw committed 2026-06-27 20:38:43 +02:00
1 parent 1f5477cf66
commit b7fcfce6f7
140 files changed
+7649 -3943

No files matched your search

+111 -111
View File
@@ -499,12 +499,12 @@ void XhciUnregisterWaitTarget(XHCI_CONTROLLER* xhci, XHCI_WAIT_TARGET* target) {
KSTATUS XhciWaitForArmedTarget(XHCI_CONTROLLER* xhci, XHCI_WAIT_TARGET* target,
uint32_t timeoutUs) {
if (!xhci || !target)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
for (uint32_t i = 0; i < timeoutUs; i++) {
if (XhciWaitTargetComplete(target)) {
XhciUnregisterWaitTarget(xhci, target);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// The IRQ/DPC path normally owns the event ring after enumeration, but
@@ -522,13 +522,13 @@ KSTATUS XhciWaitForArmedTarget(XHCI_CONTROLLER* xhci, XHCI_WAIT_TARGET* target,
}
XhciUnregisterWaitTarget(xhci, target);
return STATUS_TIMEOUT;
return NTLSTATUS_TIMEOUT;
}
KSTATUS XhciWaitForTarget(XHCI_CONTROLLER* xhci, XHCI_WAIT_TARGET* target,
uint32_t timeoutUs) {
if (!xhci || !target)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
XhciRegisterWaitTarget(xhci, target);
return XhciWaitForArmedTarget(xhci, target, timeoutUs);
}
@@ -557,15 +557,15 @@ static uint32_t gXhciControllerCount;
// Registers controller.
static KSTATUS XhciRegisterController(XHCI_CONTROLLER* xhci) {
if (!xhci) return STATUS_INVALID_PARAMETER;
if (!xhci) return NTLSTATUS_INVALID_PARAMETER;
for (uint32_t i = 0; i < gXhciControllerCount; i++) {
if (gXhciControllers[i] == xhci)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
if (gXhciControllerCount >= XHCI_MAX_CONTROLLERS)
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
gXhciControllers[gXhciControllerCount++] = xhci;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the isr operation.
@@ -589,7 +589,7 @@ void XhciIsr(void) {
// Implements the bios Handoff operation.
KSTATUS XhciBiosHandoff(XHCI_CONTROLLER* xhci) {
uint32_t xecp = (xhci->Hcc1 >> 16) & 0xFFFFu;
if (!xecp) return STATUS_SUCCESS;
if (!xecp) return NTLSTATUS_SUCCESS;
for (uint32_t guard = 0; xecp && guard < 64; guard++) {
uint32_t off = xecp << 2;
@@ -621,13 +621,13 @@ KSTATUS XhciBiosHandoff(XHCI_CONTROLLER* xhci) {
// Clear legacy SMI enables/status. RW1C status bits tolerate this.
XhciWrite32(xhci->Mmio, off + 4u, 0xFFFFFFFFu);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
xecp = next;
}
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the stop And Reset operation.
@@ -639,7 +639,7 @@ KSTATUS XhciStopAndReset(XHCI_CONTROLLER* xhci) {
XHCI_USBSTS_HCH, 1000000u)) {
DbgPrint("usb: xHCI stop timeout usbsts=%08x\n",
XhciRead32(xhci->Op, XHCI_OP_USBSTS));
return STATUS_TIMEOUT;
return NTLSTATUS_TIMEOUT;
}
}
@@ -648,35 +648,35 @@ KSTATUS XhciStopAndReset(XHCI_CONTROLLER* xhci) {
XHCI_USBCMD_HCRST, 1000000u)) {
DbgPrint("usb: xHCI reset timeout usbcmd=%08x\n",
XhciRead32(xhci->Op, XHCI_OP_USBCMD));
return STATUS_TIMEOUT;
return NTLSTATUS_TIMEOUT;
}
if (!UsbWaitClear32(xhci->Hal, xhci->Op, XHCI_OP_USBSTS,
XHCI_USBSTS_CNR, 1000000u)) {
DbgPrint("usb: xHCI controller-not-ready timeout usbsts=%08x\n",
XhciRead32(xhci->Op, XHCI_OP_USBSTS));
return STATUS_TIMEOUT;
return NTLSTATUS_TIMEOUT;
}
XhciWrite32(xhci->Op, XHCI_OP_USBSTS,
XhciRead32(xhci->Op, XHCI_OP_USBSTS) & XHCI_USBSTS_CLEAR_MASK);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Creates scratchpads.
KSTATUS XhciAllocateScratchpads(XHCI_CONTROLLER* xhci) {
if (xhci->ScratchpadCount == 0) return STATUS_SUCCESS;
if (xhci->ScratchpadCount == 0) return NTLSTATUS_SUCCESS;
if (xhci->ScratchpadCount > XHCI_MAX_SCRATCHPADS) {
DbgPrint("usb: xHCI wants %u scratchpads, capped driver supports %u\n",
xhci->ScratchpadCount, XHCI_MAX_SCRATCHPADS);
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
}
xhci->ScratchpadArray = (uint64_t*)UsbDmaAllocPages(xhci, 1, &xhci->ScratchpadArrayPhys);
if (!xhci->ScratchpadArray) {
DbgPrint("usb: xHCI scratchpad pointer-array allocation failed count=%u\n",
xhci->ScratchpadCount);
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
}
for (uint16_t i = 0; i < xhci->ScratchpadCount; i++) {
@@ -684,7 +684,7 @@ KSTATUS XhciAllocateScratchpads(XHCI_CONTROLLER* xhci) {
if (!page) {
DbgPrint("usb: xHCI scratchpad buffer allocation failed index=%u/%u\n",
i, xhci->ScratchpadCount);
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
}
(void)page;
xhci->ScratchpadArray[i] = xhci->ScratchpadPhys[i];
@@ -694,7 +694,7 @@ KSTATUS XhciAllocateScratchpads(XHCI_CONTROLLER* xhci) {
UsbTrace("usb: xHCI allocated %u scratchpad buffer(s) array=0x%016llX\n",
xhci->ScratchpadCount,
(unsigned long long)xhci->ScratchpadArrayPhys);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Creates runtime Memory.
@@ -707,7 +707,7 @@ KSTATUS XhciAllocateRuntimeMemory(XHCI_CONTROLLER* xhci) {
if (!xhci->Dcbaa || !xhci->CommandRing || !xhci->EventRing || !xhci->Erst) {
DbgPrint("usb: xHCI runtime DMA allocation failed dcbaa=0x%016llX cmd=0x%016llX event=0x%016llX erst=0x%016llX\n",
xhci->Dcbaa, xhci->CommandRing, xhci->EventRing, xhci->Erst);
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
}
xhci->CommandEnqueue = 0;
@@ -735,13 +735,13 @@ KSTATUS XhciAllocateRuntimeMemory(XHCI_CONTROLLER* xhci) {
(unsigned long long)xhci->CommandRingPhys,
(unsigned long long)xhci->EventRingPhys,
(unsigned long long)xhci->ErstPhys);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the program Runtime operation.
KSTATUS XhciProgramRuntime(XHCI_CONTROLLER* xhci) {
uint8_t slots = xhci->MaxSlots;
if (slots == 0) return STATUS_DEVICE_ERROR;
if (slots == 0) return NTLSTATUS_DEVICE_ERROR;
XhciWrite64(xhci->Op, XHCI_OP_DCBAAP, xhci->DcbaaPhys);
XhciWrite64(xhci->Op, XHCI_OP_CRCR, xhci->CommandRingPhys | xhci->CommandCycle);
@@ -756,7 +756,7 @@ KSTATUS XhciProgramRuntime(XHCI_CONTROLLER* xhci) {
XhciWrite64(ir0, 0x18u, xhci->EventRingPhys);
XhciBarrier();
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the command Trb Phys operation.
@@ -770,7 +770,7 @@ static KSTATUS XhciCommandRingAppend(XHCI_CONTROLLER* xhci,
uint32_t controlWithoutCycle,
uint64_t* outPhys) {
if (!xhci || !xhci->CommandRing)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (xhci->CommandEnqueue >= XHCI_RING_TRBS - 1u) {
XHCI_TRB* link = &xhci->CommandRing[XHCI_RING_TRBS - 1u];
@@ -796,7 +796,7 @@ static KSTATUS XhciCommandRingAppend(XHCI_CONTROLLER* xhci,
trb->Control = controlWithoutCycle | xhci->CommandCycle;
if (outPhys) *outPhys = trbPhys;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
KSTATUS XhciSubmitCommand(XHCI_CONTROLLER* xhci,
@@ -805,7 +805,7 @@ KSTATUS XhciSubmitCommand(XHCI_CONTROLLER* xhci,
uint32_t controlWithoutCycle,
XHCI_COMMAND_RESULT* outResult) {
if (!xhci)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
XHCI_WAIT_TARGET target;
memset(&target, 0, sizeof(target));
@@ -829,8 +829,8 @@ KSTATUS XhciSubmitCommand(XHCI_CONTROLLER* xhci,
if (KSUCCESS(waitStatus) && target.CommandMatched) {
if (outResult) *outResult = target.Command;
return (target.Command.CompletionCode == XHCI_CC_SUCCESS)
? STATUS_SUCCESS
: STATUS_DEVICE_ERROR;
? NTLSTATUS_SUCCESS
: NTLSTATUS_DEVICE_ERROR;
}
DbgPrint("usb: xHCI command timeout type=%u usbsts=%08x crcr=0x%016llX\n",
@@ -852,7 +852,7 @@ KSTATUS XhciSubmitNoopCommand(XHCI_CONTROLLER* xhci) {
if (KSUCCESS(st)) {
UsbTrace("usb: xHCI No-Op command completed successfully\n");
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
DbgPrint("usb: xHCI No-Op command failed st=0x%x cc=%u\n",
@@ -877,17 +877,17 @@ KSTATUS XhciEnableSlot(XHCI_CONTROLLER* xhci, uint8_t* outSlotId) {
}
if (result.SlotId == 0 || result.SlotId > XHCI_MAX_TRACKED_SLOTS) {
DbgPrint("usb: xHCI Enable Slot returned unsupported slot=%u\n", result.SlotId);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
*outSlotId = result.SlotId;
UsbTrace("usb: xHCI Enable Slot -> slot %u\n", result.SlotId);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Disables slot.
KSTATUS XhciDisableSlot(XHCI_CONTROLLER* xhci, uint8_t slotId) {
if (!xhci || slotId == 0)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
XHCI_COMMAND_RESULT res;
memset(&res, 0, sizeof(res));
@@ -901,9 +901,9 @@ KSTATUS XhciDisableSlot(XHCI_CONTROLLER* xhci, uint8_t slotId) {
return st;
if (res.CompletionCode != XHCI_CC_SUCCESS) {
DbgPrint("usb: Disable Slot slot=%u failed cc=%u\n", slotId, res.CompletionCode);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the address Device operation.
@@ -923,7 +923,7 @@ KSTATUS XhciAddressDevice(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev) {
return st;
}
UsbTrace("usb: xHCI Address Device slot=%u complete\n", dev->SlotId);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Starts the requested operation.
@@ -936,11 +936,11 @@ KSTATUS XhciStart(XHCI_CONTROLLER* xhci) {
XHCI_USBSTS_HCH, 1000000u)) {
DbgPrint("usb: xHCI start timeout usbsts=%08x\n",
XhciRead32(xhci->Op, XHCI_OP_USBSTS));
return STATUS_TIMEOUT;
return NTLSTATUS_TIMEOUT;
}
xhci->Running = true;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Enables interrupts.
@@ -979,7 +979,7 @@ KSTATUS XhciResetPort(XHCI_CONTROLLER* xhci, uint8_t port, uint8_t* outSpeed) {
uint32_t off = XhciPortReg(port);
uint32_t portsc = XhciRead32(xhci->Op, off);
if (!(portsc & XHCI_PORTSC_CCS))
return STATUS_NOT_FOUND;
return NTLSTATUS_NOT_FOUND;
uint32_t speed = (portsc & XHCI_PORTSC_SPEED_MASK) >> XHCI_PORTSC_SPEED_SHIFT;
uint8_t protocol = XhciPortProtocolMajor(xhci, port, portsc);
@@ -1018,8 +1018,8 @@ KSTATUS XhciResetPort(XHCI_CONTROLLER* xhci, uint8_t port, uint8_t* outSpeed) {
protocol, XhciPortSpeedName(speed), speed);
if (!enabled || !(portsc & XHCI_PORTSC_CCS) || !(portsc & XHCI_PORTSC_PED))
return STATUS_DEVICE_ERROR;
return STATUS_SUCCESS;
return NTLSTATUS_DEVICE_ERROR;
return NTLSTATUS_SUCCESS;
}
uint32_t reset = (portsc & XHCI_PORTSC_PP) | XHCI_PORTSC_PR;
@@ -1038,7 +1038,7 @@ KSTATUS XhciResetPort(XHCI_CONTROLLER* xhci, uint8_t port, uint8_t* outSpeed) {
if (!resetDone) {
DbgPrint("usb: xHCI port %u reset timeout portsc=%08x\n", port, portsc);
return STATUS_TIMEOUT;
return NTLSTATUS_TIMEOUT;
}
XhciClearPortChanges(xhci, port);
@@ -1052,9 +1052,9 @@ KSTATUS XhciResetPort(XHCI_CONTROLLER* xhci, uint8_t port, uint8_t* outSpeed) {
protocol, XhciPortSpeedName(speed), speed);
if (!(portsc & XHCI_PORTSC_CCS) || !(portsc & XHCI_PORTSC_PED))
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Creates device Memory.
@@ -1065,7 +1065,7 @@ KSTATUS XhciAllocateDeviceMemory(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev) {
dev->DescriptorBuffer = (uint8_t*)UsbDmaAllocPages(xhci, 1, &dev->DescriptorPhys);
if (!dev->InputContext || !dev->DeviceContext || !dev->Ep0Ring || !dev->DescriptorBuffer)
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
dev->Ep0Enqueue = 0;
dev->Ep0Cycle = 1;
@@ -1078,7 +1078,7 @@ KSTATUS XhciAllocateDeviceMemory(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev) {
XHCI_TRB_LINK_TC |
dev->Ep0Cycle;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Builds default Control Context.
@@ -1135,7 +1135,7 @@ KSTATUS XhciEp0AppendTrb(XHCI_DEVICE* dev,
uint32_t controlWithoutCycle,
uint64_t* outPhys) {
if (!dev || !dev->Ep0Ring)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (dev->Ep0Enqueue >= XHCI_EP0_RING_TRBS - 1u) {
XHCI_TRB* link = &dev->Ep0Ring[XHCI_EP0_RING_TRBS - 1u];
@@ -1161,7 +1161,7 @@ KSTATUS XhciEp0AppendTrb(XHCI_DEVICE* dev,
trb->Control = controlWithoutCycle | dev->Ep0Cycle;
if (outPhys) *outPhys = phys;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
KSTATUS XhciControlInTimeout(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
@@ -1171,7 +1171,7 @@ KSTATUS XhciControlInTimeout(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
uint16_t length,
uint32_t timeoutUs) {
if (!buffer || length == 0 || length > PAGE_SIZE)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
memset(buffer, 0, length);
@@ -1223,13 +1223,13 @@ KSTATUS XhciControlInTimeout(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
return st;
}
if (target.Transfer.CompletionCode == XHCI_CC_SUCCESS)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
DbgPrint("usb: xHCI control IN failed slot=%u cc=%u residue=%u\n",
dev->SlotId,
target.Transfer.CompletionCode,
target.Transfer.Residue);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
KSTATUS XhciControlIn(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
@@ -1282,13 +1282,13 @@ KSTATUS XhciControlNoData(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
return st;
}
if (target.Transfer.CompletionCode == XHCI_CC_SUCCESS)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
DbgPrint("usb: xHCI control no-data failed slot=%u cc=%u residue=%u\n",
dev->SlotId,
target.Transfer.CompletionCode,
target.Transfer.Residue);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
KSTATUS XhciGetDeviceDescriptorTimeout(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
@@ -1314,10 +1314,10 @@ KSTATUS XhciGetDeviceDescriptorTimeout(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
outDesc->bDescriptorType != USB_DESC_DEVICE) {
DbgPrint("usb: invalid device descriptor slot=%u len=%u type=%u\n",
dev->SlotId, outDesc->bLength, outDesc->bDescriptorType);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
KSTATUS XhciGetDeviceDescriptor(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
@@ -1353,7 +1353,7 @@ KSTATUS XhciGetConfigurationDescriptor(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
outConfig->bLength,
outConfig->bDescriptorType,
outConfig->wTotalLength);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
uint16_t total = outConfig->wTotalLength;
@@ -1378,11 +1378,11 @@ KSTATUS XhciGetConfigurationDescriptor(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
configurationIndex,
outConfig->bLength,
outConfig->bDescriptorType);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
if (outTotalLength) *outTotalLength = total;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the endpoint Id From Address operation.
@@ -1420,7 +1420,7 @@ KSTATUS XhciRingAppend(XHCI_TRB* ring, PHYSICAL_ADDRESS ringPhys,
uint64_t parameter, uint32_t status,
uint32_t controlWithoutCycle, uint64_t* outPhys) {
if (!ring || !enqueue || !cycle || trbCount < 2)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (*enqueue >= trbCount - 1u) {
XHCI_TRB* link = &ring[trbCount - 1u];
@@ -1446,7 +1446,7 @@ KSTATUS XhciRingAppend(XHCI_TRB* ring, PHYSICAL_ADDRESS ringPhys,
trb->Control = controlWithoutCycle | *cycle;
if (outPhys) *outPhys = phys;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
void XhciInitialiseTransferRing(XHCI_TRB* ring, PHYSICAL_ADDRESS ringPhys,
@@ -1471,9 +1471,9 @@ KSTATUS XhciBulkTransfer(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
uint32_t length,
uint32_t* outActual) {
if (!xhci || !dev || !ring || !enqueue || !cycle || !bufferPhys || length == 0)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (length > USB_STORAGE_MAX_BYTES)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
uint64_t trbPhys = 0;
KSTATUS st = XhciRingAppend(ring,
@@ -1511,36 +1511,36 @@ KSTATUS XhciBulkTransfer(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev,
endpointId,
target.Transfer.CompletionCode,
target.Transfer.Residue);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
if (outActual)
*outActual = length - target.Transfer.Residue;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the configure Pipe Endpoint operation.
KSTATUS XhciConfigurePipeEndpoint(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev, USB_PIPE* pipe) {
if (!xhci || !dev || !pipe || !pipe->Open)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
uint8_t dci = pipe->EndpointId;
if (dci < 2 || dci > 31)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (pipe->HcdPipeContext) {
XHCI_PIPE_CONTEXT* ctx = (XHCI_PIPE_CONTEXT*)pipe->HcdPipeContext;
return ctx->Configured ? STATUS_SUCCESS : STATUS_DEVICE_ERROR;
return ctx->Configured ? NTLSTATUS_SUCCESS : NTLSTATUS_DEVICE_ERROR;
}
XHCI_PIPE_CONTEXT* ctx = (XHCI_PIPE_CONTEXT*)MmAllocatePool(sizeof(XHCI_PIPE_CONTEXT));
if (!ctx) return STATUS_NO_MEMORY;
if (!ctx) return NTLSTATUS_NO_MEMORY;
memset(ctx, 0, sizeof(*ctx));
ctx->Ring = (XHCI_TRB*)UsbDmaAllocPages(xhci, 1, &ctx->RingPhys);
if (!ctx->Ring) {
MmFreePool(ctx);
return STATUS_NO_MEMORY;
return NTLSTATUS_NO_MEMORY;
}
ctx->Enqueue = 0;
ctx->Cycle = 1;
@@ -1575,7 +1575,7 @@ KSTATUS XhciConfigurePipeEndpoint(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev, USB_P
endpointType = XHCI_EP_TYPE_BULK_OUT;
} else {
MmFreePool(ctx);
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
}
ep[0] = (uint32_t)interval << 16;
@@ -1597,31 +1597,31 @@ KSTATUS XhciConfigurePipeEndpoint(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev, USB_P
DbgPrint("usb: Configure pipe endpoint failed slot=%u ep=%u type=%u st=0x%x cc=%u\n",
dev->SlotId, dci, pipe->Type, st, result.CompletionCode);
MmFreePool(ctx);
return KSUCCESS(st) ? STATUS_DEVICE_ERROR : st;
return KSUCCESS(st) ? NTLSTATUS_DEVICE_ERROR : st;
}
ctx->Configured = true;
pipe->HcdPipeContext = ctx;
dev->EndpointPipes[dci] = pipe;
UsbReferencePipe(pipe);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Implements the hcd Submit Interrupt Urb operation.
static KSTATUS XhciHcdSubmitInterruptUrb(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev, USB_URB* urb) {
if (!xhci || !dev || !urb || !urb->Pipe || !urb->BufferPhys || urb->Length == 0)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (urb->Pipe->Type != UsbPipeInterrupt || !(urb->Pipe->EndpointAddress & USB_ENDPOINT_DIR_IN))
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
KSTATUS st = XhciConfigurePipeEndpoint(xhci, dev, urb->Pipe);
if (!KSUCCESS(st)) return st;
XHCI_PIPE_CONTEXT* ctx = (XHCI_PIPE_CONTEXT*)urb->Pipe->HcdPipeContext;
if (!ctx || !ctx->Configured)
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
if (ctx->ActiveTransfer)
return STATUS_QUEUE_FULL;
return NTLSTATUS_QUEUE_FULL;
uint64_t trbPhys = 0;
st = XhciRingAppend(ctx->Ring,
@@ -1642,13 +1642,13 @@ static KSTATUS XhciHcdSubmitInterruptUrb(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev
ctx->ActiveUrb = urb;
urb->Pending = true;
urb->Cancelled = false;
urb->Status = STATUS_PENDING;
urb->Status = NTLSTATUS_PENDING;
urb->ActualLength = 0;
urb->HcdCompletionCode = 0;
XhciBarrier();
XhciWrite32(xhci->Doorbells, (uint32_t)dev->SlotId * 4u, ctx->EndpointId);
return STATUS_PENDING;
return NTLSTATUS_PENDING;
}
void XhciHandleAsyncTransferEvent(XHCI_CONTROLLER* xhci, uint64_t trbPhys,
@@ -1674,12 +1674,12 @@ void XhciHandleAsyncTransferEvent(XHCI_CONTROLLER* xhci, uint64_t trbPhys,
if (!urb)
return;
KSTATUS st = STATUS_SUCCESS;
KSTATUS st = NTLSTATUS_SUCCESS;
if (urb->Cancelled) {
st = STATUS_CANCELLED;
st = NTLSTATUS_CANCELLED;
} else if (completionCode != XHCI_CC_SUCCESS &&
completionCode != XHCI_CC_SHORT_PACKET) {
st = STATUS_DEVICE_ERROR;
st = NTLSTATUS_DEVICE_ERROR;
}
uint32_t actual = 0;
@@ -1705,7 +1705,7 @@ void XhciHandleAsyncTransferEvent(XHCI_CONTROLLER* xhci, uint64_t trbPhys,
// Implements the hcd Submit Bulk Urb operation.
static KSTATUS XhciHcdSubmitBulkUrb(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev, USB_URB* urb) {
if (!xhci || !dev || !urb || !urb->Pipe || !urb->BufferPhys || urb->Length == 0)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
uint8_t endpointId = urb->Pipe->EndpointId;
XHCI_TRB* ring = (XHCI_TRB*)0;
@@ -1724,7 +1724,7 @@ static KSTATUS XhciHcdSubmitBulkUrb(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev, USB
enqueue = &dev->MassOutEnqueue;
cycle = &dev->MassOutCycle;
} else {
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
}
uint32_t actual = 0;
@@ -1745,12 +1745,12 @@ static KSTATUS XhciHcdSubmitBulkUrb(XHCI_CONTROLLER* xhci, XHCI_DEVICE* dev, USB
// Implements the hcd Submit Urb operation.
static KSTATUS XhciHcdSubmitUrb(USB_HCD* hcd, USB_URB* urb) {
if (!hcd || !urb || !urb->Device)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
XHCI_CONTROLLER* xhci = (XHCI_CONTROLLER*)hcd->ControllerContext;
XHCI_DEVICE* dev = (XHCI_DEVICE*)urb->Device->HcdDeviceContext;
if (!xhci || !dev || !dev->Allocated)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
KSTATUS st;
switch (urb->Function) {
@@ -1762,7 +1762,7 @@ static KSTATUS XhciHcdSubmitUrb(USB_HCD* hcd, USB_URB* urb) {
st = XhciControlIn(xhci, dev, &urb->Setup, urb->Buffer, urb->BufferPhys, (uint16_t)urb->Length);
urb->ActualLength = KSUCCESS(st) ? urb->Length : 0;
} else {
st = STATUS_NOT_SUPPORTED;
st = NTLSTATUS_NOT_SUPPORTED;
urb->ActualLength = 0;
}
break;
@@ -1776,7 +1776,7 @@ static KSTATUS XhciHcdSubmitUrb(USB_HCD* hcd, USB_URB* urb) {
break;
default:
st = STATUS_NOT_SUPPORTED;
st = NTLSTATUS_NOT_SUPPORTED;
urb->ActualLength = 0;
break;
}
@@ -1788,11 +1788,11 @@ static KSTATUS XhciHcdSubmitUrb(USB_HCD* hcd, USB_URB* urb) {
// Implements the hcd Cancel Urb operation.
static KSTATUS XhciHcdCancelUrb(USB_HCD* hcd, USB_URB* urb) {
(void)hcd;
if (!urb) return STATUS_INVALID_PARAMETER;
if (!urb) return NTLSTATUS_INVALID_PARAMETER;
urb->Cancelled = true;
if (!urb->Pending)
urb->Status = STATUS_CANCELLED;
return STATUS_SUCCESS;
urb->Status = NTLSTATUS_CANCELLED;
return NTLSTATUS_SUCCESS;
}
// Implements the hcd Allocate Dma operation.
@@ -1803,15 +1803,15 @@ static void* XhciHcdAllocateDma(USB_HCD* hcd, size_t pages, PHYSICAL_ADDRESS* ou
// Implements the hcd Reset Root Port operation.
static KSTATUS XhciHcdResetRootPort(USB_HCD* hcd, uint8_t port, uint8_t* outSpeed) {
if (!hcd) return STATUS_INVALID_PARAMETER;
if (!hcd) return NTLSTATUS_INVALID_PARAMETER;
return XhciResetPort((XHCI_CONTROLLER*)hcd->ControllerContext, port, outSpeed);
}
// Implements the hcd Clear Root Port Changes operation.
static KSTATUS XhciHcdClearRootPortChanges(USB_HCD* hcd, uint8_t port) {
if (!hcd) return STATUS_INVALID_PARAMETER;
if (!hcd) return NTLSTATUS_INVALID_PARAMETER;
XhciClearPortChanges((XHCI_CONTROLLER*)hcd->ControllerContext, port);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
const USB_HCD_OPERATIONS gXhciHcdOperations = {
@@ -1825,9 +1825,9 @@ const USB_HCD_OPERATIONS gXhciHcdOperations = {
// Starts controller.
KSTATUS XhciStartController(XHCI_CONTROLLER* xhci) {
if (!xhci || xhci->Magic != XHCI_CONTROLLER_MAGIC || !xhci->Pdo || !xhci->Fdo)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
if (xhci->Running)
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
KSTATUS st = PciGetDeviceInfo(xhci->Pdo, &xhci->PciInfo);
if (!KSUCCESS(st)) {
@@ -1848,7 +1848,7 @@ KSTATUS XhciStartController(XHCI_CONTROLLER* xhci) {
if (xhci->MmioBar.Type != PciBarMemory32 && xhci->MmioBar.Type != PciBarMemory64) {
DbgPrint("usb: xHCI PCI %02x:%02x.%x BAR0 is not MMIO type=%u\n",
xhci->Bus, xhci->Dev, xhci->Fn, xhci->MmioBar.Type);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
xhci->Irq = 0xFFu;
@@ -1914,7 +1914,7 @@ KSTATUS XhciStartController(XHCI_CONTROLLER* xhci) {
xhci->MaxSlots == 0 || xhci->MaxPorts == 0) {
DbgPrint("usb: xHCI invalid caps caplen=%u dboff=0x%x rtsoff=0x%x hcs1=%08x\n",
xhci->CapLength, xhci->DbOff, xhci->RtsOff, xhci->Hcs1);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
uint32_t portEnd = xhci->CapLength + XHCI_OP_PORT_BASE +
@@ -1926,7 +1926,7 @@ KSTATUS XhciStartController(XHCI_CONTROLLER* xhci) {
if (xhci->MmioBytes < needBytes) {
DbgPrint("usb: xHCI BAR0 too small length=0x%x need=0x%x dboff=0x%x rtsoff=0x%x ports=%u\n",
xhci->MmioBytes, needBytes, xhci->DbOff, xhci->RtsOff, xhci->MaxPorts);
return STATUS_DEVICE_ERROR;
return NTLSTATUS_DEVICE_ERROR;
}
xhci->Op = xhci->Mmio + xhci->CapLength;
@@ -1957,7 +1957,7 @@ KSTATUS XhciStartController(XHCI_CONTROLLER* xhci) {
uint32_t pageSize = XhciRead32(xhci->Op, XHCI_OP_PAGESIZE);
if ((pageSize & 1u) == 0) {
DbgPrint("usb: xHCI does not advertise 4K pages pagesize=%08x\n", pageSize);
return STATUS_NOT_SUPPORTED;
return NTLSTATUS_NOT_SUPPORTED;
}
st = XhciAllocateRuntimeMemory(xhci);
@@ -1976,7 +1976,7 @@ KSTATUS XhciStartController(XHCI_CONTROLLER* xhci) {
XhciLogPortStatus(xhci);
st = UsbCreateRootHubPdo(&xhci->Hcd);
if (!KSUCCESS(st) && st != STATUS_ALREADY_EXISTS) {
if (!KSUCCESS(st) && st != NTLSTATUS_ALREADY_EXISTS) {
DbgPrint("usb: root hub PDO creation failed st=0x%x\n", st);
return st;
}
@@ -2008,20 +2008,20 @@ KSTATUS XhciStartController(XHCI_CONTROLLER* xhci) {
DbgPrint("usb: xHCI host controller initialised; HID boot input active=%u mass-storage will arrive through hotplug\n",
xhci->HidDeviceCount);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}
// Dispatches pnp.
KSTATUS XhciDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
if (!device || !irp || !device->DeviceExtension)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
XHCI_CONTROLLER* xhci = (XHCI_CONTROLLER*)device->DeviceExtension;
if (xhci->Magic != XHCI_CONTROLLER_MAGIC)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
IO_STACK_LOCATION* ios = IoGetCurrentIrpStackLocation(irp);
if (!ios) return STATUS_INVALID_PARAMETER;
if (!ios) return NTLSTATUS_INVALID_PARAMETER;
switch ((IO_PNP_MINOR_FUNCTION)ios->MinorFunction) {
case IRP_MN_START_DEVICE:
@@ -2029,11 +2029,11 @@ KSTATUS XhciDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
case IRP_MN_QUERY_REMOVE_DEVICE:
device->PnpState = DevicePnpRemovePending;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
case IRP_MN_CANCEL_REMOVE_DEVICE:
device->PnpState = xhci->Running ? DevicePnpStarted : DevicePnpNotStarted;
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
case IRP_MN_SURPRISE_REMOVAL:
device->PnpState = DevicePnpSurpriseRemoved;
@@ -2045,7 +2045,7 @@ KSTATUS XhciDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
}
if (xhci->Hcd.RootHubPdo)
(void)UsbRemovePdoSubtree(xhci->Hcd.RootHubPdo, true);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
case IRP_MN_REMOVE_DEVICE:
device->PnpState = DevicePnpDeleted;
@@ -2055,7 +2055,7 @@ KSTATUS XhciDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
(void)UsbRemovePdoSubtree(xhci->Hcd.RootHubPdo, true);
IoDetachDevice(device);
IoDeleteDevice(device);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
default:
return IoForwardIrpToLower(device, irp);
@@ -2065,7 +2065,7 @@ KSTATUS XhciDispatchPnp(DEVICE_OBJECT* device, IRP* irp) {
// Implements the add Device operation.
KSTATUS XhciAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject) {
if (!driver || !physicalDeviceObject || physicalDeviceObject->Type != DeviceObjectPhysical)
return STATUS_INVALID_PARAMETER;
return NTLSTATUS_INVALID_PARAMETER;
DEVICE_OBJECT* fdo = (DEVICE_OBJECT*)0;
KSTATUS st = IoCreateDevice(driver, sizeof(XHCI_CONTROLLER), &fdo);
@@ -2085,9 +2085,9 @@ KSTATUS XhciAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject
xhci->LowerDevice = IoAttachDeviceToDeviceStack(fdo, physicalDeviceObject);
if (!xhci->LowerDevice) {
IoDeleteDevice(fdo);
return STATUS_FAILURE;
return NTLSTATUS_FAILURE;
}
DbgPrint("usb: xHCI FDO attached to %v\n", physicalDeviceObject->Name);
return STATUS_SUCCESS;
return NTLSTATUS_SUCCESS;
}