int attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
When a device that has been suspended is needed again, its power(9E) entry point is called to restore the power level of component 0 (entire device) to its normal power. The driver's attach(9E) entry point is then called with an attach command value of DDI_PM_RESUME to restore the device hardware state saved in the detach(9E) routine and unblock any pending operations. Example 8-3 shows an attach(9E) routine with DDI_PM_RESUME implemented.
int
xxattach(devinfo_t *dip, ddi_attach_cmd_t cmd)
{
struct xxstate *xsp;
int instance;
instance = ddi_get_instance(dip);
xsp = ddi_get_soft_state(statep, instance);
switch (cmd) {
case DDI_ATTACH:
see chapter 5, Autoconfiguration for discussion
case DDI_RESUME:
see Example 8-5 for DDI_RESUME implementation
case DDI_PM_RESUME:
/*
* We won't be DDI_PM_RESUMEd while DDI_SUSPENDed
*/
mutex_enter(&xsp->mu);
Restore device register contents from xsp->xx_device_state
this section is optional, only needed if the driver maintains a running timeout
/* restart timeouts */
xsp->xx_timeout_id = timeout({...});
xsp->xx_pm_suspended = 0; /* allow new operations */
cv_broadcast(&xsp->cv);
mutex_exit(&xsp->mu);
return(DDI_SUCCESS);
default:
return(DDI_FAILURE);
}
}