Sun Microsystems, Inc.
spacerspacer
spacer   www.sun.com docs.sun.com | | |  
spacer
black dot
   
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z
    
 
Kernel Functions for Driversddi_dev_is_needed(9F)


NAME

 ddi_dev_is_needed - inform the system that a device's component is required

SYNOPSIS

 
#include <sys/ddi.h>
#include <sys/sunddi.h>
int ddi_dev_is_needed(dev_info_t *dip, int component, int level);

INTERFACE LEVEL

 

Solaris DDI specific (Solaris DDI)

PARAMETERS

 
dip
Pointer to the device's dev_info structure.
component
Component of the driver which is needed.
level
Power level at which the component is needed.

DESCRIPTION

 

The ddi_dev_is_needed() function is obsolete and will be removed in a future release. It is recommended that device drivers use pm_raise_power(9F) and pm_lower_power(9F).

The ddi_dev_is_needed() function informs the system that a device component is needed at the specified power level. The level argument must be non-zero.

This function sets a component to the required level and sets all devices which depend on this to their normal power levels. If component 0 of a device using original Power Management interfaces (calls pm_create_components(9F)) is at power level 0, the ddi_dev_is_needed() call will result in component 0 being returned to normal power and the device being resumed via attach(9E) before ddi_dev_is_needed() returns.

The state of the device should be examined before each physical access. The ddi_dev_is_needed() function should be called to set a component to the required power level if the operation to be performed requires the component to be at a power level other than its current level.

The ddi_dev_is_needed() function might cause re-entry of the driver. Deadlock may result if driver locks are held across the call to ddi_dev_is_needed().

RETURN VALUES

 

The ddi_dev_is_needed() function returns:

DDI_SUCCESS
Power successfully set to the requested level.
DDI_FAILURE
An error occurred.

EXAMPLES

 Example 1. disk driver code
 

A hypothetical disk driver might include this code:

 
     static int
xxdisk_spun_down(struct xxstate *xsp)
{
		return (xsp->power_level[DISK_COMPONENT] < POWER_SPUN_UP);
}
static int
xxdisk_strategy(struct buf *bp)
{

...

		mutex_enter(&xxstate_lock);
		/*
	 	* Since we have to drop the mutex, we have to do this in a loop
	 	* in case we get preempted and the device gets taken away from
	 	* us again
	 	*/
		while (device_spun_down(sp)) {
			mutex_exit(&xxstate_lock);
			if (ddi_dev_is_needed(xsp->mydip,
				XXDISK_COMPONENT, XXPOWER_SPUN_UP) != DDI_SUCCESS) {
					bioerror(bp,EIO);
					biodone(bp);
					return (0);
			}
			mutex_enter(&xxstate_lock);
		}
		xsp->device_busy++;
		mutex_exit(&xxstate_lock);

...

}

CONTEXT

 

This function can be called from user or kernel context.

ATTRIBUTES

 

See attributes(5) for descriptions of the following attributes:

ATTRIBUTE TYPEATTRIBUTE VALUE
Interface stability Obsolete

SEE ALSO

 

pm(7D), pm-components(9P), attach(9E), detach(9E), power(9E), pm_busy_components(9f), pm_create_components(9F), pm_destroy_components(9F), pm_idle_component(9F)

Writing Device Drivers


SunOS 5.9Go To TopLast Changed 15 Oct 1999

 
      
      
Copyright 2002 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.