detach(9E)
NAME
detach - detach or suspend a device
SYNOPSIS
#include <sys/ddi.h>
#include <sys/sunddi.h>
int prefix detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
INTERFACE LEVEL
Solaris DDI specific (Solaris DDI)
PARAMETERS
dip A pointer to the device's dev_info structure.
cmd Type of detach; the driver should return DDI_FAILURE
if any value other than DDI_DETACH, DDI_PM_SUSPEND
(obsolete), or DDI_SUSPEND is passed to it.
DESCRIPTION
The detach() function complements the attach(9E) routine.
DDI_DETACH
If cmd is set to DDI_DETACH, detach() is used to remove the
state associated with a given instance of a device node
prior to the removal of that instance from the system.
The detach() function will be called once for each instance
of the device for which there has been a successful
attach(), once there are no longer any opens on the device.
An attached instance of a driver can be successfully
detached only once. The detach() function should clean up
any per instance data initialized in attach(9E) and call
kmem_free(9F) to free any heap allocations. For information
on how to unregister interrupt handlers, see
ddi_add_intr(9F). This should also include putting the
underlying device into a quiescent state so that it will not
generate interrupts.
Drivers that set up timeout(9F) routines should ensure that
they are cancelled before returning DDI_SUCCESS from
detach().
If detach() determines a particular instance of the device
cannot be removed when requested because of some exceptional
condition, detach() must return DDI_FAILURE, which prevents
the particular device instance from being detached. This
also prevents the driver from being unloaded. A driver
instance failing the detach must ensure that no per instance
data or state is modified or freed that would compromise the
system or subsequent driver operation.
The system guarantees that the function will only be called
for a particular dev_info node after (and not concurrently
with) a successful attach(9E) of that device. The system
also guarantees that detach() will only be called when there
are no outstanding open(9E) calls on the device.
DDI_PM_SUSPEND
The DDI_PM_SUSPEND command is required only if the device
driver uses original Power Management interfaces (driver
calls pm_create_components(9F)). This entry point is not
needed if the device driver uses new automatic device Power
Management interfaces (driver exports pm-components(9P) pro-
perty instead of calling pm_create_components(9F)). The
DDI_PM_SUSPEND command is obsolete and will be removed in a
future release.
The DDI_PM_SUSPEND cmd is used to suspend all activity of a
device before power is possibly removed from the device by
setting component 0 to power level 0. In this case, detach()
may be called with outstanding open(9E) requests. It must
save the hardware state of the device to memory and block
incoming or existing requests until attach(9E) is called
with a command value of DDI_PM_RESUME. When the device is
suspended using DDI_PM_SUSPEND and it receives a request
which requires device to be powered on, it should call
ddi_dev_is_needed(9F) to request the framework to resume the
device.
A return of DDI_FAILURE will result in component 0 of the
device not being set to power level 0.
DDI_SUSPEND
The DDI_SUSPEND cmd is issued when the entire system is
being suspended and power removed from it or when the system
must be made quiescent. It will be issued only to devices
which have a reg property or which export a pm-hardware-
state property with the value needs-suspend-resume.
If cmd is set to DDI_SUSPEND, detach() is used to suspend
all activity of a device before power is (possibly) removed
from the device. The steps associated with suspension must
include putting the underlying device into a quiescent state
so that it will not generate interrupts or modify or access
memory. Once quiescence has been obtained, detach() can be
called with outstanding open(9E) requests. It must save the
hardware state of the device to memory and block incoming or
existing requests until attach() is called with DDI_RESUME.
If the device is used to store file systems, then after
DDI_SUSPEND is issued, the device should still honor
dump(9E) requests as this entry point may be used by
suspend-resume operation (see cpr(7)) to save state file. It
must do this, however, without disturbing the saved hardware
state of the device.
If the device driver uses original Power Management inter-
faces (driver calls pm_create_components(9F)) and it has
also been suspended by DDI_PM_SUSPEND, it will need to call
ddi_dev_is_needed(9F) to honor the dump(9E) request. If the
device driver uses new automatic device Power Management
interfaces (driver exports pm-components(9P) property
instead of calling pm_create_components(9F), it might need
to call pm_raise_power(9F) if the current power level is
lower than required to complete the dump(9E) request.
Before returning successfully from a call to detach() with a
command of DDI_SUSPEND, the driver must cancel any outstand-
ing timeouts and make any driver threads quiescent.
If DDI_FAILURE is returned for the DDI_SUSPEND cmd, either
the operation to suspend the system or to make it quiescent
will be aborted.
RETURN VALUES
DDI_SUCCESS
For DDI_DETACH, the state associated with the given
device was successfully removed. For DDI_SUSPEND and
DDI_PM_SUSPEND (obsolete), the driver was successfully
suspended.
DDI_FAILURE
The operation failed or the request was not under-
stood. The associated state is unchanged.
CONTEXT
This function is called from user context only.
ATTRIBUTES
See attributes(5) for descriptions of the following attri-
butes:
____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|__________________________|________________________________|
| Interface Stability | Evolving (DDI_PM_SUSPEND is|
| | obsolete.) |
|__________________________|________________________________|
SEE ALSO
cpr(7), pm(7D), pm(9P), pm-components(9P), attach(9E),
dump(9E), open(9E), power(9E), ddi_add_intr(9F),
ddi_dev_is_needed(9F), ddi_map_regs(9F), kmem_free(9F),
pm_create_components(9F), pm_raise_power(9F), timeout(9F)
Writing Device Drivers
Man(1) output converted with
man2html