/*++ Copyright (c) 1999, 2000 Microsoft Corporation Module Name: usbehci.h Abstract: Environment: Kernel & user mode Revision History: 1-1-00 : created --*/ #ifndef __EHCI_H__ #define __EHCI_H__ #define NO_EXP_DATE #define MASK_CHANGE_BITS(p)\ do {\ (p).OvercurrentChange = 0;\ (p).PortEnableChange = 0;\ (p).PortConnectChange = 0;\ } while (0); /* define some known busted hardware types */ #define AGERE(dd) ((dd)->Vid == 0x11c1 && (dd)->Dev == 0x5805) ? TRUE : FALSE //#define LUCENT(dd) ((dd)->ControllerFlavor == EHCI_Lucent) ? TRUE : FALSE #define NEC(dd) ((dd)->ControllerFlavor == EHCI_NEC) ? TRUE : FALSE #define MU_960(dd) ((dd)->ControllerFlavor == EHCI_960MUlator) ? TRUE : FALSE /* define resource consumption for endpoints types */ #define T_256K 0x00040000 #define T_64K 0x00010000 #define T_4K 0x00001000 #define T_4MB 0x00400000 // 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 4 + status and // setup + dummy = #define TDS_PER_CONTROL_ENDPOINT 7 // Bulk: #define MAX_BULK_TRANSFER_SIZE T_4MB // enough for 4 MB #define TDS_PER_BULK_ENDPOINT 210 // Interrupt: #define MAX_INTERRUPT_TRANSFER_SIZE T_4K // enough for up to 4 4k transfers + dummy #define TDS_PER_INTERRUPT_ENDPOINT 5 // Isochronous: #define MAX_ISO_TRANSFER_SIZE T_256K // 2 256 packet transfers *3k packet size, we can actually // handle more #define MAX_HSISO_TRANSFER_SIZE 0x00180000 #define TDS_PER_ISO_ENDPOINT 32 // default size of frame list #define USBEHCI_MAX_FRAME 1024 /* Registry Keys */ // Software Branch PDO Keys #define EN_IDLE_ENDPOINT_SUPPORT L"EnIdleEndpointSupport" // Hardware Branch PDO Keys // debug signatures #define SIG_HCD_IQH 'qi02' #define SIG_HCD_AQH 'qa02' #define SIG_HCD_QH 'hq02' #define SIG_HCD_DQH 'qd02' #define SIG_HCD_TD 'dt02' #define SIG_HCD_SITD 'dtIS' #define SIG_HCD_ITD 'dtIH' #define SIG_EP_DATA 'pe02' #define SIG_EHCI_TRANSFER 'rt02' #define SIG_EHCI_DD 'iche' #define SIG_DUMMY_QH 'hqmd' #undef PDEVICE_DATA typedef struct _TRANSFER_CONTEXT { ULONG Sig; ULONG PendingTds; PTRANSFER_PARAMETERS TransferParameters; USBD_STATUS UsbdStatus; ULONG BytesTransferred; ULONG XactErrCounter; // struct _HCD_TRANSFER_DESCRIPTOR *NextTransferTd; struct _ENDPOINT_DATA *EndpointData; //for ISO ULONG FrameComplete; LIST_ENTRY TransferLink; PMINIPORT_ISO_TRANSFER IsoTransfer; ULONG PendingPackets; ULONG PostedFrame; } TRANSFER_CONTEXT, *PTRANSFER_CONTEXT; // HCD Endpoint Descriptor (contains the HW descriptor) // values for HCD_QUEUEHEAD_DESCRIPTOR.Flags #define EHCI_QH_FLAG_IN_SCHEDULE 0x00000001 #define EHCI_QH_FLAG_QH_REMOVED 0x00000002 #define EHCI_QH_FLAG_STATIC 0x00000004 #define EHCI_QH_FLAG_HIGHSPEED 0x00000008 #define EHCI_QH_FLAG_UPDATING 0x00000010 typedef struct _HCD_QUEUEHEAD_DESCRIPTOR { HW_QUEUEHEAD_DESCRIPTOR HwQH; // 40 dwords HW_32BIT_PHYSICAL_ADDRESS PhysicalAddress; ULONG Sig; ULONG QhFlags; ULONG Ordinal; ULONG Period; ULONG Reserved; MP_HW_POINTER EndpointData; //MP_HW_POINTER HcdTail; MP_HW_POINTER NextQh; MP_HW_POINTER PrevQh; MP_HW_POINTER NextLink; #ifdef _WIN64 ULONG PadTo256[6]; #else ULONG PadTo256[6]; #endif } HCD_QUEUEHEAD_DESCRIPTOR, *PHCD_QUEUEHEAD_DESCRIPTOR; C_ASSERT((sizeof(HCD_QUEUEHEAD_DESCRIPTOR) == 160)); // // HCD Transfer Descriptor (contains the HW descriptor) // #define ENDPOINT_DATA_PTR(p) ((struct _ENDPOINT_DATA *) (p).Pointer) #define TRANSFER_CONTEXT_PTR(p) ((struct _TRANSFER_CONTEXT *) (p).Pointer) #define TRANSFER_DESCRIPTOR_PTR(p) ((struct _HCD_TRANSFER_DESCRIPTOR *) (p).Pointer) #define QH_DESCRIPTOR_PTR(p) ((struct _HCD_QUEUEHEAD_DESCRIPTOR *) (p).Pointer) #define HW_PTR(p) ((UCHAR * ) (p).Pointer) #define ISO_PACKET_PTR(p) ((struct _MINIPORT_ISO_PACKET *) (p).Pointer) #define ISO_TRANSFER_PTR(p) ((struct _TRANSFER_CONTEXT *) (p).Pointer) // values for HCD_TRANSFER_DESCRIPTOR.Flags #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 TD_FLAG_DUMMY 0x00000020 typedef struct _HCD_TRANSFER_DESCRIPTOR { HW_QUEUE_ELEMENT_TD HwTD; //64 (16 dwords) ULONG Sig; ULONG Flags; ULONG TransferLength; HW_32BIT_PHYSICAL_ADDRESS PhysicalAddress; UCHAR Packet[8]; // space for setup packet data MP_HW_POINTER EndpointData; MP_HW_POINTER TransferContext; MP_HW_POINTER NextHcdTD; MP_HW_POINTER AltNextHcdTD; LIST_ENTRY DoneLink; #ifdef _WIN64 ULONG PadToX[30]; #else ULONG PadToX[32]; #endif } HCD_TRANSFER_DESCRIPTOR, *PHCD_TRANSFER_DESCRIPTOR; C_ASSERT((sizeof(HCD_TRANSFER_DESCRIPTOR) == 256)); typedef struct _HCD_TD_LIST { HCD_TRANSFER_DESCRIPTOR Td[1]; } HCD_TD_LIST, *PHCD_TD_LIST; /* Structures used for iso see iso.c */ typedef struct _HCD_SI_TRANSFER_DESCRIPTOR { HW_SPLIT_ISOCHRONOUS_TD HwTD; //64 (16dwords) ULONG Sig; HW_32BIT_PHYSICAL_ADDRESS PhysicalAddress; ULONG StartOffset; ULONG Reserved; MP_HW_POINTER Packet; MP_HW_POINTER Transfer; MP_HW_POINTER NextLink; #ifdef _WIN64 ULONG PadToX[6]; #else ULONG PadToX[6]; #endif } HCD_SI_TRANSFER_DESCRIPTOR, *PHCD_SI_TRANSFER_DESCRIPTOR; C_ASSERT((sizeof(HCD_SI_TRANSFER_DESCRIPTOR) == 128)); typedef struct _HCD_SITD_LIST { HCD_SI_TRANSFER_DESCRIPTOR Td[1]; } HCD_SITD_LIST, *PHCD_SITD_LIST; typedef struct _HCD_HSISO_TRANSFER_DESCRIPTOR { HW_ISOCHRONOUS_TD HwTD; // 128 (32dwords) ULONG Sig; HW_32BIT_PHYSICAL_ADDRESS PhysicalAddress; ULONG HostFrame; ULONG Reserved; MP_HW_POINTER FirstPacket; MP_HW_POINTER Transfer; MP_HW_POINTER NextLink; #ifdef _WIN64 ULONG PadTo256[22]; #else ULONG PadTo256[22]; #endif } HCD_HSISO_TRANSFER_DESCRIPTOR, *PHCD_HSISO_TRANSFER_DESCRIPTOR; C_ASSERT((sizeof(HCD_HSISO_TRANSFER_DESCRIPTOR) == 256)); typedef struct _HCD_HSISOTD_LIST { HCD_HSISO_TRANSFER_DESCRIPTOR Td[1]; } HCD_HSISOTD_LIST, *PHCD_HSISOTD_LIST; /* Used for data structure that describes the interrupt schedule (see periodic.c) */ typedef struct _PERIOD_TABLE { UCHAR Period; UCHAR qhIdx; UCHAR InterruptScheduleMask; } PERIOD_TABLE, *PPERIOD_TABLE; #define EHCI_EDFLAG_HALTED 0x00000001 //#define EHCI_EDFLAG_FLUSHED 0x00000002 #define EHCI_EDFLAG_NOHALT 0x00000004 typedef struct _ENDPOINT_DATA { ULONG Sig; ENDPOINT_PARAMETERS Parameters; PHCD_QUEUEHEAD_DESCRIPTOR QueueHead; ULONG Flags; ULONG PendingTransfers; ULONG MaxPendingTransfers; // PHCD_TRANSFER_DESCRIPTOR HcdTailP; PHCD_TRANSFER_DESCRIPTOR HcdHeadP; PHCD_QUEUEHEAD_DESCRIPTOR StaticQH; PPERIOD_TABLE PeriodTableEntry; PHCD_TD_LIST TdList; PHCD_SITD_LIST SiTdList; PHCD_HSISOTD_LIST HsIsoTdList; ULONG TdCount; ULONG FreeTds; ULONG LastFrame; ULONG QhChkPhys; PVOID QhChk; LIST_ENTRY TransferList; LIST_ENTRY DoneTdList; MP_ENDPOINT_STATE State; struct _ENDPOINT_DATA *PrevEndpoint; struct _ENDPOINT_DATA *NextEndpoint; PHCD_TRANSFER_DESCRIPTOR DummyTd; // ULONG MaxErrorCount; } ENDPOINT_DATA, *PENDPOINT_DATA; // values for Flags field in DeviceData //#define EHCI_DD_FLAG_NOCHIRP 0x000000001 #define EHCI_DD_EN_IDLE_EP_SUPPORT 0x000000002 typedef struct _DEVICE_DATA { ULONG Sig; ULONG Flags; PHC_OPERATIONAL_REGISTER OperationalRegisters; PHC_CAPABILITIES_REGISTER CapabilitiesRegisters; USBINTR EnabledInterrupts; PHCD_QUEUEHEAD_DESCRIPTOR AsyncQueueHead; USB_CONTROLLER_FLAVOR ControllerFlavor; ULONG LastFrame; ULONG FrameNumberHighPart; ULONG PortResetChange; ULONG PortSuspendChange; ULONG PortConnectChange; ULONG PortPMChirp; ULONG IrqStatus; USHORT NumberOfPorts; USHORT PortPowerControl; PHCD_QUEUEHEAD_DESCRIPTOR LockPrevQh; PHCD_QUEUEHEAD_DESCRIPTOR LockNextQh; PHCD_QUEUEHEAD_DESCRIPTOR LockQh; // both these are used for non-chirping devices // port state masks //ULONG PortConnectState; ULONG HighSpeedDeviceAttached; PHCD_QUEUEHEAD_DESCRIPTOR StaticInterruptQH[65]; PHW_32BIT_PHYSICAL_ADDRESS FrameListBaseAddress; HW_32BIT_PHYSICAL_ADDRESS FrameListBasePhys; PENDPOINT_DATA IsoEndpointListHead; PVOID DummyQueueHeads; HW_32BIT_PHYSICAL_ADDRESS DummyQueueHeadsPhys; ULONG PeriodicListBaseSave; ULONG AsyncListAddrSave; ULONG SegmentSelectorSave; USBCMD CmdSave; USHORT Vid; USHORT Dev; CONFIGFLAG LastConfigFlag; ULONG PendingControlAndBulk; // we only need this for older revs of usbport // that will call checkController after start fails BOOLEAN DeviceStarted; UCHAR SavedFladj; } DEVICE_DATA, *PDEVICE_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, tp, status, length) \ RegistrationPacket.USBPORTSVC_CompleteTransfer((dd), (ep), (tp), \ (status), (length)); #define USBPORT_INVALIDATE_ENDPOINT(dd, ep) \ RegistrationPacket.USBPORTSVC_InvalidateEndpoint((dd), (ep)); #define USBPORT_PHYSICAL_TO_VIRTUAL(addr, dd, ep) \ RegistrationPacket.USBPORTSVC_MapHwPhysicalToVirtual((addr), (dd), (ep)); #define USBPORT_INVALIDATE_ROOTHUB(dd) \ RegistrationPacket.USBPORTSVC_InvalidateRootHub((dd)); #define USBPORT_REQUEST_ASYNC_CALLBACK(dd, t, c, cl, f) \ RegistrationPacket.USBPORTSVC_RequestAsyncCallback((dd), (t), \ (c), (cl), (f)); #define USBPORT_WAIT(dd, t) \ RegistrationPacket.USBPORTSVC_Wait((dd), (t)); #define USBPORT_BUGCHECK(dd) \ RegistrationPacket.USBPORTSVC_BugCheck(dd) #define USBPORT_COMPLETE_ISO_TRANSFER(dd, ep, t, iso) \ RegistrationPacket.USBPORTSVC_CompleteIsoTransfer((dd), (ep), (t), \ (iso)); #define USBPORT_INVALIDATE_CONTROLLER(dd, s) \ RegistrationPacket.USBPORTSVC_InvalidateController((dd), (s)) #define USBPORT_READ_CONFIG_SPACE(dd, b, o, l) \ RegistrationPacket.USBPORTSVC_ReadWriteConfigSpace((dd), TRUE, \ (b), (o), (l)) #define USBPORT_WRITE_CONFIG_SPACE(dd, b, o, l) \ RegistrationPacket.USBPORTSVC_ReadWriteConfigSpace((dd), FALSE, \ (b), (o), (l)) #ifdef _WIN64 #define DUMMY_TD_CONTEXT ((PVOID) 0xABADBABEABADBABE) #else #define DUMMY_TD_CONTEXT ((PVOID) 0xABADBABE) #endif // note: we must initialize the low 12 bits of the // buffer page ptr to zero to the last three nipples // are 0 #define INITIALIZE_TD_FOR_TRANSFER(td, tc) \ { ULONG i;\ TRANSFER_CONTEXT_PTR((td)->TransferContext) = (tc);\ (td)->Flags |= TD_FLAG_XFER; \ for (i=0; i<5; i++) {\ (td)->HwTD.BufferPage[i].ul = 0x0bad0000;\ }\ (td)->HwTD.Next_qTD.HwAddress = EHCI_TERMINATE_BIT;\ (td)->HwTD.AltNext_qTD.HwAddress = EHCI_TERMINATE_BIT;\ (td)->HwTD.Token.ul = 0;\ (td)->HwTD.Token.ErrorCounter = 3;\ TRANSFER_DESCRIPTOR_PTR((td)->NextHcdTD) = NULL;\ } #define SET_NEXT_TD(dd, linkTd, nextTd) \ EHCI_SetNextTd((dd), (linkTd), (nextTd), FALSE) #define SET_ALTNEXT_TD(dd, linkTd, nextTd) \ EHCI_SetAltNextTd((dd), (linkTd), (nextTd)) #define SET_NEXT_AND_ALTNEXT_TD(dd, linkTd, nextTd) \ EHCI_SetNextTd((dd), (linkTd), (nextTd), TRUE) #define SET_NEXT_TD_NULL(linkTd) \ TRANSFER_DESCRIPTOR_PTR((linkTd)->NextHcdTD) = NULL;\ TRANSFER_DESCRIPTOR_PTR((linkTd)->AltNextHcdTD) = NULL;\ (linkTd)->HwTD.Next_qTD.HwAddress = EHCI_TERMINATE_BIT; \ (linkTd)->HwTD.AltNext_qTD.HwAddress = EHCI_TERMINATE_BIT; #ifdef _WIN64 #define FREE_TD_CONTEXT ((PVOID) 0xDEADFACEDEADFACE) #else #define FREE_TD_CONTEXT ((PVOID) 0xDEADFACE) #endif #define EHCI_FREE_TD(dd, ep, td) \ (td)->Flags = 0;\ (td)->HwTD.Next_qTD.HwAddress = 0;\ (td)->HwTD.AltNext_qTD.HwAddress = 0;\ (ep)->FreeTds++;\ LOGENTRY((dd), G, '_fTD', (td), 0, 0);\ TRANSFER_CONTEXT_PTR((td)->TransferContext) = FREE_TD_CONTEXT; #define EHCI_ALLOC_TD(dd, ep) EHCI_AllocTd((dd), (ep)); #define TEST_BIT(value, bitNumber) ((value) & (1<<(bitNumber))) ? TRUE : FALSE #define SET_BIT(value, bitNumber) ((value) |= (1<<(bitNumber))) #define CLEAR_BIT(value, bitNumber) ((value) &= ~(1<<(bitNumber))) // 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;\ };\ } // // USBEHCI.C Function Prototypes // USB_MINIPORT_STATUS USBMPFN EHCI_StartController( PDEVICE_DATA DeviceData, PHC_RESOURCES HcResources ); VOID USBMPFN EHCI_StopController( PDEVICE_DATA DeviceData, BOOLEAN HwPresent ); USB_MINIPORT_STATUS EHCI_ResumeController( PDEVICE_DATA DeviceData ); VOID EHCI_SuspendController( PDEVICE_DATA DeviceData ); USB_MINIPORT_STATUS EHCI_OpenEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); VOID EHCI_CloseEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS EHCI_PokeEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS EHCI_QueryEndpointRequirements( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_REQUIREMENTS EndpointRequirements ); VOID EHCI_PollEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); PHCD_TRANSFER_DESCRIPTOR EHCI_AllocTd( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID EHCI_SetEndpointStatus( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, MP_ENDPOINT_STATUS Status ); MP_ENDPOINT_STATUS EHCI_GetEndpointStatus( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID EHCI_SetEndpointState( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, MP_ENDPOINT_STATE State ); MP_ENDPOINT_STATE EHCI_GetEndpointState( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID EHCI_PollController( PDEVICE_DATA DeviceData ); USB_MINIPORT_STATUS EHCI_SubmitTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferUrb, PTRANSFER_CONTEXT TransferContext, PTRANSFER_SG_LIST TransferSGList ); VOID EHCI_AbortTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_CONTEXT TransferContext, PULONG BytesTransferred ); USB_MINIPORT_STATUS EHCI_PassThru ( PDEVICE_DATA DeviceData, GUID *FunctionGuid, ULONG ParameterLength, PVOID Parameters ); USB_MINIPORT_STATUS EHCI_RH_UsbprivRootPortStatus( PDEVICE_DATA DeviceData, ULONG ParameterLength, PVOID Parameters ); VOID EHCI_SetEndpointDataToggle( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, ULONG Toggle ); // // ASYNC.C Function Prototypes // VOID EHCI_EnableAsyncList( PDEVICE_DATA DeviceData ); VOID EHCI_DisableAsyncList( PDEVICE_DATA DeviceData ); VOID USBMPFN EHCI_FlushInterrupts( PDEVICE_DATA DeviceData ); PHCD_QUEUEHEAD_DESCRIPTOR EHCI_InitializeQH( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PHCD_QUEUEHEAD_DESCRIPTOR Qh, HW_32BIT_PHYSICAL_ADDRESS HwPhysAddress ); PHCD_TRANSFER_DESCRIPTOR EHCI_InitializeTD( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PHCD_TRANSFER_DESCRIPTOR Td, HW_32BIT_PHYSICAL_ADDRESS HwPhysAddress ); USB_MINIPORT_STATUS EHCI_ControlTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferUrb, PTRANSFER_CONTEXT TransferContext, PTRANSFER_SG_LIST TransferSGList ); USB_MINIPORT_STATUS EHCI_BulkTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferUrb, PTRANSFER_CONTEXT TransferContext, PTRANSFER_SG_LIST TransferSGList ); USB_MINIPORT_STATUS EHCI_OpenBulkOrControlEndpoint( PDEVICE_DATA DeviceData, BOOLEAN Control, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); VOID EHCI_InsertQueueHeadInAsyncList( PDEVICE_DATA DeviceData, PHCD_QUEUEHEAD_DESCRIPTOR Qh ); VOID EHCI_RemoveQueueHeadFromAsyncList( PDEVICE_DATA DeviceData, PHCD_QUEUEHEAD_DESCRIPTOR Qh ); ULONG EHCI_MapAsyncTransferToTd( PDEVICE_DATA DeviceData, ULONG MaxPacketSize, ULONG LengthMapped, PULONG NextToggle, PTRANSFER_CONTEXT TransferContext, PHCD_TRANSFER_DESCRIPTOR Td, PTRANSFER_SG_LIST SgList ); VOID EHCI_SetAsyncEndpointState( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, MP_ENDPOINT_STATE State ); VOID EHCI_ProcessDoneAsyncTd( PDEVICE_DATA DeviceData, PHCD_TRANSFER_DESCRIPTOR Td ); USBD_STATUS EHCI_GetErrorFromTD( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PHCD_TRANSFER_DESCRIPTOR Td ); VOID EHCI_AbortAsyncTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_CONTEXT TransferContext ); // // INT.C Function Prototypes // BOOLEAN EHCI_InterruptService ( PDEVICE_DATA DeviceData ); VOID EHCI_InterruptDpc ( PDEVICE_DATA DeviceData, BOOLEAN EnableInterrupts ); VOID USBMPFN EHCI_DisableInterrupts( PDEVICE_DATA DeviceData ); VOID USBMPFN EHCI_EnableInterrupts( PDEVICE_DATA DeviceData ); VOID EHCI_RH_DisableIrq( PDEVICE_DATA DeviceData ); VOID EHCI_RH_EnableIrq( PDEVICE_DATA DeviceData ); VOID EHCI_InterruptNextSOF( PDEVICE_DATA DeviceData ); ULONG EHCI_Get32BitFrameNumber( PDEVICE_DATA DeviceData ); // // PERIODIC.C Function Prototypes // USB_MINIPORT_STATUS EHCI_OpenInterruptEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); VOID EHCI_InsertQueueHeadInPeriodicList( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID EHCI_RemoveQueueHeadFromPeriodicList( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS EHCI_InterruptTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferUrb, PTRANSFER_CONTEXT TransferContext, PTRANSFER_SG_LIST TransferSGList ); PHCD_QUEUEHEAD_DESCRIPTOR EHCI_GetQueueHeadForFrame( PDEVICE_DATA DeviceData, ULONG Frame ); VOID EHCI_InitailizeInterruptSchedule( PDEVICE_DATA DeviceData ); VOID EHCI_ComputeClassicBudget( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PUCHAR sMask, PUCHAR cMask ); // // ROOTHUB.C Function Prototypes // VOID EHCI_RH_GetRootHubData( PDEVICE_DATA DeviceData, PROOTHUB_DATA HubData ); USB_MINIPORT_STATUS EHCI_RH_GetStatus( PDEVICE_DATA DeviceData, PUSHORT Status ); USB_MINIPORT_STATUS EHCI_RH_GetPortStatus( PDEVICE_DATA DeviceData, USHORT PortNumber, PRH_PORT_STATUS portStatus ); USB_MINIPORT_STATUS EHCI_RH_GetHubStatus( PDEVICE_DATA DeviceData, OUT PRH_HUB_STATUS HubStatus ); USB_MINIPORT_STATUS EHCI_RH_SetFeaturePortReset( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS EHCI_RH_SetFeaturePortPower( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS EHCI_RH_SetFeaturePortEnable( PDEVICE_DATA DeviceData, USHORT PortNumber ); VOID EHCI_RH_PortResetComplete( PDEVICE_DATA DeviceData, PVOID Context ); USB_MINIPORT_STATUS EHCI_RH_SetFeaturePortSuspend( PDEVICE_DATA DeviceData, USHORT PortNumber ); VOID EHCI_CheckController( PDEVICE_DATA DeviceData ); USB_MINIPORT_STATUS EHCI_RH_ClearFeaturePortEnable( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS EHCI_RH_ClearFeaturePortPower( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS EHCI_RH_ClearFeaturePortSuspend ( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS EHCI_RH_ClearFeaturePortEnableChange( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS EHCI_RH_ClearFeaturePortConnectChange( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS EHCI_RH_ClearFeaturePortResetChange( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS EHCI_RH_ClearFeaturePortSuspendChange ( PDEVICE_DATA DeviceData, USHORT PortNumber ); USB_MINIPORT_STATUS EHCI_RH_ClearFeaturePortOvercurrentChange ( PDEVICE_DATA DeviceData, USHORT PortNumber ); VOID EHCI_OptumtuseratePort( PDEVICE_DATA DeviceData, USHORT PortNumber ); // // SSTOOL.C Function Prototypes // USB_MINIPORT_STATUS USBMPFN EHCI_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 USBMPFN EHCI_EndSendOnePacket( 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 EHCI_OpenIsochronousEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); VOID EHCI_SetIsoEndpointState( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, MP_ENDPOINT_STATE State ); VOID EHCI_RebalanceEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); VOID EHCI_SetAsyncEndpointStatus( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, MP_ENDPOINT_STATUS Status ); MP_ENDPOINT_STATUS EHCI_GetAsyncEndpointStatus( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS EHCI_SubmitIsoTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_PARAMETERS TransferParameters, PTRANSFER_CONTEXT TransferContext, PMINIPORT_ISO_TRANSFER IsoTransfer ); VOID EHCI_PollIsoEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS EHCI_AbortIsoTransfer( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PTRANSFER_CONTEXT TransferContext ); VOID EHCI_InternalPollHsIsoEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, BOOLEAN Complete ); VOID EHCI_InsertHsIsoTdsInSchedule( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PENDPOINT_DATA PrevEndpointData, PENDPOINT_DATA NextEndpointData ); USB_MINIPORT_STATUS EHCI_OpenHsIsochronousEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); VOID EHCI_EnablePeriodicList( PDEVICE_DATA DeviceData ); VOID EHCI_RemoveHsIsoTdsFromSchedule( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID EHCI_RebalanceInterruptEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); VOID EHCI_RebalanceIsoEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); BOOLEAN EHCI_PastExpirationDate( PDEVICE_DATA DeviceData ); USB_MINIPORT_STATUS EHCI_PokeAsyncEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); USB_MINIPORT_STATUS EHCI_PokeIsoEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_PARAMETERS EndpointParameters, PENDPOINT_DATA EndpointData ); PHCD_QUEUEHEAD_DESCRIPTOR EHCI_GetDummyQueueHeadForFrame( PDEVICE_DATA DeviceData, ULONG Frame ); VOID EHCI_AddDummyQueueHeads( PDEVICE_DATA DeviceData ); BOOLEAN EHCI_HardwarePresent( PDEVICE_DATA DeviceData, BOOLEAN Notify ); VOID EHCI_LockQueueHead( PDEVICE_DATA DeviceData, PHCD_QUEUEHEAD_DESCRIPTOR Qh, ENDPOINT_TRANSFER_TYPE EpType ); VOID EHCI_UnlockQueueHead( PDEVICE_DATA DeviceData, PHCD_QUEUEHEAD_DESCRIPTOR Qh ); VOID EHCI_PollHaltedEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID EHCI_PollAsyncEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID EHCI_PollActiveEndpoint( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID EHCI_AssertQhChk( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData ); VOID EHCI_LinkTransferToQueue( PDEVICE_DATA DeviceData, PENDPOINT_DATA EndpointData, PHCD_TRANSFER_DESCRIPTOR FirstTd ); USB_MINIPORT_STATUS EHCI_RH_ChirpRootPort( PDEVICE_DATA DeviceData, USHORT PortNumber ); VOID USBMPFN EHCI_TakePortControl( PDEVICE_DATA DeviceData ); VOID EHCI_AsyncCacheFlush( PDEVICE_DATA DeviceData ); USB_MINIPORT_STATUS EHCI_StopBIOS( PDEVICE_DATA DeviceData ); VOID EHCI_SetNextTd( PDEVICE_DATA DeviceData, PHCD_TRANSFER_DESCRIPTOR LinkTd, PHCD_TRANSFER_DESCRIPTOR NextTd, BOOLEAN SetAltNext ); VOID EHCI_SetAltNextTd( PDEVICE_DATA DeviceData, PHCD_TRANSFER_DESCRIPTOR LinkTd, PHCD_TRANSFER_DESCRIPTOR NextTd ); #endif /* __EHCI_H__ */