ATTACH(9E) Driver Entry Points ATTACH(9E)

NAME


attach - Attach a device to the system, or resume it

SYNOPSIS


#include <sys/ddi.h>
#include <sys/sunddi.h>


int prefixattach(dev_info_t *dip, ddi_attach_cmd_t cmd);


INTERFACE LEVEL


illumos DDI specific (illumos DDI)

PARAMETERS


dip
A pointer to the device's dev_info structure.


cmd
Attach type. Possible values are DDI_ATTACH and DDI_RESUME. Other
values are reserved. The driver must return DDI_FAILURE if
reserved values are passed to it.


DESCRIPTION


The attach(9E) function is the device-specific initialization entry
point. This entry point is required and must be written.

DDI_ATTACH
The DDI_ATTACH command must be provided in the attach(9E) entry point.
DDI_ATTACH is used to initialize a given device instance. When attach(9E)
is called with cmd set to DDI_ATTACH, all normal kernel services (such as
kmem_alloc(9F)) are available for use by the driver. Device interrupts
are not blocked when attaching a device to the system.


The attach(9E) function is called once for each instance of the device on
the system with cmd set to DDI_ATTACH. Until attach(9E) succeeds, the
only driver entry point which may be called is getinfo(9E). See the
Writing Device Drivers for more information. The instance number may be
obtained using ddi_get_instance(9F).


At attach time, all components of a power-manageable device are assumed
to be at unknown levels. Before using the device, the driver needs to
bring the required component(s) to a known power level. The
pm_raise_power(9F) function can be used to set the power level of a
component. This function must not be called before data structures
referenced in power(9E) have been initialized.

DDI_RESUME
The attach() function may be called with cmd set to DDI_RESUME after
detach(9E) has been successfully called with cmd set to DDI_SUSPEND.


When called with cmd set to DDI_RESUME, attach() must restore the
hardware state of a device (power may have been removed from the device),
allow pending requests to continue, and service new requests. In this
case, the driver must not make any assumptions about the state of the
hardware, but must restore the state of the device except for the power
level of components.


If the device driver uses the automatic device Power Management
interfaces (driver exports the pm-components(9P) property), the Power
Management framework sets its notion of the power level of each component
of a device to unknown while processing a DDI_RESUME command.


The driver can deal with components during DDI_RESUME in one of the
following ways:

1. If the driver can determine the power level of the component
without having to power it up (for example, by calling
ddi_peek(9F) or some other device-specific method) then it
should notify the power level to the framework by calling
pm_power_has_changed(9F).

2. The driver must also set its own notion of the power level of
the component to unknown. The system will consider the
component idle or busy based on the most recent call to
pm_idle_component(9F) or pm_busy_component(9F) for that
component. If the component is idle for sufficient time, the
framework will call into the driver's power(9E) entry point to
turn the component off. If the driver needs to access the
device, then it must call pm_raise_power(9F) to bring the
component up to the level needed for the device access to
succeed. The driver must honor any request to set the power
level of the component, since it cannot make any assumption
about what power level the component has (or it should have
called pm_power_has_changed(9F) as outlined above). As a
special case of this, the driver may bring the component to a
known state because it wants to perform an operation on the
device as part of its DDI_RESUME processing (such as loading
firmware so that it can detect hot-plug events).

RETURN VALUES


The attach() function returns:

DDI_SUCCESS
Successful completion


DDI_FAILURE
Operation failed


ATTRIBUTES


See attributes(7) for descriptions of the following attributes:


+--------------------+-----------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-----------------+
|Interface Stability | Committed |
+--------------------+-----------------+

SEE ALSO


cpr(4), pm(4D), detach(9E), getinfo(9E), identify(9E), open(9E),
power(9E), probe(9E), ddi_add_intr(9F), ddi_create_minor_node(9F),
ddi_get_instance(9F), ddi_map_regs(9F), kmem_alloc(9F),
pm_raise_power(9F), pm(9P), pm-components(9P)


Writing Device Drivers

January 7, 2004 ATTACH(9E)