DETACH(9E) Driver Entry Points DETACH(9E)
NAME
detach - detach or suspend a device
SYNOPSIS
#include <sys/ddi.h>
#include <sys/sunddi.h>
int prefixdetach(
dev_info_t * dip,
ddi_detach_cmd_t cmd);
INTERFACE LEVEL
illumos DDI specific (illumos 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 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_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(4)) to
save state file. It must do this, however, without disturbing the
saved hardware state of the device.
If the device driver uses automatic device Power Management
interfaces (driver exports
pm-components(9P) property), 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 outstanding 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, the
driver was successfully suspended.
DDI_FAILURE The operation failed or the request was not
understood. The associated state is unchanged.
CONTEXT
This function is called from user context only.
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Interface Stability | Committed |
+--------------------+-----------------+
SEE ALSO
cpr(4),
pm(4D),
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_raise_power(9F),
timeout(9F),
pm(9P),
pm-components(9P) Writing Device Drivers July 25, 2015 DETACH(9E)