DDI_CHECK_ACC_HANDLE(9F)                        Kernel Functions for Drivers
NAME
       ddi_check_acc_handle, ddi_check_dma_handle - Check data access and
       DMA handles
SYNOPSIS
       #include <sys/ddi.h>
       #include <sys/sunddi.h>       
int ddi_check_acc_handle(
ddi_acc_handle_t  acc_handle );       
int ddi_check_dma_handle(
ddi_dma_handle_t  dma_handle );
INTERFACE LEVEL
       illumos DDI specific (illumos DDI)
PARAMETERS
       acc_handle                      Data access handle obtained from a previous call to                      
ddi_regs_map_setup(9F), 
ddi_dma_mem_alloc(9F), or
                      similar function.       
dma_handle                      DMA handle obtained from 
ddi_dma_alloc_handle(9F).
DESCRIPTION
       The 
ddi_check_acc_handle() and ddi_check_dma_handle() functions check
       for faults that can interfere with communication between a driver and
       the device it controls. Each function checks a single handle of a
       specific type and returns a status value indicating whether faults
       affecting the resource mapped by the supplied handle have been
       detected.
       If a fault is indicated when checking a data access handle, this
       implies that the driver is no longer able to access the mapped
       registers or memory using programmed I/O through that handle.
       Typically, this might occur after the device has failed to respond to
       an I/O access (for example, has incurred a bus error or timed out).
       The effect of programmed I/O accesses made after this happens is
       undefined; for example, read accesses (for example, 
ddi_get8(9F)) may
       return random values, and write accesses (for example, 
ddi_put8(9F))
       may or may not have any effect. This type of fault is normally fatal
       to the operation of the device, and the driver should report it via       
ddi_dev_report_fault(9F) specifying 
DDI_SERVICE_LOST for the impact,
       and 
DDI_DATAPATH_FAULT for the location.
       If a fault is indicated when checking a DMA handle, it implies that a
       fault has been detected that has (or will) affect DMA transactions
       between the device and the memory currently bound to the handle (or
       most recently bound, if the handle is currently unbound). Possible
       causes include the failure of a component in the DMA data path, or an
       attempt by the device to make an invalid DMA access.  The driver may
       be able to continue by falling back to a non-DMA mode of operation,
       but in general, DMA faults are non-recoverable.  The contents of the
       memory currently (or previously) bound to the handle should be
       regarded as indeterminate. The fault indication associated with the
       current transaction is lost once the handle is (re-)bound, but
       because the fault may persist, future DMA operations may not succeed.
       Note that some implementations cannot detect all types of failure. If
       a fault is not indicated, this does not constitute a guarantee that
       communication is possible. However, if a check fails, this is a
       positive indication that a problem 
does exist with respect to
       communication using that handle.
RETURN VALUES
       The 
ddi_check_acc_handle() and 
ddi_check_dma_handle() functions
       return 
DDI_SUCCESS if no faults affecting the supplied handle are
       detected and 
DDI_FAILURE if any fault affecting the supplied handle
       is detected.
EXAMPLES
         static int
         xxattach(dev_info_t *dip, ddi_attach_cmd_t cmd)
         {
             ...
             /* This driver uses only a single register-access handle */
             status = ddi_regs_map_setup(dip, REGSET_ZERO, ®addr,
                                         0, 0, , &acc_attrs, &acc_hdl);
             if (status != DDI_SUCCESS)
                 return (DDI_FAILURE);
             ...
         }
         static int
         xxread(dev_t  dev, struct uio *uio_p, cred_t *cred_p)
         {
             ...
             if (ddi_check_acc_handle(acc_hdl) != DDI_SUCCESS) {
                 ddi_dev_report_fault(dip, DDI_SERVICE_LOST,
                     DDI_DATAPATH_FAULT, "register access fault during read");
                 return (EIO);
             }
             ...
CONTEXT
       The 
ddi_check_acc_handle() and 
ddi_check_dma_handle() functions may
       be called from user, kernel, or interrupt context.
SEE ALSO
       ddi_dev_report_fault(9F), 
ddi_dma_alloc_handle(9F), 
ddi_get8(9F),       
ddi_put8(9F), 
ddi_regs_map_setup(9F)                                May 24, 2014        DDI_CHECK_ACC_HANDLE(9F)