//================================================================================================ // // CheckSleepCapability // //================================================================================================ // void AppleUSBUHCI::CheckSleepCapability(void) { if (_device->getProperty("built-in") && (_ERRATA64BITS & kErrataICH6PowerSequencing)) { // The ICH6 UHCI drivers on a Transition system just magically work on sleep/wake // so we will just hard code those. Other systems will have to be evaluated later setProperty("Card Type","Built-in"); _controllerCanSleep = true; } else { // This appears to be necessary setProperty("Card Type","PCI"); _controllerCanSleep = false; } // if we have an ExpressCard attached (non-zero port), then we need to register for some special messages to allow us to override the Resume Enables // for that port (some cards disconnect when the ExpressCard power goes away and we would like to ignore these extra detach events. if ((_ExpressCardPort = ExpressCardPort(_device))) { _device->callPlatformFunction( /* function */ "RegisterDebugDriver", /* waitForFunction */ false, /* provider nubÊ Ê */ _device, /* unused Ê */ (void *) this, /* unused Ê */ (void *) NULL, /* unused Ê */ (void *) NULL ); } _badExpressCardAttached = false; // Call registerService() so that the IOUSBController object is published and clients (like Prober) can find it registerService(); }
//================================================================================================ // // CheckSleepCapability // //================================================================================================ // void AppleUSBOHCI::CheckSleepCapability(void) { // assume that sleep is OK _controllerCanSleep = true; _hasPCIPwrMgmt = false; // We need to determine which OHCI controllers don't survive sleep. These fall into 2 categories: // // 1. CardBus cards // 2. PCI Cards that lose power (right now because of a bug in the PCI Family, USB PCI cards do not prevent // sleep, so even cards that don't support the PCI Power Mgmt stuff get their power removed. // // Additionally, the PowerBook 101 controller cannot survive across sleep (I doesn't support remote wakeup). // // So here, we look at all those cases and set the _unloadUIMAcrossSleep boolean to true. As it turns out, // if a controller does not have the "AAPL,clock-id" property, then it means that it cannot survive sleep. We // might need to refine this later once we figure how to deal with PCI cards that can go into PCI sleep mode. // An exception is the B&W G3, that does not have this property but can sleep. Sigh... // Now, look at PCI cards. Note that the onboard controller's provider is an IOPCIDevice so we cannot use that // to distinguish between USB PCI cards and the on board controller. Instead, we use the existence of the // "AAPL,clock-id" property in the provider. If it does not exist, then we are a OHCI controller on a USB PCI card. // if ( !_device->getProperty("AAPL,clock-id") && !((getPlatform()->getChipSetType() == kChipSetTypeGossamer) && getPlatform()->getMachineType() == kGossamerTypeYosemite) ) { if (_device->getProperty("built-in")) { if (_errataBits & kErrataNECIncompleteWrite) { FixupNECControllerConfigRegisters(); } // rdar://5769508 - if we are on a built in PCI device, then assume the system supports D3cold if (_device->hasPCIPowerManagement(kPCIPMCPMESupportFromD3Cold) && (_device->enablePCIPowerManagement(kPCIPMCSPowerStateD3) == kIOReturnSuccess)) { _hasPCIPwrMgmt = true; setProperty("Card Type","Built-in"); } } else { // rdar://5856545 - on older machines without the built-in property, we need to use the "default" case in the IOPCIDevice code if (_device->hasPCIPowerManagement() && (_device->enablePCIPowerManagement() == kIOReturnSuccess)) { _hasPCIPwrMgmt = true; setProperty("Card Type","Built-in"); } } if (!_hasPCIPwrMgmt) { USBError(1, "AppleUSBOHCI[%p]::CheckSleepCapability - controller will be unloaded across sleep",this); _controllerCanSleep = false; setProperty("Card Type","PCI"); } } else { setProperty("Card Type","Built-in"); } // if we have an ExpressCard attached (non-zero port), then we will need to disable port resume // for that port (some cards disconnect when the ExpressCard power goes away and we would like to ignore these extra detach events. _ExpressCardPort = ExpressCardPort(_device); _badExpressCardAttached = false; // Call registerService() so that the IOUSBController object is published and clients (like Prober) can find it registerService(); }