ddi_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).
ARGUMENTS
dip A pointer to the device’s dev_info structure.
component The component of the driver which is needed
level The power level at which the component is needed
DESCRIPTION
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 of the devices on which it depends (see pm(7D)) to their normal power levels. If component 0 of the device 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 di_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() may 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
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.
SEE ALSO
pm(7D), attach(9E), detach(9E), power(9E), pm_busy_compnent(9F), pm_create_components(9F), pm_destroy_components(9F), pm_idle_component(9F)
Writing Device Drivers
SunOS 5.6 — Last change: 28 Oct 1996