Example #1
0
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 */
Example #3
0
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;
}