SCSI_VU_ERRMSG(9F)      Kernel Functions for Drivers      SCSI_VU_ERRMSG(9F)
NAME
       scsi_vu_errmsg - display a SCSI request sense message
SYNOPSIS
       #include <sys/scsi/scsi.h>       
void scsi_vu_errmsg(
struct scsi_pkt *pktp, 
char *drv_name, 
int severity,            int err_blkno, struct scsi_key_strings *cmdlist,            
struct scsi_extended_sense *sensep,            
struct scsi_asq_key_strings *asc_list,            
char **decode_fru struct scsi_device*, char 
*, int, char);
INTERFACE LEVEL
       illumos DDI specific (illumos DDI).
PARAMETERS
       The following parameters are supported:       
devp                     Pointer to the 
scsi_device(9S) structure.       
pktp                     Pointer to a 
scsi_pkt(9S) structure.       
drv_name                     String used by 
scsi_log(9F).       
severity                     Error severity level, maps to severity strings below.       
blkno                     Requested block number.       
err_blkno                     Error block number.       
cmdlist                     An array of SCSI command description strings.       
sensep                     A pointer to a 
scsi_extended_sense(9S) structure.       
asc_list                     A pointer to a array of asc and ascq message list.The
                     list must be terminated with 
-1 asc value.       
decode_fru                     This is a function pointer that will be called after
                     the entire sense information has been decoded. The
                     parameters will be the scsi_device structure to
                     identify the device. Second argument will be a pointer
                     to a buffer of length specified by third argument. The
                     fourth argument will be the FRU byte.  
decode_fru might
                     be 
NULL if no special decoding is required.  
decode_fru                     is expected to return pointer to a char string if
                     decoding possible and 
NULL if no decoding is possible.
DESCRIPTION
       This function is very similar to 
scsi_errmsg(9F) but allows decoding
       of vendor-unique ASC/ASCQ and FRU information.
       The 
scsi_vu_errmsg() function interprets the request sense
       information in the 
sensep pointer and generates a standard message
       that is displayed using 
scsi_log(9F). It first searches the list
       array for a matching vendor unique code if supplied. If it does not
       find one in the list then the standard list is searched. The first
       line of the message is always a 
CE_WARN, with the continuation lines
       being 
CE_CONT. 
sensep may be 
NULL, in which case no sense key or
       vendor information is displayed.
       The driver should make the determination as to when to call this
       function based on the severity of the failure and the severity level
       that the driver wants to report.
       The 
scsi_device(9S) structure denoted by 
devp supplies the
       identification of the device that requested the display. 
severity       selects which string is used in the Error Level: reporting, according
       to the table below:
              Severity Value:      String:
              SCSI_ERR_ALL         All
              SCSI_ERR_UNKNOWN     Unknown
              SCSI_ERR_INFO        Information
              SCSI_ERR_RECOVERED   Recovered
              SCSI_ERR_RETRYABLE   Retryable
              SCSI_ERR_FATAL       Fatal       
blkno is the block number of the original request that generated the
       error. 
err_blkno is the block number where the error occurred.       
cmdlist is a mapping table for translating the SCSI command code in
       pktp to the actual command string.
       The 
cmdlist is described in the structure below:
         struct scsi_key_strings {
             int key;
             char *message;
         };
       For a basic SCSI disk, the following list is appropriate:
              static struct scsi_key_strings scsi_cmds[] = {
                      0x00, "test unit ready",
                      0x01, "rezero/rewind",
                      0x03, "request sense",
                      0x04, "format",
                      0x07, "reassign",
                      0x08, "read",
                      0x0a, "write",
                      0x0b, "seek",
                      0x12, "inquiry",
                      0x15, "mode select",
                      0x16, "reserve",
                      0x17, "release",
                      0x18, "copy",
                      0x1a, "mode sense",
                      0x1b, "start/stop",
                      0x1e, "door lock",
                      0x28, "read(10)",
                      0x2a, "write(10)",
                      0x2f, "verify",
                      0x37, "read defect data",
                      0x3b, "write buffer",
                      -1, NULL
              };
CONTEXT
       The 
scsi_vu_errmsg() function may be called from user, interrupt, or
       kernel context.
EXAMPLES
       Example 1: Using scsi_vu_errmsg()
              struct scsi_asq_key_strings cd_slist[] = {
                      0x81, 0, "Logical Unit is inaccessible",
                      -1, 0, NULL,
              };
              scsi_vu_errmsg(devp, pkt, "sd",
                             SCSI_ERR_INFO, bp->b_blkno, err_blkno,
                             sd_cmds, rqsense, cd_list,
                             my_decode_fru);
       This generates the following console warning:
         WARNING: /sbus@1,f8000000/esp@0,800000/sd@1,0 (sd1):
                   Error for Command: read        Error Level: Informational
                   Requested Block: 23936         Error Block: 23936
                   Vendor: XYZ                Serial Number: 123456
                   Sense Key:  Unit Attention
                   ASC: 0x81 (Logical Unit is inaccessible), ASCQ: 0x0
                   FRU: 0x11 (replace LUN 1, located in slot 1)
SEE ALSO
       cmn_err(9F), 
scsi_errmsg(9F), 
scsi_log(9F), 
scsi_asc_key_strings(9S),       
scsi_device(9S), 
scsi_extended_sense(9S), 
scsi_pkt(9S)       Writing Device Drivers       STREAMS Programming Guide                              February 21, 2023           SCSI_VU_ERRMSG(9F)