Author: tfaber
Date: Sat Sep 2 22:48:45 2017
New Revision: 75745
URL:
http://svn.reactos.org/svn/reactos?rev=75745&view=rev
Log:
[USBPORT]
Patch by Vadim Galyant:
- Move isochronous transfer functions to their own file
- Fix return type of PUSBPORT_COMPLETE_TRANSFER
- Improve some debug prints
Added:
trunk/reactos/drivers/usb/usbport/iso.c
- copied, changed from r75735, trunk/reactos/drivers/usb/usbport/usbport.c
Modified:
trunk/reactos/drivers/usb/usbport/CMakeLists.txt
trunk/reactos/drivers/usb/usbport/queue.c
trunk/reactos/drivers/usb/usbport/usbport.c
trunk/reactos/drivers/usb/usbport/usbport.h
trunk/reactos/sdk/include/reactos/drivers/usbport/usbmport.h
Modified: trunk/reactos/drivers/usb/usbport/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbport/CMakeL…
==============================================================================
--- trunk/reactos/drivers/usb/usbport/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbport/CMakeLists.txt [iso-8859-1] Sat Sep 2 22:48:45
2017
@@ -7,6 +7,7 @@
endpoint.c
iface.c
ioctl.c
+ iso.c
pnp.c
power.c
queue.c
Copied: trunk/reactos/drivers/usb/usbport/iso.c (from r75735,
trunk/reactos/drivers/usb/usbport/usbport.c)
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbport/iso.c?…
==============================================================================
--- trunk/reactos/drivers/usb/usbport/usbport.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbport/iso.c [iso-8859-1] Sat Sep 2 22:48:45 2017
@@ -3,1973 +3,14 @@
#define NDEBUG
#include <debug.h>
-#define NDEBUG_USBPORT_CORE
-#define NDEBUG_USBPORT_INTERRUPT
-#define NDEBUG_USBPORT_TIMER
-#include "usbdebug.h"
-
-LIST_ENTRY USBPORT_MiniPortDrivers = {NULL, NULL};
-LIST_ENTRY USBPORT_USB1FdoList = {NULL, NULL};
-LIST_ENTRY USBPORT_USB2FdoList = {NULL, NULL};
-
-KSPIN_LOCK USBPORT_SpinLock;
-BOOLEAN USBPORT_Initialized = FALSE;
-
-PDEVICE_OBJECT
+USBD_STATUS
NTAPI
-USBPORT_FindUSB2Controller(IN PDEVICE_OBJECT FdoDevice)
+USBPORT_InitializeIsoTransfer(PDEVICE_OBJECT FdoDevice,
+ struct _URB_ISOCH_TRANSFER * Urb,
+ PUSBPORT_TRANSFER Transfer)
{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_DEVICE_EXTENSION USB2FdoExtension;
- KIRQL OldIrql;
- PLIST_ENTRY USB2FdoEntry;
- PDEVICE_OBJECT USB2FdoDevice = NULL;
-
- DPRINT("USBPORT_FindUSB2Controller: FdoDevice - %p\n", FdoDevice);
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- KeAcquireSpinLock(&USBPORT_SpinLock, &OldIrql);
-
- USB2FdoEntry = USBPORT_USB2FdoList.Flink;
-
- while (USB2FdoEntry && USB2FdoEntry != &USBPORT_USB2FdoList)
- {
- USB2FdoExtension = CONTAINING_RECORD(USB2FdoEntry,
- USBPORT_DEVICE_EXTENSION,
- ControllerLink);
-
- if (USB2FdoExtension->BusNumber == FdoExtension->BusNumber &&
- USB2FdoExtension->PciDeviceNumber == FdoExtension->PciDeviceNumber)
- {
- USB2FdoDevice = USB2FdoExtension->CommonExtension.SelfDevice;
- break;
- }
-
- USB2FdoEntry = USB2FdoEntry->Flink;
- }
-
- KeReleaseSpinLock(&USBPORT_SpinLock, OldIrql);
-
- return USB2FdoDevice;
-}
-
-VOID
-NTAPI
-USBPORT_AddUSB1Fdo(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
-
- DPRINT("USBPORT_AddUSB1Fdo: FdoDevice - %p\n", FdoDevice);
-
- FdoExtension = FdoDevice->DeviceExtension;
- FdoExtension->Flags |= USBPORT_FLAG_REGISTERED_FDO;
-
- ExInterlockedInsertTailList(&USBPORT_USB1FdoList,
- &FdoExtension->ControllerLink,
- &USBPORT_SpinLock);
-}
-
-VOID
-NTAPI
-USBPORT_AddUSB2Fdo(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
-
- DPRINT("USBPORT_AddUSB2Fdo: FdoDevice - %p\n", FdoDevice);
-
- FdoExtension = FdoDevice->DeviceExtension;
- FdoExtension->Flags |= USBPORT_FLAG_REGISTERED_FDO;
-
- ExInterlockedInsertTailList(&USBPORT_USB2FdoList,
- &FdoExtension->ControllerLink,
- &USBPORT_SpinLock);
-}
-
-VOID
-NTAPI
-USBPORT_RemoveUSBxFdo(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- KIRQL OldIrql;
-
- DPRINT("USBPORT_RemoveUSBxFdo: FdoDevice - %p\n", FdoDevice);
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- KeAcquireSpinLock(&USBPORT_SpinLock, &OldIrql);
- RemoveEntryList(&FdoExtension->ControllerLink);
- KeReleaseSpinLock(&USBPORT_SpinLock, OldIrql);
-
- FdoExtension->Flags &= ~USBPORT_FLAG_REGISTERED_FDO;
-
- FdoExtension->ControllerLink.Flink = NULL;
- FdoExtension->ControllerLink.Blink = NULL;
-}
-
-BOOLEAN
-NTAPI
-USBPORT_IsCompanionFdoExtension(IN PDEVICE_OBJECT USB2FdoDevice,
- IN PUSBPORT_DEVICE_EXTENSION USB1FdoExtension)
-{
- PUSBPORT_DEVICE_EXTENSION USB2FdoExtension;
-
- DPRINT("USBPORT_IsCompanionFdoExtension: USB2Fdo - %p, USB1FdoExtension -
%p\n",
- USB2FdoDevice,
- USB1FdoExtension);
-
- USB2FdoExtension = USB2FdoDevice->DeviceExtension;
-
- return USB2FdoExtension->BusNumber == USB1FdoExtension->BusNumber &&
- USB2FdoExtension->PciDeviceNumber == USB1FdoExtension->PciDeviceNumber;
-}
-
-PDEVICE_RELATIONS
-NTAPI
-USBPORT_FindCompanionControllers(IN PDEVICE_OBJECT USB2FdoDevice,
- IN BOOLEAN IsObRefer,
- IN BOOLEAN IsFDOsReturned)
-{
- PLIST_ENTRY USB1FdoList;
- PUSBPORT_DEVICE_EXTENSION USB1FdoExtension;
- ULONG NumControllers = 0;
- PDEVICE_OBJECT * Entry;
- PDEVICE_RELATIONS ControllersList = NULL;
- KIRQL OldIrql;
-
- DPRINT("USBPORT_FindCompanionControllers: USB2Fdo - %p, IsObRefer - %x, IsFDOs -
%x\n",
- USB2FdoDevice,
- IsObRefer,
- IsFDOsReturned);
-
- KeAcquireSpinLock(&USBPORT_SpinLock, &OldIrql);
-
- USB1FdoList = USBPORT_USB1FdoList.Flink;
-
- while (USB1FdoList && USB1FdoList != &USBPORT_USB1FdoList)
- {
- USB1FdoExtension = CONTAINING_RECORD(USB1FdoList,
- USBPORT_DEVICE_EXTENSION,
- ControllerLink);
-
- if (USB1FdoExtension->Flags & USBPORT_FLAG_COMPANION_HC &&
- USBPORT_IsCompanionFdoExtension(USB2FdoDevice, USB1FdoExtension))
- {
- ++NumControllers;
- }
-
- USB1FdoList = USB1FdoExtension->ControllerLink.Flink;
- }
-
- DPRINT("USBPORT_FindCompanionControllers: NumControllers - %x\n",
- NumControllers);
-
- if (!NumControllers)
- {
- goto Exit;
- }
-
- ControllersList = ExAllocatePoolWithTag(NonPagedPool,
- NumControllers * sizeof(DEVICE_RELATIONS),
- USB_PORT_TAG);
-
- if (!ControllersList)
- {
- goto Exit;
- }
-
- RtlZeroMemory(ControllersList, NumControllers * sizeof(DEVICE_RELATIONS));
-
- ControllersList->Count = NumControllers;
-
- USB1FdoList = USBPORT_USB1FdoList.Flink;
-
- Entry = &ControllersList->Objects[0];
-
- while (USB1FdoList && USB1FdoList != &USBPORT_USB1FdoList)
- {
- USB1FdoExtension = CONTAINING_RECORD(USB1FdoList,
- USBPORT_DEVICE_EXTENSION,
- ControllerLink);
-
- if (USB1FdoExtension->Flags & USBPORT_FLAG_COMPANION_HC &&
- USBPORT_IsCompanionFdoExtension(USB2FdoDevice, USB1FdoExtension))
- {
- *Entry = USB1FdoExtension->CommonExtension.LowerPdoDevice;
-
- if (IsObRefer)
- {
- ObReferenceObject(USB1FdoExtension->CommonExtension.LowerPdoDevice);
- }
-
- if (IsFDOsReturned)
- {
- *Entry = USB1FdoExtension->CommonExtension.SelfDevice;
- }
-
- ++Entry;
- }
-
- USB1FdoList = USB1FdoExtension->ControllerLink.Flink;
- }
-
-Exit:
-
- KeReleaseSpinLock(&USBPORT_SpinLock, OldIrql);
-
- return ControllersList;
-}
-
-MPSTATUS
-NTAPI
-USBPORT_NtStatusToMpStatus(NTSTATUS NtStatus)
-{
- DPRINT("USBPORT_NtStatusToMpStatus: NtStatus - %x\n", NtStatus);
-
- if (NtStatus == STATUS_SUCCESS)
- {
- return MP_STATUS_SUCCESS;
- }
- else
- {
- return MP_STATUS_UNSUCCESSFUL;
- }
-}
-
-NTSTATUS
-NTAPI
-USBPORT_SetRegistryKeyValue(IN PDEVICE_OBJECT DeviceObject,
- IN BOOL UseDriverKey,
- IN ULONG Type,
- IN PCWSTR ValueNameString,
- IN PVOID Data,
- IN ULONG DataSize)
-{
- UNICODE_STRING ValueName;
- HANDLE KeyHandle;
- NTSTATUS Status;
-
- DPRINT("USBPORT_SetRegistryKeyValue: ValueNameString - %S \n",
- ValueNameString);
-
- if (UseDriverKey)
- {
- Status = IoOpenDeviceRegistryKey(DeviceObject,
- PLUGPLAY_REGKEY_DRIVER,
- STANDARD_RIGHTS_ALL,
- &KeyHandle);
- }
- else
- {
- Status = IoOpenDeviceRegistryKey(DeviceObject,
- PLUGPLAY_REGKEY_DEVICE,
- STANDARD_RIGHTS_ALL,
- &KeyHandle);
- }
-
- if (NT_SUCCESS(Status))
- {
- RtlInitUnicodeString(&ValueName, ValueNameString);
-
- Status = ZwSetValueKey(KeyHandle,
- &ValueName,
- 0,
- Type,
- Data,
- DataSize);
-
- ZwClose(KeyHandle);
- }
-
- return Status;
-}
-
-NTSTATUS
-NTAPI
-USBPORT_GetRegistryKeyValueFullInfo(IN PDEVICE_OBJECT FdoDevice,
- IN PDEVICE_OBJECT PdoDevice,
- IN BOOL UseDriverKey,
- IN PCWSTR SourceString,
- IN ULONG LengthStr,
- IN PVOID Buffer,
- IN ULONG BufferLength)
-{
- NTSTATUS Status;
- PKEY_VALUE_FULL_INFORMATION KeyValue;
- UNICODE_STRING ValueName;
- HANDLE KeyHandle;
- ULONG LengthKey;
-
- DPRINT("USBPORT_GetRegistryKeyValue: UseDriverKey - %x, SourceString - %S,
LengthStr - %x, Buffer - %p, BufferLength - %x\n",
- UseDriverKey,
- SourceString,
- LengthStr,
- Buffer,
- BufferLength);
-
- if (UseDriverKey)
- {
- Status = IoOpenDeviceRegistryKey(PdoDevice,
- PLUGPLAY_REGKEY_DRIVER,
- STANDARD_RIGHTS_ALL,
- &KeyHandle);
- }
- else
- {
- Status = IoOpenDeviceRegistryKey(PdoDevice,
- PLUGPLAY_REGKEY_DEVICE,
- STANDARD_RIGHTS_ALL,
- &KeyHandle);
- }
-
- if (NT_SUCCESS(Status))
- {
- RtlInitUnicodeString(&ValueName, SourceString);
-
- LengthKey = sizeof(KEY_VALUE_FULL_INFORMATION) +
- LengthStr +
- BufferLength;
-
- KeyValue = ExAllocatePoolWithTag(PagedPool,
- LengthKey,
- USB_PORT_TAG);
-
- if (KeyValue)
- {
- RtlZeroMemory(KeyValue, LengthKey);
-
- Status = ZwQueryValueKey(KeyHandle,
- &ValueName,
- KeyValueFullInformation,
- KeyValue,
- LengthKey,
- &LengthKey);
-
- if (NT_SUCCESS(Status))
- {
- RtlCopyMemory(Buffer,
- (PUCHAR)KeyValue + KeyValue->DataOffset,
- BufferLength);
- }
-
- ExFreePoolWithTag(KeyValue, USB_PORT_TAG);
- }
-
- ZwClose(KeyHandle);
- }
-
- return Status;
-}
-
-MPSTATUS
-NTAPI
-USBPORT_GetMiniportRegistryKeyValue(IN PVOID MiniPortExtension,
- IN BOOL UseDriverKey,
- IN PCWSTR SourceString,
- IN SIZE_T LengthStr,
- IN PVOID Buffer,
- IN SIZE_T BufferLength)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDEVICE_OBJECT FdoDevice;
- NTSTATUS Status;
-
- DPRINT("USBPORT_GetMiniportRegistryKeyValue: MiniPortExtension - %p,
UseDriverKey - %x, SourceString - %S, LengthStr - %x, Buffer - %p, BufferLength -
%x\n",
- MiniPortExtension,
- UseDriverKey,
- SourceString,
- LengthStr,
- Buffer,
- BufferLength);
-
- FdoExtension = (PUSBPORT_DEVICE_EXTENSION)((ULONG_PTR)MiniPortExtension -
- sizeof(USBPORT_DEVICE_EXTENSION));
-
- FdoDevice = FdoExtension->CommonExtension.SelfDevice;
-
- Status = USBPORT_GetRegistryKeyValueFullInfo(FdoDevice,
-
FdoExtension->CommonExtension.LowerPdoDevice,
- UseDriverKey,
- SourceString,
- LengthStr,
- Buffer,
- BufferLength);
-
- return USBPORT_NtStatusToMpStatus(Status);
-}
-
-NTSTATUS
-NTAPI
-USBPORT_GetSetConfigSpaceData(IN PDEVICE_OBJECT FdoDevice,
- IN BOOLEAN IsReadData,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- ULONG BytesReadWrite;
-
- DPRINT("USBPORT_GetSetConfigSpaceData ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- BytesReadWrite = Length;
-
- if (IsReadData)
- {
- RtlZeroMemory(Buffer, Length);
-
- BytesReadWrite = (*FdoExtension->BusInterface.GetBusData)
- (FdoExtension->BusInterface.Context,
- PCI_WHICHSPACE_CONFIG,
- Buffer,
- Offset,
- Length);
- }
- else
- {
- BytesReadWrite = (*FdoExtension->BusInterface.SetBusData)
- (FdoExtension->BusInterface.Context,
- PCI_WHICHSPACE_CONFIG,
- Buffer,
- Offset,
- Length);
- }
-
- if (BytesReadWrite == Length)
- {
- return STATUS_SUCCESS;
- }
-
- return STATUS_UNSUCCESSFUL;
-}
-
-MPSTATUS
-NTAPI
-USBPORT_ReadWriteConfigSpace(IN PVOID MiniPortExtension,
- IN BOOLEAN IsReadData,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length)
-{
- NTSTATUS Status;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDEVICE_OBJECT FdoDevice;
-
- DPRINT("USBPORT_ReadWriteConfigSpace: ... \n");
-
- //FdoExtension->MiniPortExt = (PVOID)((ULONG_PTR)FdoExtension +
sizeof(USBPORT_DEVICE_EXTENSION));
- FdoExtension = (PUSBPORT_DEVICE_EXTENSION)((ULONG_PTR)MiniPortExtension -
- sizeof(USBPORT_DEVICE_EXTENSION));
-
- FdoDevice = FdoExtension->CommonExtension.SelfDevice;
-
- Status = USBPORT_GetSetConfigSpaceData(FdoDevice,
- IsReadData,
- Buffer,
- Offset,
- Length);
-
- return USBPORT_NtStatusToMpStatus(Status);
-}
-
-NTSTATUS
-NTAPI
-USBPORT_USBDStatusToNtStatus(IN PURB Urb,
- IN USBD_STATUS USBDStatus)
-{
- NTSTATUS Status;
-
- if (USBD_ERROR(USBDStatus))
- {
- DPRINT1("USBPORT_USBDStatusToNtStatus: Urb - %p, USBDStatus - %x\n",
- Urb,
- USBDStatus);
- }
-
- if (Urb)
- Urb->UrbHeader.Status = USBDStatus;
-
- switch (USBDStatus)
- {
- case USBD_STATUS_SUCCESS:
- Status = STATUS_SUCCESS;
- break;
-
- case USBD_STATUS_INSUFFICIENT_RESOURCES:
- Status = STATUS_INSUFFICIENT_RESOURCES;
- break;
-
- case USBD_STATUS_DEVICE_GONE:
- Status = STATUS_DEVICE_NOT_CONNECTED;
- break;
-
- case USBD_STATUS_CANCELED:
- Status = STATUS_CANCELLED;
- break;
-
- case USBD_STATUS_NOT_SUPPORTED:
- Status = STATUS_NOT_SUPPORTED;
- break;
-
- case USBD_STATUS_INVALID_URB_FUNCTION:
- case USBD_STATUS_INVALID_PARAMETER:
- case USBD_STATUS_INVALID_PIPE_HANDLE:
- case USBD_STATUS_BAD_START_FRAME:
- Status = STATUS_INVALID_PARAMETER;
- break;
-
- default:
- if (USBD_ERROR(USBDStatus))
- Status = STATUS_UNSUCCESSFUL;
- else
- Status = STATUS_SUCCESS;
-
- break;
- }
-
- return Status;
-}
-
-NTSTATUS
-NTAPI
-USBPORT_Wait(IN PVOID MiniPortExtension,
- IN ULONG Milliseconds)
-{
- LARGE_INTEGER Interval = {{0, 0}};
-
- DPRINT("USBPORT_Wait: Milliseconds - %x\n", Milliseconds);
- Interval.QuadPart -= 10000 * Milliseconds + (KeQueryTimeIncrement() - 1);
- return KeDelayExecutionThread(KernelMode, FALSE, &Interval);
-}
-
-VOID
-NTAPI
-USBPORT_MiniportInterrupts(IN PDEVICE_OBJECT FdoDevice,
- IN BOOLEAN IsEnable)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_REGISTRATION_PACKET Packet;
- BOOLEAN IsLock;
- KIRQL OldIrql;
-
- DPRINT_INT("USBPORT_MiniportInterrupts: IsEnable - %p\n", IsEnable);
-
- FdoExtension = FdoDevice->DeviceExtension;
- Packet = &FdoExtension->MiniPortInterface->Packet;
-
- IsLock = (Packet->MiniPortFlags & USB_MINIPORT_FLAGS_NOT_LOCK_INT) == 0;
-
- if (IsLock)
- KeAcquireSpinLock(&FdoExtension->MiniportSpinLock, &OldIrql);
-
- if (IsEnable)
- {
- FdoExtension->Flags |= USBPORT_FLAG_INTERRUPT_ENABLED;
- Packet->EnableInterrupts(FdoExtension->MiniPortExt);
- }
- else
- {
- Packet->DisableInterrupts(FdoExtension->MiniPortExt);
- FdoExtension->Flags &= ~USBPORT_FLAG_INTERRUPT_ENABLED;
- }
-
- if (IsLock)
- KeReleaseSpinLock(&FdoExtension->MiniportSpinLock, OldIrql);
-}
-
-VOID
-NTAPI
-USBPORT_SoftInterruptDpc(IN PRKDPC Dpc,
- IN PVOID DeferredContext,
- IN PVOID SystemArgument1,
- IN PVOID SystemArgument2)
-{
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
-
- DPRINT("USBPORT_SoftInterruptDpc: ... \n");
-
- FdoDevice = DeferredContext;
- FdoExtension = FdoDevice->DeviceExtension;
-
- if (!KeInsertQueueDpc(&FdoExtension->IsrDpc, NULL, (PVOID)1))
- {
- InterlockedDecrement(&FdoExtension->IsrDpcCounter);
- }
-}
-
-VOID
-NTAPI
-USBPORT_SoftInterrupt(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- LARGE_INTEGER DueTime = {{0, 0}};
-
- DPRINT("USBPORT_SoftInterrupt: ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- KeInitializeTimer(&FdoExtension->TimerSoftInterrupt);
-
- KeInitializeDpc(&FdoExtension->SoftInterruptDpc,
- USBPORT_SoftInterruptDpc,
- FdoDevice);
-
- DueTime.QuadPart -= 10000 + (KeQueryTimeIncrement() - 1);
-
- KeSetTimer(&FdoExtension->TimerSoftInterrupt,
- DueTime,
- &FdoExtension->SoftInterruptDpc);
-}
-
-VOID
-NTAPI
-USBPORT_InvalidateControllerHandler(IN PDEVICE_OBJECT FdoDevice,
- IN ULONG Type)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
-
- DPRINT("USBPORT_InvalidateControllerHandler: Invalidate Type - %x\n",
- Type);
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- switch (Type)
- {
- case USBPORT_INVALIDATE_CONTROLLER_RESET:
- DPRINT1("USBPORT_InvalidateControllerHandler:
INVALIDATE_CONTROLLER_RESET UNIMPLEMENTED. FIXME. \n");
- break;
-
- case USBPORT_INVALIDATE_CONTROLLER_SURPRISE_REMOVE:
- DPRINT1("USBPORT_InvalidateControllerHandler:
INVALIDATE_CONTROLLER_SURPRISE_REMOVE UNIMPLEMENTED. FIXME. \n");
- break;
-
- case USBPORT_INVALIDATE_CONTROLLER_SOFT_INTERRUPT:
- if (InterlockedIncrement(&FdoExtension->IsrDpcCounter))
- {
- InterlockedDecrement(&FdoExtension->IsrDpcCounter);
- }
- else
- {
- USBPORT_SoftInterrupt(FdoDevice);
- }
- break;
- }
-}
-
-ULONG
-NTAPI
-USBPORT_InvalidateController(IN PVOID MiniPortExtension,
- IN ULONG Type)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDEVICE_OBJECT FdoDevice;
-
- DPRINT("USBPORT_InvalidateController: Invalidate Type - %x\n", Type);
-
- //FdoExtension->MiniPortExt = (PVOID)((ULONG_PTR)FdoExtension +
sizeof(USBPORT_DEVICE_EXTENSION));
- FdoExtension = (PUSBPORT_DEVICE_EXTENSION)((ULONG_PTR)MiniPortExtension -
- sizeof(USBPORT_DEVICE_EXTENSION));
- FdoDevice = FdoExtension->CommonExtension.SelfDevice;
-
- USBPORT_InvalidateControllerHandler(FdoDevice, Type);
-
- return 0;
-}
-
-ULONG
-NTAPI
-USBPORT_NotifyDoubleBuffer(IN PVOID MiniPortExtension,
- IN PVOID MiniPortTransfer,
- IN PVOID Buffer,
- IN SIZE_T Length)
-{
- DPRINT1("USBPORT_NotifyDoubleBuffer: UNIMPLEMENTED. FIXME. \n");
- return 0;
-}
-
-VOID
-NTAPI
-USBPORT_WorkerRequestDpc(IN PRKDPC Dpc,
- IN PVOID DeferredContext,
- IN PVOID SystemArgument1,
- IN PVOID SystemArgument2)
-{
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
-
- DPRINT("USBPORT_WorkerRequestDpc: ... \n");
-
- FdoDevice = DeferredContext;
- FdoExtension = FdoDevice->DeviceExtension;
-
- if (!InterlockedIncrement(&FdoExtension->IsrDpcHandlerCounter))
- {
- USBPORT_DpcHandler(FdoDevice);
- }
-
- InterlockedDecrement(&FdoExtension->IsrDpcHandlerCounter);
-}
-
-VOID
-NTAPI
-USBPORT_DoneTransfer(IN PUSBPORT_TRANSFER Transfer)
-{
- PUSBPORT_ENDPOINT Endpoint;
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PURB Urb;
- PIRP Irp;
- KIRQL CancelIrql;
- KIRQL OldIrql;
-
- DPRINT_CORE("USBPORT_DoneTransfer: Transfer - %p\n", Transfer);
-
- Endpoint = Transfer->Endpoint;
- FdoDevice = Endpoint->FdoDevice;
- FdoExtension = FdoDevice->DeviceExtension;
-
- Urb = Transfer->Urb;
- Irp = Transfer->Irp;
-
- KeAcquireSpinLock(&FdoExtension->FlushTransferSpinLock, &OldIrql);
-
- if (Irp)
- {
- IoAcquireCancelSpinLock(&CancelIrql);
- IoSetCancelRoutine(Irp, NULL);
- IoReleaseCancelSpinLock(CancelIrql);
-
- USBPORT_RemoveActiveTransferIrp(FdoDevice, Irp);
- }
-
- KeReleaseSpinLock(&FdoExtension->FlushTransferSpinLock, OldIrql);
-
- USBPORT_USBDStatusToNtStatus(Transfer->Urb, Transfer->USBDStatus);
- USBPORT_CompleteTransfer(Urb, Urb->UrbHeader.Status);
-
- DPRINT_CORE("USBPORT_DoneTransfer: exit\n");
-}
-
-VOID
-NTAPI
-USBPORT_FlushDoneTransfers(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PLIST_ENTRY DoneTransferList;
- PUSBPORT_TRANSFER Transfer;
- PUSBPORT_ENDPOINT Endpoint;
- ULONG TransferCount;
- KIRQL OldIrql;
- BOOLEAN IsHasTransfers;
-
- DPRINT_CORE("USBPORT_FlushDoneTransfers: ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
- DoneTransferList = &FdoExtension->DoneTransferList;
-
- while (TRUE)
- {
- KeAcquireSpinLock(&FdoExtension->DoneTransferSpinLock, &OldIrql);
-
- if (IsListEmpty(DoneTransferList))
- break;
-
- Transfer = CONTAINING_RECORD(DoneTransferList->Flink,
- USBPORT_TRANSFER,
- TransferLink);
-
- RemoveHeadList(DoneTransferList);
- KeReleaseSpinLock(&FdoExtension->DoneTransferSpinLock, OldIrql);
-
- if (Transfer)
- {
- Endpoint = Transfer->Endpoint;
-
- if ((Transfer->Flags & TRANSFER_FLAG_SPLITED))
- {
- ASSERT(FALSE);// USBPORT_DoneSplitTransfer(Transfer);
- }
- else
- {
- USBPORT_DoneTransfer(Transfer);
- }
-
- IsHasTransfers = USBPORT_EndpointHasQueuedTransfers(FdoDevice,
- Endpoint,
- &TransferCount);
-
- if (IsHasTransfers && !TransferCount)
- {
- USBPORT_InvalidateEndpointHandler(FdoDevice,
- Endpoint,
- INVALIDATE_ENDPOINT_WORKER_DPC);
- }
- }
- }
-
- KeReleaseSpinLock(&FdoExtension->DoneTransferSpinLock, OldIrql);
-}
-
-
-VOID
-NTAPI
-USBPORT_TransferFlushDpc(IN PRKDPC Dpc,
- IN PVOID DeferredContext,
- IN PVOID SystemArgument1,
- IN PVOID SystemArgument2)
-{
- PDEVICE_OBJECT FdoDevice;
-
- DPRINT_CORE("USBPORT_TransferFlushDpc: ... \n");
- FdoDevice = DeferredContext;
- USBPORT_FlushDoneTransfers(FdoDevice);
-}
-
-BOOLEAN
-NTAPI
-USBPORT_QueueDoneTransfer(IN PUSBPORT_TRANSFER Transfer,
- IN USBD_STATUS USBDStatus)
-{
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
-
- DPRINT_CORE("USBPORT_QueueDoneTransfer: Transfer - %p, USBDStatus - %p\n",
- Transfer,
- USBDStatus);
-
- FdoDevice = Transfer->Endpoint->FdoDevice;
- FdoExtension = FdoDevice->DeviceExtension;
-
- RemoveEntryList(&Transfer->TransferLink);
- Transfer->USBDStatus = USBDStatus;
-
- ExInterlockedInsertTailList(&FdoExtension->DoneTransferList,
- &Transfer->TransferLink,
- &FdoExtension->DoneTransferSpinLock);
-
- return KeInsertQueueDpc(&FdoExtension->TransferFlushDpc, NULL, NULL);
-}
-
-VOID
-NTAPI
-USBPORT_DpcHandler(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_ENDPOINT Endpoint;
- PLIST_ENTRY Entry;
- LIST_ENTRY List;
- LONG LockCounter;
-
- DPRINT("USBPORT_DpcHandler: ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- InitializeListHead(&List);
-
- KeAcquireSpinLockAtDpcLevel(&FdoExtension->EndpointListSpinLock);
- Entry = FdoExtension->EndpointList.Flink;
-
- while (Entry && Entry != &FdoExtension->EndpointList)
- {
- Endpoint = CONTAINING_RECORD(Entry,
- USBPORT_ENDPOINT,
- EndpointLink);
-
- LockCounter = InterlockedIncrement(&Endpoint->LockCounter);
-
- if (USBPORT_GetEndpointState(Endpoint) != USBPORT_ENDPOINT_ACTIVE ||
- LockCounter ||
- Endpoint->Flags & ENDPOINT_FLAG_ROOTHUB_EP0)
- {
- InterlockedDecrement(&Endpoint->LockCounter);
- }
- else
- {
- InsertTailList(&List, &Endpoint->DispatchLink);
-
- if (Endpoint->WorkerLink.Flink && Endpoint->WorkerLink.Blink)
- {
- RemoveEntryList(&Endpoint->WorkerLink);
-
- Endpoint->WorkerLink.Flink = NULL;
- Endpoint->WorkerLink.Blink = NULL;
- }
- }
-
- Entry = Endpoint->EndpointLink.Flink;
- }
-
- KeReleaseSpinLockFromDpcLevel(&FdoExtension->EndpointListSpinLock);
-
- while (!IsListEmpty(&List))
- {
- Endpoint = CONTAINING_RECORD(List.Flink,
- USBPORT_ENDPOINT,
- DispatchLink);
-
- RemoveEntryList(List.Flink);
- Endpoint->DispatchLink.Flink = NULL;
- Endpoint->DispatchLink.Blink = NULL;
-
- USBPORT_EndpointWorker(Endpoint, TRUE);
- USBPORT_FlushPendingTransfers(Endpoint);
- }
-
- KeAcquireSpinLockAtDpcLevel(&FdoExtension->EndpointListSpinLock);
-
- if (!IsListEmpty(&FdoExtension->WorkerList))
- {
- USBPORT_SignalWorkerThread(FdoDevice);
- }
-
- KeReleaseSpinLockFromDpcLevel(&FdoExtension->EndpointListSpinLock);
-
- USBPORT_FlushDoneTransfers(FdoDevice);
-}
-
-VOID
-NTAPI
-USBPORT_IsrDpcHandler(IN PDEVICE_OBJECT FdoDevice,
- IN BOOLEAN IsDpcHandler)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_REGISTRATION_PACKET Packet;
- PUSBPORT_ENDPOINT Endpoint;
- PLIST_ENTRY List;
- ULONG FrameNumber;
-
- ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
-
- DPRINT_CORE("USBPORT_IsrDpcHandler: IsDpcHandler - %x\n", IsDpcHandler);
-
- FdoExtension = FdoDevice->DeviceExtension;
- Packet = &FdoExtension->MiniPortInterface->Packet;
-
- if (InterlockedIncrement(&FdoExtension->IsrDpcHandlerCounter))
- {
- KeInsertQueueDpc(&FdoExtension->IsrDpc, NULL, NULL);
- InterlockedDecrement(&FdoExtension->IsrDpcHandlerCounter);
- return;
- }
-
- for (List = ExInterlockedRemoveHeadList(&FdoExtension->EpStateChangeList,
-
&FdoExtension->EpStateChangeSpinLock);
- List != NULL;
- List = ExInterlockedRemoveHeadList(&FdoExtension->EpStateChangeList,
-
&FdoExtension->EpStateChangeSpinLock))
- {
- Endpoint = CONTAINING_RECORD(List,
- USBPORT_ENDPOINT,
- StateChangeLink);
-
- DPRINT_CORE("USBPORT_IsrDpcHandler: Endpoint - %p\n", Endpoint);
-
- KeAcquireSpinLockAtDpcLevel(&Endpoint->EndpointSpinLock);
-
- KeAcquireSpinLockAtDpcLevel(&FdoExtension->MiniportSpinLock);
- FrameNumber = Packet->Get32BitFrameNumber(FdoExtension->MiniPortExt);
- KeReleaseSpinLockFromDpcLevel(&FdoExtension->MiniportSpinLock);
-
- if (FrameNumber <= Endpoint->FrameNumber &&
- !(Endpoint->Flags & ENDPOINT_FLAG_NUKE))
- {
- KeReleaseSpinLockFromDpcLevel(&Endpoint->EndpointSpinLock);
-
- ExInterlockedInsertHeadList(&FdoExtension->EpStateChangeList,
- &Endpoint->StateChangeLink,
- &FdoExtension->EpStateChangeSpinLock);
-
- KeAcquireSpinLockAtDpcLevel(&FdoExtension->MiniportSpinLock);
- Packet->InterruptNextSOF(FdoExtension->MiniPortExt);
- KeReleaseSpinLockFromDpcLevel(&FdoExtension->MiniportSpinLock);
-
- break;
- }
-
- KeReleaseSpinLockFromDpcLevel(&Endpoint->EndpointSpinLock);
-
- KeAcquireSpinLockAtDpcLevel(&Endpoint->StateChangeSpinLock);
- Endpoint->StateLast = Endpoint->StateNext;
- KeReleaseSpinLockFromDpcLevel(&Endpoint->StateChangeSpinLock);
-
- DPRINT_CORE("USBPORT_IsrDpcHandler: Endpoint->StateLast - %x\n",
- Endpoint->StateLast);
-
- if (IsDpcHandler)
- {
- USBPORT_InvalidateEndpointHandler(FdoDevice,
- Endpoint,
- INVALIDATE_ENDPOINT_ONLY);
- }
- else
- {
- USBPORT_InvalidateEndpointHandler(FdoDevice,
- Endpoint,
- INVALIDATE_ENDPOINT_WORKER_THREAD);
- }
- }
-
- if (IsDpcHandler)
- {
- USBPORT_DpcHandler(FdoDevice);
- }
-
- InterlockedDecrement(&FdoExtension->IsrDpcHandlerCounter);
-}
-
-VOID
-NTAPI
-USBPORT_IsrDpc(IN PRKDPC Dpc,
- IN PVOID DeferredContext,
- IN PVOID SystemArgument1,
- IN PVOID SystemArgument2)
-{
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_REGISTRATION_PACKET Packet;
- BOOLEAN InterruptEnable;
-
- DPRINT_INT("USBPORT_IsrDpc: DeferredContext - %p, SystemArgument2 - %p\n",
- DeferredContext,
- SystemArgument2);
-
- FdoDevice = DeferredContext;
- FdoExtension = FdoDevice->DeviceExtension;
- Packet = &FdoExtension->MiniPortInterface->Packet;
-
- if (SystemArgument2)
- {
- InterlockedDecrement(&FdoExtension->IsrDpcCounter);
- }
-
- KeAcquireSpinLockAtDpcLevel(&FdoExtension->MiniportInterruptsSpinLock);
- InterruptEnable = (FdoExtension->Flags & USBPORT_FLAG_INTERRUPT_ENABLED) ==
- USBPORT_FLAG_INTERRUPT_ENABLED;
-
- Packet->InterruptDpc(FdoExtension->MiniPortExt, InterruptEnable);
-
- KeReleaseSpinLockFromDpcLevel(&FdoExtension->MiniportInterruptsSpinLock);
-
- if (FdoExtension->Flags & USBPORT_FLAG_HC_SUSPEND &&
- FdoExtension->TimerFlags & USBPORT_TMFLAG_WAKE)
- {
- USBPORT_CompletePdoWaitWake(FdoDevice);
- }
- else
- {
- USBPORT_IsrDpcHandler(FdoDevice, TRUE);
- }
-
- DPRINT_INT("USBPORT_IsrDpc: exit\n");
-}
-
-BOOLEAN
-NTAPI
-USBPORT_InterruptService(IN PKINTERRUPT Interrupt,
- IN PVOID ServiceContext)
-{
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_REGISTRATION_PACKET Packet;
- BOOLEAN Result = FALSE;
-
- FdoDevice = ServiceContext;
- FdoExtension = FdoDevice->DeviceExtension;
- Packet = &FdoExtension->MiniPortInterface->Packet;
-
- DPRINT_INT("USBPORT_InterruptService: FdoExtension->Flags - %lx\n",
- FdoExtension->Flags);
-
- if (FdoExtension->Flags & USBPORT_FLAG_INTERRUPT_ENABLED &&
- FdoExtension->MiniPortFlags & USBPORT_MPFLAG_INTERRUPTS_ENABLED)
- {
- Result = Packet->InterruptService(FdoExtension->MiniPortExt);
-
- if (Result)
- {
- KeInsertQueueDpc(&FdoExtension->IsrDpc, NULL, NULL);
- }
- }
-
- DPRINT_INT("USBPORT_InterruptService: return - %x\n", Result);
-
- return Result;
-}
-
-VOID
-NTAPI
-USBPORT_SignalWorkerThread(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- KIRQL OldIrql;
-
- DPRINT_CORE("USBPORT_SignalWorkerThread ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- KeAcquireSpinLock(&FdoExtension->WorkerThreadEventSpinLock, &OldIrql);
- KeSetEvent(&FdoExtension->WorkerThreadEvent, EVENT_INCREMENT, FALSE);
- KeReleaseSpinLock(&FdoExtension->WorkerThreadEventSpinLock, OldIrql);
-}
-
-VOID
-NTAPI
-USBPORT_WorkerThreadHandler(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_REGISTRATION_PACKET Packet;
- PLIST_ENTRY workerList;
- KIRQL OldIrql;
- PUSBPORT_ENDPOINT Endpoint;
- LIST_ENTRY list;
- BOOLEAN Result;
-
- DPRINT_CORE("USBPORT_WorkerThreadHandler: ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
- Packet = &FdoExtension->MiniPortInterface->Packet;
-
- KeAcquireSpinLock(&FdoExtension->MiniportSpinLock, &OldIrql);
-
- if (!(FdoExtension->Flags & USBPORT_FLAG_HC_SUSPEND))
- {
- Packet->CheckController(FdoExtension->MiniPortExt);
- }
-
- KeReleaseSpinLock(&FdoExtension->MiniportSpinLock, OldIrql);
-
- InitializeListHead(&list);
-
- USBPORT_FlushAllEndpoints(FdoDevice);
-
- while (TRUE)
- {
- KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
- KeAcquireSpinLockAtDpcLevel(&FdoExtension->EndpointListSpinLock);
-
- workerList = &FdoExtension->WorkerList;
-
- if (IsListEmpty(workerList))
- break;
-
- Endpoint = CONTAINING_RECORD(workerList->Flink,
- USBPORT_ENDPOINT,
- WorkerLink);
-
- DPRINT_CORE("USBPORT_WorkerThreadHandler: Endpoint - %p\n", Endpoint);
-
- RemoveHeadList(workerList);
- Endpoint->WorkerLink.Blink = NULL;
- Endpoint->WorkerLink.Flink = NULL;
-
- KeReleaseSpinLockFromDpcLevel(&FdoExtension->EndpointListSpinLock);
-
- Result = USBPORT_EndpointWorker(Endpoint, FALSE);
- KeAcquireSpinLockAtDpcLevel(&FdoExtension->EndpointListSpinLock);
-
- if (Result)
- {
- if (Endpoint->FlushAbortLink.Flink == NULL ||
- Endpoint->FlushAbortLink.Blink == NULL)
- {
- InsertTailList(&list, &Endpoint->FlushAbortLink);
- }
- }
-
- while (!IsListEmpty(&list))
- {
- Endpoint = CONTAINING_RECORD(list.Flink,
- USBPORT_ENDPOINT,
- FlushAbortLink);
-
- RemoveHeadList(&list);
-
- Endpoint->FlushAbortLink.Flink = NULL;
- Endpoint->FlushAbortLink.Blink = NULL;
-
- if (Endpoint->WorkerLink.Flink == NULL ||
- Endpoint->WorkerLink.Blink == NULL)
- {
- InsertTailList(&FdoExtension->WorkerList,
- &Endpoint->WorkerLink);
-
- USBPORT_SignalWorkerThread(FdoDevice);
- }
- }
-
- KeReleaseSpinLockFromDpcLevel(&FdoExtension->EndpointListSpinLock);
- KeLowerIrql(OldIrql);
- }
-
- KeReleaseSpinLockFromDpcLevel(&FdoExtension->EndpointListSpinLock);
- KeLowerIrql(OldIrql);
-
- USBPORT_FlushClosedEndpointList(FdoDevice);
-}
-
-VOID
-NTAPI
-USBPORT_DoRootHubCallback(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDEVICE_OBJECT PdoDevice;
- PUSBPORT_RHDEVICE_EXTENSION PdoExtension;
- PRH_INIT_CALLBACK RootHubInitCallback;
- PVOID RootHubInitContext;
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- DPRINT("USBPORT_DoRootHubCallback: FdoDevice - %p\n", FdoDevice);
-
- PdoDevice = FdoExtension->RootHubPdo;
-
- if (PdoDevice)
- {
- PdoExtension = PdoDevice->DeviceExtension;
-
- RootHubInitContext = PdoExtension->RootHubInitContext;
- RootHubInitCallback = PdoExtension->RootHubInitCallback;
-
- PdoExtension->RootHubInitCallback = NULL;
- PdoExtension->RootHubInitContext = NULL;
-
- if (RootHubInitCallback)
- {
- RootHubInitCallback(RootHubInitContext);
- }
- }
-
- DPRINT("USBPORT_DoRootHubCallback: exit\n");
-}
-
-VOID
-NTAPI
-USBPORT_SynchronizeRootHubCallback(IN PDEVICE_OBJECT FdoDevice,
- IN PDEVICE_OBJECT Usb2FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_REGISTRATION_PACKET Packet;
- PUSBPORT_DEVICE_EXTENSION Usb2FdoExtension;
- PDEVICE_RELATIONS CompanionControllersList;
- PUSBPORT_DEVICE_EXTENSION CompanionFdoExtension;
- PDEVICE_OBJECT * Entry;
- ULONG ix;
-
- DPRINT("USBPORT_SynchronizeRootHubCallback: FdoDevice - %p, Usb2FdoDevice -
%p\n",
- FdoDevice,
- Usb2FdoDevice);
-
- FdoExtension = FdoDevice->DeviceExtension;
- Packet = &FdoExtension->MiniPortInterface->Packet;
-
- if (Usb2FdoDevice == NULL &&
- !(Packet->MiniPortFlags & USB_MINIPORT_FLAGS_USB2))
- {
- /* Not Companion USB11 Controller */
- USBPORT_DoRootHubCallback(FdoDevice);
-
- FdoExtension->Flags &= ~USBPORT_FLAG_RH_INIT_CALLBACK;
- InterlockedCompareExchange(&FdoExtension->RHInitCallBackLock, 0, 1);
-
- DPRINT("USBPORT_SynchronizeRootHubCallback: exit \n");
- return;
- }
-
- /* USB2 or Companion USB11 */
-
- DPRINT("USBPORT_SynchronizeRootHubCallback: FdoExtension->Flags -
%p\n",
- FdoExtension->Flags);
-
- if (!(FdoExtension->Flags & USBPORT_FLAG_COMPANION_HC))
- {
- KeWaitForSingleObject(&FdoExtension->ControllerSemaphore,
- Executive,
- KernelMode,
- FALSE,
- NULL);
-
- FdoExtension->Flags |= USBPORT_FLAG_PWR_AND_CHIRP_LOCK;
-
- if (!(FdoExtension->Flags & (USBPORT_FLAG_HC_SUSPEND |
- USBPORT_FLAG_POWER_AND_CHIRP_OK)))
- {
- USBPORT_RootHubPowerAndChirpAllCcPorts(FdoDevice);
- FdoExtension->Flags |= USBPORT_FLAG_POWER_AND_CHIRP_OK;
- }
-
- FdoExtension->Flags &= ~USBPORT_FLAG_PWR_AND_CHIRP_LOCK;
-
- KeReleaseSemaphore(&FdoExtension->ControllerSemaphore,
- LOW_REALTIME_PRIORITY,
- 1,
- FALSE);
-
- CompanionControllersList = USBPORT_FindCompanionControllers(FdoDevice,
- FALSE,
- TRUE);
-
- if (CompanionControllersList)
- {
- Entry = &CompanionControllersList->Objects[0];
-
- for (ix = 0; ix < CompanionControllersList->Count; ++ix)
- {
- CompanionFdoExtension = ((*Entry)->DeviceExtension);
-
-
InterlockedCompareExchange(&CompanionFdoExtension->RHInitCallBackLock,
- 0,
- 1);
-
- ++Entry;
- }
-
- ExFreePoolWithTag(CompanionControllersList, USB_PORT_TAG);
- }
-
- USBPORT_DoRootHubCallback(FdoDevice);
-
- FdoExtension->Flags &= ~USBPORT_FLAG_RH_INIT_CALLBACK;
- InterlockedCompareExchange(&FdoExtension->RHInitCallBackLock, 0, 1);
- }
- else
- {
- Usb2FdoExtension = Usb2FdoDevice->DeviceExtension;
-
- USBPORT_Wait(FdoDevice, 50);
-
- while (FdoExtension->RHInitCallBackLock)
- {
- USBPORT_Wait(FdoDevice, 10);
-
- Usb2FdoExtension->Flags |= USBPORT_FLAG_RH_INIT_CALLBACK;
- USBPORT_SignalWorkerThread(Usb2FdoDevice);
- }
-
- USBPORT_DoRootHubCallback(FdoDevice);
-
- FdoExtension->Flags &= ~USBPORT_FLAG_RH_INIT_CALLBACK;
- }
-
- DPRINT("USBPORT_SynchronizeRootHubCallback: exit \n");
-}
-
-VOID
-NTAPI
-USBPORT_WorkerThread(IN PVOID StartContext)
-{
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- LARGE_INTEGER OldTime;
- LARGE_INTEGER NewTime;
- KIRQL OldIrql;
-
- DPRINT_CORE("USBPORT_WorkerThread ... \n");
-
- FdoDevice = StartContext;
- FdoExtension = FdoDevice->DeviceExtension;
-
- FdoExtension->WorkerThread = KeGetCurrentThread();
-
- do
- {
- KeQuerySystemTime(&OldTime);
-
- KeWaitForSingleObject(&FdoExtension->WorkerThreadEvent,
- Suspended,
- KernelMode,
- FALSE,
- NULL);
-
- KeQuerySystemTime(&NewTime);
-
- KeAcquireSpinLock(&FdoExtension->WorkerThreadEventSpinLock,
&OldIrql);
- KeResetEvent(&FdoExtension->WorkerThreadEvent);
- KeReleaseSpinLock(&FdoExtension->WorkerThreadEventSpinLock, OldIrql);
- DPRINT_CORE("USBPORT_WorkerThread: run \n");
-
- if (FdoExtension->MiniPortFlags & USBPORT_MPFLAG_INTERRUPTS_ENABLED)
- {
- USBPORT_DoSetPowerD0(FdoDevice);
-
- if (FdoExtension->Flags & USBPORT_FLAG_RH_INIT_CALLBACK)
- {
- PDEVICE_OBJECT USB2FdoDevice = NULL;
-
- USB2FdoDevice = USBPORT_FindUSB2Controller(FdoDevice);
- USBPORT_SynchronizeRootHubCallback(FdoDevice, USB2FdoDevice);
- }
- }
-
- USBPORT_WorkerThreadHandler(FdoDevice);
- }
- while (!(FdoExtension->Flags & USBPORT_FLAG_WORKER_THREAD_ON));
-
- PsTerminateSystemThread(0);
-}
-
-NTSTATUS
-NTAPI
-USBPORT_CreateWorkerThread(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- NTSTATUS Status;
-
- DPRINT("USBPORT_CreateWorkerThread ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- FdoExtension->Flags &= ~USBPORT_FLAG_WORKER_THREAD_ON;
-
- KeInitializeEvent(&FdoExtension->WorkerThreadEvent,
- NotificationEvent,
- FALSE);
-
- Status = PsCreateSystemThread(&FdoExtension->WorkerThreadHandle,
- THREAD_ALL_ACCESS,
- NULL,
- NULL,
- NULL,
- USBPORT_WorkerThread,
- (PVOID)FdoDevice);
-
- return Status;
-}
-
-VOID
-NTAPI
-USBPORT_SynchronizeControllersStart(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDEVICE_OBJECT PdoDevice;
- PUSBPORT_RHDEVICE_EXTENSION PdoExtension;
- PDEVICE_OBJECT USB2FdoDevice = NULL;
- PUSBPORT_DEVICE_EXTENSION USB2FdoExtension;
- BOOLEAN IsOn;
-
- DPRINT_TIMER("USBPORT_SynchronizeControllersStart: FdoDevice - %p\n",
- FdoDevice);
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- PdoDevice = FdoExtension->RootHubPdo;
-
- if (!PdoDevice)
- {
- return;
- }
-
- PdoExtension = PdoDevice->DeviceExtension;
-
- if (PdoExtension->RootHubInitCallback == NULL ||
- FdoExtension->Flags & USBPORT_FLAG_RH_INIT_CALLBACK)
- {
- return;
- }
-
- DPRINT_TIMER("USBPORT_SynchronizeControllersStart: Flags - %p\n",
- FdoExtension->Flags);
-
- if (FdoExtension->Flags & USBPORT_FLAG_COMPANION_HC)
- {
- IsOn = FALSE;
-
- USB2FdoDevice = USBPORT_FindUSB2Controller(FdoDevice);
-
- DPRINT_TIMER("USBPORT_SynchronizeControllersStart: USB2FdoDevice -
%p\n",
- USB2FdoDevice);
-
- if (USB2FdoDevice)
- {
- USB2FdoExtension = USB2FdoDevice->DeviceExtension;
-
- if (USB2FdoExtension->CommonExtension.PnpStateFlags &
- USBPORT_PNP_STATE_STARTED)
- {
- IsOn = TRUE;
- }
- }
-
- if (!(FdoExtension->Flags & USBPORT_FLAG_NO_HACTION))
- {
- goto Start;
- }
-
- USB2FdoDevice = NULL;
- }
-
- IsOn = TRUE;
-
- Start:
-
- if (IsOn &&
- !InterlockedCompareExchange(&FdoExtension->RHInitCallBackLock, 1, 0))
- {
- FdoExtension->Flags |= USBPORT_FLAG_RH_INIT_CALLBACK;
- USBPORT_SignalWorkerThread(FdoDevice);
-
- if (USB2FdoDevice)
- {
- USB2FdoExtension = USB2FdoDevice->DeviceExtension;
-
- USB2FdoExtension->Flags |= USBPORT_FLAG_RH_INIT_CALLBACK;
- USBPORT_SignalWorkerThread(USB2FdoDevice);
- }
- }
-
- DPRINT_TIMER("USBPORT_SynchronizeControllersStart: exit\n");
-}
-
-VOID
-NTAPI
-USBPORT_TimerDpc(IN PRKDPC Dpc,
- IN PVOID DeferredContext,
- IN PVOID SystemArgument1,
- IN PVOID SystemArgument2)
-{
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_REGISTRATION_PACKET Packet;
- LARGE_INTEGER DueTime = {{0, 0}};
- ULONG TimerFlags;
- PTIMER_WORK_QUEUE_ITEM IdleQueueItem;
- KIRQL OldIrql;
- KIRQL TimerOldIrql;
-
- DPRINT_TIMER("USBPORT_TimerDpc: Dpc - %p, DeferredContext - %p\n",
- Dpc,
- DeferredContext);
-
- FdoDevice = DeferredContext;
- FdoExtension = FdoDevice->DeviceExtension;
- Packet = &FdoExtension->MiniPortInterface->Packet;
-
- KeAcquireSpinLock(&FdoExtension->TimerFlagsSpinLock, &TimerOldIrql);
-
- TimerFlags = FdoExtension->TimerFlags;
-
- DPRINT_TIMER("USBPORT_TimerDpc: Flags - %p, TimerFlags - %p\n",
- FdoExtension->Flags,
- TimerFlags);
-
- if (FdoExtension->Flags & USBPORT_FLAG_HC_SUSPEND &&
- FdoExtension->Flags & USBPORT_FLAG_HC_WAKE_SUPPORT &&
- !(TimerFlags & USBPORT_TMFLAG_HC_RESUME))
- {
- KeAcquireSpinLock(&FdoExtension->MiniportSpinLock, &OldIrql);
- Packet->PollController(FdoExtension->MiniPortExt);
- KeReleaseSpinLock(&FdoExtension->MiniportSpinLock, OldIrql);
- }
-
- USBPORT_SynchronizeControllersStart(FdoDevice);
-
- if (TimerFlags & USBPORT_TMFLAG_HC_SUSPENDED)
- {
- USBPORT_BadRequestFlush(FdoDevice);
- goto Exit;
- }
-
- KeAcquireSpinLock(&FdoExtension->MiniportSpinLock, &OldIrql);
-
- if (!(FdoExtension->Flags & USBPORT_FLAG_HC_SUSPEND))
- {
- Packet->CheckController(FdoExtension->MiniPortExt);
- }
-
- KeReleaseSpinLock(&FdoExtension->MiniportSpinLock, OldIrql);
-
- if (FdoExtension->Flags & USBPORT_FLAG_HC_POLLING)
- {
- KeAcquireSpinLock(&FdoExtension->MiniportSpinLock, &OldIrql);
- Packet->PollController(FdoExtension->MiniPortExt);
- KeReleaseSpinLock(&FdoExtension->MiniportSpinLock, OldIrql);
- }
-
- USBPORT_IsrDpcHandler(FdoDevice, FALSE);
-
- DPRINT_TIMER("USBPORT_TimerDpc: USBPORT_TimeoutAllEndpoints
UNIMPLEMENTED.\n");
- //USBPORT_TimeoutAllEndpoints(FdoDevice);
- DPRINT_TIMER("USBPORT_TimerDpc: USBPORT_CheckIdleEndpoints
UNIMPLEMENTED.\n");
- //USBPORT_CheckIdleEndpoints(FdoDevice);
-
- USBPORT_BadRequestFlush(FdoDevice);
-
- if (FdoExtension->IdleLockCounter > -1 &&
- !(TimerFlags & USBPORT_TMFLAG_IDLE_QUEUEITEM_ON))
- {
- IdleQueueItem = ExAllocatePoolWithTag(NonPagedPool,
- sizeof(TIMER_WORK_QUEUE_ITEM),
- USB_PORT_TAG);
-
- DPRINT("USBPORT_TimerDpc: IdleLockCounter - %x, IdleQueueItem - %p\n",
- FdoExtension->IdleLockCounter,
- IdleQueueItem);
-
- if (IdleQueueItem)
- {
- RtlZeroMemory(IdleQueueItem, sizeof(TIMER_WORK_QUEUE_ITEM));
-
- IdleQueueItem->WqItem.List.Flink = NULL;
- IdleQueueItem->WqItem.WorkerRoutine = USBPORT_DoIdleNotificationCallback;
- IdleQueueItem->WqItem.Parameter = IdleQueueItem;
-
- IdleQueueItem->FdoDevice = FdoDevice;
- IdleQueueItem->Context = 0;
-
- FdoExtension->TimerFlags |= USBPORT_TMFLAG_IDLE_QUEUEITEM_ON;
-
- ExQueueWorkItem(&IdleQueueItem->WqItem, CriticalWorkQueue);
- }
- }
-
-Exit:
-
- KeReleaseSpinLock(&FdoExtension->TimerFlagsSpinLock, TimerOldIrql);
-
- if (TimerFlags & USBPORT_TMFLAG_TIMER_QUEUED)
- {
- DueTime.QuadPart -= FdoExtension->TimerValue * 10000 +
- (KeQueryTimeIncrement() - 1);
-
- KeSetTimer(&FdoExtension->TimerObject,
- DueTime,
- &FdoExtension->TimerDpc);
- }
-
- DPRINT_TIMER("USBPORT_TimerDpc: exit\n");
-}
-
-BOOLEAN
-NTAPI
-USBPORT_StartTimer(IN PDEVICE_OBJECT FdoDevice,
- IN ULONG Time)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- LARGE_INTEGER DueTime = {{0, 0}};
- ULONG TimeIncrement;
- BOOLEAN Result;
-
- DPRINT_TIMER("USBPORT_StartTimer: FdoDevice - %p, Time - %x\n",
- FdoDevice,
- Time);
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- TimeIncrement = KeQueryTimeIncrement();
-
- FdoExtension->TimerFlags |= USBPORT_TMFLAG_TIMER_QUEUED;
- FdoExtension->TimerValue = Time;
-
- KeInitializeTimer(&FdoExtension->TimerObject);
- KeInitializeDpc(&FdoExtension->TimerDpc, USBPORT_TimerDpc, FdoDevice);
-
- DueTime.QuadPart -= 10000 * Time + (TimeIncrement - 1);
-
- Result = KeSetTimer(&FdoExtension->TimerObject,
- DueTime,
- &FdoExtension->TimerDpc);
-
- return Result;
-}
-
-PUSBPORT_COMMON_BUFFER_HEADER
-NTAPI
-USBPORT_AllocateCommonBuffer(IN PDEVICE_OBJECT FdoDevice,
- IN SIZE_T BufferLength)
-{
- PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer = NULL;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDMA_ADAPTER DmaAdapter;
- PDMA_OPERATIONS DmaOperations;
- SIZE_T HeaderSize;
- ULONG Length = 0;
- ULONG LengthPadded;
- PHYSICAL_ADDRESS LogicalAddress;
- ULONG_PTR BaseVA;
- ULONG_PTR StartBufferVA;
- ULONG_PTR StartBufferPA;
-
- DPRINT("USBPORT_AllocateCommonBuffer: FdoDevice - %p, BufferLength -
%p\n",
- FdoDevice,
- BufferLength);
-
- if (BufferLength == 0)
- goto Exit;
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- DmaAdapter = FdoExtension->DmaAdapter;
- DmaOperations = DmaAdapter->DmaOperations;
-
- HeaderSize = sizeof(USBPORT_COMMON_BUFFER_HEADER);
- Length = ROUND_TO_PAGES(BufferLength + HeaderSize);
- LengthPadded = Length - (BufferLength + HeaderSize);
-
- BaseVA = (ULONG_PTR)DmaOperations->AllocateCommonBuffer(DmaAdapter,
- Length,
- &LogicalAddress,
- TRUE);
-
- if (!BaseVA)
- goto Exit;
-
- StartBufferVA = BaseVA & ~(PAGE_SIZE - 1);
- StartBufferPA = LogicalAddress.LowPart & ~(PAGE_SIZE - 1);
-
- HeaderBuffer = (PUSBPORT_COMMON_BUFFER_HEADER)(StartBufferVA +
- BufferLength +
- LengthPadded);
-
- HeaderBuffer->Length = Length;
- HeaderBuffer->BaseVA = BaseVA;
- HeaderBuffer->LogicalAddress = LogicalAddress;
-
- HeaderBuffer->BufferLength = BufferLength + LengthPadded;
- HeaderBuffer->VirtualAddress = StartBufferVA;
- HeaderBuffer->PhysicalAddress = StartBufferPA;
-
- RtlZeroMemory((PVOID)StartBufferVA, BufferLength + LengthPadded);
-
-Exit:
- return HeaderBuffer;
-}
-
-VOID
-NTAPI
-USBPORT_FreeCommonBuffer(IN PDEVICE_OBJECT FdoDevice,
- IN PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDMA_ADAPTER DmaAdapter;
- PDMA_OPERATIONS DmaOperations;
-
- DPRINT("USBPORT_FreeCommonBuffer: ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- DmaAdapter = FdoExtension->DmaAdapter;
- DmaOperations = DmaAdapter->DmaOperations;
-
- DmaOperations->FreeCommonBuffer(FdoExtension->DmaAdapter,
- HeaderBuffer->Length,
- HeaderBuffer->LogicalAddress,
- (PVOID)HeaderBuffer->VirtualAddress,
- TRUE);
-}
-
-PUSBPORT_MINIPORT_INTERFACE
-NTAPI
-USBPORT_FindMiniPort(IN PDRIVER_OBJECT DriverObject)
-{
- KIRQL OldIrql;
- PLIST_ENTRY List;
- PUSBPORT_MINIPORT_INTERFACE MiniPortInterface;
- BOOLEAN IsFound = FALSE;
-
- DPRINT("USBPORT_FindMiniPort: ... \n");
-
- KeAcquireSpinLock(&USBPORT_SpinLock, &OldIrql);
-
- for (List = USBPORT_MiniPortDrivers.Flink;
- List != &USBPORT_MiniPortDrivers;
- List = List->Flink)
- {
- MiniPortInterface = CONTAINING_RECORD(List,
- USBPORT_MINIPORT_INTERFACE,
- DriverLink);
-
- if (MiniPortInterface->DriverObject == DriverObject)
- {
- DPRINT("USBPORT_FindMiniPort: find MiniPortInterface - %p\n",
- MiniPortInterface);
-
- IsFound = TRUE;
- break;
- }
- }
-
- KeReleaseSpinLock(&USBPORT_SpinLock, OldIrql);
-
- if (IsFound)
- return MiniPortInterface;
- else
- return NULL;
-
-}
-
-NTSTATUS
-NTAPI
-USBPORT_AddDevice(IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT PhysicalDeviceObject)
-{
- NTSTATUS Status;
- PUSBPORT_MINIPORT_INTERFACE MiniPortInterface;
- ULONG DeviceNumber = 0;
- WCHAR CharDeviceName[64];
- UNICODE_STRING DeviceName;
- PDEVICE_OBJECT DeviceObject;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_COMMON_DEVICE_EXTENSION FdoCommonExtension;
- PDEVICE_OBJECT LowerDevice;
- ULONG Length;
-
- DPRINT("USBPORT_AddDevice: DriverObject - %p, PhysicalDeviceObject -
%p\n",
- DriverObject,
- PhysicalDeviceObject);
-
- MiniPortInterface = USBPORT_FindMiniPort(DriverObject);
-
- if (!MiniPortInterface)
- {
- DPRINT("USBPORT_AddDevice: USBPORT_FindMiniPort not found
MiniPortInterface\n");
- return STATUS_UNSUCCESSFUL;
- }
-
- while (TRUE)
- {
- /* Construct device name */
- RtlStringCbPrintfW(CharDeviceName,
- sizeof(CharDeviceName),
- L"\\Device\\USBFDO-%d",
- DeviceNumber);
-
- RtlInitUnicodeString(&DeviceName, CharDeviceName);
-
- Length = sizeof(USBPORT_DEVICE_EXTENSION) +
- MiniPortInterface->Packet.MiniPortExtensionSize;
-
- /* Create device */
- Status = IoCreateDevice(DriverObject,
- Length,
- &DeviceName,
- FILE_DEVICE_CONTROLLER,
- 0,
- FALSE,
- &DeviceObject);
-
- /* Check for success */
- if (NT_SUCCESS(Status)) break;
-
- /* Is there a device object with that same name */
- if ((Status == STATUS_OBJECT_NAME_EXISTS) ||
- (Status == STATUS_OBJECT_NAME_COLLISION))
- {
- /* Try the next name */
- DeviceNumber++;
- continue;
- }
-
- /* Bail out on other errors */
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("USBPORT_AddDevice: failed to create %wZ, Status %x\n",
- &DeviceName,
- Status);
-
- return Status;
- }
- }
-
- DPRINT("USBPORT_AddDevice: created device %p <%wZ>, Status %x\n",
- DeviceObject,
- &DeviceName,
- Status);
-
- FdoExtension = DeviceObject->DeviceExtension;
- FdoCommonExtension = &FdoExtension->CommonExtension;
-
- RtlZeroMemory(FdoExtension, sizeof(USBPORT_DEVICE_EXTENSION));
-
- FdoCommonExtension->SelfDevice = DeviceObject;
- FdoCommonExtension->LowerPdoDevice = PhysicalDeviceObject;
- FdoCommonExtension->IsPDO = FALSE;
-
- LowerDevice = IoAttachDeviceToDeviceStack(DeviceObject,
- PhysicalDeviceObject);
-
- FdoCommonExtension->LowerDevice = LowerDevice;
-
- FdoCommonExtension->DevicePowerState = PowerDeviceD3;
-
- FdoExtension->MiniPortExt = (PVOID)((ULONG_PTR)FdoExtension +
- sizeof(USBPORT_DEVICE_EXTENSION));
-
- FdoExtension->MiniPortInterface = MiniPortInterface;
- FdoExtension->FdoNameNumber = DeviceNumber;
-
- KeInitializeSemaphore(&FdoExtension->DeviceSemaphore, 1, 1);
- KeInitializeSemaphore(&FdoExtension->ControllerSemaphore, 1, 1);
-
- InitializeListHead(&FdoExtension->EndpointList);
- InitializeListHead(&FdoExtension->DoneTransferList);
- InitializeListHead(&FdoExtension->WorkerList);
- InitializeListHead(&FdoExtension->EpStateChangeList);
- InitializeListHead(&FdoExtension->MapTransferList);
- InitializeListHead(&FdoExtension->DeviceHandleList);
- InitializeListHead(&FdoExtension->IdleIrpList);
- InitializeListHead(&FdoExtension->BadRequestList);
- InitializeListHead(&FdoExtension->EndpointClosedList);
-
- DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
-
- return Status;
-}
-
-VOID
-NTAPI
-USBPORT_Unload(IN PDRIVER_OBJECT DriverObject)
-{
- PUSBPORT_MINIPORT_INTERFACE MiniPortInterface;
-
- DPRINT1("USBPORT_Unload: FIXME!\n");
-
- MiniPortInterface = USBPORT_FindMiniPort(DriverObject);
-
- if (!MiniPortInterface)
- {
- DPRINT("USBPORT_Unload: CRITICAL ERROR!!! USBPORT_FindMiniPort not found
MiniPortInterface\n");
- KeBugCheckEx(BUGCODE_USB_DRIVER, 1, 0, 0, 0);
- }
-
- DPRINT1("USBPORT_Unload: UNIMPLEMENTED. FIXME. \n");
- //MiniPortInterface->DriverUnload(DriverObject); // Call MiniPort _HCI_Unload
-}
-
-ULONG
-NTAPI
-USBPORT_MiniportCompleteTransfer(IN PVOID MiniPortExtension,
- IN PVOID MiniPortEndpoint,
- IN PVOID TransferParameters,
- IN USBD_STATUS USBDStatus,
- IN ULONG TransferLength)
-{
- PUSBPORT_TRANSFER Transfer;
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
-
- DPRINT_CORE("USBPORT_MiniportCompleteTransfer: USBDStatus - %x, TransferLength -
%x\n",
- USBDStatus,
- TransferLength);
-
- Transfer = CONTAINING_RECORD(TransferParameters,
- USBPORT_TRANSFER,
- TransferParameters);
-
- FdoDevice = Transfer->Endpoint->FdoDevice;
- FdoExtension = FdoDevice->DeviceExtension;
-
- Transfer->CompletedTransferLen = TransferLength;
-
- RemoveEntryList(&Transfer->TransferLink);
-
- Transfer->USBDStatus = USBDStatus;
-
- ExInterlockedInsertTailList(&FdoExtension->DoneTransferList,
- &Transfer->TransferLink,
- &FdoExtension->DoneTransferSpinLock);
-
- return KeInsertQueueDpc(&FdoExtension->TransferFlushDpc, NULL, NULL);
+ DPRINT1("USBPORT_InitializeIsoTransfer: UNIMPLEMENTED. FIXME.\n");
+ return USBD_STATUS_NOT_SUPPORTED;
}
ULONG
@@ -1983,789 +24,3 @@
return 0;
}
-VOID
-NTAPI
-USBPORT_AsyncTimerDpc(IN PRKDPC Dpc,
- IN PVOID DeferredContext,
- IN PVOID SystemArgument1,
- IN PVOID SystemArgument2)
-{
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PUSBPORT_ASYNC_CALLBACK_DATA AsyncCallbackData;
-
- DPRINT("USBPORT_AsyncTimerDpc: ... \n");
-
- AsyncCallbackData = DeferredContext;
- FdoDevice = AsyncCallbackData->FdoDevice;
- FdoExtension = FdoDevice->DeviceExtension;
-
- (*AsyncCallbackData->CallbackFunction)(FdoExtension->MiniPortExt,
- &AsyncCallbackData->CallbackContext);
-
- ExFreePoolWithTag(AsyncCallbackData, USB_PORT_TAG);
-}
-
-ULONG
-NTAPI
-USBPORT_RequestAsyncCallback(IN PVOID MiniPortExtension,
- IN ULONG TimerValue,
- IN PVOID Buffer,
- IN SIZE_T Length,
- IN ASYNC_TIMER_CALLBACK * Callback)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_ASYNC_CALLBACK_DATA AsyncCallbackData;
- LARGE_INTEGER DueTime = {{0, 0}};
-
- DPRINT("USBPORT_RequestAsyncCallback: ... \n");
-
- FdoExtension = (PUSBPORT_DEVICE_EXTENSION)((ULONG_PTR)MiniPortExtension -
- sizeof(USBPORT_DEVICE_EXTENSION));
-
- FdoDevice = FdoExtension->CommonExtension.SelfDevice;
-
- AsyncCallbackData = ExAllocatePoolWithTag(NonPagedPool,
- sizeof(USBPORT_ASYNC_CALLBACK_DATA) +
Length,
- USB_PORT_TAG);
-
- if (!AsyncCallbackData)
- {
- DPRINT1("USBPORT_RequestAsyncCallback: Not allocated
AsyncCallbackData!\n");
- return 0;
- }
-
- RtlZeroMemory(AsyncCallbackData,
- sizeof(USBPORT_ASYNC_CALLBACK_DATA) + Length);
-
- if (Length)
- {
- RtlCopyMemory(&AsyncCallbackData->CallbackContext, Buffer, Length);
- }
-
- AsyncCallbackData->FdoDevice = FdoDevice;
- AsyncCallbackData->CallbackFunction = Callback;
-
- KeInitializeTimer(&AsyncCallbackData->AsyncTimer);
-
- KeInitializeDpc(&AsyncCallbackData->AsyncTimerDpc,
- USBPORT_AsyncTimerDpc,
- AsyncCallbackData);
-
- DueTime.QuadPart -= (KeQueryTimeIncrement() - 1) + 10000 * TimerValue;
-
- KeSetTimer(&AsyncCallbackData->AsyncTimer,
- DueTime,
- &AsyncCallbackData->AsyncTimerDpc);
-
- return 0;
-}
-
-PVOID
-NTAPI
-USBPORT_GetMappedVirtualAddress(IN PVOID PhysicalAddress,
- IN PVOID MiniPortExtension,
- IN PVOID MiniPortEndpoint)
-{
- PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer;
- PUSBPORT_ENDPOINT Endpoint;
- ULONG Offset;
- ULONG_PTR VirtualAddress;
-
- DPRINT_CORE("USBPORT_GetMappedVirtualAddress ... \n");
-
- Endpoint = (PUSBPORT_ENDPOINT)((ULONG_PTR)MiniPortEndpoint -
- sizeof(USBPORT_ENDPOINT));
-
- if (!Endpoint)
- {
- ASSERT(FALSE);
- }
-
- HeaderBuffer = Endpoint->HeaderBuffer;
-
- Offset = (ULONG_PTR)PhysicalAddress - HeaderBuffer->PhysicalAddress;
- VirtualAddress = HeaderBuffer->VirtualAddress + Offset;
-
- return (PVOID)VirtualAddress;
-}
-
-ULONG
-NTAPI
-USBPORT_InvalidateEndpoint(IN PVOID MiniPortExtension,
- IN PVOID MiniPortEndpoint)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_ENDPOINT Endpoint;
-
- DPRINT_CORE("USBPORT_InvalidateEndpoint: ... \n");
-
- FdoExtension = (PUSBPORT_DEVICE_EXTENSION)((ULONG_PTR)MiniPortExtension -
- sizeof(USBPORT_DEVICE_EXTENSION));
-
- FdoDevice = FdoExtension->CommonExtension.SelfDevice;
-
- if (!MiniPortEndpoint)
- {
- USBPORT_InvalidateEndpointHandler(FdoDevice,
- NULL,
- INVALIDATE_ENDPOINT_ONLY);
- return 0;
- }
-
- Endpoint = (PUSBPORT_ENDPOINT)((ULONG_PTR)MiniPortEndpoint -
- sizeof(USBPORT_ENDPOINT));
-
- USBPORT_InvalidateEndpointHandler(FdoDevice,
- Endpoint,
- INVALIDATE_ENDPOINT_ONLY);
-
- return 0;
-}
-
-VOID
-NTAPI
-USBPORT_CompleteTransfer(IN PURB Urb,
- IN USBD_STATUS TransferStatus)
-{
- struct _URB_CONTROL_TRANSFER *UrbTransfer;
- PUSBPORT_TRANSFER Transfer;
- NTSTATUS Status;
- PIRP Irp;
- KIRQL OldIrql;
- PRKEVENT Event;
- BOOLEAN WriteToDevice;
- BOOLEAN IsFlushSuccess;
- PMDL Mdl;
- ULONG_PTR CurrentVa;
- SIZE_T TransferLength;
- PUSBPORT_ENDPOINT Endpoint;
- PDEVICE_OBJECT FdoDevice;
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDMA_OPERATIONS DmaOperations;
-
- DPRINT("USBPORT_CompleteTransfer: Urb - %p, TransferStatus - %X\n",
- Urb,
- TransferStatus);
-
- UrbTransfer = &Urb->UrbControlTransfer;
- Transfer = UrbTransfer->hca.Reserved8[0];
-
- Transfer->USBDStatus = TransferStatus;
- Status = USBPORT_USBDStatusToNtStatus(Urb, TransferStatus);
-
- UrbTransfer->TransferBufferLength = Transfer->CompletedTransferLen;
-
- if (Transfer->Flags & TRANSFER_FLAG_DMA_MAPPED)
- {
- Endpoint = Transfer->Endpoint;
- FdoDevice = Endpoint->FdoDevice;
- FdoExtension = FdoDevice->DeviceExtension;
- DmaOperations = FdoExtension->DmaAdapter->DmaOperations;
-
- WriteToDevice = Transfer->Direction == USBPORT_DMA_DIRECTION_TO_DEVICE;
- Mdl = UrbTransfer->TransferBufferMDL;
- CurrentVa = (ULONG_PTR)MmGetMdlVirtualAddress(Mdl);
- TransferLength = UrbTransfer->TransferBufferLength;
-
- IsFlushSuccess =
DmaOperations->FlushAdapterBuffers(FdoExtension->DmaAdapter,
- Mdl,
-
Transfer->MapRegisterBase,
- (PVOID)CurrentVa,
- TransferLength,
- WriteToDevice);
-
- if (!IsFlushSuccess)
- {
- DPRINT("USBPORT_CompleteTransfer: no FlushAdapterBuffers !!!\n");
- ASSERT(FALSE);
- }
-
- KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
-
- DmaOperations->FreeMapRegisters(FdoExtension->DmaAdapter,
- Transfer->MapRegisterBase,
- Transfer->NumberOfMapRegisters);
-
- KeLowerIrql(OldIrql);
- }
-
- if (Urb->UrbHeader.UsbdFlags & USBD_FLAG_ALLOCATED_MDL)
- {
- IoFreeMdl(Transfer->TransferBufferMDL);
- Urb->UrbHeader.UsbdFlags |= ~USBD_FLAG_ALLOCATED_MDL;
- }
-
- Urb->UrbControlTransfer.hca.Reserved8[0] = NULL;
- Urb->UrbHeader.UsbdFlags |= ~USBD_FLAG_ALLOCATED_TRANSFER;
-
- Irp = Transfer->Irp;
-
- if (Irp)
- {
- if (!NT_SUCCESS(Status))
- {
- //DbgBreakPoint();
- DPRINT1("USBPORT_CompleteTransfer: Irp - %p complete with Status -
%lx\n",
- Irp,
- Status);
-
- USBPORT_DumpingURB(Urb);
- }
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
- KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- KeLowerIrql(OldIrql);
- }
-
- Event = Transfer->Event;
-
- if (Event)
- {
- KeSetEvent(Event, EVENT_INCREMENT, FALSE);
- }
-
- ExFreePoolWithTag(Transfer, USB_PORT_TAG);
-
- DPRINT_CORE("USBPORT_CompleteTransfer: exit\n");
-}
-
-IO_ALLOCATION_ACTION
-NTAPI
-USBPORT_MapTransfer(IN PDEVICE_OBJECT FdoDevice,
- IN PIRP Irp,
- IN PVOID MapRegisterBase,
- IN PVOID Context)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PDMA_ADAPTER DmaAdapter;
- PUSBPORT_TRANSFER Transfer;
- PURB Urb;
- PUSBPORT_ENDPOINT Endpoint;
- PMDL Mdl;
- ULONG_PTR CurrentVa;
- PUSBPORT_SCATTER_GATHER_LIST sgList;
- SIZE_T CurrentLength;
- ULONG ix;
- BOOLEAN WriteToDevice;
- PHYSICAL_ADDRESS PhAddr = {{0, 0}};
- PHYSICAL_ADDRESS PhAddress = {{0, 0}};
- SIZE_T TransferLength;
- SIZE_T SgCurrentLength;
- SIZE_T ElementLength;
- PUSBPORT_DEVICE_HANDLE DeviceHandle;
- PDMA_OPERATIONS DmaOperations;
-
- DPRINT_CORE("USBPORT_MapTransfer: ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
- DmaAdapter = FdoExtension->DmaAdapter;
- DmaOperations = DmaAdapter->DmaOperations;
-
- Transfer = Context;
-
- Urb = Transfer->Urb;
- Endpoint = Transfer->Endpoint;
- TransferLength = Transfer->TransferParameters.TransferBufferLength;
-
- Mdl = Urb->UrbControlTransfer.TransferBufferMDL;
- CurrentVa = (ULONG_PTR)MmGetMdlVirtualAddress(Mdl);
-
- Transfer->SgList.CurrentVa = CurrentVa;
- Transfer->SgList.MappedSystemVa = MmGetSystemAddressForMdlSafe(Mdl,
NormalPagePriority);
-
- sgList = &Transfer->SgList;
- sgList->Flags = 0;
-
- Transfer->MapRegisterBase = MapRegisterBase;
-
- ix = 0;
- CurrentLength = 0;
-
- do
- {
- WriteToDevice = Transfer->Direction == USBPORT_DMA_DIRECTION_TO_DEVICE;
- ASSERT(Transfer->Direction != 0);
-
- PhAddress = DmaOperations->MapTransfer(DmaAdapter,
- Mdl,
- MapRegisterBase,
- (PVOID)CurrentVa,
- &TransferLength,
- WriteToDevice);
-
- DPRINT_CORE("USBPORT_MapTransfer: PhAddress.LowPart - %p, PhAddress.HighPart
- %x, TransferLength - %x\n",
- PhAddress.LowPart,
- PhAddress.HighPart,
- TransferLength);
-
- PhAddress.HighPart = 0;
- SgCurrentLength = TransferLength;
-
- do
- {
- ElementLength = 0x1000 - (PhAddress.LowPart & 0xFFF);
-
- if (ElementLength > SgCurrentLength)
- ElementLength = SgCurrentLength;
-
- DPRINT_CORE("USBPORT_MapTransfer: PhAddress.LowPart - %p, HighPart - %x,
ElementLength - %x\n",
- PhAddress.LowPart,
- PhAddress.HighPart,
- ElementLength);
-
- sgList->SgElement[ix].SgPhysicalAddress = PhAddress;
- sgList->SgElement[ix].SgTransferLength = ElementLength;
- sgList->SgElement[ix].SgOffset = CurrentLength +
- (TransferLength - SgCurrentLength);
-
- PhAddress.LowPart += ElementLength;
- SgCurrentLength -= ElementLength;
-
- ++ix;
- }
- while (SgCurrentLength);
-
- if ((PhAddr.LowPart == PhAddress.LowPart) &&
- (PhAddr.HighPart == PhAddress.HighPart))
- {
- ASSERT(FALSE);
- }
-
- PhAddr = PhAddress;
-
- CurrentLength += TransferLength;
- CurrentVa += TransferLength;
-
- TransferLength = Transfer->TransferParameters.TransferBufferLength -
- CurrentLength;
- }
- while (CurrentLength != Transfer->TransferParameters.TransferBufferLength);
-
- Transfer->SgList.SgElementCount = ix;
- Transfer->Flags |= TRANSFER_FLAG_DMA_MAPPED;
-
- ASSERT(Transfer->TransferParameters.TransferBufferLength <=
- Endpoint->EndpointProperties.MaxTransferSize);
-
- KeAcquireSpinLock(&Endpoint->EndpointSpinLock,
&Endpoint->EndpointOldIrql);
- InsertTailList(&Endpoint->TransferList, &Transfer->TransferLink);
- KeReleaseSpinLock(&Endpoint->EndpointSpinLock, Endpoint->EndpointOldIrql);
-
- DeviceHandle = Urb->UrbHeader.UsbdDeviceHandle;
- InterlockedDecrement(&DeviceHandle->DeviceHandleLock);
-
- if (USBPORT_EndpointWorker(Endpoint, 0))
- {
- USBPORT_InvalidateEndpointHandler(FdoDevice,
- Endpoint,
- INVALIDATE_ENDPOINT_WORKER_THREAD);
- }
-
- return DeallocateObjectKeepRegisters;
-}
-
-VOID
-NTAPI
-USBPORT_FlushMapTransfers(IN PDEVICE_OBJECT FdoDevice)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- PLIST_ENTRY MapTransferList;
- PUSBPORT_TRANSFER Transfer;
- ULONG NumMapRegisters;
- PMDL Mdl;
- SIZE_T TransferBufferLength;
- ULONG_PTR VirtualAddr;
- KIRQL OldIrql;
- NTSTATUS Status;
- PDMA_OPERATIONS DmaOperations;
-
- DPRINT_CORE("USBPORT_FlushMapTransfers: ... \n");
-
- FdoExtension = FdoDevice->DeviceExtension;
- DmaOperations = FdoExtension->DmaAdapter->DmaOperations;
-
- KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
-
- while (TRUE)
- {
- MapTransferList = &FdoExtension->MapTransferList;
-
- if (IsListEmpty(&FdoExtension->MapTransferList))
- {
- KeLowerIrql(OldIrql);
- return;
- }
-
- Transfer = CONTAINING_RECORD(MapTransferList->Flink,
- USBPORT_TRANSFER,
- TransferLink);
-
- RemoveHeadList(MapTransferList);
-
- Mdl = Transfer->Urb->UrbControlTransfer.TransferBufferMDL;
- TransferBufferLength = Transfer->TransferParameters.TransferBufferLength;
- VirtualAddr = (ULONG_PTR)MmGetMdlVirtualAddress(Mdl);
-
- NumMapRegisters = ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddr,
- TransferBufferLength);
-
- Transfer->NumberOfMapRegisters = NumMapRegisters;
-
- Status = DmaOperations->AllocateAdapterChannel(FdoExtension->DmaAdapter,
- FdoDevice,
- NumMapRegisters,
- USBPORT_MapTransfer,
- Transfer);
-
- if (!NT_SUCCESS(Status))
- ASSERT(FALSE);
- }
-
- KeLowerIrql(OldIrql);
-}
-
-USBD_STATUS
-NTAPI
-USBPORT_AllocateTransfer(IN PDEVICE_OBJECT FdoDevice,
- IN PURB Urb,
- IN PUSBPORT_DEVICE_HANDLE DeviceHandle,
- IN PIRP Irp,
- IN PRKEVENT Event)
-{
- PUSBPORT_DEVICE_EXTENSION FdoExtension;
- SIZE_T TransferLength;
- PMDL Mdl;
- ULONG_PTR VirtualAddr;
- ULONG PagesNeed = 0;
- SIZE_T PortTransferLength;
- SIZE_T FullTransferLength;
- PUSBPORT_TRANSFER Transfer;
- PUSBPORT_PIPE_HANDLE PipeHandle;
- USBD_STATUS USBDStatus;
-
- DPRINT_CORE("USBPORT_AllocateTransfer: FdoDevice - %p, Urb - %p, DeviceHandle -
%p, Irp - %p, Event - %p\n",
- FdoDevice,
- Urb,
- DeviceHandle,
- Irp,
- Event);
-
- FdoExtension = FdoDevice->DeviceExtension;
-
- TransferLength = Urb->UrbControlTransfer.TransferBufferLength;
- PipeHandle = Urb->UrbControlTransfer.PipeHandle;
-
- if (TransferLength)
- {
- Mdl = Urb->UrbControlTransfer.TransferBufferMDL;
- VirtualAddr = (ULONG_PTR)MmGetMdlVirtualAddress(Mdl);
-
- PagesNeed = ADDRESS_AND_SIZE_TO_SPAN_PAGES(VirtualAddr,
- TransferLength);
- }
-
- if (Urb->UrbHeader.Function == URB_FUNCTION_ISOCH_TRANSFER)
- {
- DPRINT1("USBPORT_AllocateTransfer: ISOCH_TRANSFER UNIMPLEMENTED.
FIXME.\n");
- }
-
- PortTransferLength = sizeof(USBPORT_TRANSFER) +
- PagesNeed * sizeof(USBPORT_SCATTER_GATHER_ELEMENT);
-
- FullTransferLength = PortTransferLength +
-
FdoExtension->MiniPortInterface->Packet.MiniPortTransferSize;
-
- Transfer = ExAllocatePoolWithTag(NonPagedPool,
- FullTransferLength,
- USB_PORT_TAG);
-
- if (Transfer)
- {
- RtlZeroMemory(Transfer, FullTransferLength);
-
- Transfer->Irp = Irp;
- Transfer->Urb = Urb;
- Transfer->Endpoint = PipeHandle->Endpoint;
- Transfer->Event = Event;
- Transfer->PortTransferLength = PortTransferLength;
- Transfer->FullTransferLength = FullTransferLength;
-
- Transfer->MiniportTransfer = (PVOID)((ULONG_PTR)Transfer +
- PortTransferLength);
-
- Urb->UrbControlTransfer.hca.Reserved8[0] = Transfer;
- Urb->UrbHeader.UsbdFlags |= USBD_FLAG_ALLOCATED_TRANSFER;
-
- USBDStatus = USBD_STATUS_SUCCESS;
- }
- else
- {
- USBDStatus = USBD_STATUS_INSUFFICIENT_RESOURCES;
- }
-
- DPRINT_CORE("USBPORT_AllocateTransfer: return USBDStatus - %x\n",
- USBDStatus);
-
- return USBDStatus;
-}
-
-NTSTATUS
-NTAPI
-USBPORT_Dispatch(IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PUSBPORT_COMMON_DEVICE_EXTENSION DeviceExtension;
- PIO_STACK_LOCATION IoStack;
- NTSTATUS Status = STATUS_SUCCESS;
-
- DeviceExtension = DeviceObject->DeviceExtension;
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- if (DeviceExtension->PnpStateFlags & USBPORT_PNP_STATE_FAILED)
- {
- DPRINT1("USBPORT_Dispatch: USBPORT_PNP_STATE_FAILED\n");
- DbgBreakPoint();
- }
-
- switch (IoStack->MajorFunction)
- {
- case IRP_MJ_DEVICE_CONTROL:
- if (DeviceExtension->IsPDO)
- {
- DPRINT("USBPORT_Dispatch: PDO IRP_MJ_DEVICE_CONTROL. Major - %d,
Minor - %d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- Status = USBPORT_PdoDeviceControl(DeviceObject, Irp);
- }
- else
- {
- DPRINT("USBPORT_Dispatch: FDO IRP_MJ_DEVICE_CONTROL. Major - %d,
Minor - %d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- Status = USBPORT_FdoDeviceControl(DeviceObject, Irp);
- }
-
- break;
-
- case IRP_MJ_INTERNAL_DEVICE_CONTROL:
- if (DeviceExtension->IsPDO)
- {
- DPRINT("USBPORT_Dispatch: PDO IRP_MJ_INTERNAL_DEVICE_CONTROL. Major
- %d, Minor - %d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- Status = USBPORT_PdoInternalDeviceControl(DeviceObject, Irp);
- }
- else
- {
- DPRINT("USBPORT_Dispatch: FDO IRP_MJ_INTERNAL_DEVICE_CONTROL. Major
- %d, Minor - %d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- Status = USBPORT_FdoInternalDeviceControl(DeviceObject, Irp);
- }
-
- break;
-
- case IRP_MJ_POWER:
- if (DeviceExtension->IsPDO)
- {
- DPRINT("USBPORT_Dispatch: PDO IRP_MJ_POWER. Major - %d, Minor -
%d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- Status = USBPORT_PdoPower(DeviceObject, Irp);
- }
- else
- {
- DPRINT("USBPORT_Dispatch: FDO IRP_MJ_POWER. Major - %d, Minor -
%d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- Status = USBPORT_FdoPower(DeviceObject, Irp);
- }
-
- break;
-
- case IRP_MJ_SYSTEM_CONTROL:
- if (DeviceExtension->IsPDO)
- {
- DPRINT("USBPORT_Dispatch: PDO IRP_MJ_SYSTEM_CONTROL. Major - %d,
Minor - %d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
- else
- {
- DPRINT("USBPORT_Dispatch: FDO IRP_MJ_SYSTEM_CONTROL. Major - %d,
Minor - %d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- IoSkipCurrentIrpStackLocation(Irp);
- Status = IoCallDriver(DeviceExtension->LowerDevice, Irp);
- }
-
- break;
-
- case IRP_MJ_PNP:
- if (DeviceExtension->IsPDO)
- {
- DPRINT("USBPORT_Dispatch: PDO IRP_MJ_PNP. Major - %d, Minor -
%d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- Status = USBPORT_PdoPnP(DeviceObject, Irp);
- }
- else
- {
- DPRINT("USBPORT_Dispatch: FDO IRP_MJ_PNP. Major - %d, Minor -
%d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
-
- Status = USBPORT_FdoPnP(DeviceObject, Irp);
- }
-
- break;
-
- case IRP_MJ_CREATE:
- case IRP_MJ_CLOSE:
- DPRINT("USBPORT_Dispatch: IRP_MJ_CREATE | IRP_MJ_CLOSE\n");
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- break;
-
- default:
- if (DeviceExtension->IsPDO)
- {
- DPRINT("USBPORT_Dispatch: PDO unhandled IRP_MJ_???. Major - %d,
Minor - %d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
- }
- else
- {
- DPRINT("USBPORT_Dispatch: FDO unhandled IRP_MJ_???. Major - %d,
Minor - %d\n",
- IoStack->MajorFunction,
- IoStack->MinorFunction);
- }
-
- Status = STATUS_INVALID_DEVICE_REQUEST;
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- break;
- }
-
- DPRINT("USBPORT_Dispatch: Status - %x\n", Status);
- return Status;
-}
-
-ULONG
-NTAPI
-USBPORT_GetHciMn(VOID)
-{
- return USBPORT_HCI_MN;
-}
-
-NTSTATUS
-NTAPI
-USBPORT_RegisterUSBPortDriver(IN PDRIVER_OBJECT DriverObject,
- IN ULONG Version,
- IN PUSBPORT_REGISTRATION_PACKET RegPacket)
-{
- PUSBPORT_MINIPORT_INTERFACE MiniPortInterface;
-
- DPRINT("USBPORT_RegisterUSBPortDriver: DriverObject - %p, Version - %p,
RegPacket - %p\n",
- DriverObject,
- Version,
- RegPacket);
-
- DPRINT("USBPORT_RegisterUSBPortDriver: sizeof(USBPORT_MINIPORT_INTERFACE) -
%x\n",
- sizeof(USBPORT_MINIPORT_INTERFACE));
-
- DPRINT("USBPORT_RegisterUSBPortDriver: sizeof(USBPORT_DEVICE_EXTENSION) -
%x\n",
- sizeof(USBPORT_DEVICE_EXTENSION));
-
- if (Version < USB10_MINIPORT_INTERFACE_VERSION)
- {
- return STATUS_UNSUCCESSFUL;
- }
-
- if (!USBPORT_Initialized)
- {
- InitializeListHead(&USBPORT_MiniPortDrivers);
- InitializeListHead(&USBPORT_USB1FdoList);
- InitializeListHead(&USBPORT_USB2FdoList);
-
- KeInitializeSpinLock(&USBPORT_SpinLock);
- USBPORT_Initialized = TRUE;
- }
-
- MiniPortInterface = ExAllocatePoolWithTag(NonPagedPool,
- sizeof(USBPORT_MINIPORT_INTERFACE),
- USB_PORT_TAG);
- if (!MiniPortInterface)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- RtlZeroMemory(MiniPortInterface, sizeof(USBPORT_MINIPORT_INTERFACE));
-
- MiniPortInterface->DriverObject = DriverObject;
- MiniPortInterface->DriverUnload = DriverObject->DriverUnload;
- MiniPortInterface->Version = Version;
-
- ExInterlockedInsertTailList(&USBPORT_MiniPortDrivers,
- &MiniPortInterface->DriverLink,
- &USBPORT_SpinLock);
-
- DriverObject->DriverExtension->AddDevice = USBPORT_AddDevice;
- DriverObject->DriverUnload = USBPORT_Unload;
-
- DriverObject->MajorFunction[IRP_MJ_CREATE] = USBPORT_Dispatch;
- DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBPORT_Dispatch;
- DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBPORT_Dispatch;
- DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = USBPORT_Dispatch;
- DriverObject->MajorFunction[IRP_MJ_PNP] = USBPORT_Dispatch;
- DriverObject->MajorFunction[IRP_MJ_POWER] = USBPORT_Dispatch;
- DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = USBPORT_Dispatch;
-
- RegPacket->UsbPortDbgPrint = USBPORT_DbgPrint;
- RegPacket->UsbPortTestDebugBreak = USBPORT_TestDebugBreak;
- RegPacket->UsbPortAssertFailure = USBPORT_AssertFailure;
- RegPacket->UsbPortGetMiniportRegistryKeyValue =
USBPORT_GetMiniportRegistryKeyValue;
- RegPacket->UsbPortInvalidateRootHub = USBPORT_InvalidateRootHub;
- RegPacket->UsbPortInvalidateEndpoint = USBPORT_InvalidateEndpoint;
- RegPacket->UsbPortCompleteTransfer = USBPORT_MiniportCompleteTransfer;
- RegPacket->UsbPortCompleteIsoTransfer = USBPORT_CompleteIsoTransfer;
- RegPacket->UsbPortLogEntry = USBPORT_LogEntry;
- RegPacket->UsbPortGetMappedVirtualAddress = USBPORT_GetMappedVirtualAddress;
- RegPacket->UsbPortRequestAsyncCallback = USBPORT_RequestAsyncCallback;
- RegPacket->UsbPortReadWriteConfigSpace = USBPORT_ReadWriteConfigSpace;
- RegPacket->UsbPortWait = USBPORT_Wait;
- RegPacket->UsbPortInvalidateController = USBPORT_InvalidateController;
- RegPacket->UsbPortBugCheck = USBPORT_BugCheck;
- RegPacket->UsbPortNotifyDoubleBuffer = USBPORT_NotifyDoubleBuffer;
-
- RtlCopyMemory(&MiniPortInterface->Packet,
- RegPacket,
- sizeof(USBPORT_REGISTRATION_PACKET));
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-NTAPI
-DriverEntry(IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING RegistryPath)
-{
- return STATUS_SUCCESS;
-}
Modified: trunk/reactos/drivers/usb/usbport/queue.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbport/queue.…
==============================================================================
--- trunk/reactos/drivers/usb/usbport/queue.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbport/queue.c [iso-8859-1] Sat Sep 2 22:48:45 2017
@@ -531,7 +531,7 @@
PIRP irp;
KIRQL OldIrql;
- DPRINT_CORE("USBPORT_CancelTransferIrp: Irp - %p\n", Irp);
+ DPRINT_CORE("USBPORT_CancelActiveTransferIrp: Irp - %p\n", Irp);
PdoExtension = DeviceObject->DeviceExtension;
FdoDevice = PdoExtension->FdoDevice;
@@ -549,7 +549,7 @@
Transfer = Urb->UrbControlTransfer.hca.Reserved8[0];
Endpoint = Transfer->Endpoint;
- DPRINT_CORE("USBPORT_CancelTransferIrp: irp - %p, Urb - %p, Transfer -
%p\n",
+ DPRINT_CORE("USBPORT_CancelActiveTransferIrp: irp - %p, Urb - %p, Transfer -
%p\n",
irp,
Urb,
Transfer);
Modified: trunk/reactos/drivers/usb/usbport/usbport.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbport/usbpor…
==============================================================================
--- trunk/reactos/drivers/usb/usbport/usbport.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbport/usbport.c [iso-8859-1] Sat Sep 2 22:48:45 2017
@@ -588,7 +588,7 @@
PDEVICE_OBJECT FdoDevice;
PUSBPORT_DEVICE_EXTENSION FdoExtension;
- DPRINT("USBPORT_SoftInterruptDpc: ... \n");
+ DPRINT_INT("USBPORT_SoftInterruptDpc: ... \n");
FdoDevice = DeferredContext;
FdoExtension = FdoDevice->DeviceExtension;
@@ -606,7 +606,7 @@
PUSBPORT_DEVICE_EXTENSION FdoExtension;
LARGE_INTEGER DueTime = {{0, 0}};
- DPRINT("USBPORT_SoftInterrupt: ... \n");
+ DPRINT_INT("USBPORT_SoftInterrupt: ... \n");
FdoExtension = FdoDevice->DeviceExtension;
@@ -1079,7 +1079,8 @@
FdoExtension = FdoDevice->DeviceExtension;
Packet = &FdoExtension->MiniPortInterface->Packet;
- DPRINT_INT("USBPORT_InterruptService: FdoExtension->Flags - %lx\n",
+ DPRINT_INT("USBPORT_InterruptService: FdoExtension[%p]->Flags -
%08X\n",
+ FdoExtension,
FdoExtension->Flags);
if (FdoExtension->Flags & USBPORT_FLAG_INTERRUPT_ENABLED &&
@@ -1936,7 +1937,7 @@
//MiniPortInterface->DriverUnload(DriverObject); // Call MiniPort _HCI_Unload
}
-ULONG
+VOID
NTAPI
USBPORT_MiniportCompleteTransfer(IN PVOID MiniPortExtension,
IN PVOID MiniPortEndpoint,
@@ -1969,18 +1970,7 @@
&Transfer->TransferLink,
&FdoExtension->DoneTransferSpinLock);
- return KeInsertQueueDpc(&FdoExtension->TransferFlushDpc, NULL, NULL);
-}
-
-ULONG
-NTAPI
-USBPORT_CompleteIsoTransfer(IN PVOID MiniPortExtension,
- IN PVOID MiniPortEndpoint,
- IN PVOID TransferParameters,
- IN ULONG TransferLength)
-{
- DPRINT1("USBPORT_CompleteIsoTransfer: UNIMPLEMENTED. FIXME.\n");
- return 0;
+ KeInsertQueueDpc(&FdoExtension->TransferFlushDpc, NULL, NULL);
}
VOID
@@ -2309,7 +2299,7 @@
do
{
- ElementLength = 0x1000 - (PhAddress.LowPart & 0xFFF);
+ ElementLength = PAGE_SIZE - (PhAddress.LowPart & (PAGE_SIZE - 1));
if (ElementLength > SgCurrentLength)
ElementLength = SgCurrentLength;
@@ -2331,9 +2321,9 @@
}
while (SgCurrentLength);
- if ((PhAddr.LowPart == PhAddress.LowPart) &&
- (PhAddr.HighPart == PhAddress.HighPart))
- {
+ if (PhAddr.QuadPart == PhAddress.QuadPart)
+ {
+ DPRINT1("USBPORT_MapTransfer: PhAddr == PhAddress\n");
ASSERT(FALSE);
}
Modified: trunk/reactos/drivers/usb/usbport/usbport.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbport/usbpor…
==============================================================================
--- trunk/reactos/drivers/usb/usbport/usbport.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbport/usbport.h [iso-8859-1] Sat Sep 2 22:48:45 2017
@@ -862,6 +862,22 @@
IN PDEVICE_OBJECT RootHubPdo,
IN PUNICODE_STRING DestinationString);
+/* iso.c */
+USBD_STATUS
+NTAPI
+USBPORT_InitializeIsoTransfer(
+ IN PDEVICE_OBJECT FdoDevice,
+ IN struct _URB_ISOCH_TRANSFER * Urb,
+ IN PUSBPORT_TRANSFER Transfer);
+
+ULONG
+NTAPI
+USBPORT_CompleteIsoTransfer(
+ IN PVOID MiniPortExtension,
+ IN PVOID MiniPortEndpoint,
+ IN PVOID TransferParameters,
+ IN ULONG TransferLength);
+
/* pnp.c */
NTSTATUS
NTAPI
Modified: trunk/reactos/sdk/include/reactos/drivers/usbport/usbmport.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/sdk/include/reactos/driver…
==============================================================================
--- trunk/reactos/sdk/include/reactos/drivers/usbport/usbmport.h [iso-8859-1] (original)
+++ trunk/reactos/sdk/include/reactos/drivers/usbport/usbmport.h [iso-8859-1] Sat Sep 2
22:48:45 2017
@@ -43,7 +43,7 @@
typedef struct _USBPORT_RESOURCES {
ULONG ResourcesTypes;
- ULONG HcFlavor;
+ USB_CONTROLLER_FLAVOR HcFlavor;
ULONG InterruptVector;
KIRQL InterruptLevel;
UCHAR Padded1[3];
@@ -364,7 +364,7 @@
PVOID,
PVOID);
-typedef ULONG
+typedef VOID
(NTAPI *PUSBPORT_COMPLETE_TRANSFER)(
PVOID,
PVOID,
@@ -581,6 +581,8 @@
C_ASSERT(sizeof(USBPORT_MINIPORT_INTERFACE) == 32 + 76 * sizeof(PVOID));
#define USBPORT_TRANSFER_DIRECTION_OUT 1 // From host to device
+#define USBPORT_MAX_DEVICE_ADDRESS 127
+
typedef struct _USBPORT_ENDPOINT_PROPERTIES {
USHORT DeviceAddress;
USHORT EndpointAddress;