IOUSBControllerV3.h [plain text]
#ifndef _IOKIT_IOUSBCONTROLLERV3_H
#define _IOKIT_IOUSBCONTROLLERV3_H
#include <IOKit/pci/IOPCIDevice.h>
#include <IOKit/pwr_mgt/RootDomain.h>
#include <IOKit/usb/IOUSBControllerV2.h>
#include <IOKit/usb/IOUSBHubDevice.h>
enum
{
kUSBPowerStateOff = 0, kUSBPowerStateRestart = 1, kUSBPowerStateSleep = 2, kUSBPowerStateLowPower = 3, kUSBPowerStateOn = 4, kUSBNumberBusPowerStates = 5
};
#define kUSBPowerStateStable -1
enum
{
kUSBBusStateReset = 0, kUSBBusStateSuspended = 1, kUSBBusStateRunning = 2 };
typedef struct IOUSBRootHubInterruptTransaction
{
IOMemoryDescriptor * buf;
UInt32 bufLen;
IOUSBCompletion completion;
} IOUSBRootHubInterruptTransaction;
typedef IOUSBRootHubInterruptTransaction* IOUSBRootHubInterruptTransactionPtr;
enum
{
kIOUSBMaxRootHubTransactions = 2
};
class IOUSBControllerV3 : public IOUSBControllerV2
{
OSDeclareAbstractStructors(IOUSBControllerV3)
protected:
static uint32_t * _gHibernateState;
UInt8 _myBusState; bool _wakingFromHibernation; bool _needToAckPowerDown; bool _onCardBus; bool _controllerAvailable; SInt32 _powerStateChangingTo; bool _poweringDown; bool _restarting; unsigned long _myPowerState; IOUSBControllerV3 *_ehciController; unsigned long _numPowerStates; IOPMPowerState *_myPowerStates; IOPCIDevice *_device;
IOTimerEventSource *_rootHubTimer; UInt8 _rootHubPollingRate; UInt8 _rootHubNumPorts; UInt16 _rootHubStatusChangedBitmap; bool _rootHubTimerActive; IOUSBRootHubInterruptTransaction _outstandingRHTrans[4];
struct V3ExpansionData {
uint32_t _rootHubPollingRate32;
bool _rootHubTransactionWasAborted;
IOPMDriverAssertionID _externalUSBDeviceAssertionID; SInt32 _externalDeviceCount; UInt32 _inCheckPowerModeSleeping; bool _onThunderbolt; uint32_t _thunderboltModelID; uint32_t _thunderboltVendorID; UInt8 _rootHubNumPortsSS; UInt8 _rootHubNumPortsHS; UInt8 _rootHubPortsHSStartRange;
UInt8 _rootHubPortsSSStartRange;
IOUSBRootHubInterruptTransaction _outstandingSSRHTrans[4]; bool _wakingFromStandby; };
V3ExpansionData *_v3ExpansionData;
virtual bool init( OSDictionary * propTable );
virtual bool start( IOService * provider );
virtual void stop( IOService * provider );
virtual unsigned long maxCapabilityForDomainState ( IOPMPowerFlags domainState );
virtual unsigned long initialPowerStateForDomainState ( IOPMPowerFlags domainState );
virtual IOReturn powerStateWillChangeTo ( IOPMPowerFlags capabilities, unsigned long stateNumber, IOService* whatDevice);
virtual IOReturn setPowerState( unsigned long powerStateOrdinal, IOService* whatDevice );
virtual IOReturn powerStateDidChangeTo ( IOPMPowerFlags capabilities, unsigned long stateNumber, IOService* whatDevice);
virtual void powerChangeDone ( unsigned long fromState);
virtual void systemWillShutdown( IOOptionBits specifier );
virtual bool willTerminate(IOService * provider, IOOptionBits options);
virtual bool didTerminate( IOService * provider, IOOptionBits options, bool * defer );
virtual void free(void);
virtual IOReturn AcquireDeviceZero( void );
virtual void ReleaseDeviceZero( void );
virtual IOReturn DeviceRequest(IOUSBDevRequest *request, IOUSBCompletion *completion, USBDeviceAddress address, UInt8 epNum, UInt32 noDataTimeout, UInt32 completionTimeout);
virtual IOReturn DeviceRequest(IOUSBDevRequestDesc *request, IOUSBCompletion *completion, USBDeviceAddress address, UInt8 epNum, UInt32 noDataTimeout, UInt32 completionTimeout);
virtual IOReturn ClosePipe(USBDeviceAddress address, Endpoint *endpoint);
virtual IOReturn AbortPipe(USBDeviceAddress address, Endpoint *endpoint);
virtual IOReturn ResetPipe(USBDeviceAddress address, Endpoint *endpoint);
virtual IOReturn ClearPipeStall(USBDeviceAddress address, Endpoint *endpoint);
virtual IOReturn Read(IOMemoryDescriptor *buffer, USBDeviceAddress address, Endpoint *endpoint, IOUSBCompletion *completion, UInt32 noDataTimeout, UInt32 completionTimeout, IOByteCount reqCount);
virtual IOReturn Write(IOMemoryDescriptor *buffer, USBDeviceAddress address, Endpoint *endpoint, IOUSBCompletion *completion, UInt32 noDataTimeout, UInt32 completionTimeout, IOByteCount reqCount);
virtual IOReturn IsocIO(IOMemoryDescriptor *buffer, UInt64 frameStart, UInt32 numFrames, IOUSBIsocFrame *frameList, USBDeviceAddress address, Endpoint *endpoint, IOUSBIsocCompletion *completion );
virtual IOReturn IsocIO(IOMemoryDescriptor *buffer, UInt64 frameStart, UInt32 numFrames, IOUSBLowLatencyIsocFrame *frameList, USBDeviceAddress address, Endpoint *endpoint, IOUSBLowLatencyIsocCompletion *completion, UInt32 updateFrequency );
virtual UInt32 GetErrataBits(UInt16 vendorID, UInt16 deviceID, UInt16 revisionID );
virtual IOReturn OpenPipe(USBDeviceAddress address, UInt8 speed, Endpoint *endpoint);
virtual IOReturn AddHSHub(USBDeviceAddress highSpeedHub, UInt32 flags);
virtual IOReturn RemoveHSHub(USBDeviceAddress highSpeedHub);
virtual IOReturn SetTestMode(UInt32 mode, UInt32 port);
virtual IOReturn ReadV2(IOMemoryDescriptor *buffer, USBDeviceAddress address, Endpoint *endpoint, IOUSBCompletionWithTimeStamp *completion, UInt32 noDataTimeout, UInt32 completionTimeout, IOByteCount reqCount);
static IOReturn DoEnableAddressEndpoints(OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3);
static IOReturn DoEnableAllEndpoints(OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3);
static IOReturn GatedPowerChange(OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3);
static IOReturn ChangeExternalDeviceCount(OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3);
static IOReturn DoGetActualDeviceAddress(OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3);
static IOReturn DoCreateStreams(OSObject *owner, void *arg0, void *arg1, void *arg2, void *arg3 );
static void RootHubTimerFired(OSObject *owner, IOTimerEventSource *sender);
static IOReturn DoAbortStream(
OSObject * owner,
void * arg0,
void * arg1,
void * arg2,
void * arg3 );
virtual IOReturn CheckForEHCIController(IOService *provider);
virtual IOReturn AllocatePowerStateArray(void);
virtual IOReturn InitForPM(void);
virtual IOReturn CheckPowerModeBeforeGatedCall(char *fromStr);
virtual IOReturn EnableAllEndpoints(bool enable);
virtual IOReturn EnableBusMastering(bool enable);
virtual IOReturn EnsureUsability(void);
virtual IOReturn CheckForRootHubChanges(void);
virtual IOReturn RootHubQueueInterruptRead(IOMemoryDescriptor *buf, UInt32 bufLen, IOUSBCompletion completion);
virtual IOReturn RootHubAbortInterruptRead(void);
virtual IOReturn RootHubStartTimer(UInt8 pollingRate); virtual IOReturn RootHubStopTimer(void);
virtual void ControllerOff(void);
virtual void ControllerRestart(void);
virtual void ControllerSleep(void);
virtual void ControllerDoze(void);
virtual void ControllerOn(void);
virtual IOReturn ResetControllerState(void) = 0;
virtual IOReturn RestartControllerFromReset(void) = 0;
virtual IOReturn SaveControllerStateForSleep(void) = 0;
virtual IOReturn RestoreControllerStateFromSleep(void) = 0;
virtual IOReturn DozeController(void) = 0;
virtual IOReturn WakeControllerFromDoze(void) = 0;
virtual IOReturn UIMEnableAddressEndpoints(USBDeviceAddress address, bool enable) = 0;
virtual IOReturn UIMEnableAllEndpoints(bool enable) = 0;
virtual IOReturn EnableInterruptsFromController(bool enable) = 0;
public:
virtual IOReturn EnableAddressEndpoints(USBDeviceAddress address, bool enable);
virtual bool IsControllerAvailable(void);
virtual IOReturn HandlePowerChange(unsigned long powerStateOrdinal);
virtual UInt32 AllocateExtraRootHubPortPower(UInt32 extraPowerRequested); virtual void ReturnExtraRootHubPortPower(UInt32 extraPowerReturned);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 0);
virtual IOReturn RootHubStartTimer32(uint32_t pollingRate);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 1);
virtual IOReturn CheckPMAssertions(IOUSBDevice *forDevice, bool deviceBeingAdded);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 2);
virtual IOReturn GetRootHubBOSDescriptor( OSData *desc );
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 3);
virtual IOReturn GetRootHub3Descriptor( IOUSB3HubDescriptor *desc );
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 4);
virtual IOReturn UIMDeviceToBeReset(short functionAddress);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 5);
virtual IOReturn Read(UInt32 streamID,
IOMemoryDescriptor * buffer,
USBDeviceAddress address,
Endpoint * endpoint,
IOUSBCompletion * completion,
UInt32 noDataTimeout,
UInt32 completionTimeout,
IOByteCount reqCount );
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 6);
virtual IOReturn Write(UInt32 streamID,
IOMemoryDescriptor * buffer,
USBDeviceAddress address,
Endpoint * endpoint,
IOUSBCompletion * completion,
UInt32 noDataTimeout,
UInt32 completionTimeout,
IOByteCount reqCount );
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 7);
virtual IOReturn AbortPipe(UInt32 streamID, USBDeviceAddress address, Endpoint *endpoint);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 8);
virtual IOReturn UIMAbortStream(UInt32 streamID,
short functionNumber,
short endpointNumber,
short direction);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 9);
virtual IOReturn OpenPipe(USBDeviceAddress address, UInt8 speed, Endpoint *endpoint, UInt32 maxStreams, UInt32 maxBurstAndMult);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 10);
virtual UInt32 UIMMaxSupportedStream(void);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 11);
virtual USBDeviceAddress UIMGetActualDeviceAddress(USBDeviceAddress current);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 12);
virtual IOReturn UIMCreateSSBulkEndpoint(
UInt8 functionNumber,
UInt8 endpointNumber,
UInt8 direction,
UInt8 speed,
UInt16 maxPacketSize,
UInt32 maxStream,
UInt32 maxBurst);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 13);
virtual IOReturn UIMCreateSSInterruptEndpoint(
short functionAddress,
short endpointNumber,
UInt8 direction,
short speed,
UInt16 maxPacketSize,
short pollingRate,
UInt32 maxBurst);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 14);
virtual IOReturn UIMCreateSSIsochEndpoint(
short functionAddress,
short endpointNumber,
UInt32 maxPacketSize,
UInt8 direction,
UInt8 interval,
UInt32 maxBurstAndMult);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 15);
virtual IOReturn UIMCreateStreams(UInt8 functionNumber,
UInt8 endpointNumber,
UInt8 direction,
UInt32 maxStream);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 16);
virtual IOReturn GetActualDeviceAddress(USBDeviceAddress currentAddress, USBDeviceAddress *newAddress);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 17);
virtual IOReturn CreateStreams(UInt8 functionNumber, UInt8 endpointNumber, UInt8 direction, UInt32 maxStream);
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 18);
virtual IOReturn GetRootHubPortErrorCount( UInt16 port, UInt16 * count );
OSMetaClassDeclareReservedUsed(IOUSBControllerV3, 19);
virtual IOReturn GetBandwidthAvailableForDevice(IOUSBDevice *forDevice, UInt32 *pBandwidthAvailable);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 20);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 21);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 22);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 23);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 24);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 25);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 26);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 27);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 28);
OSMetaClassDeclareReservedUnused(IOUSBControllerV3, 29);
protected:
void FixupNECControllerConfigRegisters(void);
IOReturn RHQueueTransaction(IOMemoryDescriptor *buf, UInt32 bufLen, IOUSBCompletion completion, IOUSBRootHubInterruptTransactionPtr outstandingRHXaction);
void RHCompleteTransaction(IOUSBRootHubInterruptTransactionPtr outstandingRHTransPtr);
void RHAbortTransaction(IOUSBRootHubInterruptTransactionPtr outstandingRHXaction);
};
#endif