SCSI_ADDRESS_DEVICE(9F)                         Kernel Functions for Drivers
NAME
     scsi_address_device, 
scsi_device_unit_address,     
scsi_device_hba_private_get, 
scsi_device_hba_private_set - SCSI Complex
     addressing utility functions
SYNOPSIS
     #include <sys/scsi/scsi.h>     struct scsi_device *     scsi_address_device(
struct scsi_address *sa);     
void *     scsi_device_hba_private_get(
struct scsi_device *sd);     
void     scsi_device_hba_private_set(
struct scsi_device *sd, 
void *data);     
char *     scsi_device_unit_address(
struct scsi_device *sd);
INTERFACE LEVEL
     Evolving - This interface is still evolving in illumos.  API and ABI
     stability is not guaranteed.
PARAMETERS
     sa            Pointer to a 
scsi_address(9S) structure.     
sd            Pointer to a 
scsi_device(9S) structure.     
data          A private value that the driver can get and set.
DESCRIPTION
     These functions provide useful services for SCSI HBA drivers that use
     complex addressing.  In complex addressing mode, the 
scsi_address(9S)     structure is treated as an opaque structure and is not a simple target
     and LUN.  To use these functions, the driver must have enabled complex
     addressing by passing the SCSI_HBA_ADDR_COMPLEX flag into the 
hba_flags     argument of the 
scsi_hba_attach_setup(9F) function.  If the
     SCSI_HBA_ADDR_COMPLEX flag was not passed, then the driver must not
     call the 
scsi_device_hba_private_get(), 
scsi_device_hba_private_set(),
     or 
scsi_device_unit_address() functions.
     The 
scsi_address_device() function maps the 
scsi_address(9S) function
     back to its corresponding 
scsi_device(9S) structure.  If the
     SCSI_HBA_ADDR_COMPLEX flag has not been set, then the function will
     return NULL.  This can be used as a way to check if the flag has been
     set on the device.
     The 
scsi_device_hba_private_set() function, allows a driver to set a
     private data value on the 
scsi_device(9S) structure, which it can later
     retrieve through the 
scsi_device_hba_private_get() function.  Most
     drivers will set a value during the 
tran_start(9E) entry point and then
     reference the data structure later on.  This is designed to simplify
     the management of mapping between driver data structures and the
     corresponding system objects.
     The 
scsi_device_unit_address() function returns the unit address of the     
scsi_device(9S) structure.  The returned string should not be modified
     by the device driver.  The unit address string comes from values that
     are passed when the device is enumerated, generally through an instance
     of an 
iport(9).
CONTEXT
     These functions may be used in 
user, 
kernel, and 
interrupt context.
RETURN VALUES
     Upon successful completion, the 
scsi_address_device() function returns
     a pointer to the 
scsi_device(9S) structure.  Otherwise, if an error
     occurred NULL is returned.
     The 
scsi_device_hba_private_get() function returns a data value
     registered via the 
scsi_device_hba_private_set() function.  If the     
scsi_device_hba_private_set() was never called, NULL is returned.
     Upon successful completion, the 
scsi_device_unit_address() returns a
     pointer to a character string with the device's unit address.
     Otherwise, NULL is returned.
     If the SCSI_HBA_ADDR_COMPLEX flag has not been set for the HBA
     structure or iport, then the 
scsi_address_device(),     
scsi_device_hba_private_get(), and 
scsi_device_unit_address() functions
     return NULL.
SEE ALSO
     iport(9), 
tran_start(9E), 
scsi_hba_attach_setup(9F), 
scsi_address(9S),     
scsi_device(9S)illumos                        April 20, 2017                        illumos