void ARMIO::publishBelow( IORegistryEntry * root ) { OSCollectionIterator * kids; IORegistryEntry * next; IOService * nub; // infanticide kids = IODTFindMatchingEntries( root, kIODTRecursive, deleteList() ); if( kids) { while( (next = (IORegistryEntry *)kids->getNextObject())) { next->detachAll( gIODTPlane); } kids->release(); } // publish everything below, minus excludeList kids = IODTFindMatchingEntries( root, kIODTRecursive | kIODTExclusive, excludeList()); if( kids) { while( (next = (IORegistryEntry *)kids->getNextObject())) { if( 0 == (nub = createNub( next ))) continue; nub->attach( this ); processNub(nub); nub->registerService(); } kids->release(); } }
bool IODTPlatformExpert::createNubs( IOService * parent, OSIterator * iter ) { IORegistryEntry * next; IOService * nub; bool ok = true; if( iter) { while( (next = (IORegistryEntry *) iter->getNextObject())) { if( 0 == (nub = createNub( next ))) continue; nub->attach( parent ); nub->registerService(); } iter->release(); } return( ok ); }
bool IOPlatformExpert::configure( IOService * provider ) { OSSet * topLevel; OSDictionary * dict; IOService * nub; topLevel = OSDynamicCast( OSSet, getProperty("top-level")); if( topLevel) { while( (dict = OSDynamicCast( OSDictionary, topLevel->getAnyObject()))) { dict->retain(); topLevel->removeObject( dict ); nub = createNub( dict ); if( 0 == nub) continue; dict->release(); nub->attach( this ); nub->registerService(); } } return( true ); }
bool IOATABlockStorageDriver::start ( IOService * provider ) { IOReturn theErr = kIOReturnSuccess; IOWorkLoop * workLoop = NULL; OSNumber * numCommandObjects = NULL; STATUS_LOG ( ( "IOATABlockStorageDriver::start entering.\n" ) ); fATADevice = NULL; fCommandPool = NULL; fATAUnitID = kATAInvalidDeviceID; fATADeviceType = kUnknownATADeviceType; fATASocketType = kUnknownSocket; fAPMLevel = 0xFF; // First call start() in our superclass if ( super::start ( provider ) == false ) return false; // Cache our provider fATADevice = OSDynamicCast ( IOATADevice, provider ); if ( fATADevice == NULL ) return false; // Find out if the device type is ATA if ( fATADevice->getDeviceType ( ) != reportATADeviceType ( ) ) { ERROR_LOG ( ( "IOATABlockStorageDriver::start exiting, not an ATA device.\n" ) ); return false; } reserved = ( ExpansionData * ) IOMalloc ( sizeof ( ExpansionData ) ); bzero ( reserved, sizeof ( ExpansionData ) ); STATUS_LOG ( ( "IOATABlockStorageDriver::start opening device.\n" ) ); if ( fATADevice->open ( this ) == false ) return false; // Cache the drive unit number (master/slave assignment). fATAUnitID = fATADevice->getUnitID ( ); fATADeviceType = fATADevice->getDeviceType ( ); STATUS_LOG ( ( "IOATABlockStorageDriver::start fATAUnitID = %d.\n", ( UInt8 ) fATAUnitID ) ); STATUS_LOG ( ( "IOATABlockStorageDriver::start fATADeviceType is %d\n", ( UInt8 ) fATADeviceType ) ); bzero ( fDeviceIdentifyData, 512 ); fDeviceIdentifyBuffer = IOMemoryDescriptor::withAddress ( ( void * ) fDeviceIdentifyData, 512, kIODirectionIn ); assert ( fDeviceIdentifyBuffer != NULL ); fDeviceIdentifyBuffer->prepare ( ); numCommandObjects = OSDynamicCast ( OSNumber, getProperty ( "IOCommandPoolSize" ) ); fNumCommandObjects = numCommandObjects->unsigned32BitValue ( ); STATUS_LOG ( ( "IOATABlockStorageDriver::start fNumCommandObjects = %ld\n", fNumCommandObjects ) ); // Create an IOCommandGate (for power management support) and attach // this event source to the provider's workloop fCommandGate = IOCommandGate::commandGate ( this ); assert ( fCommandGate != NULL ); workLoop = getWorkLoop ( ); assert ( workLoop != NULL ); theErr = workLoop->addEventSource ( fCommandGate ); assert ( theErr == kIOReturnSuccess ); fCommandPool = IOCommandPool::commandPool ( this, workLoop, fNumCommandObjects ); assert ( fCommandPool != NULL ); allocateATACommandObjects ( ); // Inspect the provider if ( inspectDevice ( fATADevice ) == false ) return false; fCurrentPowerState = kIOATAPowerStateActive; fProposedPowerState = kIOATAPowerStateActive; fNumCommandsOutstanding = 0; fPowerTransitionInProgress = false; fPowerManagementThread = thread_call_allocate ( ( thread_call_func_t ) IOATABlockStorageDriver::sPowerManagement, ( thread_call_param_t ) this ); if ( fPowerManagementThread == NULL ) { ERROR_LOG ( ( "thread allocation failed.\n" ) ); return false; } // A policy-maker must make these calls to join the PM tree, // and to initialize its state PMinit ( ); // initialize power management variables setIdleTimerPeriod ( k5Minutes ); // 5 minute inactivity timer provider->joinPMtree ( this ); // join power management tree makeUsable ( ); fPowerManagementInitialized = true; initForPM ( ); return ( createNub ( provider ) ); }