[USBHUB]
[reactos.git] / reactos / drivers / usb / usbhub / usbhub.h
index a30a303..b0d2b94 100644 (file)
@@ -1,15 +1,14 @@
-#include <ntddk.h>
+#pragma once
+
+#include <wdm.h>
 #include <hubbusif.h>
 #include <usbbusif.h>
-#include <usbioctl.h>
-#include <usb.h>
-#include <debug.h>
-//BROKEN: #include <usbprotocoldefs.h>
+#include <usbdlib.h>
 
 #define USB_HUB_TAG 'hbsu'
 #define USB_MAXCHILDREN 127
 
-/* Lifted from broken header above */
+// Lifted from broken header above
 #define C_HUB_LOCAL_POWER                    0
 #define C_HUB_OVER_CURRENT                   1
 #define PORT_CONNECTION                      0
 #define PORT_TEST                            21
 #define PORT_INDICATOR                       22
 
-typedef struct _USB_ENDPOINT
+typedef struct _PORT_STATUS_CHANGE
 {
-    ULONG Flags;
-    LIST_ENTRY  UrbList;
-    struct _USB_INTERFACE *Interface;
-    USB_ENDPOINT_DESCRIPTOR EndPointDescriptor;
-} USB_ENDPOINT, *PUSB_ENDPOINT;
+    USHORT Status;
+    USHORT Change;
+} PORT_STATUS_CHANGE, *PPORT_STATUS_CHANGE;
 
-typedef struct _USB_INTERFACE
+typedef struct _WORK_ITEM_DATA
 {
-    struct _USB_CONFIGURATION *Config;
-    USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
-    USB_ENDPOINT *EndPoints[];
-} USB_INTERFACE, *PUSB_INTERFACE;
+    WORK_QUEUE_ITEM WorkItem;
+    PVOID Context;
+} WORK_ITEM_DATA, *PWORK_ITEM_DATA;
 
-typedef struct _USB_CONFIGURATION
+typedef struct
 {
-    struct _USB_DEVICE *Device;
-    USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor;
-    USB_INTERFACE *Interfaces[];
-} USB_CONFIGURATION, *PUSB_CONFIGURATION;
+    BOOLEAN IsFDO;
+} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
 
-typedef struct _USB_DEVICE
+typedef struct _HUB_CHILDDEVICE_EXTENSION
 {
-    UCHAR Address;
-    ULONG Port;
-    PVOID ParentDevice;
-    BOOLEAN IsHub;
-    USB_DEVICE_SPEED DeviceSpeed;
-    USB_DEVICE_TYPE DeviceType;
-    USB_DEVICE_DESCRIPTOR DeviceDescriptor;
-    USB_CONFIGURATION *ActiveConfig;
-    USB_INTERFACE *ActiveInterface;
-    USB_CONFIGURATION **Configs;
-
-} USB_DEVICE, *PUSB_DEVICE;
+    COMMON_DEVICE_EXTENSION Common;
+    PDEVICE_OBJECT ParentDeviceObject;
+    PUSB_DEVICE_HANDLE UsbDeviceHandle;
+    ULONG PortNumber;
+    UNICODE_STRING usDeviceId;
+    UNICODE_STRING usInstanceId;
+    UNICODE_STRING usHardwareIds;
+    UNICODE_STRING usCompatibleIds;
+    UNICODE_STRING usTextDescription;
+    UNICODE_STRING usLocationInformation;
+    USB_DEVICE_DESCRIPTOR DeviceDesc;
+    PUSB_CONFIGURATION_DESCRIPTOR FullConfigDesc;
+    UNICODE_STRING SymbolicLinkName;
+    USB_BUS_INTERFACE_USBDI_V2 DeviceInterface;
+    USB_DEVICE_INFORMATION_0 DeviceInformation;
+} HUB_CHILDDEVICE_EXTENSION, *PHUB_CHILDDEVICE_EXTENSION;
 
 typedef struct _HUB_DEVICE_EXTENSION
 {
-       BOOLEAN IsFDO;
-       USB_DEVICE* dev;
-       PDEVICE_OBJECT LowerDevice;
+    COMMON_DEVICE_EXTENSION Common;
+    PDEVICE_OBJECT LowerDeviceObject;
     ULONG ChildCount;
-       PDEVICE_OBJECT Children[USB_MAXCHILDREN];
+    PDEVICE_OBJECT ChildDeviceObject[USB_MAXCHILDREN];
+    PDEVICE_OBJECT RootHubPhysicalDeviceObject;
+    PDEVICE_OBJECT RootHubFunctionalDeviceObject;
 
-    PUSB_DEVICE RootHubUsbDevice;
+    ULONG NumberOfHubs;
+    KEVENT ResetComplete;
 
-    PDEVICE_OBJECT RootHubPdo;
-    PDEVICE_OBJECT RootHubFdo;
-
-    ULONG HubCount;
-
-    ULONG PortStatus[256];
+    PORT_STATUS_CHANGE *PortStatusChange;
+    URB PendingSCEUrb;
+    PIRP PendingSCEIrp;
 
     USB_BUS_INTERFACE_HUB_V5 HubInterface;
     USB_BUS_INTERFACE_USBDI_V2 UsbDInterface;
 
     USB_HUB_DESCRIPTOR HubDescriptor;
     USB_DEVICE_DESCRIPTOR HubDeviceDescriptor;
-
     USB_CONFIGURATION_DESCRIPTOR HubConfigDescriptor;
     USB_INTERFACE_DESCRIPTOR HubInterfaceDescriptor;
     USB_ENDPOINT_DESCRIPTOR HubEndPointDescriptor;
@@ -96,70 +92,96 @@ typedef struct _HUB_DEVICE_EXTENSION
 
     USBD_CONFIGURATION_HANDLE ConfigurationHandle;
     USBD_PIPE_HANDLE PipeHandle;
-    /* Fields valid only when IsFDO == FALSE */
-    UNICODE_STRING DeviceId;          // REG_SZ
-    UNICODE_STRING InstanceId;        // REG_SZ
-    UNICODE_STRING HardwareIds;       // REG_MULTI_SZ
-    UNICODE_STRING CompatibleIds;     // REG_MULTI_SZ
+    PVOID RootHubHandle;
+    USB_BUS_INTERFACE_USBDI_V2 DeviceInterface;
+
     UNICODE_STRING SymbolicLinkName;
+    ULONG InstanceCount;
+
 } HUB_DEVICE_EXTENSION, *PHUB_DEVICE_EXTENSION;
 
-/* createclose.c */
+// createclose.c
 NTSTATUS NTAPI
-UsbhubCreate(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp);
+USBHUB_Create(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
 
 NTSTATUS NTAPI
-UsbhubClose(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp);
+USBHUB_Close(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
 
 NTSTATUS NTAPI
-UsbhubCleanup(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp);
+USBHUB_Cleanup(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
 
-/* fdo.c */
-NTSTATUS NTAPI
-UsbhubPnpFdo(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp);
+// fdo.c
+NTSTATUS
+USBHUB_FdoHandleDeviceControl(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
 
 NTSTATUS
-UsbhubDeviceControlFdo(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp);
+USBHUB_FdoHandlePnp(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
 
-/* misc.c */
+// misc.c
 NTSTATUS
 ForwardIrpAndWait(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp);
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
 
-NTSTATUS NTAPI
+NTSTATUS
 ForwardIrpAndForget(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp);
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);
 
 NTSTATUS
-UsbhubDuplicateUnicodeString(
-       OUT PUNICODE_STRING Destination,
-       IN PUNICODE_STRING Source,
-       IN POOL_TYPE PoolType);
+SubmitRequestToRootHub(
+    IN PDEVICE_OBJECT RootHubDeviceObject,
+    IN ULONG IoControlCode,
+    OUT PVOID OutParameter1,
+    OUT PVOID OutParameter2);
 
 NTSTATUS
-UsbhubInitMultiSzString(
-       OUT PUNICODE_STRING Destination,
-       ... /* list of PCSZ */);
+FDO_QueryInterface(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN OUT PUSB_BUS_INTERFACE_USBDI_V2 Interface);
 
-/* pdo.c */
-NTSTATUS NTAPI
-UsbhubPnpPdo(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp);
+// pdo.c
+NTSTATUS
+USBHUB_PdoHandlePnp(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
+
+NTSTATUS
+USBHUB_PdoHandleInternalDeviceControl(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
+
+VOID
+DumpDeviceDescriptor(
+    PUSB_DEVICE_DESCRIPTOR DeviceDescriptor);
+
+VOID
+DumpConfigurationDescriptor(
+    PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
+
+VOID
+DumpFullConfigurationDescriptor(
+    PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
+
+NTSTATUS
+GetPortStatusAndChange(
+    IN PDEVICE_OBJECT RootHubDeviceObject,
+    IN ULONG PortId,
+    OUT PPORT_STATUS_CHANGE StatusChange);
+
+// hub_fdo.c
 
 NTSTATUS
-UsbhubInternalDeviceControlPdo(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp);
+USBHUB_ParentFDOStartDevice(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN PIRP Irp);