ddi_dev_is_needed(9F)
NAME
ddi_dev_is_needed - inform the system that a device's com-
ponent 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 phy-
sical 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 attri-
butes:
____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE 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
Man(1) output converted with
man2html