IOReturn CLASS::setPowerState( unsigned long powerStateOrdinal, IOService * policyMaker ) { if (!fPCINub || (powerStateOrdinal == fCurrentPowerState)) return IOPMAckImplied; switch (powerStateOrdinal) { case kPowerStateOff: // Now that the driver knows if Magic Packet support was enabled, // tell PCI Family whether PME_EN should be set or not. hwSetMagicPacketEnable( fMagicPacketEnabled ); fPCINub->hasPCIPowerManagement( fMagicPacketEnabled ? kPCIPMCPMESupportFromD3Cold : kPCIPMCD3Support ); break; case kPowerStateDoze: break; case kPowerStateOn: if (fCurrentPowerState == kPowerStateOff) initPCIConfigSpace(fPCINub); break; } fCurrentPowerState = powerStateOrdinal; return IOPMAckImplied; }
bool RTL8139::start( IOService *provider ) { OSObject *builtinProperty; bool success = false; ELG( IOThreadSelf(), provider, 'Strt', "RTL8139::start - this, provider." ); DEBUG_LOG( "start() ===>\n" ); do { if ( false == super::start( provider ) ) // Start our superclass first break; // Save a reference to our provider. pciNub = OSDynamicCast( IOPCIDevice, provider ); if ( 0 == pciNub ) break; pciNub->retain(); // Retain provider, released in free(). if ( false == pciNub->open( this ) ) // Open our provider. break; fBuiltin = false; builtinProperty = provider->getProperty( "built-in" ); if ( builtinProperty ) { fBuiltin = true; ELG( 0, 0, 'b-in', "RTL8139::start - found built-in property." ); } if ( false == initEventSources( provider ) ) break; // Allocate memory for descriptors. This function will leak memory // if called more than once. So don't do it. if ( false == allocateDescriptorMemory() ) break; // Get the virtual address mapping of CSR registers located at // Base Address Range 0 (0x10). csrMap = pciNub->mapDeviceMemoryWithRegister( kIOPCIConfigBaseAddress1 ); if ( 0 == csrMap ) break; csrBase = (volatile void*)csrMap->getVirtualAddress(); // Init PCI config space: if ( false == initPCIConfigSpace( pciNub ) ) break; // Reset chip to bring it to a known state. if ( initAdapter( kResetChip ) == false ) { IOLog( "%s: initAdapter() failed\n", getName() ); break; } registerEEPROM(); // Publish our media capabilities: phyProbeMediaCapability(); if ( false == publishMediumDictionary( mediumDict ) ) break; success = true; } while ( false ); // Close our provider, it will be re-opened on demand when // our enable() is called by a client. if ( pciNub ) pciNub->close( this ); do { if ( false == success ) break; success = false; // Allocate and attach an IOEthernetInterface instance. if ( false == attachInterface( (IONetworkInterface**)&netif, false) ) break; // Optional: this driver supports kernel debugging. attachDebuggerClient( &debugger ); // Trigger matching for clients of netif. netif->registerService(); success = true; } while ( false ); DEBUG_LOG( "start() <===\n" ); return success; }/* end start */
bool CLASS::start( IOService * provider ) { bool success = false; bool superStart = false; do { // Start our superclass first. if (false == super::start(provider)) break; superStart = true; // Save a reference to our provider. fPCINub = OSDynamicCast(IOPCIDevice, provider); if (!fPCINub) break; // Retain provider, released in free(). fPCINub->retain(); // Open our provider. if (false == fPCINub->open(this)) break; // Allocate mbuf cursors and other support objects. if (false == allocateSupportObjects(provider)) break; // Initialize our harwdare's PCI config space. initPCIConfigSpace(fPCINub); // Get the virtual address mapping of registers located at // Base Address Range 1 (offset 0x14 - memory range). fRegMap = fPCINub->mapDeviceMemoryWithRegister( kIOPCIConfigBaseAddress1); if (0 == fRegMap) break; fRegBase = (volatile void *) fRegMap->getVirtualAddress(); // Detect the hardware type. if (probeHardware() == false) { ERROR_LOG("%s: probeHardware() failed\n", getName()); break; } // Publish our media capabilities. phyProbeCapability(); success = true; } while ( false ); // Stop super on failure. if (!success && superStart) { super::stop(provider); } // Close our provider, it will be re-opened on demand when // our enable() is called by a client. if (fPCINub) fPCINub->close(this); do { if (false == success) break; success = false; // Allocate and attach an IOEthernetInterface instance. if (false == attachInterface((IONetworkInterface **)&fNetif, false)) break; // Optional: this driver supports kernel debugging. // Reserved a copy buffer memory used during kernel debugging, // and resolve its physical address. Use mbuf for convenience. fKDPMbuf = allocatePacket(kIOEthernetMaxPacketSize); if (fKDPMbuf && fRxMbufCursor->getPhysicalSegments(fKDPMbuf, &fKDPMbufSeg) == 1) { attachDebuggerClient(&fKDPNub); } // Start matching clients of netif. fNetif->registerService(); success = true; } while ( false ); return success; }
bool AgereET131x::start(IOService* provider) { //IOLog("%s::%s()\n",getName(),__FUNCTION__); bool success = false; if (super::start(provider) == false) { IOLog("supper::start failed.\n"); return false; } pciDevice = OSDynamicCast(IOPCIDevice, provider); if (pciDevice == NULL) return false; pciDevice->retain(); if (pciDevice->open(this) == false) return false; adapter.VendorID = pciDevice->configRead16(kIOPCIConfigVendorID); adapter.DeviceID = pciDevice->configRead16(kIOPCIConfigDeviceID); adapter.SubVendorID = pciDevice->configRead16(kIOPCIConfigSubSystemVendorID); adapter.SubSystemID = pciDevice->configRead16(kIOPCIConfigSubSystemID); adapter.RevisionID = pciDevice->configRead8(kIOPCIConfigRevisionID); // adapter.hw.device_id will be used later IOLog("vendor:device: 0x%x:0x%x.\n", adapter.VendorID, adapter.DeviceID); do { if(!initEventSources(provider)){ break; } csrPCIAddress = pciDevice->mapDeviceMemoryWithRegister(kIOPCIConfigBaseAddress0); if (csrPCIAddress == NULL) { IOLog("csrPCIAddress.\n"); break; } adapter.CSRAddress = (ADDRESS_MAP_t*)csrPCIAddress->getVirtualAddress(); adapter.netdev = this; adapter.pdev = pciDevice; set_mtu( ETH_DATA_LEN ); // Init PCI config space: if ( false == initPCIConfigSpace() ) break; // reset the hardware with the new settings addNetworkMedium(kIOMediumEthernetAuto, 0, MEDIUM_INDEX_AUTO); addNetworkMedium(kIOMediumEthernet10BaseT | kIOMediumOptionHalfDuplex, 10 * MBit, MEDIUM_INDEX_10HD); addNetworkMedium(kIOMediumEthernet10BaseT | kIOMediumOptionFullDuplex, 10 * MBit, MEDIUM_INDEX_10FD); addNetworkMedium(kIOMediumEthernet100BaseTX | kIOMediumOptionHalfDuplex, 100 * MBit, MEDIUM_INDEX_100HD); addNetworkMedium(kIOMediumEthernet100BaseTX | kIOMediumOptionFullDuplex, 100 * MBit, MEDIUM_INDEX_100FD); addNetworkMedium(kIOMediumEthernet1000BaseT | kIOMediumOptionFullDuplex, 1000 * MBit, MEDIUM_INDEX_1000FD); if (!publishMediumDictionary(mediumDict)) { IOLog("publishMediumDictionary.\n"); break; } success = true; } while(false); // Close our provider, it will be re-opened on demand when // our enable() is called by a client. pciDevice->close(this); do { if ( false == success ) break; // Allocate and attach an IOEthernetInterface instance. if (attachInterface((IONetworkInterface **)(&netif), true) == false) { IOLog("Failed to attach data link layer.\n"); break; } success = true; } while(false); if(false == success){ adapter_memory_free(); } return success; }