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