The attach(9E) routine should perform the common initialization tasks that all devices require. Typically, these tasks include:
Allocating per-instance state structures
Registering device interrupts
Mapping the device's registers
Initializing mutex and condition variables
Creating power-manageable components
Creating minor nodes
See "attach()" for code examples of these tasks.
Character device drivers create minor nodes of type S_IFCHR. This causes a character special file representing the node to eventually appear in the /devices hierarchy. Example 9-1 shows a character driver attach(9E) routine.
static int xxattach(dev_info_t *dip, ddi_attach_cmd_t cmd) { switch (cmd) { case DDI_ATTACH: allocate a state structure and initialize it. map the device's registers. add the device driver's interrupt handler(s). initialize any mutexes and condition variables. create power manageable components. /* * Create the device's minor node. Note that the node_type * argument is set to DDI_NT_TAPE. */ if (ddi_create_minor_node(dip, "minor_name", S_IFCHR, minor_number, DDI_NT_TAPE, 0) == DDI_FAILURE) { free resources allocated so far. /* Remove any previously allocated minor nodes */ ddi_remove_minor_node(dip, NULL); return (DDI_FAILURE); } ... return (DDI_SUCCESS); case DDI_PM_RESUME: For information, see Chapter 8, Power Management case DDI_RESUME: For information, see Chapter 8, Power Management default: return (DDI_FAILURE); } }