DDI_DEVID_COMPARE(9F)   Kernel Functions for Drivers   DDI_DEVID_COMPARE(9F)
NAME
       ddi_devid_compare, ddi_devid_free, ddi_devid_init,
       ddi_devid_register, ddi_devid_sizeof, ddi_devid_str_decode,
       ddi_devid_str_encode, ddi_devid_str_free, ddi_devid_get,
       ddi_devid_unregister, ddi_devid_valid - kernel interfaces for device
       ids
SYNOPSIS
       int ddi_devid_compare(
ddi_devid_t devid1, 
ddi_devid_t devid2);       
size_t ddi_devid_sizeof(
ddi_devid_t devid);       
int ddi_devid_init(
dev_info_t *dip, 
ushort_t devid_type,            
ushort_t nbytes, 
void *id, 
ddi_devid_t *retdevid);       
void ddi_devid_free(
ddi_devid_t devid);       
int ddi_devid_register(
dev_info_t *dip, 
ddi_devid_t devid);       
int ddi_devid_str_decode(
char *devidstr, 
ddi_devid_t *retdevid,            
char **retminor_name);       
int ddi_devid_str_encode(
ddi_devid_t devid, 
char *minor_name);       
int ddi_devid_str_free(
char *devidstr);       
int ddi_devid_get(
dev_info_t *dip, 
ddi_devid_t *retdevid);       
void ddi_devid_unregister(
dev_info_t *dip);       
int ddi_devid_valid(
ddi_devid_t devid);
PARAMETERS
       devid                     The device id address.       
devidstr                     The 
devid and 
minor_name represented as a string.       
devid1                     The first of two device id addresses to be compared
                     calling 
ddi_devid_compare().       
devid2                     The second of two device id addresses to be compared
                     calling 
ddi_devid_compare().       
dip                     A 
dev_info pointer, which identifies the device.       
devid_type                     The following device id types may be accepted by the                     
ddi_devid_init() function:                     
DEVID_SCSI3_WWN                                          World Wide Name associated with
                                          SCSI-3 devices.                     
DEVID_SCSI_SERIAL                                          Vendor 
ID and serial number
                                          associated with a SCSI device.
                                          Note: This may only be used if
                                          known to be unique; otherwise a
                                          fabricated device id must be used.                     
DEVID_ENCAP                                          Device 
ID of another device. This
                                          is for layered device driver
                                          usage.                     
DEVID_FAB                                          Fabricated device 
ID.       
minor_name                        The minor name to be encoded.       
nbytes                        The length in bytes of device 
ID.       
retdevid                        The return address of the device 
ID.       
retminor_name                        The return address of a minor name. Free string with                        
ddi_devid_str_free().
INTERFACE LEVEL
       illumos DDI specific (illumos DDI).
DESCRIPTION
       The following routines are used to provide unique identifiers, device       
IDs, for devices. Specifically, kernel modules use these interfaces
       to identify and locate devices, independent of the device's physical
       connection or its logical device name or number.       
ddi_devid_compare() compares two device 
IDs byte-by-byte and
       determines both equality and sort order.       
ddi_devid_sizeof() returns the number of bytes allocated for the
       passed in device 
ID (
devid).       
ddi_devid_init() allocates memory and initializes the opaque device       
ID structure. This function does not store the 
devid. If the device
       id is not derived from the device's firmware, it is the driver's
       responsibility to store the 
devid on some reliable store. When a       
devid_type of either 
DEVID_SCSI3_WWN, DEVID_SCSI_SERIAL, or       
DEVID_ENCAP is accepted, an array of bytes (
id) must be passed in
       (
nbytes).
       When the 
devid_type DEVID_FAB is used, the array of bytes (
id) must
       be 
NULL and the length (
nbytes) must be zero. The fabricated device
       ids, 
DEVID_FAB will be initialized with the machine's host id and a
       timestamp.
       Drivers must free the memory allocated by this function, using the       
ddi_devid_free() function.       
ddi_devid_free() frees the memory allocated for the returned 
devid by
       the 
ddi_devid_init() and 
devid_str_decode() functions.       
ddi_devid_register() registers the device 
ID address (
devid) with the       
DDI framework, associating it with the 
dev_info passed in (
dip). The
       drivers must register device 
IDs at attach time. See 
attach(9E).       
ddi_devid_unregister() removes the device 
ID address from the       
dev_info passed in (
dip). Drivers must use this function to
       unregister the device 
ID when devices are being detached. This
       function does not free the space allocated for the device 
ID. The
       driver must free the space allocated for the device 
ID, using the       
ddi_devid_free() function. See 
detach(9E).       
ddi_devid_valid() validates the device 
ID (
devid) passed in.  The
       driver must use this function to validate any fabricated device 
ID       that has been stored on a device.
       The 
ddi_devid_get() function returns a pointer to the device ID
       structure through 
retdevid if there is already a registered device ID
       associated with the 
dev_info node. A driver can use this interface to
       check and get the device ID associated with the 
dev_info node. It
       returns 
DDI_FAILURE if no device ID is registered for the node.
       The 
ddi_devid_get() function allocates memory for the opaque device
       ID structure and initializes it with the associated device ID and
       returns the pointer to it. The driver must free the memory allocated
       by this function using the 
ddi_devid_free() function.
       The 
ddi_devid_str_encode() function encodes a 
devid and 
minor_name       into a null-terminated ASCII string, returning a pointer to that
       string. If both a 
devid and a 
minor_name are non-null, then a slash
       (
/) is used to separate the 
devid from the 
minor_name in the encoded
       string. If 
minor_name is null, then only the 
devid is encoded. If the       
devid is null, then the special string 
id0 is returned. Note that you
       cannot compare the returned string against another string with       
strcmp() to determine 
devid equality. The returned string must be
       freed by calling 
devid_str_free().
       The 
ddi_devid_str_decode() function takes a string previously
       produced by the 
devid_str_encode(3DEVID) or 
ddi_devid_str_encode()       function and decodes the contained device ID and minor name,
       allocating and returning pointers to the extracted parts through the       
retdevid and 
retminor_name arguments. If the special 
devidstr id0 was
       specified then the returned device ID and minor name will both be
       null. A non-null returned 
devid must be freed by the caller through
       the 
ddi_devid_free() function. A non-null returned minor name must be
       freed by calling 
ddi_devid_str_free().
       The 
ddi_devid_str_free() function is used to free all strings
       returned by the 
ddi_devid functions (the 
ddi_devid_str_encode()       function return value and the returned 
retminor_name argument).
RETURN VALUES
       ddi_devid_init() returns the following values:            
DDI_SUCCESS                           Success.            
DDI_FAILURE                           Out of memory. An invalid 
devid_type was passed
                           in.       
ddi_devid_valid() returns the following values:            
DDI_SUCCESS                           Valid device 
ID.            
DDI_FAILURE                           Invalid device 
ID.       
ddi_devid_register() returns the following values:            
DDI_SUCCESS                           Success.            
DDI_FAILURE                           Failure. The device 
ID is already registered or
                           the device 
ID is invalid.       
ddi_devid_valid() returns the following values:            
DDI_SUCCESS                           Valid device 
ID.            
DDI_FAILURE                           Invalid device 
ID.       
ddi_devid_get() returns the following values:            
DDI_SUCCESS                           Device 
ID is present and a pointer to it is
                           returned in 
retdevid.            
DDI_FAILURE                           No device 
ID is defined for this 
dev_info node.       
ddi_devid_compare() returns the following values:            
-1                     The first device ID is less than the second device ID.            
0                     The first device ID is equal to the second device ID.            
1                     The first device ID is greater than the second device
                     ID.       
ddi_devid_sizeof() returns the size of the 
devid in bytes. If called
       with a null, then the number of bytes that must be allocated and
       initialized to determine the size of a complete device ID is
       returned.       
ddi_devid_str_encode() returns a value of null to indicate failure.
       Failure can be caused by attempting to encode an invalid 
devid. If
       the return value is non-null then the caller must free the returned
       string by using the 
devid_str_free() function.       
ddi_devid_str_decode() returns the following values:            
DDI_SUCCESS                           Success.            
DDI_FAILURE                           Failure; the 
devidstr string was not valid.
CONTEXT
       These functions can be called from a user or kernel context.
SEE ALSO
       devid_get(3DEVID), 
libdevid(3LIB), 
attributes(7), 
attach(9E),       
detach(9E), 
kmem_free(9F)       Writing Device Drivers                               August 22, 2023         DDI_DEVID_COMPARE(9F)