/*++ Copyright (c) 1999 Microsoft Corporation Module Name: usbohci.h Abstract: Environment: Kernel & user mode Revision History: 5-10-96 : created --*/ #ifndef __OHCI_H__ #define __OHCI_H__ #define OHCI_COMMON_BUFFER_SIZE (sizeof(HCCA_BLOCK)+\ NO_ED_LISTS*sizeof(HW_ENDPOINT_DESCRIPTOR) +\ (17*2)*sizeof(HCD_ENDPOINT_DESCRIPTOR)) /* Registry Keys */ // Software Branch PDO Keys #define SOF_MODIFY_KEY L"recommendedClocksPerFrame" // Hardware Branch PDO Keys /* define resource consumption for endpoints types */ #define T_256K 0x40000 #define T_128K 0x20000 #define T_64K 0x10000 #define T_4K 0x1000 // Control: // largest possible transfer for control is 64k // therefore we support up to 2 transfers of this // size in HW. Most control transfers are much // smaller than this. // NOTE: we MUST support at least one 64k transfer in // HW since a single control transfer cannot be // broken up. #define MAX_CONTROL_TRANSFER_SIZE T_64K // worst case 64k control transfer 17 + status and // setup TD = 19 (*2 transfers) #define TDS_PER_CONTROL_ENDPOINT 38 // Bulk: // The most data we can move in a ms is 1200 bytes. // we support two 64k transfers queued to HW at a // a time -- we should be able to keep the bus busy // with this. // NOTE: in a memory constrained system we can shrink // this value, our max transfer size should always be // at half the # of TDs available #define MAX_BULK_TRANSFER_SIZE T_256K // enough for 4 64 xfers, 2 128k or 1 256k #define TDS_PER_BULK_ENDPOINT 68 // Iso: #define MAX_ISO_TRANSFER_SIZE T_64K #define TDS_PER_ISO_ENDPOINT 64 // Interrupt: #define MAX_INTERRUPT_TRANSFER_SIZE T_4K #define TDS_PER_INTERRUPT_ENDPOINT 4 #undef PDEVICE_DATA // Values for DeviceData.Flags #define HMP_FLAG_SOF_MODIFY_VALUE 0x00000001 #define HMP_FLAG_SUSPENDED 0x00000002 //** flags for ED HC_STATIC_ED_DATA & HCD_ENDPOINT_DESCRIPTOR //* these define the type of ED #define EDFLAG_CONTROL 0x00000001 #define EDFLAG_BULK 0x00000002 #define EDFLAG_INTERRUPT 0x00000004 //* // these define ed charateristics and state #define EDFLAG_NOHALT 0x00000008 #define EDFLAG_REMOVED 0x00000010 #define EDFLAG_REGISTER 0x00000020 typedef struct _HC_STATIC_ED_DATA { // virtual address of static ED PHW_ENDPOINT_DESCRIPTOR HwED; // physical address of next ED HW_32BIT_PHYSICAL_ADDRESS HwEDPhys; // index in the static ED list for the // next ED in the interrupt tree CHAR NextIdx; // list of 'real EDs' associated // with this static ED LIST_ENTRY TransferEdList; // Use EDFLAG_ ULONG EdFlags; // this is either an HC register or the address of the entry // in the HCCA area corresponding to the 'physical address' // of the first ed in the list // // in the case of control and bulk the physical head will be 0 // or point to timing delay 'dummy EDs' // // in the case of interrupt the physical head will be a static // ED in the onterrupt 'tree' PULONG PhysicalHead; ULONG AllocatedBandwidth; ULONG HccaOffset; } HC_STATIC_ED_DATA, *PHC_STATIC_ED_DATA; // // These values index in to the static ED list // #define ED_INTERRUPT_1ms 0 #define ED_INTERRUPT_2ms 1 #define ED_INTERRUPT_4ms 3 #define ED_INTERRUPT_8ms 7 #define ED_INTERRUPT_16ms 15 #define ED_INTERRUPT_32ms 31 #define ED_CONTROL 63 #define ED_BULK 64 #define ED_ISOCHRONOUS 0 // same as 1ms interrupt queue #define NO_ED_LISTS 65 #define ED_EOF 0xff // #define SIG_HCD_DUMMY_ED 'deYD' #define SIG_HCD_ED 'deYH' #define SIG_HCD_TD 'dtYH' #define SIG_EP_DATA 'peYH' #define SIG_OHCI_TRANSFER 'rtYH' #define SIG_OHCI_DD 'icho' typedef struct _DEVICE_DATA { ULONG Sig; ULONG Flags; PHC_OPERATIONAL_REGISTER HC; HC_FM_INTERVAL BIOS_Interval; ULONG SofModifyValue; ULONG FrameHighPart; ULONG NumberOfPorts; PHCCA_BLOCK HcHCCA; HW_32BIT_PHYSICAL_ADDRESS HcHCCAPhys; PUCHAR StaticEDs; HW_32BIT_PHYSICAL_ADDRESS StaticEDsPhys; USB_CONTROLLER_FLAVOR ControllerFlavor; ULONG LastDeadmanFrame; struct _HCD_ENDPOINT_DESCRIPTOR *HydraLsHsHackEd; HC_STATIC_ED_DATA StaticEDList[NO_ED_LISTS]; } DEVICE_DATA, *PDEVICE_DATA; #define TC_FLAGS_SHORT_XFER_OK 0x00000001 #define TC_FLAGS_SHORT_XFER_DONE 0x00000002 typedef struct _TRANSFER_CONTEXT { ULONG Sig; ULONG BytesTransferred; PTRANSFER_PARAMETERS TransferParameters; ULONG PendingTds; ULONG TcFlags; USBD_STATUS UsbdStatus; // first TD of the next transfer in the chain struct _HCD_TRANSFER_DESCRIPTOR *NextXferTd; struct _HCD_TRANSFER_DESCRIPTOR *StatusTd; struct _ENDPOINT_DATA *EndpointData; PMINIPORT_ISO_TRANSFER IsoTransfer; } TRANSFER_CONTEXT, *PTRANSFER_CONTEXT; // HCD Endpoint Descriptor (contains the HW descriptor) // #define ENDPOINT_DATA_PTR(p) ((struct _ENDPOINT_DATA *) (p).Pointer) typedef struct _HCD_ENDPOINT_DESCRIPTOR { HW_ENDPOINT_DESCRIPTOR HwED; // make Physical Address the same as in HCD_TRANSFER_DESCRIPTOR ULONG Pad4[4]; HW_32BIT_PHYSICAL_ADDRESS PhysicalAddress; ULONG Sig; ULONG EdFlags; //use EDFLAG_ ULONG Win64Pad; MP_HW_POINTER EndpointData; MP_HW_LIST_ENTRY SwLink; ULONG PadTo128[14]; } HCD_ENDPOINT_DESCRIPTOR, *PHCD_ENDPOINT_DESCRIPTOR; C_ASSERT((sizeof(HCD_ENDPOINT_DESCRIPTOR) == 128)); // // HCD Transfer Descriptor (contains the HW descriptor) // #define TD_FLAG_BUSY 0x00000001 #define TD_FLAG_XFER 0x00000002 #define TD_FLAG_CONTROL_STATUS 0x00000004 #define TD_FLAG_DONE 0x00000008 #define TD_FLAG_SKIP 0x00000010 #define TRANSFER_CONTEXT_PTR(p) ((struct _TRANSFER_CONTEXT *) (p).Pointer) #define TRANSFER_DESCRIPTOR_PTR(p) ((struct _HCD_TRANSFER_DESCRIPTOR *) (p).Pointer) #define HW_TRANSFER_DESCRIPTOR_PTR(p) ((struct _HW_TRANSFER_DESCRIPTOR *) (p).Pointer) #define HW_DATA_PTR(p) ((PVOID) (p).Pointer) typedef struct _HCD_TRANSFER_DESCRIPTOR { HW_TRANSFER_DESCRIPTOR HwTD; HW_32BIT_PHYSICAL_ADDRESS PhysicalAddress; ULONG Sig; ULONG Flags; ULONG TransferCount; MP_HW_POINTER EndpointData; MP_HW_POINTER TransferContext; MP_HW_POINTER NextHcdTD; ULONG FrameIndex; LIST_ENTRY DoneLink; #ifdef _WIN64 ULONG PadTo128[8]; #else ULONG PadTo128[11]; #endif } HCD_TRANSFER_DESCRIPTOR, *PHCD_TRANSFER_DESCRIPTOR; C_ASSERT((sizeof(HCD_TRANSFER_DESCRIPTOR) == 128)); typedef struct _SS_PACKET_CONTEXT { ULONG PhysHold; MP_HW_POINTER Td; MP_HW_POINTER Data; ULONG PadTo8Dwords[3]; } SS_PACKET_CONTEXT, *PSS_PACKET_CONTEXT; typedef struct _HCD_TD_LIST { HCD_TRANSFER_DESCRIPTOR Td[1]; } HCD_TD_LIST, *PHCD_TD_LIST; //#define EPF_HAVE_TRANSFER 0x00000001 //#define EPF_REQUEST_PAUSE 0x00000002 typedef struct _ENDPOINT_DATA { ULONG Sig; ENDPOINT_PARAMETERS Parameters; ULONG Flags; // USHORT MaxPendingTransfers; USHORT PendingTransfers; PHC_STATIC_ED_DATA StaticEd; PHCD_TD_LIST TdList; PHCD_ENDPOINT_DESCRIPTOR HcdEd; ULONG TdCount; ULONG PendingTds; PHCD_TRANSFER_DESCRIPTOR HcdTailP; PHCD_TRANSFER_DESCRIPTOR HcdHeadP; LIST_ENTRY DoneTdList; } ENDPOINT_DATA, *PENDPOINT_DATA; /* Callouts to port driver services */ extern USBPORT_REGISTRATION_PACKET RegistrationPacket; #define USBPORT_DBGPRINT(dd, l, f, arg0, arg1, arg2, arg3, arg4, arg5) \ RegistrationPacket.USBPORTSVC_DbgPrint((dd), (l), (f), (arg0), (arg1), \ (arg2), (arg3), (arg4), (arg5)) #define USBPORT_GET_REGISTRY_KEY_VALUE(dd, branch, keystring, keylen, data, datalen) \ RegistrationPacket.USBPORTSVC_GetMiniportRegistryKeyValue((dd), (branch), \ (keystring), (keylen), (data), (datalen)) #define USBPORT_INVALIDATE_ROOTHUB(dd) \ RegistrationPacket.USBPORTSVC_InvalidateRootHub((dd)); #define USBPORT_COMPLETE_TRANSFER(dd, ep, t, status, length) \ RegistrationPacket.USBPORTSVC_CompleteTransfer((dd), (ep), (t), \ (status), (length)); #define USBPORT_COMPLETE_ISO_TRANSFER(dd, ep, t, iso) \ RegistrationPacket.USBPORTSVC_CompleteIsoTransfer((dd), (ep), (t), \ (iso)); #define USBPORT_INVALIDATE_ENDPOINT(dd, ep) \ RegistrationPacket.USBPORTSVC_InvalidateEndpoint((dd), (ep)); #define USBPORT_INVALIDATE_CONTROLLER(dd, s) \ RegistrationPacket.USBPORTSVC_InvalidateController((dd), (s)) #define USBPORT_PHYSICAL_TO_VIRTUAL(addr, dd, ep) \ RegistrationPacket.USBPORTSVC_MapHwPhysicalToVirtual((addr), (dd), (ep)); #define USBPORT_RW_CONFIG_SPACE(dd, read, buffer, offset, length) \ RegistrationPacket.USBPORTSVC_ReadWriteConfigSpace((dd), (read), \ (buffer), (offset), (length)) #define USBPORT_BUGCHECK(dd) \ RegistrationPacket.USBPORTSVC_BugCheck(dd) #define INITIALIZE_TD_FOR_TRANSFER(td, tc) \ { ULONG i;\ TRANSFER_CONTEXT_PTR((td)->TransferContext) = (tc);\ SET_FLAG((td)->Flags, TD_FLAG_XFER); \ (td)->HwTD.CBP = 0xbaadf00d;\ (td)->HwTD.BE = 0xf00dbaad;\ (td)->HwTD.NextTD = 0;\ (td)->HwTD.Asy.IntDelay = HcTDIntDelay_NoInterrupt;\ TRANSFER_DESCRIPTOR_PTR((td)->NextHcdTD) = NULL;\ for (i=0; i<8; i++) {\ (td)->HwTD.Packet[i].PSW = 0;\ }\ } #define SET_NEXT_TD(linkTd, nextTd) \ (linkTd)->HwTD.NextTD = (nextTd)->PhysicalAddress;\ TRANSFER_DESCRIPTOR_PTR((linkTd)->NextHcdTD) = (nextTd); #define SET_NEXT_TD_NULL(linkTd) \ TRANSFER_DESCRIPTOR_PTR((linkTd)->NextHcdTD) = NULL;\ (linkTd)->HwTD.NextTD = 0; #ifdef _WIN64 #define FREE_TD_CONTEXT ((PVOID) 0xDEADFACEDEADFACE) #else #define FREE_TD_CONTEXT ((PVOID) 0xDEADFACE) #endif #define OHCI_FREE_TD(dd, ep, td) \ (td)->Flags = 0;\ (td)->HwTD.NextTD = 0;\ TRANSFER_CONTEXT_PTR((td)->TransferContext) = FREE_TD_CONTEXT;\ (td)->DoneLink.Flink = NULL;\ (td)->DoneLink.Blink = NULL; #define OHCI_ALLOC_TD OHCI_AllocTd // assuming only one bit is set this macro returns that bit // #define GET_BIT_SET(d, bit) \ { \ UCHAR tmp = (d);\ (bit)=0; \ while (!(tmp & 0x01)) {\ (bit)++;\ tmp >>= 1;\ };\ } VOID OHCI_EnableList( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); PHCD_TRANSFER_DESCRIPTOR OHCI_AllocTd( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS OHCI_SubmitTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferParameters, PTRANSFER_CONTEXT TransferContext, PTRANSFER_SG_LIST TransferSGList ); ULONG OHCI_MapAsyncTransferToTd( PDEVICE_DATA DeviceData, ULONG MaxPacketSize, ULONG LengthMapped, PTRANSFER_CONTEXT TransferContext, PHCD_TRANSFER_DESCRIPTOR Td, PTRANSFER_SG_LIST SgList ); USB_MINIPORT_STATUS OHCI_OpenEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); MP_ENDPOINT_STATE OHCI_GetEndpointState( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID OHCI_SetEndpointState( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, MP_ENDPOINT_STATE State ); VOID OHCI_CheckController( PDEVICE_DATA DeviceData ); BOOLEAN OHCI_HardwarePresent( PDEVICE_DATA DeviceData, BOOLEAN Notify ); VOID OHCI_ResetController( PDEVICE_DATA DeviceData ); USB_MINIPORT_STATUS USBMPFN OHCI_StartController( PDEVICE_DATA DeviceData, PHC_RESOURCES HcResources ); BOOLEAN OHCI_InterruptService ( PDEVICE_DATA DeviceData ); USB_MINIPORT_STATUS OHCI_RH_GetPortStatus( PDEVICE_DATA DeviceData, USHORT PortNumber, PRH_PORT_STATUS portStatus ); USB_MINIPORT_STATUS OHCI_RH_SetFeaturePortReset( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS OHCI_RH_SetFeaturePortSuspend( PDEVICE_DATA DeviceData, USHORT PortNumber ); VOID OHCI_RH_GetRootHubData( PDEVICE_DATA DeviceData, PROOTHUB_DATA HubData ); USB_MINIPORT_STATUS OHCI_RH_GetStatus( PDEVICE_DATA DeviceData, PUSHORT Status ); USB_MINIPORT_STATUS OHCI_RH_ClearFeaturePortEnable( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS OHCI_RH_ClearFeaturePortPower( PDEVICE_DATA DeviceData, USHORT PortNumber ); VOID OHCI_RH_DisableIrq( PDEVICE_DATA DeviceData ); VOID OHCI_RH_EnableIrq( PDEVICE_DATA DeviceData ); VOID OHCI_InterruptDpc ( PDEVICE_DATA DeviceData, BOOLEAN EnableInterrupts ); USB_MINIPORT_STATUS OHCI_RH_ClearFeaturePortEnableChange( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS OHCI_RH_ClearFeaturePortConnectChange( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS OHCI_RH_ClearFeaturePortResetChange( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS OHCI_RH_GetHubStatus( PDEVICE_DATA DeviceData, PRH_HUB_STATUS HubStatus ); USB_MINIPORT_STATUS OHCI_RH_SetFeaturePortPower( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS OHCI_RH_SetFeaturePortEnable( PDEVICE_DATA DeviceData, USHORT PortNumber ); VOID OHCI_QueryEndpointRequirements( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_REQUIREMENTS EndpointRequirements ); VOID OHCI_CloseEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID OHCI_PollEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS OHCI_ControlTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferParameters, PTRANSFER_CONTEXT TransferContext, PTRANSFER_SG_LIST TransferSGList ); VOID OHCI_ProcessDoneAsyncTd( PDEVICE_DATA DeviceData, PHCD_TRANSFER_DESCRIPTOR Td, BOOLEAN CompleteTransfer ); USB_MINIPORT_STATUS OHCI_PokeEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS OHCI_BulkOrInterruptTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferParameters, PTRANSFER_CONTEXT TransferContext, PTRANSFER_SG_LIST TransferSGList ); USB_MINIPORT_STATUS OHCI_OpenBulkEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS OHCI_OpenControlEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS OHCI_OpenInterruptEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); PHCD_TRANSFER_DESCRIPTOR OHCI_InitializeTD( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PHCD_TRANSFER_DESCRIPTOR Td, HW_32BIT_PHYSICAL_ADDRESS HwPhysAddress ); PHCD_ENDPOINT_DESCRIPTOR OHCI_InitializeED( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PHCD_ENDPOINT_DESCRIPTOR Ed, PHCD_TRANSFER_DESCRIPTOR DummyTd, HW_32BIT_PHYSICAL_ADDRESS HwPhysAddress ); VOID OHCI_InsertEndpointInSchedule( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID OHCI_PollAsyncEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID USBMPFN OHCI_StopController( PDEVICE_DATA DeviceData, BOOLEAN HwPresent ); ULONG OHCI_Get32BitFrameNumber( PDEVICE_DATA DeviceData ); VOID OHCI_InterruptNextSOF( PDEVICE_DATA DeviceData ); VOID USBMPFN OHCI_EnableInterrupts( PDEVICE_DATA DeviceData ); VOID USBMPFN OHCI_DisableInterrupts( PDEVICE_DATA DeviceData ); ULONG OHCI_FreeTds( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID OHCI_AbortTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_CONTEXT TransferContext, PULONG BytesTransferred ); USB_MINIPORT_STATUS OHCI_StartSendOnePacket( PDEVICE_DATA DeviceData, PMP_PACKET_PARAMETERS PacketParameters, PUCHAR PacketData, PULONG PacketLength, PUCHAR WorkspaceVirtualAddress, HW_32BIT_PHYSICAL_ADDRESS WorkspacePhysicalAddress, ULONG WorkSpaceLength, USBD_STATUS *UsbdStatus ); USB_MINIPORT_STATUS OHCI_EndSendOnePacket( PDEVICE_DATA DeviceData, PMP_PACKET_PARAMETERS PacketParameters, PUCHAR PacketData, PULONG PacketLength, PUCHAR WorkspaceVirtualAddress, HW_32BIT_PHYSICAL_ADDRESS WorkspacePhysicalAddress, ULONG WorkSpaceLength, USBD_STATUS *UsbdStatus ); VOID OHCI_PollController( PDEVICE_DATA DeviceData ); VOID OHCI_SetEndpointDataToggle( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, ULONG Toggle ); MP_ENDPOINT_STATUS OHCI_GetEndpointStatus( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID OHCI_SetEndpointStatus( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, MP_ENDPOINT_STATUS Status ); VOID OHCI_Unload( PDRIVER_OBJECT DriverObject ); USB_MINIPORT_STATUS OHCI_OpenIsoEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); ULONG OHCI_MapIsoTransferToTd( PDEVICE_DATA DeviceData, PMINIPORT_ISO_TRANSFER IsoTransfer, ULONG CurrentPacket, PHCD_TRANSFER_DESCRIPTOR Td ); USB_MINIPORT_STATUS OHCI_SubmitIsoTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferParameters, PTRANSFER_CONTEXT TransferContext, PMINIPORT_ISO_TRANSFER IsoTransfer ); USB_MINIPORT_STATUS OHCI_IsoTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferParameters, PTRANSFER_CONTEXT TransferContext, PMINIPORT_ISO_TRANSFER IsoTransfer ); VOID OHCI_ProcessDoneIsoTd( PDEVICE_DATA DeviceData, PHCD_TRANSFER_DESCRIPTOR Td, BOOLEAN CompleteTransfer ); VOID OHCI_PollIsoEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); ULONG InitializeHydraHsLsFix( PDEVICE_DATA DeviceData, PUCHAR CommonBuffer, HW_32BIT_PHYSICAL_ADDRESS CommonBufferPhys ); VOID OHCI_SuspendController( PDEVICE_DATA DeviceData ); USB_MINIPORT_STATUS OHCI_ResumeController( PDEVICE_DATA DeviceData ); ULONG OHCI_ReadRhDescriptorA( PDEVICE_DATA DeviceData ); USB_MINIPORT_STATUS OHCI_RH_ClearFeaturePortSuspend( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS OHCI_RH_ClearFeaturePortSuspendChange( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS OHCI_RH_ClearFeaturePortOvercurrentChange( PDEVICE_DATA DeviceData, USHORT PortNumber ); VOID USBMPFN OHCI_FlushInterrupts( PDEVICE_DATA DeviceData ); #endif /* __OHCI_H__ */