[USBEHCI_NEW] Bring-in the USB EHCI miniport driver created by Vadim Galyant. (#301)
[reactos.git] / drivers / usb / usbehci_new / usbehci.h
index fcacb26..d4344fd 100644 (file)
+/*
+ * PROJECT:     ReactOS USB EHCI Miniport Driver
+ * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE:     USBEHCI declarations
+ * COPYRIGHT:   Copyright 2017-2018 Vadim Galyant <vgal@rambler.ru>
+ */
+
 #ifndef USBEHCI_H__
 #define USBEHCI_H__
 
 #include <ntddk.h>
-#define YDEBUG
-#include <debug.h>
+#include <windef.h>
+#include <stdio.h>
 #include <hubbusif.h>
 #include <usbbusif.h>
-#include <usbioctl.h>
-#include <usb.h>
-#include <stdio.h>
-#include <wdmguid.h>
-
-//
-// FIXME:
-// the following includes are required to get kcom to compile
-//
-#include <portcls.h>
-#include <dmusicks.h>
-#include <kcom.h>
-
-#include "interfaces.h"
-
-typedef struct
-{
-    BOOLEAN IsFDO;                                               // is device a FDO or PDO
-    BOOLEAN IsHub;                                               // is device a hub / child - not yet used
-    union
-    {
-        PHCDCONTROLLER HcdController;                            // hcd controller
-        PHUBCONTROLLER HubController;                            // hub controller
-    };
-}COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
-
-
-//
-// assert for c++ - taken from portcls
-//
-#define PC_ASSERT(exp) \
-  (VOID)((!(exp)) ? \
-    RtlAssert((PVOID) #exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
-
-//
-// hcd_controller.cpp
-//
-NTSTATUS CreateHCDController(PHCDCONTROLLER *HcdController);
-
-//
-// hardware.cpp
-//
-NTSTATUS CreateUSBHardware(PUSBHARDWAREDEVICE *OutHardware);
-
-//
-// misc.cpp
-//
-NTSTATUS NTAPI SyncForwardIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+#include <usbdlib.h>
+#include <drivers/usbport/usbmport.h>
+#include "hardware.h"
+
+extern USBPORT_REGISTRATION_PACKET RegPacket;
+
+#define EHCI_MAX_CONTROL_TRANSFER_SIZE    0x10000
+#define EHCI_MAX_INTERRUPT_TRANSFER_SIZE  0x1000
+#define EHCI_MAX_BULK_TRANSFER_SIZE       0x400000
+#define EHCI_MAX_FS_ISO_TRANSFER_SIZE     0x40000
+#define EHCI_MAX_HS_ISO_TRANSFER_SIZE     0x180000
+
+#define EHCI_MAX_FS_ISO_HEADER_BUFFER_SIZE  0x1000
+#define EHCI_MAX_HS_ISO_HEADER_BUFFER_SIZE  0x40000
+
+#define EHCI_MAX_CONTROL_TD_COUNT    6
+#define EHCI_MAX_INTERRUPT_TD_COUNT  4
+#define EHCI_MAX_BULK_TD_COUNT       209
+
+#define EHCI_FRAMES       32
+#define EHCI_MICROFRAMES  8
+
+#define EHCI_MAX_HC_SYSTEM_ERRORS  256
+
+typedef struct _EHCI_PERIOD {
+  UCHAR Period;
+  UCHAR PeriodIdx;
+  UCHAR ScheduleMask;
+} EHCI_PERIOD, *PEHCI_PERIOD;
+
+/* Transfer Descriptor */
+#define EHCI_HCD_TD_FLAG_ALLOCATED 0x01
+#define EHCI_HCD_TD_FLAG_PROCESSED 0x02
+#define EHCI_HCD_TD_FLAG_DONE      0x08
+#define EHCI_HCD_TD_FLAG_ACTIVE    0x10
+#define EHCI_HCD_TD_FLAG_DUMMY     0x20
+
+struct _EHCI_HCD_QH;
+struct _EHCI_ENDPOINT;
+struct _EHCI_TRANSFER;
+
+typedef struct _EHCI_HCD_TD {
+  /* Hardware*/
+  EHCI_QUEUE_TD HwTD;
+  /* Software */
+  ULONG PhysicalAddress;
+  ULONG TdFlags;
+  struct _EHCI_ENDPOINT * EhciEndpoint;
+  struct _EHCI_TRANSFER * EhciTransfer;
+  struct _EHCI_HCD_TD * NextHcdTD;
+  struct _EHCI_HCD_TD * AltNextHcdTD;
+  USB_DEFAULT_PIPE_SETUP_PACKET SetupPacket;
+  ULONG LengthThisTD;
+  LIST_ENTRY DoneLink;
+#ifdef _WIN64
+  ULONG Pad[31];
+#else
+  ULONG Pad[40];
+#endif
+} EHCI_HCD_TD, *PEHCI_HCD_TD;
+
+C_ASSERT(sizeof(EHCI_HCD_TD) == 0x100);
 
+/* Queue Head */
+#define EHCI_QH_FLAG_IN_SCHEDULE  0x01
+#define EHCI_QH_FLAG_CLOSED       0x02
+#define EHCI_QH_FLAG_STATIC       0x04
+#define EHCI_QH_FLAG_STATIC_FAST  0x08
+#define EHCI_QH_FLAG_UPDATING     0x10
+#define EHCI_QH_FLAG_NUKED        0x20
+
+typedef struct _EHCI_STATIC_QH {
+  /* Hardware part */
+  EHCI_QUEUE_HEAD HwQH;
+  /* Software part */
+  ULONG QhFlags;
+  ULONG PhysicalAddress;
+  struct _EHCI_HCD_QH * PrevHead;
+#ifndef _WIN64
+  ULONG Pad2;
+#endif
+  struct _EHCI_HCD_QH * NextHead;
+#ifndef _WIN64
+  ULONG Pad3;
 #endif
+  struct _EHCI_STATIC_QH * StaticQH;
+#ifndef _WIN64
+  ULONG Pad4;
+#endif
+  ULONG Period;
+  ULONG Ordinal;
+#ifdef _WIN64
+  ULONG Pad[11];
+#else
+  ULONG Pad[13];
+#endif
+} EHCI_STATIC_QH, *PEHCI_STATIC_QH;
+
+C_ASSERT(sizeof(EHCI_STATIC_QH) == 0xA0);
+
+#define EHCI_DUMMYQH_MAX_PACKET_LENGTH  64
+
+typedef struct _EHCI_HCD_QH {
+  EHCI_STATIC_QH sqh;
+#ifdef _WIN64
+  ULONG Pad[23];
+#else
+  ULONG Pad[24];
+#endif
+} EHCI_HCD_QH, *PEHCI_HCD_QH;
+
+C_ASSERT(sizeof(EHCI_HCD_QH) == 0x100);
+
+/* EHCI Endpoint follows USBPORT Endpoint */
+typedef struct _EHCI_ENDPOINT {
+  ULONG Reserved;
+  ULONG EndpointStatus;
+  ULONG EndpointState;
+  USBPORT_ENDPOINT_PROPERTIES EndpointProperties;
+  PVOID DmaBufferVA;
+  ULONG DmaBufferPA;
+  PEHCI_HCD_TD FirstTD;
+  ULONG MaxTDs;
+  ULONG PendingTDs;
+  ULONG RemainTDs;
+  PEHCI_HCD_QH QH;
+  PEHCI_HCD_TD HcdHeadP;
+  PEHCI_HCD_TD HcdTailP;
+  LIST_ENTRY ListTDs;
+  const EHCI_PERIOD * PeriodTable;
+  PEHCI_STATIC_QH StaticQH;
+} EHCI_ENDPOINT, *PEHCI_ENDPOINT;
+
+/* EHCI Transfer follows USBPORT Transfer */
+typedef struct _EHCI_TRANSFER {
+  ULONG Reserved;
+  PUSBPORT_TRANSFER_PARAMETERS TransferParameters;
+  ULONG USBDStatus;
+  ULONG TransferLen;
+  PEHCI_ENDPOINT EhciEndpoint;
+  ULONG PendingTDs;
+  ULONG TransferOnAsyncList;
+} EHCI_TRANSFER, *PEHCI_TRANSFER;
+
+typedef struct _EHCI_HC_RESOURCES {
+  ULONG PeriodicFrameList[EHCI_FRAME_LIST_MAX_ENTRIES]; // 4K-page aligned array
+  EHCI_STATIC_QH AsyncHead;
+  EHCI_STATIC_QH PeriodicHead[64];
+  UCHAR Padded[0x160];
+  EHCI_HCD_QH IsoDummyQH[EHCI_FRAME_LIST_MAX_ENTRIES];
+} EHCI_HC_RESOURCES, *PEHCI_HC_RESOURCES;
+
+#define EHCI_FLAGS_CONTROLLER_SUSPEND 0x01
+#define EHCI_FLAGS_IDLE_SUPPORT       0x20
+
+/* EHCI Extension follows USBPORT Extension */
+typedef struct _EHCI_EXTENSION {
+  ULONG Reserved;
+  ULONG Flags;
+  PEHCI_HC_CAPABILITY_REGISTERS CapabilityRegisters;
+  PEHCI_HW_REGISTERS OperationalRegs;
+  UCHAR FrameLengthAdjustment;
+  BOOLEAN IsStarted;
+  USHORT HcSystemErrors;
+  ULONG PortRoutingControl;
+  USHORT NumberOfPorts;
+  USHORT PortPowerControl;
+  EHCI_INTERRUPT_ENABLE InterruptMask;
+  EHCI_INTERRUPT_ENABLE InterruptStatus;
+  /* Schedule */
+  PEHCI_HC_RESOURCES HcResourcesVA;
+  ULONG HcResourcesPA;
+  PEHCI_STATIC_QH AsyncHead;
+  PEHCI_STATIC_QH PeriodicHead[64];
+  PEHCI_HCD_QH IsoDummyQHListVA;
+  ULONG IsoDummyQHListPA;
+  ULONG FrameIndex;
+  ULONG FrameHighPart;
+  /* Root Hub Bits */
+  ULONG ConnectPortBits;
+  ULONG SuspendPortBits;
+  ULONG ResetPortBits;
+  ULONG FinishResetPortBits;
+  /* Transfers */
+  ULONG PendingTransfers;
+  /* Lock Queue */
+  PEHCI_HCD_QH PrevQH;
+  PEHCI_HCD_QH LockQH;
+  PEHCI_HCD_QH NextQH;
+  /* Registers Copy Backup */
+  ULONG BackupPeriodiclistbase;
+  ULONG BackupAsynclistaddr;
+  ULONG BackupCtrlDSSegment;
+  ULONG BackupUSBCmd;
+} EHCI_EXTENSION, *PEHCI_EXTENSION;
+
+/* debug.c */
+VOID
+NTAPI
+EHCI_DumpHwTD(
+  IN PEHCI_HCD_TD TD);
+
+VOID
+NTAPI
+EHCI_DumpHwQH(
+  IN PEHCI_HCD_QH QH);
+
+/* roothub.c */
+MPSTATUS
+NTAPI
+EHCI_RH_ChirpRootPort(
+  IN PVOID ehciExtension,
+  IN USHORT Port);
+
+VOID
+NTAPI
+EHCI_RH_GetRootHubData(
+  IN PVOID ohciExtension,
+  IN PVOID rootHubData);
+
+MPSTATUS
+NTAPI
+EHCI_RH_GetStatus(
+  IN PVOID ohciExtension,
+  IN PUSHORT Status);
+
+MPSTATUS
+NTAPI
+EHCI_RH_GetPortStatus(
+  IN PVOID ohciExtension,
+  IN USHORT Port,
+  IN PUSB_PORT_STATUS_AND_CHANGE PortStatus);
+
+MPSTATUS
+NTAPI
+EHCI_RH_GetHubStatus(
+  IN PVOID ohciExtension,
+  IN PUSB_HUB_STATUS_AND_CHANGE HubStatus);
+
+MPSTATUS
+NTAPI
+EHCI_RH_SetFeaturePortReset(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_SetFeaturePortPower(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_SetFeaturePortEnable(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_SetFeaturePortSuspend(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_ClearFeaturePortEnable(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_ClearFeaturePortPower(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_ClearFeaturePortSuspend(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_ClearFeaturePortEnableChange(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_ClearFeaturePortConnectChange(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_ClearFeaturePortResetChange(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_ClearFeaturePortSuspendChange(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+MPSTATUS
+NTAPI
+EHCI_RH_ClearFeaturePortOvercurrentChange(
+  IN PVOID ohciExtension,
+  IN USHORT Port);
+
+VOID
+NTAPI
+EHCI_RH_DisableIrq(
+  IN PVOID ohciExtension);
+
+VOID
+NTAPI
+EHCI_RH_EnableIrq(
+  IN PVOID ohciExtension);
+
+#endif /* USBEHCI_H__ */