Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ ddi_dev_is_needed(9F) — SunOS 5.6

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

pm(7D)

attach(9E)

detach(9E)

power(9E)

pm_busy_compnent(9F)

pm_create_components(9F)

pm_destroy_components(9F)

pm_idle_component(9F)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026