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); } }