IOReturn IOFireWireMagicMatchingNub::message( 	UInt32 		mess, 
												IOService *	provider,
												void * 		argument )
{
    // Propagate bus reset start/end messages
    if( kIOMessageServiceIsResumed == mess ||
        kIOMessageServiceIsSuspended == mess ||
        kIOMessageServiceIsRequestingClose == mess ||
        kIOFWMessageServiceIsRequestingClose == mess ) 
	{
 		messageClients( mess );
        return kIOReturnSuccess;
    }
	
	if( kIOFWMessagePowerStateChanged == mess )
	{
		messageClients( mess );
		return kIOReturnSuccess;
	}

	if( kIOFWMessageTopologyChanged == mess )
	{
		messageClients( mess );
		return kIOReturnSuccess;
	}
	
    return IOService::message(mess, provider, argument );
}
IOReturn IOFireWireAVCLocalNode::message(UInt32 type, IOService *provider, void *argument)
{
    IOReturn res = kIOReturnUnsupported;

	//IOLog( "IOFireWireAVCLocalNode::message\n");

	switch (type)
	{
		case kIOMessageServiceIsTerminated:
		case kIOMessageServiceIsRequestingClose:
		case kIOMessageServiceIsResumed:
			res = kIOReturnSuccess;
			break;

		// This message is received when a bus-reset start happens!
		case kIOMessageServiceIsSuspended:
			res = kIOReturnSuccess;
			if((fStarted == true) && (fPCRSpace))
				fPCRSpace->clearAllP2PConnections();
			break;

		default:
			break;
	}
	
	messageClients(type);

    return res;
}
IOReturn IOFireWireSBP2LUN::message( UInt32 type, IOService *nub, void *arg )
{
    IOReturn res = kIOReturnUnsupported;

    //IOLog("IOFireWireSBP2LUN, message 0x%x\n", type);

    res = IOService::message(type, nub, arg);

    if( kIOReturnUnsupported == res )
    {
        switch (type)
        {
            case kIOMessageServiceIsTerminated:
				terminateNotify();
                FWKLOG( ( "IOFireWireSBP2LUN<%p> : kIOMessageServiceIsTerminated\n", this ) );
                res = kIOReturnSuccess;
                break;

            case kIOMessageServiceIsSuspended:
				FWKLOG( ( "IOFireWireSBP2LUN<%p> : kIOMessageServiceIsSuspended\n", this ) );
                suspendedNotify();
                res = kIOReturnSuccess;
                break;

            case kIOMessageServiceIsResumed:
				FWKLOG( ( "IOFireWireSBP2LUN<%p> : kIOMessageServiceIsResumed\n", this ) );
                resumeNotify();
                res = kIOReturnSuccess;
                break;

            default: // default the action to return kIOReturnUnsupported
                break;
        }
   }

    // we must send resumeNotify and/or suspendNotify before messaging clients
	if( type != kIOMessageServiceIsTerminated &&
		type != (UInt32)kIOMessageFWSBP2ReconnectFailed &&
		type != (UInt32)kIOMessageFWSBP2ReconnectComplete )
	{
		messageClients( type, arg );    
    }
	
	// send reset notification for all busy orbs
	// we must send orb reset notification after messaging clients
	if( type == kIOMessageServiceIsSuspended )
		clearAllTasksInSet();
		
    return res;
}
void WMIHIKeyboardDevice::keyPressed(int code)
{
	int i = 0, out;
	do
	{
		if (keyMap[i].description == NULL && keyMap[i].in == 0 && keyMap[i].out == 0xFF)
		{
			DbgLog("%s: Unknown key %02X i=%d\n",this->getName(), code, i);
			break;
		}
		if (keyMap[i].in == code)
		{
			out = keyMap[i].out;
			messageClients(kIOACPIMessageDeviceNotification, &out);
            DbgLog("%s: Key Pressed %02X i=%d\n",this->getName(), code, i);
			break;
		}
		i++;
	}
	while (true);	
}
IOReturn com_ximeta_driver_NDASLogicalDevice::message(		
													   UInt32		mess, 
													   IOService	* provider,
													   void			* argument 
													   )
{
	DbgIOLog(DEBUG_MASK_PNP_TRACE, ("message: Entered.\n"));

    // Propagate power and eject messages
    if ( kIOMessageServiceIsResumed == mess ||
		 kIOMessageServiceIsSuspended == mess ||
		 kIOMessageServiceIsRequestingClose == mess ||
		 kIOMessageServiceIsTerminated == mess
		 ) 
    {		
        messageClients( mess );
        return kIOReturnSuccess;
    }
	
    return IOService::message(mess, provider, argument );
}
IOReturn com_ximeta_driver_NDASDiskArrayController::message (
															 UInt32 		type,
															 IOService *	nub,
															 void * 		arg 
															 )
{
	DbgIOLog(DEBUG_MASK_NDAS_TRACE, ("message Entered.\n"));
	
	IOReturn				status		= kIOReturnSuccess;
	
	switch ( type )
	{
		
		case kIOMessageServiceIsSuspended:
		{
			DbgIOLog(DEBUG_MASK_POWER_INFO, ("kIOMessageServiceIsSuspended\n"));

			// Now go to sleep.
			fInSleepMode = true;
					
			messageClients(kIOMessageServiceIsSuspended);
			
		}
			break;
			
		case kIOMessageServiceIsResumed:
		{
			DbgIOLog(DEBUG_MASK_POWER_INFO, ("kIOMessageServiceIsResumed\n"));
			
			fInSleepMode = false;
			
			fWakeup = true;
						
			// Disconnect.
			for(int count = 0; count < MAX_NR_OF_TARGETS_PER_DEVICE; count++) {
				if(fProvider->targetConnected(count)) {
					
					fProvider->setTargetConnected(count, false);
					fProvider->cleanupDataConnection(count);
					//fProvider->unmount(count);
				}			
			}
			
			messageClients(kIOMessageServiceIsResumed);
		}
			break;
		case kIOMessageServiceIsRequestingClose:
		{
			DbgIOLog(DEBUG_MASK_NDAS_INFO, ("kIOMessageServiceIsRequestingClose\n"));
		
			// Terminate Thread.
			fThreadTerminate = true;
			
			semaphore_signal(fCommandSema);
			
			// Wait Until the thread terminated.
			semaphore_wait(fExitSema);
			
			if ( fProvider != NULL ) {		
				
				fProvider->setController(NULL);
				
				if ( fProvider->isOpen ( this ) ) {
					fProvider->close ( this );
				}
			}
			
		}
			break;
			
		case kIOMessageServiceIsTerminated:
			DbgIOLog(DEBUG_MASK_NDAS_INFO, ("kIOMessageServiceIsTerminated\n"));
			
			if ( fProvider != NULL ) {		
				
				fProvider->setController(NULL);
				
				if ( fProvider->isOpen ( this ) ) {
					fProvider->close ( this );
				}
			}
				
			break;
			
		default:
			status = IOService::message (type, nub, arg);
			break;
			
	}
	
	return status;
	
}