NAME | SYNOPSIS | INTERFACE LEVEL | PARAMETERS | DESCRIPTION | RETURN VALUES | EXAMPLES | CONTEXT | ATTRIBUTES | SEE ALSO
#include <sys/ddi.h> #include <sys/sunddi.h>int ddi_dev_is_needed(dev_info_t *dip, int component, int level);
Solaris DDI specific (Solaris DDI)
Pointer to the device's dev_info structure.
Component of the driver which is needed.
Power level at which the component is needed.
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().
The ddi_dev_is_needed() function returns:
Power successfully set to the requested level.
An error occurred.
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); . . . }
This function can be called from user or kernel context.
See attributes(5) for descriptions of the following attributes:
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
---|---|
Interface stability | Obsolete |
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)
NAME | SYNOPSIS | INTERFACE LEVEL | PARAMETERS | DESCRIPTION | RETURN VALUES | EXAMPLES | CONTEXT | ATTRIBUTES | SEE ALSO