Home | History | Annotate | Download | only in sg_write_buffer
      1 /*
      2  * Copyright (c) 2007-2018 Douglas Gilbert.
      3  * All rights reserved.
      4  * Use of this source code is governed by a BSD-style
      5  * license that can be found in the BSD_LICENSE file.
      6  */
      7 
      8 #include <stdlib.h>
      9 
     10 #ifdef HAVE_CONFIG_H
     11 #include "config.h"
     12 #else
     13 #define SG_SCSI_STRINGS 1
     14 #endif
     15 
     16 #include "sg_lib.h"
     17 #include "sg_lib_data.h"
     18 
     19 
     20 const char * sg_lib_version_str = "2.38 20180122";/* spc5r17, sbc4r15 */
     21 
     22 
     23 /* indexed by pdt; those that map to own index do not decay */
     24 int sg_lib_pdt_decay_arr[32] = {
     25     PDT_DISK, PDT_TAPE, PDT_TAPE /* printer */, PDT_PROCESSOR,
     26     PDT_DISK /* WO */, PDT_MMC, PDT_SCANNER, PDT_DISK /* optical */,
     27     PDT_MCHANGER, PDT_COMMS, 0xa, 0xb,
     28     PDT_SAC, PDT_SES, PDT_DISK /* rbc */, PDT_OCRW,
     29     PDT_BCC, PDT_OSD, PDT_TAPE /* adc */, PDT_SMD,
     30     PDT_DISK /* zbc */, 0x15, 0x16, 0x17,
     31     0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, PDT_WLUN, PDT_UNKNOWN
     32 };
     33 
     34 #ifdef SG_SCSI_STRINGS
     35 struct sg_lib_value_name_t sg_lib_normal_opcodes[] = {
     36     {0, 0, "Test Unit Ready"},
     37     {0x1, 0, "Rezero Unit"},
     38     {0x1, PDT_TAPE, "Rewind"},
     39     {0x3, 0, "Request Sense"},
     40     {0x4, 0, "Format Unit"},
     41     {0x4, PDT_TAPE, "Format medium"},
     42     {0x4, PDT_PRINTER, "Format"},
     43     {0x5, 0, "Read Block Limits"},
     44     {0x7, 0, "Reassign Blocks"},
     45     {0x7, PDT_MCHANGER, "Initialize element status"},
     46     {0x8, 0, "Read(6)"},        /* obsolete in sbc3r30 */
     47     {0x8, PDT_PROCESSOR, "Receive"},
     48     {0xa, 0, "Write(6)"},       /* obsolete in sbc3r30 */
     49     {0xa, PDT_PRINTER, "Print"},
     50     {0xa, PDT_PROCESSOR, "Send"},
     51     {0xb, 0, "Seek(6)"},
     52     {0xb, PDT_TAPE, "Set capacity"},
     53     {0xb, PDT_PRINTER, "Slew and print"},
     54     {0xf, 0, "Read reverse(6)"},
     55     {0x10, 0, "Write filemarks(6)"},
     56     {0x10, PDT_PRINTER, "Synchronize buffer"},
     57     {0x11, 0, "Space(6)"},
     58     {0x12, 0, "Inquiry"},
     59     {0x13, 0, "Verify(6)"},  /* SSC */
     60     {0x14, 0, "Recover buffered data"},
     61     {0x15, 0, "Mode select(6)"}, /* SBC-3 r31 recommends Mode select(10) */
     62     {0x16, 0, "Reserve(6)"},    /* obsolete in SPC-4 r11 */
     63     {0x16, PDT_MCHANGER, "Reserve element(6)"},
     64     {0x17, 0, "Release(6)"},    /* obsolete in SPC-4 r11 */
     65     {0x17, PDT_MCHANGER, "Release element(6)"},
     66     {0x18, 0, "Copy"},          /* obsolete in SPC-4 r11 */
     67     {0x19, 0, "Erase(6)"},
     68     {0x1a, 0, "Mode sense(6)"}, /* SBC-3 r31 recommends Mode sense(10) */
     69     {0x1b, 0, "Start stop unit"},
     70     {0x1b, PDT_TAPE, "Load unload"},
     71     {0x1b, PDT_ADC, "Load unload"},
     72     {0x1b, PDT_PRINTER, "Stop print"},
     73     {0x1c, 0, "Receive diagnostic results"},
     74     {0x1d, 0, "Send diagnostic"},
     75     {0x1e, 0, "Prevent allow medium removal"},
     76     {0x23, 0, "Read Format capacities"},
     77     {0x24, 0, "Set window"},
     78     {0x25, 0, "Read capacity(10)"},
     79                         /* SBC-3 r31 recommends Read capacity(16) */
     80     {0x25, PDT_OCRW, "Read card capacity"},
     81     {0x28, 0, "Read(10)"},      /* SBC-3 r31 recommends Read(16) */
     82     {0x29, 0, "Read generation"},
     83     {0x2a, 0, "Write(10)"},     /* SBC-3 r31 recommends Write(16) */
     84     {0x2b, 0, "Seek(10)"},
     85     {0x2b, PDT_TAPE, "Locate(10)"},
     86     {0x2b, PDT_MCHANGER, "Position to element"},
     87     {0x2c, 0, "Erase(10)"},
     88     {0x2d, 0, "Read updated block"},
     89     {0x2e, 0, "Write and verify(10)"},
     90                         /* SBC-3 r31 recommends Write and verify(16) */
     91     {0x2f, 0, "Verify(10)"},    /* SBC-3 r31 recommends Verify(16) */
     92     {0x30, 0, "Search data high(10)"},
     93     {0x31, 0, "Search data equal(10)"},
     94     {0x32, 0, "Search data low(10)"},
     95     {0x33, 0, "Set limits(10)"},
     96     {0x34, 0, "Pre-fetch(10)"}, /* SBC-3 r31 recommends Pre-fetch(16) */
     97     {0x34, PDT_TAPE, "Read position"},
     98     {0x35, 0, "Synchronize cache(10)"},
     99                         /* SBC-3 r31 recommends Synchronize cache(16) */
    100     {0x36, 0, "Lock unlock cache(10)"},
    101     {0x37, 0, "Read defect data(10)"},
    102                         /* SBC-3 r31 recommends Read defect data(12) */
    103     {0x37, PDT_MCHANGER, "Initialize element status with range"},
    104     {0x38, 0, "Medium scan"},
    105     {0x39, 0, "Compare"},               /* obsolete in SPC-4 r11 */
    106     {0x3a, 0, "Copy and verify"},       /* obsolete in SPC-4 r11 */
    107     {0x3b, 0, "Write buffer"},
    108     {0x3c, 0, "Read buffer(10)"},
    109     {0x3d, 0, "Update block"},
    110     {0x3e, 0, "Read long(10)"},         /* obsolete in SBC-4 r7 */
    111     {0x3f, 0, "Write long(10)"}, /* SBC-3 r31 recommends Write long(16) */
    112     {0x40, 0, "Change definition"},     /* obsolete in SPC-4 r11 */
    113     {0x41, 0, "Write same(10)"}, /* SBC-3 r31 recommends Write same(16) */
    114     {0x42, 0, "Unmap"},                 /* added SPC-4 rev 18 */
    115     {0x42, PDT_MMC, "Read sub-channel"},
    116     {0x43, PDT_MMC, "Read TOC/PMA/ATIP"},
    117     {0x44, 0, "Report density support"},
    118     {0x45, PDT_MMC, "Play audio(10)"},
    119     {0x46, PDT_MMC, "Get configuration"},
    120     {0x47, PDT_MMC, "Play audio msf"},
    121     {0x48, 0, "Sanitize"},
    122     {0x4a, PDT_MMC, "Get event status notification"},
    123     {0x4b, PDT_MMC, "Pause/resume"},
    124     {0x4c, 0, "Log select"},
    125     {0x4d, 0, "Log sense"},
    126     {0x4e, 0, "Stop play/scan"},
    127     {0x50, 0, "Xdwrite(10)"},           /* obsolete in SBC-3 r31 */
    128     {0x51, 0, "Xpwrite(10)"},           /* obsolete in SBC-4 r15 */
    129     {0x51, PDT_MMC, "Read disk information"},
    130     {0x52, 0, "Xdread(10)"},            /* obsolete in SBC-3 r31 */
    131     {0x52, PDT_MMC, "Read track information"},
    132     {0x53, 0, "Xdwriteread(10)"},       /* obsolete in SBC-4 r15 */
    133     {0x54, 0, "Send OPC information"},
    134     {0x55, 0, "Mode select(10)"},
    135     {0x56, 0, "Reserve(10)"},           /* obsolete in SPC-4 r11 */
    136     {0x56, PDT_MCHANGER, "Reserve element(10)"},
    137     {0x57, 0, "Release(10)"},           /* obsolete in SPC-4 r11 */
    138     {0x57, PDT_MCHANGER, "Release element(10)"},
    139     {0x58, 0, "Repair track"},
    140     {0x5a, 0, "Mode sense(10)"},
    141     {0x5b, 0, "Close track/session"},
    142     {0x5c, 0, "Read buffer capacity"},
    143     {0x5d, 0, "Send cue sheet"},
    144     {0x5e, 0, "Persistent reserve in"},
    145     {0x5f, 0, "Persistent reserve out"},
    146     {0x7e, 0, "Extended cdb (XCBD)"},           /* added in SPC-4 r12 */
    147     {0x80, 0, "Xdwrite extended(16)"},          /* obsolete in SBC-4 r15 */
    148     {0x80, PDT_TAPE, "Write filemarks(16)"},
    149     {0x81, 0, "Rebuild(16)"},
    150     {0x81, PDT_TAPE, "Read reverse(16)"},
    151     {0x82, 0, "Regenerate(16)"},
    152     {0x83, 0, "Third party copy out"},  /* Extended copy, before spc4r34 */
    153         /* Following was "Receive copy results", before spc4r34 */
    154     {0x84, 0, "Third party copy in"},
    155     {0x85, 0, "ATA pass-through(16)"},  /* was 0x98 in spc3 rev21c */
    156     {0x86, 0, "Access control in"},
    157     {0x87, 0, "Access control out"},
    158     {0x88, 0, "Read(16)"},
    159     {0x89, 0, "Compare and write"},
    160     {0x8a, 0, "Write(16)"},
    161     {0x8b, 0, "Orwrite(16)"},
    162     {0x8c, 0, "Read attribute"},
    163     {0x8d, 0, "Write attribute"},
    164     {0x8e, 0, "Write and verify(16)"},
    165     {0x8f, 0, "Verify(16)"},
    166     {0x90, 0, "Pre-fetch(16)"},
    167     {0x91, 0, "Synchronize cache(16)"},
    168     {0x91, PDT_TAPE, "Space(16)"},
    169     {0x92, 0, "Lock unlock cache(16)"},
    170     {0x92, PDT_TAPE, "Locate(16)"},
    171     {0x93, 0, "Write same(16)"},
    172     {0x93, PDT_TAPE, "Erase(16)"},
    173     {0x94, PDT_ZBC, "ZBC out"},  /* new sbc4r04, has service actions */
    174     {0x95, PDT_ZBC, "ZBC in"},   /* new sbc4r04, has service actions */
    175     {0x9a, 0, "Write stream(16)"},      /* added sbc4r07 */
    176     {0x9b, 0, "Read buffer(16)"},       /* added spc5r02 */
    177     {0x9c, 0, "Write atomic(16)"},
    178     {0x9d, 0, "Service action bidirectional"},  /* added spc4r35 */
    179     {0x9e, 0, "Service action in(16)"},
    180     {0x9f, 0, "Service action out(16)"},
    181     {0xa0, 0, "Report luns"},
    182     {0xa1, 0, "ATA pass-through(12)"},
    183     {0xa1, PDT_MMC, "Blank"},
    184     {0xa2, 0, "Security protocol in"},
    185     {0xa3, 0, "Maintenance in"},
    186     {0xa3, PDT_MMC, "Send key"},
    187     {0xa4, 0, "Maintenance out"},
    188     {0xa4, PDT_MMC, "Report key"},
    189     {0xa5, 0, "Move medium"},
    190     {0xa5, PDT_MMC, "Play audio(12)"},
    191     {0xa6, 0, "Exchange medium"},
    192     {0xa6, PDT_MMC, "Load/unload medium"},
    193     {0xa7, 0, "Move medium attached"},
    194     {0xa7, PDT_MMC, "Set read ahead"},
    195     {0xa8, 0, "Read(12)"},      /* SBC-3 r31 recommends Read(16) */
    196     {0xa9, 0, "Service action out(12)"},
    197     {0xaa, 0, "Write(12)"},     /* SBC-3 r31 recommends Write(16) */
    198     {0xab, 0, "Service action in(12)"},
    199     {0xac, 0, "erase(12)"},
    200     {0xac, PDT_MMC, "Get performance"},
    201     {0xad, PDT_MMC, "Read DVD/BD structure"},
    202     {0xae, 0, "Write and verify(12)"},
    203                         /* SBC-3 r31 recommends Write and verify(16) */
    204     {0xaf, 0, "Verify(12)"},    /* SBC-3 r31 recommends Verify(16) */
    205     {0xb0, 0, "Search data high(12)"},
    206     {0xb1, 0, "Search data equal(12)"},
    207     {0xb1, PDT_MCHANGER, "Open/close import/export element"},
    208     {0xb2, 0, "Search data low(12)"},
    209     {0xb3, 0, "Set limits(12)"},
    210     {0xb4, 0, "Read element status attached"},
    211     {0xb5, 0, "Security protocol out"},
    212     {0xb5, PDT_MCHANGER, "Request volume element address"},
    213     {0xb6, 0, "Send volume tag"},
    214     {0xb6, PDT_MMC, "Set streaming"},
    215     {0xb7, 0, "Read defect data(12)"},
    216     {0xb8, 0, "Read element status"},
    217     {0xb9, 0, "Read CD msf"},
    218     {0xba, 0, "Redundancy group in"},
    219     {0xba, PDT_MMC, "Scan"},
    220     {0xbb, 0, "Redundancy group out"},
    221     {0xbb, PDT_MMC, "Set CD speed"},
    222     {0xbc, 0, "Spare in"},
    223     {0xbd, 0, "Spare out"},
    224     {0xbd, PDT_MMC, "Mechanism status"},
    225     {0xbe, 0, "Volume set in"},
    226     {0xbe, PDT_MMC, "Read CD"},
    227     {0xbf, 0, "Volume set out"},
    228     {0xbf, PDT_MMC, "Send DVD/BD structure"},
    229     {0xffff, 0, NULL},
    230 };
    231 
    232 /* Read buffer(10) [0x3c] and Read buffer(16) [0x9b] service actions (sa),
    233  * need prefix */
    234 struct sg_lib_value_name_t sg_lib_read_buff_arr[] = {
    235     {0x0, 0, "combined header and data [or multiple modes]"},
    236     {0x2, 0, "data"},
    237     {0x3, 0, "descriptor"},
    238     {0xa, 0, "read data from echo buffer"},
    239     {0xb, 0, "echo buffer descriptor"},
    240     {0x1a, 0, "enable expander comms protocol and echo buffer"},
    241     {0x1c, 0, "error history"},
    242     {0xffff, 0, NULL},
    243 };
    244 
    245 /* Write buffer [0x3b] service actions, need prefix */
    246 struct sg_lib_value_name_t sg_lib_write_buff_arr[] = {
    247     {0x0, 0, "combined header and data [or multiple modes]"},
    248     {0x2, 0, "data"},
    249     {0x4, 0, "download microcode and activate"},
    250     {0x5, 0, "download microcode, save, and activate"},
    251     {0x6, 0, "download microcode with offsets and activate"},
    252     {0x7, 0, "download microcode with offsets, save, and activate"},
    253     {0xa, 0, "write data to echo buffer"},
    254     {0xd, 0, "download microcode with offsets, select activation events, "
    255              "save and defer activate"},
    256     {0xe, 0, "download microcode with offsets, save and defer activate"},
    257     {0xf, 0, "activate deferred microcode"},
    258     {0x1a, 0, "enable expander comms protocol and echo buffer"},
    259     {0x1b, 0, "disable expander comms protocol"},
    260     {0x1c, 0, "download application client error history"},
    261     {0xffff, 0, NULL},
    262 };
    263 
    264 /* Read position (SSC) [0x34] service actions, need prefix */
    265 struct sg_lib_value_name_t sg_lib_read_pos_arr[] = {
    266     {0x0, PDT_TAPE, "short form - block id"},
    267     {0x1, PDT_TAPE, "short form - vendor specific"},
    268     {0x6, PDT_TAPE, "long form"},
    269     {0x8, PDT_TAPE, "extended form"},
    270     {0xffff, 0, NULL},
    271 };
    272 
    273 /* Maintenance in [0xa3] service actions */
    274 struct sg_lib_value_name_t sg_lib_maint_in_arr[] = {
    275     {0x0, PDT_SAC, "Report assigned/unassigned p_extent"},
    276     {0x1, PDT_SAC, "Report component device"},
    277     {0x2, PDT_SAC, "Report component device attachments"},
    278     {0x3, PDT_SAC, "Report peripheral device"},
    279     {0x4, PDT_SAC, "Report peripheral device associations"},
    280     {0x5, 0, "Report identifying information"},
    281                 /* was "Report device identifier" prior to spc4r07 */
    282     {0x6, PDT_SAC, "Report states"},
    283     {0x7, PDT_SAC, "Report device identification"},
    284     {0x8, PDT_SAC, "Report unconfigured capacity"},
    285     {0x9, PDT_SAC, "Report supported configuration method"},
    286     {0xa, 0, "Report target port groups"},
    287     {0xb, 0, "Report aliases"},
    288     {0xc, 0, "Report supported operation codes"},
    289     {0xd, 0, "Report supported task management functions"},
    290     {0xe, 0, "Report priority"},
    291     {0xf, 0, "Report timestamp"},
    292     {0x10, 0, "Management protocol in"},
    293     {0x1d, PDT_DISK, "Report provisioning initialization pattern"},
    294         /* added in sbc4r07, shares sa 0x1d with ssc5r01 (tape) */
    295     {0x1d, PDT_TAPE, "Receive recommended access order"},
    296     {0x1e, PDT_TAPE, "Read dynamic runtime attribute"},
    297     {0x1e, PDT_ADC, "Report automation device attributes"},
    298     {0x1f, 0, "Maintenance in vendor specific"},
    299     {0xffff, 0, NULL},
    300 };
    301 
    302 /* Maintenance out [0xa4] service actions */
    303 struct sg_lib_value_name_t sg_lib_maint_out_arr[] = {
    304     {0x0, PDT_SAC, "Add peripheral device / component device"},
    305     {0x1, PDT_SAC, "Attach to component device"},
    306     {0x2, PDT_SAC, "Exchange p_extent"},
    307     {0x3, PDT_SAC, "Exchange peripheral device / component device"},
    308     {0x4, PDT_SAC, "Instruct component device"},
    309     {0x5, PDT_SAC, "Remove peripheral device / component device"},
    310     {0x6, 0, "Set identifying information"},
    311                 /* was "Set device identifier" prior to spc4r07 */
    312     {0x7, PDT_SAC, "Break peripheral device / component device"},
    313     {0xa, 0, "Set target port groups"},
    314     {0xb, 0, "Change aliases"},
    315     {0xc, 0, "Remove I_T nexus"},
    316     {0xe, 0, "Set priority"},
    317     {0xf, 0, "Set timestamp"},
    318     {0x10, 0, "Management protocol out"},
    319     {0x1d, PDT_TAPE, "Generate recommended access order"},
    320     {0x1e, PDT_TAPE, "write dynamic runtime attribute"},
    321     {0x1e, PDT_ADC, "Set automation device attributes"},
    322     {0x1f, 0, "Maintenance out vendor specific"},
    323     {0xffff, 0, NULL},
    324 };
    325 
    326 /* Sanitize [0x48] service actions, need prefix */
    327 struct sg_lib_value_name_t sg_lib_sanitize_sa_arr[] = {
    328     {0x1, 0, "overwrite"},
    329     {0x2, 0, "block erase"},
    330     {0x3, 0, "cryptographic erase"},
    331     {0x1f, 0, "exit failure mode"},
    332     {0xffff, 0, NULL},
    333 };
    334 
    335 /* Service action in(12) [0xab] service actions */
    336 struct sg_lib_value_name_t sg_lib_serv_in12_arr[] = {
    337     {0x1, 0, "Read media serial number"},
    338     {0xffff, 0, NULL},
    339 };
    340 
    341 /* Service action out(12) [0xa9] service actions */
    342 struct sg_lib_value_name_t sg_lib_serv_out12_arr[] = {
    343     {0xff, 0, "Impossible command name"},
    344     {0xffff, 0, NULL},
    345 };
    346 
    347 /* Service action in(16) [0x9e] service actions */
    348 struct sg_lib_value_name_t sg_lib_serv_in16_arr[] = {
    349     {0xf, 0, "Receive binding report"}, /* added spc5r11 */
    350     {0x10, 0, "Read capacity(16)"},
    351     {0x11, 0, "Read long(16)"},         /* obsolete in SBC-4 r7 */
    352     {0x12, 0, "Get LBA status(16)"},    /* 32 byte variant added in sbc4r14 */
    353     {0x13, 0, "Report referrals"},
    354     {0x14, 0, "Stream control"},
    355     {0x15, 0, "Background control"},
    356     {0x16, 0, "Get stream status"},
    357     {0x17, 0, "Get physical element status"},   /* added sbc4r13 */
    358     {0x18, 0, "Remove element and truncate"},   /* added sbc4r13 */
    359     {0xffff, 0, NULL},
    360 };
    361 
    362 /* Service action out(16) [0x9f] service actions */
    363 struct sg_lib_value_name_t sg_lib_serv_out16_arr[] = {
    364     {0x0b, 0, "Test bind"},             /* added spc5r13 */
    365     {0x0c, 0, "Prepare bind report"},   /* added spc5r11 */
    366     {0x0d, 0, "Set affiliation"},
    367     {0x0e, 0, "Bind"},
    368     {0x0f, 0, "Unbind"},
    369     {0x11, 0, "Write long(16)"},
    370     {0x12, 0, "Write scattered(16)"},   /* added sbc4r11 */
    371     {0x14, PDT_ZBC, "Reset write pointer"},
    372     {0x1f, PDT_ADC, "Notify data transfer device(16)"},
    373     {0xffff, 0, NULL},
    374 };
    375 
    376 /* Service action bidirectional [0x9d] service actions */
    377 struct sg_lib_value_name_t sg_lib_serv_bidi_arr[] = {
    378     {0xffff, 0, NULL},
    379 };
    380 
    381 /* Persistent reserve in [0x5e] service actions, need prefix */
    382 struct sg_lib_value_name_t sg_lib_pr_in_arr[] = {
    383     {0x0, 0, "read keys"},
    384     {0x1, 0, "read reservation"},
    385     {0x2, 0, "report capabilities"},
    386     {0x3, 0, "read full status"},
    387     {0xffff, 0, NULL},
    388 };
    389 
    390 /* Persistent reserve out [0x5f] service actions, need prefix */
    391 struct sg_lib_value_name_t sg_lib_pr_out_arr[] = {
    392     {0x0, 0, "register"},
    393     {0x1, 0, "reserve"},
    394     {0x2, 0, "release"},
    395     {0x3, 0, "clear"},
    396     {0x4, 0, "preempt"},
    397     {0x5, 0, "preempt and abort"},
    398     {0x6, 0, "register and ignore existing key"},
    399     {0x7, 0, "register and move"},
    400     {0x8, 0, "replace lost reservation"},
    401     {0xffff, 0, NULL},
    402 };
    403 
    404 /* Third party copy in [0x83] service actions
    405  * Opcode 'Receive copy results' was renamed 'Third party copy in' in spc4r34
    406  * LID1 is an abbreviation of List Identifier length of 1 byte */
    407 struct sg_lib_value_name_t sg_lib_xcopy_sa_arr[] = {
    408     {0x0, 0, "Extended copy(LID1)"},
    409     {0x1, 0, "Extended copy(LID4)"},
    410     {0x10, 0, "Populate token"},
    411     {0x11, 0, "Write using token"},
    412     {0x1c, 0, "Copy operation abort"},
    413     {0xffff, 0, NULL},
    414 };
    415 
    416 /* Third party copy out [0x84] service actions
    417  * Opcode 'Extended copy' was renamed 'Third party copy out' in spc4r34
    418  * LID4 is an abbreviation of List Identifier length of 4 bytes */
    419 struct sg_lib_value_name_t sg_lib_rec_copy_sa_arr[] = {
    420     {0x0, 0, "Receive copy status(LID1)"},
    421     {0x1, 0, "Receive copy data(LID1)"},
    422     {0x3, 0, "Receive copy operating parameters"},
    423     {0x4, 0, "Receive copy failure details(LID1)"},
    424     {0x5, 0, "Receive copy status(LID4)"},
    425     {0x6, 0, "Receive copy data(LID4)"},
    426     {0x7, 0, "Receive ROD token information"},
    427     {0x8, 0, "Report all ROD tokens"},
    428     {0xffff, 0, NULL},
    429 };
    430 
    431 /* Variable length cdb [0x7f] service actions (more than 16 bytes long) */
    432 struct sg_lib_value_name_t sg_lib_variable_length_arr[] = {
    433     {0x1, 0, "Rebuild(32)"},
    434     {0x2, 0, "Regenerate(32)"},
    435     {0x3, 0, "Xdread(32)"},             /* obsolete in SBC-3 r31 */
    436     {0x4, 0, "Xdwrite(32)"},            /* obsolete in SBC-3 r31 */
    437     {0x5, 0, "Xdwrite extended(32)"},   /* obsolete in SBC-4 r15 */
    438     {0x6, 0, "Xpwrite(32)"},            /* obsolete in SBC-4 r15 */
    439     {0x7, 0, "Xdwriteread(32)"},        /* obsolete in SBC-4 r15 */
    440     {0x8, 0, "Xdwrite extended(64)"},   /* obsolete in SBC-4 r15 */
    441     {0x9, 0, "Read(32)"},
    442     {0xa, 0, "Verify(32)"},
    443     {0xb, 0, "Write(32)"},
    444     {0xc, 0, "Write and verify(32)"},
    445     {0xd, 0, "Write same(32)"},
    446     {0xe, 0, "Orwrite(32)"},            /* added sbc3r25 */
    447     {0xf, 0, "Atomic write(32)"},       /* added sbc4r02 */
    448     {0x10, 0, "Write stream(32)"},      /* added sbc4r07 */
    449     {0x11, 0, "Write scattered(32)"},   /* added sbc4r11 */
    450     {0x12, 0, "Get LBA status(32)"},    /* added sbc4r14 */
    451     {0x1800, 0, "Receive credential"},
    452     {0x1ff0, 0, "ATA pass-through(32)"},/* added sat4r05 */
    453     {0x8801, 0, "Format OSD (osd)"},
    454     {0x8802, 0, "Create (osd)"},
    455     {0x8803, 0, "List (osd)"},
    456     {0x8805, 0, "Read (osd)"},
    457     {0x8806, 0, "Write (osd)"},
    458     {0x8807, 0, "Append (osd)"},
    459     {0x8808, 0, "Flush (osd)"},
    460     {0x880a, 0, "Remove (osd)"},
    461     {0x880b, 0, "Create partition (osd)"},
    462     {0x880c, 0, "Remove partition (osd)"},
    463     {0x880e, 0, "Get attributes (osd)"},
    464     {0x880f, 0, "Set attributes (osd)"},
    465     {0x8812, 0, "Create and write (osd)"},
    466     {0x8815, 0, "Create collection (osd)"},
    467     {0x8816, 0, "Remove collection (osd)"},
    468     {0x8817, 0, "List collection (osd)"},
    469     {0x8818, 0, "Set key (osd)"},
    470     {0x8819, 0, "Set master key (osd)"},
    471     {0x881a, 0, "Flush collection (osd)"},
    472     {0x881b, 0, "Flush partition (osd)"},
    473     {0x881c, 0, "Flush OSD (osd)"},
    474     {0x8880, 0, "Object structure check (osd-2)"},
    475     {0x8881, 0, "Format OSD (osd-2)"},
    476     {0x8882, 0, "Create (osd-2)"},
    477     {0x8883, 0, "List (osd-2)"},
    478     {0x8884, 0, "Punch (osd-2)"},
    479     {0x8885, 0, "Read (osd-2)"},
    480     {0x8886, 0, "Write (osd-2)"},
    481     {0x8887, 0, "Append (osd-2)"},
    482     {0x8888, 0, "Flush (osd-2)"},
    483     {0x8889, 0, "Clear (osd-2)"},
    484     {0x888a, 0, "Remove (osd-2)"},
    485     {0x888b, 0, "Create partition (osd-2)"},
    486     {0x888c, 0, "Remove partition (osd-2)"},
    487     {0x888e, 0, "Get attributes (osd-2)"},
    488     {0x888f, 0, "Set attributes (osd-2)"},
    489     {0x8892, 0, "Create and write (osd-2)"},
    490     {0x8895, 0, "Create collection (osd-2)"},
    491     {0x8896, 0, "Remove collection (osd-2)"},
    492     {0x8897, 0, "List collection (osd-2)"},
    493     {0x8898, 0, "Set key (osd-2)"},
    494     {0x8899, 0, "Set master key (osd-2)"},
    495     {0x889a, 0, "Flush collection (osd-2)"},
    496     {0x889b, 0, "Flush partition (osd-2)"},
    497     {0x889c, 0, "Flush OSD (osd-2)"},
    498     {0x88a0, 0, "Query (osd-2)"},
    499     {0x88a1, 0, "Remove member objects (osd-2)"},
    500     {0x88a2, 0, "Get member attributes (osd-2)"},
    501     {0x88a3, 0, "Set member attributes (osd-2)"},
    502     {0x88b1, 0, "Read map (osd-2)"},
    503     {0x8f7c, 0, "Perform SCSI command (osd-2)"},
    504     {0x8f7d, 0, "Perform task management function (osd-2)"},
    505     {0x8f7e, 0, "Perform SCSI command (osd)"},
    506     {0x8f7f, 0, "Perform task management function (osd)"},
    507     {0xffff, 0, NULL},
    508 };
    509 
    510 /* Zoning out [0x94] service actions */
    511 struct sg_lib_value_name_t sg_lib_zoning_out_arr[] = {
    512     {0x1, PDT_ZBC, "Close zone"},
    513     {0x2, PDT_ZBC, "Finish zone"},
    514     {0x3, PDT_ZBC, "Open zone"},
    515     {0x4, PDT_ZBC, "Reset write pointer"},
    516     {0xffff, 0, NULL},
    517 };
    518 
    519 /* Zoning in [0x95] service actions */
    520 struct sg_lib_value_name_t sg_lib_zoning_in_arr[] = {
    521     {0x0, PDT_ZBC, "Report zones"},
    522     {0xffff, 0, NULL},
    523 };
    524 
    525 /* Read attribute [0x8c] service actions */
    526 struct sg_lib_value_name_t sg_lib_read_attr_arr[] = {
    527     {0x0, 0, "attribute values"},
    528     {0x1, 0, "attribute list"},
    529     {0x2, 0, "logical volume list"},
    530     {0x3, 0, "partition list"},
    531     {0x5, 0, "supported attributes"},
    532     {0xffff, 0, NULL},
    533 };
    534 
    535 #else   /* SG_SCSI_STRINGS */
    536 
    537 struct sg_lib_value_name_t sg_lib_normal_opcodes[] = {
    538     {0xffff, 0, NULL},
    539 };
    540 
    541 struct sg_lib_value_name_t sg_lib_read_buff_arr[] = {  /* opcode 0x3c */
    542     {0xffff, 0, NULL},
    543 };
    544 
    545 struct sg_lib_value_name_t sg_lib_write_buff_arr[] = {  /* opcode 0x3b */
    546     {0xffff, 0, NULL},
    547 };
    548 
    549 struct sg_lib_value_name_t sg_lib_read_pos_arr[] = {  /* opcode 0x34 */
    550     {0xffff, 0, NULL},
    551 };
    552 
    553 struct sg_lib_value_name_t sg_lib_maint_in_arr[] = {  /* opcode 0xa3 */
    554     {0xffff, 0, NULL},
    555 };
    556 
    557 struct sg_lib_value_name_t sg_lib_maint_out_arr[] = {  /* opcode 0xa4 */
    558     {0xffff, 0, NULL},
    559 };
    560 
    561 struct sg_lib_value_name_t sg_lib_sanitize_sa_arr[] = {  /* opcode 0x94 */
    562     {0xffff, 0, NULL},
    563 };
    564 
    565 struct sg_lib_value_name_t sg_lib_serv_in12_arr[] = { /* opcode 0xab */
    566     {0xffff, 0, NULL},
    567 };
    568 
    569 struct sg_lib_value_name_t sg_lib_serv_out12_arr[] = { /* opcode 0xa9 */
    570     {0xffff, 0, NULL},
    571 };
    572 
    573 struct sg_lib_value_name_t sg_lib_serv_in16_arr[] = { /* opcode 0x9e */
    574     {0xffff, 0, NULL},
    575 };
    576 
    577 struct sg_lib_value_name_t sg_lib_serv_out16_arr[] = { /* opcode 0x9f */
    578     {0xffff, 0, NULL},
    579 };
    580 
    581 struct sg_lib_value_name_t sg_lib_serv_bidi_arr[] = { /* opcode 0x9d */
    582     {0xffff, 0, NULL},
    583 };
    584 
    585 struct sg_lib_value_name_t sg_lib_pr_in_arr[] = { /* opcode 0x5e */
    586     {0xffff, 0, NULL},
    587 };
    588 
    589 struct sg_lib_value_name_t sg_lib_pr_out_arr[] = { /* opcode 0x5f */
    590     {0xffff, 0, NULL},
    591 };
    592 
    593 struct sg_lib_value_name_t sg_lib_xcopy_sa_arr[] = { /* opcode 0x83 */
    594     {0xffff, 0, NULL},
    595 };
    596 
    597 struct sg_lib_value_name_t sg_lib_rec_copy_sa_arr[] = { /* opcode 0x84 */
    598     {0xffff, 0, NULL},
    599 };
    600 
    601 struct sg_lib_value_name_t sg_lib_variable_length_arr[] = {
    602     {0xffff, 0, NULL},
    603 };
    604 
    605 struct sg_lib_value_name_t sg_lib_zoning_out_arr[] = {
    606     {0xffff, 0, NULL},
    607 };
    608 
    609 struct sg_lib_value_name_t sg_lib_zoning_in_arr[] = {
    610     {0xffff, 0, NULL},
    611 };
    612 
    613 struct sg_lib_value_name_t sg_lib_read_attr_arr[] = {
    614     {0xffff, 0, NULL},
    615 };
    616 
    617 #endif  /* SG_SCSI_STRINGS */
    618 
    619 /* A conveniently formatted list of SCSI ASC/ASCQ codes and their
    620  * corresponding text can be found at: www.t10.org/lists/asc-num.txt
    621  * The following should match asc-num.txt dated 20150423 */
    622 
    623 #ifdef SG_SCSI_STRINGS
    624 struct sg_lib_asc_ascq_range_t sg_lib_asc_ascq_range[] =
    625 {
    626     {0x40,0x01,0x7f,"Ram failure [0x%x]"},
    627     {0x40,0x80,0xff,"Diagnostic failure on component [0x%x]"},
    628     {0x41,0x01,0xff,"Data path failure [0x%x]"},
    629     {0x42,0x01,0xff,"Power-on or self-test failure [0x%x]"},
    630     {0x4d,0x00,0xff,"Tagged overlapped commands [0x%x]"},
    631     {0x70,0x00,0xff,"Decompression exception short algorithm id of 0x%x"},
    632     {0, 0, 0, NULL}
    633 };
    634 
    635 struct sg_lib_asc_ascq_t sg_lib_asc_ascq[] =
    636 {
    637     {0x00,0x00,"No additional sense information"},
    638     {0x00,0x01,"Filemark detected"},
    639     {0x00,0x02,"End-of-partition/medium detected"},
    640     {0x00,0x03,"Setmark detected"},
    641     {0x00,0x04,"Beginning-of-partition/medium detected"},
    642     {0x00,0x05,"End-of-data detected"},
    643     {0x00,0x06,"I/O process terminated"},
    644     {0x00,0x07,"Programmable early warning detected"},
    645     {0x00,0x11,"Audio play operation in progress"},
    646     {0x00,0x12,"Audio play operation paused"},
    647     {0x00,0x13,"Audio play operation successfully completed"},
    648     {0x00,0x14,"Audio play operation stopped due to error"},
    649     {0x00,0x15,"No current audio status to return"},
    650     {0x00,0x16,"operation in progress"},
    651     {0x00,0x17,"Cleaning requested"},
    652     {0x00,0x18,"Erase operation in progress"},
    653     {0x00,0x19,"Locate operation in progress"},
    654     {0x00,0x1a,"Rewind operation in progress"},
    655     {0x00,0x1b,"Set capacity operation in progress"},
    656     {0x00,0x1c,"Verify operation in progress"},
    657     {0x00,0x1d,"ATA pass through information available"},
    658     {0x00,0x1e,"Conflicting SA creation request"},
    659     {0x00,0x1f,"Logical unit transitioning to another power condition"},
    660     {0x00,0x20,"Extended copy information available"},
    661     {0x00,0x21,"Atomic command aborted due to ACA"},
    662     {0x00,0x22,"Deferred microcode is pending"},
    663     {0x01,0x00,"No index/sector signal"},
    664     {0x02,0x00,"No seek complete"},
    665     {0x03,0x00,"Peripheral device write fault"},
    666     {0x03,0x01,"No write current"},
    667     {0x03,0x02,"Excessive write errors"},
    668     {0x04,0x00,"Logical unit not ready, cause not reportable"},
    669     {0x04,0x01,"Logical unit is in process of becoming ready"},
    670     {0x04,0x02,"Logical unit not ready, "
    671                 "initializing command required"},
    672     {0x04,0x03,"Logical unit not ready, "
    673                 "manual intervention required"},
    674     {0x04,0x04,"Logical unit not ready, format in progress"},
    675     {0x04,0x05,"Logical unit not ready, rebuild in progress"},
    676     {0x04,0x06,"Logical unit not ready, recalculation in progress"},
    677     {0x04,0x07,"Logical unit not ready, operation in progress"},
    678     {0x04,0x08,"Logical unit not ready, long write in progress"},
    679     {0x04,0x09,"Logical unit not ready, self-test in progress"},
    680     {0x04,0x0a,"Logical unit "
    681                 "not accessible, asymmetric access state transition"},
    682     {0x04,0x0b,"Logical unit "
    683                 "not accessible, target port in standby state"},
    684     {0x04,0x0c,"Logical unit "
    685                 "not accessible, target port in unavailable state"},
    686     {0x04,0x0d,"Logical unit not ready, structure check required"},
    687     {0x04,0x0e,"Logical unit not ready, security session in progress"},
    688     {0x04,0x10,"Logical unit not ready, "
    689                 "auxiliary memory not accessible"},
    690     {0x04,0x11,"Logical unit not ready, "
    691                 "notify (enable spinup) required"},
    692     {0x04,0x12,"Logical unit not ready, offline"},
    693     {0x04,0x13,"Logical unit not ready, SA creation in progress"},
    694     {0x04,0x14,"Logical unit not ready, space allocation in progress"},
    695     {0x04,0x15,"Logical unit not ready, robotics disabled"},
    696     {0x04,0x16,"Logical unit not ready, configuration required"},
    697     {0x04,0x17,"Logical unit not ready, calibration required"},
    698     {0x04,0x18,"Logical unit not ready, a door is open"},
    699     {0x04,0x19,"Logical unit not ready, operating in sequential mode"},
    700     {0x04,0x1a,"Logical unit not ready, start stop unit command in progress"},
    701     {0x04,0x1b,"Logical unit not ready, sanitize in progress"},
    702     {0x04,0x1c,"Logical unit not ready, additional power use not yet "
    703                 "granted"},
    704     {0x04,0x1d,"Logical unit not ready, configuration in progress"},
    705     {0x04,0x1e,"Logical unit not ready, microcode activation required"},
    706     {0x04,0x1f,"Logical unit not ready, microcode download required"},
    707     {0x04,0x20,"Logical unit not ready, logical unit reset required"},
    708     {0x04,0x21,"Logical unit not ready, hard reset required"},
    709     {0x04,0x22,"Logical unit not ready, power cycle required"},
    710     {0x04,0x23,"Logical unit not ready, affiliation required"},
    711     {0x05,0x00,"Logical unit does not respond to selection"},
    712     {0x06,0x00,"No reference position found"},
    713     {0x07,0x00,"Multiple peripheral devices selected"},
    714     {0x08,0x00,"Logical unit communication failure"},
    715     {0x08,0x01,"Logical unit communication time-out"},
    716     {0x08,0x02,"Logical unit communication parity error"},
    717     {0x08,0x03,"Logical unit communication CRC error (Ultra-DMA/32)"},
    718     {0x08,0x04,"Unreachable copy target"},
    719     {0x09,0x00,"Track following error"},
    720     {0x09,0x01,"Tracking servo failure"},
    721     {0x09,0x02,"Focus servo failure"},
    722     {0x09,0x03,"Spindle servo failure"},
    723     {0x09,0x04,"Head select fault"},
    724     {0x09,0x05,"Vibration induced tracking error"},
    725     {0x0A,0x00,"Error log overflow"},
    726     {0x0B,0x00,"Warning"},
    727     {0x0B,0x01,"Warning - specified temperature exceeded"},
    728     {0x0B,0x02,"Warning - enclosure degraded"},
    729     {0x0B,0x03,"Warning - background self-test failed"},
    730     {0x0B,0x04,"Warning - background pre-scan detected medium error"},
    731     {0x0B,0x05,"Warning - background medium scan detected medium error"},
    732     {0x0B,0x06,"Warning - non-volatile cache now volatile"},
    733     {0x0B,0x07,"Warning - degraded power to non-volatile cache"},
    734     {0x0B,0x08,"Warning - power loss expected"},
    735     {0x0B,0x09,"Warning - device statistics notification active"},
    736     {0x0B,0x0A,"Warning - high critical temperature limit exceeded"},
    737     {0x0B,0x0B,"Warning - low critical temperature limit exceeded"},
    738     {0x0B,0x0C,"Warning - high operating temperature limit exceeded"},
    739     {0x0B,0x0D,"Warning - low operating temperature limit exceeded"},
    740     {0x0B,0x0E,"Warning - high critical humidity limit exceeded"},
    741     {0x0B,0x0F,"Warning - low critical humidity limit exceeded"},
    742     {0x0B,0x10,"Warning - high operating humidity limit exceeded"},
    743     {0x0B,0x11,"Warning - low operating humidity limit exceeded"},
    744     {0x0B,0x12,"Warning - microcode security at risk"},
    745     {0x0B,0x13,"Warning - microcode digital signature validation failure"},
    746     {0x0C,0x00,"Write error"},
    747     {0x0C,0x01,"Write error - recovered with auto reallocation"},
    748     {0x0C,0x02,"Write error - auto reallocation failed"},
    749     {0x0C,0x03,"Write error - recommend reassignment"},
    750     {0x0C,0x04,"Compression check miscompare error"},
    751     {0x0C,0x05,"Data expansion occurred during compression"},
    752     {0x0C,0x06,"Block not compressible"},
    753     {0x0C,0x07,"Write error - recovery needed"},
    754     {0x0C,0x08,"Write error - recovery failed"},
    755     {0x0C,0x09,"Write error - loss of streaming"},
    756     {0x0C,0x0A,"Write error - padding blocks added"},
    757     {0x0C,0x0B,"Auxiliary memory write error"},
    758     {0x0C,0x0C,"Write error - unexpected unsolicited data"},
    759     {0x0C,0x0D,"Write error - not enough unsolicited data"},
    760     {0x0C,0x0E,"Multiple write errors"},
    761     {0x0C,0x0F,"Defects in error window"},
    762     {0x0C,0x10,"Incomplete multiple atomic write operations"},
    763     {0x0C,0x11,"Write error - recovery scan needed"},
    764     {0x0C,0x12,"Write error - insufficient zone resources"},
    765     {0x0D,0x00,"Error detected by third party temporary initiator"},
    766     {0x0D,0x01,"Third party device failure"},
    767     {0x0D,0x02,"Copy target device not reachable"},
    768     {0x0D,0x03,"Incorrect copy target device type"},
    769     {0x0D,0x04,"Copy target device data underrun"},
    770     {0x0D,0x05,"Copy target device data overrun"},
    771     {0x0E,0x00,"Invalid information unit"},
    772     {0x0E,0x01,"Information unit too short"},
    773     {0x0E,0x02,"Information unit too long"},
    774     {0x0E,0x03,"Invalid field in command information unit"},
    775     {0x10,0x00,"Id CRC or ECC error"},
    776     {0x10,0x01,"Logical block guard check failed"},
    777     {0x10,0x02,"Logical block application tag check failed"},
    778     {0x10,0x03,"Logical block reference tag check failed"},
    779     {0x10,0x04,"Logical block protection error on recover buffered data"},
    780     {0x10,0x05,"Logical block protection method error"},
    781     {0x11,0x00,"Unrecovered read error"},
    782     {0x11,0x01,"Read retries exhausted"},
    783     {0x11,0x02,"Error too long to correct"},
    784     {0x11,0x03,"Multiple read errors"},
    785     {0x11,0x04,"Unrecovered read error - auto reallocate failed"},
    786     {0x11,0x05,"L-EC uncorrectable error"},
    787     {0x11,0x06,"CIRC unrecovered error"},
    788     {0x11,0x07,"Data re-synchronization error"},
    789     {0x11,0x08,"Incomplete block read"},
    790     {0x11,0x09,"No gap found"},
    791     {0x11,0x0A,"Miscorrected error"},
    792     {0x11,0x0B,"Unrecovered read error - recommend reassignment"},
    793     {0x11,0x0C,"Unrecovered read error - recommend rewrite the data"},
    794     {0x11,0x0D,"De-compression CRC error"},
    795     {0x11,0x0E,"Cannot decompress using declared algorithm"},
    796     {0x11,0x0F,"Error reading UPC/EAN number"},
    797     {0x11,0x10,"Error reading ISRC number"},
    798     {0x11,0x11,"Read error - loss of streaming"},
    799     {0x11,0x12,"Auxiliary memory read error"},
    800     {0x11,0x13,"Read error - failed retransmission request"},
    801     {0x11,0x14,"Read error - LBA marked bad by application client"},
    802     {0x11,0x15,"Write after sanitize required"},
    803     {0x12,0x00,"Address mark not found for id field"},
    804     {0x13,0x00,"Address mark not found for data field"},
    805     {0x14,0x00,"Recorded entity not found"},
    806     {0x14,0x01,"Record not found"},
    807     {0x14,0x02,"Filemark or setmark not found"},
    808     {0x14,0x03,"End-of-data not found"},
    809     {0x14,0x04,"Block sequence error"},
    810     {0x14,0x05,"Record not found - recommend reassignment"},
    811     {0x14,0x06,"Record not found - data auto-reallocated"},
    812     {0x14,0x07,"Locate operation failure"},
    813     {0x15,0x00,"Random positioning error"},
    814     {0x15,0x01,"Mechanical positioning error"},
    815     {0x15,0x02,"Positioning error detected by read of medium"},
    816     {0x16,0x00,"Data synchronization mark error"},
    817     {0x16,0x01,"Data sync error - data rewritten"},
    818     {0x16,0x02,"Data sync error - recommend rewrite"},
    819     {0x16,0x03,"Data sync error - data auto-reallocated"},
    820     {0x16,0x04,"Data sync error - recommend reassignment"},
    821     {0x17,0x00,"Recovered data with no error correction applied"},
    822     {0x17,0x01,"Recovered data with retries"},
    823     {0x17,0x02,"Recovered data with positive head offset"},
    824     {0x17,0x03,"Recovered data with negative head offset"},
    825     {0x17,0x04,"Recovered data with retries and/or circ applied"},
    826     {0x17,0x05,"Recovered data using previous sector id"},
    827     {0x17,0x06,"Recovered data without ECC - data auto-reallocated"},
    828     {0x17,0x07,"Recovered data without ECC - recommend reassignment"},
    829     {0x17,0x08,"Recovered data without ECC - recommend rewrite"},
    830     {0x17,0x09,"Recovered data without ECC - data rewritten"},
    831     {0x18,0x00,"Recovered data with error correction applied"},
    832     {0x18,0x01,"Recovered data with error corr. & retries applied"},
    833     {0x18,0x02,"Recovered data - data auto-reallocated"},
    834     {0x18,0x03,"Recovered data with CIRC"},
    835     {0x18,0x04,"Recovered data with L-EC"},
    836     {0x18,0x05,"Recovered data - recommend reassignment"},
    837     {0x18,0x06,"Recovered data - recommend rewrite"},
    838     {0x18,0x07,"Recovered data with ECC - data rewritten"},
    839     {0x18,0x08,"Recovered data with linking"},
    840     {0x19,0x00,"Defect list error"},
    841     {0x19,0x01,"Defect list not available"},
    842     {0x19,0x02,"Defect list error in primary list"},
    843     {0x19,0x03,"Defect list error in grown list"},
    844     {0x1A,0x00,"Parameter list length error"},
    845     {0x1B,0x00,"Synchronous data transfer error"},
    846     {0x1C,0x00,"Defect list not found"},
    847     {0x1C,0x01,"Primary defect list not found"},
    848     {0x1C,0x02,"Grown defect list not found"},
    849     {0x1D,0x00,"Miscompare during verify operation"},
    850     {0x1D,0x01,"Miscompare verify of unmapped lba"},
    851     {0x1E,0x00,"Recovered id with ECC correction"},
    852     {0x1F,0x00,"Partial defect list transfer"},
    853     {0x20,0x00,"Invalid command operation code"},
    854     {0x20,0x01,"Access denied - initiator pending-enrolled"},
    855     {0x20,0x02,"Access denied - no access rights"},
    856     {0x20,0x03,"Access denied - invalid mgmt id key"},
    857     {0x20,0x04,"Illegal command while in write capable state"},
    858     {0x20,0x05,"Write type operation while in read capable state (obs)"},
    859     {0x20,0x06,"Illegal command while in explicit address mode"},
    860     {0x20,0x07,"Illegal command while in implicit address mode"},
    861     {0x20,0x08,"Access denied - enrollment conflict"},
    862     {0x20,0x09,"Access denied - invalid LU identifier"},
    863     {0x20,0x0A,"Access denied - invalid proxy token"},
    864     {0x20,0x0B,"Access denied - ACL LUN conflict"},
    865     {0x20,0x0C,"Illegal command when not in append-only mode"},
    866     {0x20,0x0D,"Not an administrative logical unit"},
    867     {0x20,0x0E,"Not a subsidiary logical unit"},
    868     {0x20,0x0F,"Not a conglomerate logical unit"},
    869     {0x21,0x00,"Logical block address out of range"},
    870     {0x21,0x01,"Invalid element address"},
    871     {0x21,0x02,"Invalid address for write"},
    872     {0x21,0x03,"Invalid write crossing layer jump"},
    873     {0x21,0x04,"Unaligned write command"},
    874     {0x21,0x05,"Write boundary violation"},
    875     {0x21,0x06,"Attempt to read invalid data"},
    876     {0x21,0x07,"Read boundary violation"},
    877     {0x21,0x08,"Misaligned write command"},
    878     {0x22,0x00,"Illegal function (use 20 00, 24 00, or 26 00)"},
    879     {0x23,0x00,"Invalid token operation, cause not reportable"},
    880     {0x23,0x01,"Invalid token operation, unsupported token type"},
    881     {0x23,0x02,"Invalid token operation, remote token usage not supported"},
    882     {0x23,0x03,"invalid token operation, remote rod token creation not "
    883                "supported"},
    884     {0x23,0x04,"Invalid token operation, token unknown"},
    885     {0x23,0x05,"Invalid token operation, token corrupt"},
    886     {0x23,0x06,"Invalid token operation, token revoked"},
    887     {0x23,0x07,"Invalid token operation, token expired"},
    888     {0x23,0x08,"Invalid token operation, token cancelled"},
    889     {0x23,0x09,"Invalid token operation, token deleted"},
    890     {0x23,0x0a,"Invalid token operation, invalid token length"},
    891     {0x24,0x00,"Invalid field in cdb"},
    892     {0x24,0x01,"CDB decryption error"},
    893     {0x24,0x02,"Invalid cdb field while in explicit block model (obs)"},
    894     {0x24,0x03,"Invalid cdb field while in implicit block model (obs)"},
    895     {0x24,0x04,"Security audit value frozen"},
    896     {0x24,0x05,"Security working key frozen"},
    897     {0x24,0x06,"Nonce not unique"},
    898     {0x24,0x07,"Nonce timestamp out of range"},
    899     {0x24,0x08,"Invalid xcdb"},
    900     {0x24,0x09,"Invalid fast format"},
    901     {0x25,0x00,"Logical unit not supported"},
    902     {0x26,0x00,"Invalid field in parameter list"},
    903     {0x26,0x01,"Parameter not supported"},
    904     {0x26,0x02,"Parameter value invalid"},
    905     {0x26,0x03,"Threshold parameters not supported"},
    906     {0x26,0x04,"Invalid release of persistent reservation"},
    907     {0x26,0x05,"Data decryption error"},
    908     {0x26,0x06,"Too many target descriptors"},
    909     {0x26,0x07,"Unsupported target descriptor type code"},
    910     {0x26,0x08,"Too many segment descriptors"},
    911     {0x26,0x09,"Unsupported segment descriptor type code"},
    912     {0x26,0x0A,"Unexpected inexact segment"},
    913     {0x26,0x0B,"Inline data length exceeded"},
    914     {0x26,0x0C,"Invalid operation for copy source or destination"},
    915     {0x26,0x0D,"Copy segment granularity violation"},
    916     {0x26,0x0E,"Invalid parameter while port is enabled"},
    917     {0x26,0x0F,"Invalid data-out buffer integrity check value"},
    918     {0x26,0x10,"Data decryption key fail limit reached"},
    919     {0x26,0x11,"Incomplete key-associated data set"},
    920     {0x26,0x12,"Vendor specific key reference not found"},
    921     {0x26,0x13,"Application tag mode page is invalid"},
    922     {0x26,0x14,"Tape stream mirroring prevented"},
    923     {0x26,0x15,"Copy source or copy destination not authorized"},
    924     {0x27,0x00,"Write protected"},
    925     {0x27,0x01,"Hardware write protected"},
    926     {0x27,0x02,"Logical unit software write protected"},
    927     {0x27,0x03,"Associated write protect"},
    928     {0x27,0x04,"Persistent write protect"},
    929     {0x27,0x05,"Permanent write protect"},
    930     {0x27,0x06,"Conditional write protect"},
    931     {0x27,0x07,"Space allocation failed write protect"},
    932     {0x27,0x08,"Zone is read only"},
    933     {0x28,0x00,"Not ready to ready change, medium may have changed"},
    934     {0x28,0x01,"Import or export element accessed"},
    935     {0x28,0x02,"Format-layer may have changed"},
    936     {0x28,0x03,"Import/export element accessed, medium changed"},
    937     {0x29,0x00,"Power on, reset, or bus device reset occurred"},
    938     {0x29,0x01,"Power on occurred"},
    939     {0x29,0x02,"SCSI bus reset occurred"},
    940     {0x29,0x03,"Bus device reset function occurred"},
    941     {0x29,0x04,"Device internal reset"},
    942     {0x29,0x05,"Transceiver mode changed to single-ended"},
    943     {0x29,0x06,"Transceiver mode changed to lvd"},
    944     {0x29,0x07,"I_T nexus loss occurred"},
    945     {0x2A,0x00,"Parameters changed"},
    946     {0x2A,0x01,"Mode parameters changed"},
    947     {0x2A,0x02,"Log parameters changed"},
    948     {0x2A,0x03,"Reservations preempted"},
    949     {0x2A,0x04,"Reservations released"},
    950     {0x2A,0x05,"Registrations preempted"},
    951     {0x2A,0x06,"Asymmetric access state changed"},
    952     {0x2A,0x07,"Implicit asymmetric access state transition failed"},
    953     {0x2A,0x08,"Priority changed"},
    954     {0x2A,0x09,"Capacity data has changed"},
    955     {0x2A,0x0c, "Error recovery attributes have changed"},
    956     {0x2A,0x0d, "Data encryption capabilities changed"},
    957     {0x2A,0x10,"Timestamp changed"},
    958     {0x2A,0x11,"Data encryption parameters changed by another i_t nexus"},
    959     {0x2A,0x12,"Data encryption parameters changed by vendor specific event"},
    960     {0x2A,0x13,"Data encryption key instance counter has changed"},
    961     {0x2A,0x0a,"Error history i_t nexus cleared"},
    962     {0x2A,0x0b,"Error history snapshot released"},
    963     {0x2A,0x14,"SA creation capabilities data has changed"},
    964     {0x2A,0x15,"Medium removal prevention preempted"},
    965     {0x2A,0x16,"Zone reset write pointer recommended"},
    966     {0x2B,0x00,"Copy cannot execute since host cannot disconnect"},
    967     {0x2C,0x00,"Command sequence error"},
    968     {0x2C,0x01,"Too many windows specified"},
    969     {0x2C,0x02,"Invalid combination of windows specified"},
    970     {0x2C,0x03,"Current program area is not empty"},
    971     {0x2C,0x04,"Current program area is empty"},
    972     {0x2C,0x05,"Illegal power condition request"},
    973     {0x2C,0x06,"Persistent prevent conflict"},
    974     {0x2C,0x07,"Previous busy status"},
    975     {0x2C,0x08,"Previous task set full status"},
    976     {0x2C,0x09,"Previous reservation conflict status"},
    977     {0x2C,0x0A,"Partition or collection contains user objects"},
    978     {0x2C,0x0B,"Not reserved"},
    979     {0x2C,0x0C,"ORWRITE generation does not match"},
    980     {0x2C,0x0D,"Reset write pointer not allowed"},
    981     {0x2C,0x0E,"Zone is offline"},
    982     {0x2C,0x0F,"Stream not open"},
    983     {0x2C,0x10,"Unwritten data in zone"},
    984     {0x2C,0x11,"Descriptor format sense data required"},
    985     {0x2D,0x00,"Overwrite error on update in place"},
    986     {0x2E,0x00,"Insufficient time for operation"},
    987     {0x2E,0x01,"Command timeout before processing"},
    988     {0x2E,0x02,"Command timeout during processing"},
    989     {0x2E,0x03,"Command timeout during processing due to error recovery"},
    990     {0x2F,0x00,"Commands cleared by another initiator"},
    991     {0x2F,0x01,"Commands cleared by power loss notification"},
    992     {0x2F,0x02,"Commands cleared by device server"},
    993     {0x2F,0x03,"Some commands cleared by queuing layer event"},
    994     {0x30,0x00,"Incompatible medium installed"},
    995     {0x30,0x01,"Cannot read medium - unknown format"},
    996     {0x30,0x02,"Cannot read medium - incompatible format"},
    997     {0x30,0x03,"Cleaning cartridge installed"},
    998     {0x30,0x04,"Cannot write medium - unknown format"},
    999     {0x30,0x05,"Cannot write medium - incompatible format"},
   1000     {0x30,0x06,"Cannot format medium - incompatible medium"},
   1001     {0x30,0x07,"Cleaning failure"},
   1002     {0x30,0x08,"Cannot write - application code mismatch"},
   1003     {0x30,0x09,"Current session not fixated for append"},
   1004     {0x30,0x0A,"Cleaning request rejected"},
   1005     {0x30,0x0B,"Cleaning tape expired"},
   1006     {0x30,0x0C,"WORM medium - overwrite attempted"},
   1007     {0x30,0x0D,"WORM medium - integrity check"},
   1008     {0x30,0x10,"Medium not formatted"},
   1009     {0x30,0x11,"Incompatible volume type"},
   1010     {0x30,0x12,"Incompatible volume qualifier"},
   1011     {0x30,0x13,"Cleaning volume expired"},
   1012     {0x31,0x00,"Medium format corrupted"},
   1013     {0x31,0x01,"Format command failed"},
   1014     {0x31,0x02,"Zoned formatting failed due to spare linking"},
   1015     {0x31,0x03,"Sanitize command failed"},
   1016     {0x32,0x00,"No defect spare location available"},
   1017     {0x32,0x01,"Defect list update failure"},
   1018     {0x33,0x00,"Tape length error"},
   1019     {0x34,0x00,"Enclosure failure"},
   1020     {0x35,0x00,"Enclosure services failure"},
   1021     {0x35,0x01,"Unsupported enclosure function"},
   1022     {0x35,0x02,"Enclosure services unavailable"},
   1023     {0x35,0x03,"Enclosure services transfer failure"},
   1024     {0x35,0x04,"Enclosure services transfer refused"},
   1025     {0x35,0x05,"Enclosure services checksum error"},
   1026     {0x36,0x00,"Ribbon, ink, or toner failure"},
   1027     {0x37,0x00,"Rounded parameter"},
   1028     {0x38,0x00,"Event status notification"},
   1029     {0x38,0x02,"Esn - power management class event"},
   1030     {0x38,0x04,"Esn - media class event"},
   1031     {0x38,0x06,"Esn - device busy class event"},
   1032     {0x38,0x07,"Thin provisioning soft threshold reached"},
   1033     {0x39,0x00,"Saving parameters not supported"},
   1034     {0x3A,0x00,"Medium not present"},
   1035     {0x3A,0x01,"Medium not present - tray closed"},
   1036     {0x3A,0x02,"Medium not present - tray open"},
   1037     {0x3A,0x03,"Medium not present - loadable"},
   1038     {0x3A,0x04,"Medium not present - medium auxiliary memory accessible"},
   1039     {0x3B,0x00,"Sequential positioning error"},
   1040     {0x3B,0x01,"Tape position error at beginning-of-medium"},
   1041     {0x3B,0x02,"Tape position error at end-of-medium"},
   1042     {0x3B,0x03,"Tape or electronic vertical forms unit not ready"},
   1043     {0x3B,0x04,"Slew failure"},
   1044     {0x3B,0x05,"Paper jam"},
   1045     {0x3B,0x06,"Failed to sense top-of-form"},
   1046     {0x3B,0x07,"Failed to sense bottom-of-form"},
   1047     {0x3B,0x08,"Reposition error"},
   1048     {0x3B,0x09,"Read past end of medium"},
   1049     {0x3B,0x0A,"Read past beginning of medium"},
   1050     {0x3B,0x0B,"Position past end of medium"},
   1051     {0x3B,0x0C,"Position past beginning of medium"},
   1052     {0x3B,0x0D,"Medium destination element full"},
   1053     {0x3B,0x0E,"Medium source element empty"},
   1054     {0x3B,0x0F,"End of medium reached"},
   1055     {0x3B,0x11,"Medium magazine not accessible"},
   1056     {0x3B,0x12,"Medium magazine removed"},
   1057     {0x3B,0x13,"Medium magazine inserted"},
   1058     {0x3B,0x14,"Medium magazine locked"},
   1059     {0x3B,0x15,"Medium magazine unlocked"},
   1060     {0x3B,0x16,"Mechanical positioning or changer error"},
   1061     {0x3B,0x17,"Read past end of user object"},
   1062     {0x3B,0x18,"Element disabled"},
   1063     {0x3B,0x19,"Element enabled"},
   1064     {0x3B,0x1a,"Data transfer device removed"},
   1065     {0x3B,0x1b,"Data transfer device inserted"},
   1066     {0x3B,0x1c,"Too many logical objects on partition to support operation"},
   1067     {0x3D,0x00,"Invalid bits in identify message"},
   1068     {0x3E,0x00,"Logical unit has not self-configured yet"},
   1069     {0x3E,0x01,"Logical unit failure"},
   1070     {0x3E,0x02,"Timeout on logical unit"},
   1071     {0x3E,0x03,"Logical unit failed self-test"},
   1072     {0x3E,0x04,"Logical unit unable to update self-test log"},
   1073     {0x3F,0x00,"Target operating conditions have changed"},
   1074     {0x3F,0x01,"Microcode has been changed"},
   1075     {0x3F,0x02,"Changed operating definition"},
   1076     {0x3F,0x03,"Inquiry data has changed"},
   1077     {0x3F,0x04,"Component device attached"},
   1078     {0x3F,0x05,"Device identifier changed"},
   1079     {0x3F,0x06,"Redundancy group created or modified"},
   1080     {0x3F,0x07,"Redundancy group deleted"},
   1081     {0x3F,0x08,"Spare created or modified"},
   1082     {0x3F,0x09,"Spare deleted"},
   1083     {0x3F,0x0A,"Volume set created or modified"},
   1084     {0x3F,0x0B,"Volume set deleted"},
   1085     {0x3F,0x0C,"Volume set deassigned"},
   1086     {0x3F,0x0D,"Volume set reassigned"},
   1087     {0x3F,0x0E,"Reported luns data has changed"},
   1088     {0x3F,0x0F,"Echo buffer overwritten"},
   1089     {0x3F,0x10,"Medium loadable"},
   1090     {0x3F,0x11,"Medium auxiliary memory accessible"},
   1091     {0x3F,0x12,"iSCSI IP address added"},
   1092     {0x3F,0x13,"iSCSI IP address removed"},
   1093     {0x3F,0x14,"iSCSI IP address changed"},
   1094     {0x3F,0x15,"Inspect referrals sense descriptors"},
   1095     {0x3F,0x16,"Microcode has been changed without reset"},
   1096     {0x3F,0x17,"Zone transition to full"},
   1097     {0x3F,0x18,"Bind completed"},
   1098     {0x3F,0x19,"Bind redirected"},
   1099     {0x3F,0x1A,"Subsidiary binding changed"},
   1100 
   1101     /*
   1102      * ASC 0x40, 0x41 and 0x42 overridden by "additional2" array entries
   1103      * for ascq > 1. Preferred error message for this group is
   1104      * "Diagnostic failure on component nn (80h-ffh)".
   1105      */
   1106     {0x40,0x00,"Ram failure (should use 40 nn)"},
   1107     {0x41,0x00,"Data path failure (should use 40 nn)"},
   1108     {0x42,0x00,"Power-on or self-test failure (should use 40 nn)"},
   1109 
   1110     {0x43,0x00,"Message error"},
   1111     {0x44,0x00,"Internal target failure"},
   1112     {0x44,0x01,"Persistent reservation information lost"},
   1113     {0x44,0x71,"ATA device failed Set Features"},
   1114     {0x45,0x00,"Select or reselect failure"},
   1115     {0x46,0x00,"Unsuccessful soft reset"},
   1116     {0x47,0x00,"SCSI parity error"},
   1117     {0x47,0x01,"Data phase CRC error detected"},
   1118     {0x47,0x02,"SCSI parity error detected during st data phase"},
   1119     {0x47,0x03,"Information unit iuCRC error detected"},
   1120     {0x47,0x04,"Asynchronous information protection error detected"},
   1121     {0x47,0x05,"Protocol service CRC error"},
   1122     {0x47,0x06,"Phy test function in progress"},
   1123     {0x47,0x7F,"Some commands cleared by iSCSI protocol event"},
   1124     {0x48,0x00,"Initiator detected error message received"},
   1125     {0x49,0x00,"Invalid message error"},
   1126     {0x4A,0x00,"Command phase error"},
   1127     {0x4B,0x00,"Data phase error"},
   1128     {0x4B,0x01,"Invalid target port transfer tag received"},
   1129     {0x4B,0x02,"Too much write data"},
   1130     {0x4B,0x03,"Ack/nak timeout"},
   1131     {0x4B,0x04,"Nak received"},
   1132     {0x4B,0x05,"Data offset error"},
   1133     {0x4B,0x06,"Initiator response timeout"},
   1134     {0x4B,0x07,"Connection lost"},
   1135     {0x4B,0x08,"Data-in buffer overflow - data buffer size"},
   1136     {0x4B,0x09,"Data-in buffer overflow - data buffer descriptor area"},
   1137     {0x4B,0x0A,"Data-in buffer error"},
   1138     {0x4B,0x0B,"Data-out buffer overflow - data buffer size"},
   1139     {0x4B,0x0C,"Data-out buffer overflow - data buffer descriptor area"},
   1140     {0x4B,0x0D,"Data-out buffer error"},
   1141     {0x4B,0x0E,"PCIe fabric error"},
   1142     {0x4B,0x0f,"PCIe completion timeout"},
   1143     {0x4B,0x10,"PCIe completer abort"},
   1144     {0x4B,0x11,"PCIe poisoned tlp received"},
   1145     {0x4B,0x12,"PCIe ecrc check failed"},
   1146     {0x4B,0x13,"PCIe unsupported request"},
   1147     {0x4B,0x14,"PCIe acs violation"},
   1148     {0x4B,0x15,"PCIe tlp prefix blocked"},
   1149     {0x4C,0x00,"Logical unit failed self-configuration"},
   1150     /*
   1151      * ASC 0x4D overridden by an "additional2" array entry
   1152      * so there is no need to have them here.
   1153      */
   1154     /* {0x4D,0x00,"Tagged overlapped commands (nn = queue tag)"}, */
   1155 
   1156     {0x4E,0x00,"Overlapped commands attempted"},
   1157     {0x50,0x00,"Write append error"},
   1158     {0x50,0x01,"Write append position error"},
   1159     {0x50,0x02,"Position error related to timing"},
   1160     {0x51,0x00,"Erase failure"},
   1161     {0x51,0x01,"Erase failure - incomplete erase operation detected"},
   1162     {0x52,0x00,"Cartridge fault"},
   1163     {0x53,0x00,"Media load or eject failed"},
   1164     {0x53,0x01,"Unload tape failure"},
   1165     {0x53,0x02,"Medium removal prevented"},
   1166     {0x53,0x03,"Medium removal prevented by data transfer element"},
   1167     {0x53,0x04,"Medium thread or unthread failure"},
   1168     {0x53,0x05,"Volume identifier invalid"},
   1169     {0x53,0x06,"Volume identifier missing"},
   1170     {0x53,0x07,"Duplicate volume identifier"},
   1171     {0x53,0x08,"Element status unknown"},
   1172     {0x53,0x09,"Data transfer device error - load failed"},
   1173     {0x53,0x0A,"Data transfer device error - unload failed"},
   1174     {0x53,0x0B,"Data transfer device error - unload missing"},
   1175     {0x53,0x0C,"Data transfer device error - eject failed"},
   1176     {0x53,0x0D,"Data transfer device error - library communication failed"},
   1177     {0x54,0x00,"SCSI to host system interface failure"},
   1178     {0x55,0x00,"System resource failure"},
   1179     {0x55,0x01,"System buffer full"},
   1180     {0x55,0x02,"Insufficient reservation resources"},
   1181     {0x55,0x03,"Insufficient resources"},
   1182     {0x55,0x04,"Insufficient registration resources"},
   1183     {0x55,0x05,"Insufficient access control resources"},
   1184     {0x55,0x06,"Auxiliary memory out of space"},
   1185     {0x55,0x07,"Quota error"},
   1186     {0x55,0x08,"Maximum number of supplemental decryption keys exceeded"},
   1187     {0x55,0x09,"Medium auxiliary memory not accessible"},
   1188     {0x55,0x0a,"Data currently unavailable"},
   1189     {0x55,0x0b,"Insufficient power for operation"},
   1190     {0x55,0x0c,"Insufficient resources to create rod"},
   1191     {0x55,0x0d,"Insufficient resources to create rod token"},
   1192     {0x55,0x0e,"Insufficient zone resources"},
   1193     {0x55,0x0f,"Insufficient zone resources to complete write"},
   1194     {0x55,0x10,"Maximum number of streams open"},
   1195     {0x55,0x11,"Insufficient resources to bind"},
   1196     {0x57,0x00,"Unable to recover table-of-contents"},
   1197     {0x58,0x00,"Generation does not exist"},
   1198     {0x59,0x00,"Updated block read"},
   1199     {0x5A,0x00,"Operator request or state change input"},
   1200     {0x5A,0x01,"Operator medium removal request"},
   1201     {0x5A,0x02,"Operator selected write protect"},
   1202     {0x5A,0x03,"Operator selected write permit"},
   1203     {0x5B,0x00,"Log exception"},
   1204     {0x5B,0x01,"Threshold condition met"},
   1205     {0x5B,0x02,"Log counter at maximum"},
   1206     {0x5B,0x03,"Log list codes exhausted"},
   1207     {0x5C,0x00,"Rpl status change"},
   1208     {0x5C,0x01,"Spindles synchronized"},
   1209     {0x5C,0x02,"Spindles not synchronized"},
   1210     {0x5D,0x00,"Failure prediction threshold exceeded"},
   1211     {0x5D,0x01,"Media failure prediction threshold exceeded"},
   1212     {0x5D,0x02,"Logical unit failure prediction threshold exceeded"},
   1213     {0x5D,0x03,"spare area exhaustion prediction threshold exceeded"},
   1214     {0x5D,0x10,"Hardware impending failure general hard drive failure"},
   1215     {0x5D,0x11,"Hardware impending failure drive error rate too high" },
   1216     {0x5D,0x12,"Hardware impending failure data error rate too high" },
   1217     {0x5D,0x13,"Hardware impending failure seek error rate too high" },
   1218     {0x5D,0x14,"Hardware impending failure too many block reassigns"},
   1219     {0x5D,0x15,"Hardware impending failure access times too high" },
   1220     {0x5D,0x16,"Hardware impending failure start unit times too high" },
   1221     {0x5D,0x17,"Hardware impending failure channel parametrics"},
   1222     {0x5D,0x18,"Hardware impending failure controller detected"},
   1223     {0x5D,0x19,"Hardware impending failure throughput performance"},
   1224     {0x5D,0x1A,"Hardware impending failure seek time performance"},
   1225     {0x5D,0x1B,"Hardware impending failure spin-up retry count"},
   1226     {0x5D,0x1C,"Hardware impending failure drive calibration retry count"},
   1227     {0x5D,0x1D,"Hardware impending failure power loss protection circuit"},
   1228     {0x5D,0x20,"Controller impending failure general hard drive failure"},
   1229     {0x5D,0x21,"Controller impending failure drive error rate too high" },
   1230     {0x5D,0x22,"Controller impending failure data error rate too high" },
   1231     {0x5D,0x23,"Controller impending failure seek error rate too high" },
   1232     {0x5D,0x24,"Controller impending failure too many block reassigns"},
   1233     {0x5D,0x25,"Controller impending failure access times too high" },
   1234     {0x5D,0x26,"Controller impending failure start unit times too high" },
   1235     {0x5D,0x27,"Controller impending failure channel parametrics"},
   1236     {0x5D,0x28,"Controller impending failure controller detected"},
   1237     {0x5D,0x29,"Controller impending failure throughput performance"},
   1238     {0x5D,0x2A,"Controller impending failure seek time performance"},
   1239     {0x5D,0x2B,"Controller impending failure spin-up retry count"},
   1240     {0x5D,0x2C,"Controller impending failure drive calibration retry count"},
   1241     {0x5D,0x30,"Data channel impending failure general hard drive failure"},
   1242     {0x5D,0x31,"Data channel impending failure drive error rate too high" },
   1243     {0x5D,0x32,"Data channel impending failure data error rate too high" },
   1244     {0x5D,0x33,"Data channel impending failure seek error rate too high" },
   1245     {0x5D,0x34,"Data channel impending failure too many block reassigns"},
   1246     {0x5D,0x35,"Data channel impending failure access times too high" },
   1247     {0x5D,0x36,"Data channel impending failure start unit times too high" },
   1248     {0x5D,0x37,"Data channel impending failure channel parametrics"},
   1249     {0x5D,0x38,"Data channel impending failure controller detected"},
   1250     {0x5D,0x39,"Data channel impending failure throughput performance"},
   1251     {0x5D,0x3A,"Data channel impending failure seek time performance"},
   1252     {0x5D,0x3B,"Data channel impending failure spin-up retry count"},
   1253     {0x5D,0x3C,"Data channel impending failure drive calibration retry count"},
   1254     {0x5D,0x40,"Servo impending failure general hard drive failure"},
   1255     {0x5D,0x41,"Servo impending failure drive error rate too high" },
   1256     {0x5D,0x42,"Servo impending failure data error rate too high" },
   1257     {0x5D,0x43,"Servo impending failure seek error rate too high" },
   1258     {0x5D,0x44,"Servo impending failure too many block reassigns"},
   1259     {0x5D,0x45,"Servo impending failure access times too high" },
   1260     {0x5D,0x46,"Servo impending failure start unit times too high" },
   1261     {0x5D,0x47,"Servo impending failure channel parametrics"},
   1262     {0x5D,0x48,"Servo impending failure controller detected"},
   1263     {0x5D,0x49,"Servo impending failure throughput performance"},
   1264     {0x5D,0x4A,"Servo impending failure seek time performance"},
   1265     {0x5D,0x4B,"Servo impending failure spin-up retry count"},
   1266     {0x5D,0x4C,"Servo impending failure drive calibration retry count"},
   1267     {0x5D,0x50,"Spindle impending failure general hard drive failure"},
   1268     {0x5D,0x51,"Spindle impending failure drive error rate too high" },
   1269     {0x5D,0x52,"Spindle impending failure data error rate too high" },
   1270     {0x5D,0x53,"Spindle impending failure seek error rate too high" },
   1271     {0x5D,0x54,"Spindle impending failure too many block reassigns"},
   1272     {0x5D,0x55,"Spindle impending failure access times too high" },
   1273     {0x5D,0x56,"Spindle impending failure start unit times too high" },
   1274     {0x5D,0x57,"Spindle impending failure channel parametrics"},
   1275     {0x5D,0x58,"Spindle impending failure controller detected"},
   1276     {0x5D,0x59,"Spindle impending failure throughput performance"},
   1277     {0x5D,0x5A,"Spindle impending failure seek time performance"},
   1278     {0x5D,0x5B,"Spindle impending failure spin-up retry count"},
   1279     {0x5D,0x5C,"Spindle impending failure drive calibration retry count"},
   1280     {0x5D,0x60,"Firmware impending failure general hard drive failure"},
   1281     {0x5D,0x61,"Firmware impending failure drive error rate too high" },
   1282     {0x5D,0x62,"Firmware impending failure data error rate too high" },
   1283     {0x5D,0x63,"Firmware impending failure seek error rate too high" },
   1284     {0x5D,0x64,"Firmware impending failure too many block reassigns"},
   1285     {0x5D,0x65,"Firmware impending failure access times too high" },
   1286     {0x5D,0x66,"Firmware impending failure start unit times too high" },
   1287     {0x5D,0x67,"Firmware impending failure channel parametrics"},
   1288     {0x5D,0x68,"Firmware impending failure controller detected"},
   1289     {0x5D,0x69,"Firmware impending failure throughput performance"},
   1290     {0x5D,0x6A,"Firmware impending failure seek time performance"},
   1291     {0x5D,0x6B,"Firmware impending failure spin-up retry count"},
   1292     {0x5D,0x6C,"Firmware impending failure drive calibration retry count"},
   1293     {0x5D,0x73,"Media impending failure endurance limit met"},
   1294     {0x5D,0xFF,"Failure prediction threshold exceeded (false)"},
   1295     {0x5E,0x00,"Low power condition on"},
   1296     {0x5E,0x01,"Idle condition activated by timer"},
   1297     {0x5E,0x02,"Standby condition activated by timer"},
   1298     {0x5E,0x03,"Idle condition activated by command"},
   1299     {0x5E,0x04,"Standby condition activated by command"},
   1300     {0x5E,0x05,"Idle_b condition activated by timer"},
   1301     {0x5E,0x06,"Idle_b condition activated by command"},
   1302     {0x5E,0x07,"Idle_c condition activated by timer"},
   1303     {0x5E,0x08,"Idle_c condition activated by command"},
   1304     {0x5E,0x09,"Standby_y condition activated by timer"},
   1305     {0x5E,0x0a,"Standby_y condition activated by command"},
   1306     {0x5E,0x41,"Power state change to active"},
   1307     {0x5E,0x42,"Power state change to idle"},
   1308     {0x5E,0x43,"Power state change to standby"},
   1309     {0x5E,0x45,"Power state change to sleep"},
   1310     {0x5E,0x47,"Power state change to device control"},
   1311     {0x60,0x00,"Lamp failure"},
   1312     {0x61,0x00,"Video acquisition error"},
   1313     {0x61,0x01,"Unable to acquire video"},
   1314     {0x61,0x02,"Out of focus"},
   1315     {0x62,0x00,"Scan head positioning error"},
   1316     {0x63,0x00,"End of user area encountered on this track"},
   1317     {0x63,0x01,"Packet does not fit in available space"},
   1318     {0x64,0x00,"Illegal mode for this track"},
   1319     {0x64,0x01,"Invalid packet size"},
   1320     {0x65,0x00,"Voltage fault"},
   1321     {0x66,0x00,"Automatic document feeder cover up"},
   1322     {0x66,0x01,"Automatic document feeder lift up"},
   1323     {0x66,0x02,"Document jam in automatic document feeder"},
   1324     {0x66,0x03,"Document miss feed automatic in document feeder"},
   1325     {0x67,0x00,"Configuration failure"},
   1326     {0x67,0x01,"Configuration of incapable logical units failed"},
   1327     {0x67,0x02,"Add logical unit failed"},
   1328     {0x67,0x03,"Modification of logical unit failed"},
   1329     {0x67,0x04,"Exchange of logical unit failed"},
   1330     {0x67,0x05,"Remove of logical unit failed"},
   1331     {0x67,0x06,"Attachment of logical unit failed"},
   1332     {0x67,0x07,"Creation of logical unit failed"},
   1333     {0x67,0x08,"Assign failure occurred"},
   1334     {0x67,0x09,"Multiply assigned logical unit"},
   1335     {0x67,0x0A,"Set target port groups command failed"},
   1336     {0x67,0x0B,"ATA device feature not enabled"},
   1337     {0x67,0x0C,"Command rejected"},
   1338     {0x67,0x0D,"Explicit bind not allowed"},
   1339     {0x68,0x00,"Logical unit not configured"},
   1340     {0x68,0x01,"Subsidiary logical unit not configured"},
   1341     {0x69,0x00,"Data loss on logical unit"},
   1342     {0x69,0x01,"Multiple logical unit failures"},
   1343     {0x69,0x02,"Parity/data mismatch"},
   1344     {0x6A,0x00,"Informational, refer to log"},
   1345     {0x6B,0x00,"State change has occurred"},
   1346     {0x6B,0x01,"Redundancy level got better"},
   1347     {0x6B,0x02,"Redundancy level got worse"},
   1348     {0x6C,0x00,"Rebuild failure occurred"},
   1349     {0x6D,0x00,"Recalculate failure occurred"},
   1350     {0x6E,0x00,"Command to logical unit failed"},
   1351     {0x6F,0x00,"Copy protection key exchange failure - authentication "
   1352                "failure"},
   1353     {0x6F,0x01,"Copy protection key exchange failure - key not present"},
   1354     {0x6F,0x02,"Copy protection key exchange failure - key not established"},
   1355     {0x6F,0x03,"Read of scrambled sector without authentication"},
   1356     {0x6F,0x04,"Media region code is mismatched to logical unit region"},
   1357     {0x6F,0x05,"Drive region must be permanent/region reset count error"},
   1358     {0x6F,0x06,"Insufficient block count for binding nonce recording"},
   1359     {0x6F,0x07,"Conflict in binding nonce recording"},
   1360     {0x6F,0x08,"Insufficient permission"},
   1361     {0x6F,0x09,"Invalid drive-host pairing server"},
   1362     {0x6F,0x0A,"Drive-host pairing suspended"},
   1363     /*
   1364      * ASC 0x70 overridden by an "additional2" array entry
   1365      * so there is no need to have them here.
   1366      */
   1367     /* {0x70,0x00,"Decompression exception short algorithm id of nn"}, */
   1368 
   1369     {0x71,0x00,"Decompression exception long algorithm id"},
   1370     {0x72,0x00,"Session fixation error"},
   1371     {0x72,0x01,"Session fixation error writing lead-in"},
   1372     {0x72,0x02,"Session fixation error writing lead-out"},
   1373     {0x72,0x03,"Session fixation error - incomplete track in session"},
   1374     {0x72,0x04,"Empty or partially written reserved track"},
   1375     {0x72,0x05,"No more track reservations allowed"},
   1376     {0x72,0x06,"RMZ extension is not allowed"},
   1377     {0x72,0x07,"No more test zone extensions are allowed"},
   1378     {0x73,0x00,"CD control error"},
   1379     {0x73,0x01,"Power calibration area almost full"},
   1380     {0x73,0x02,"Power calibration area is full"},
   1381     {0x73,0x03,"Power calibration area error"},
   1382     {0x73,0x04,"Program memory area update failure"},
   1383     {0x73,0x05,"Program memory area is full"},
   1384     {0x73,0x06,"RMA/PMA is almost full"},
   1385     {0x73,0x10,"Current power calibration area almost full"},
   1386     {0x73,0x11,"Current power calibration area is full"},
   1387     {0x73,0x17,"RDZ is full"},
   1388     {0x74,0x00,"Security error"},
   1389     {0x74,0x01,"Unable to decrypt data"},
   1390     {0x74,0x02,"Unencrypted data encountered while decrypting"},
   1391     {0x74,0x03,"Incorrect data encryption key"},
   1392     {0x74,0x04,"Cryptographic integrity validation failed"},
   1393     {0x74,0x05,"Error decrypting data"},
   1394     {0x74,0x06,"Unknown signature verification key"},
   1395     {0x74,0x07,"Encryption parameters not useable"},
   1396     {0x74,0x08,"Digital signature validation failure"},
   1397     {0x74,0x09,"Encryption mode mismatch on read"},
   1398     {0x74,0x0a,"Encrypted block not raw read enabled"},
   1399     {0x74,0x0b,"Incorrect Encryption parameters"},
   1400     {0x74,0x0c,"Unable to decrypt parameter list"},
   1401     {0x74,0x0d,"Encryption algorithm disabled"},
   1402     {0x74,0x10,"SA creation parameter value invalid"},
   1403     {0x74,0x11,"SA creation parameter value rejected"},
   1404     {0x74,0x12,"Invalid SA usage"},
   1405     {0x74,0x21,"Data encryption configuration prevented"},
   1406     {0x74,0x30,"SA creation parameter not supported"},
   1407     {0x74,0x40,"Authentication failed"},
   1408     {0x74,0x61,"External data encryption key manager access error"},
   1409     {0x74,0x62,"External data encryption key manager error"},
   1410     {0x74,0x63,"External data encryption key not found"},
   1411     {0x74,0x64,"External data encryption request not authorized"},
   1412     {0x74,0x6e,"External data encryption control timeout"},
   1413     {0x74,0x6f,"External data encryption control error"},
   1414     {0x74,0x71,"Logical unit access not authorized"},
   1415     {0x74,0x79,"Security conflict in translated device"},
   1416     {0, 0, NULL}
   1417 };
   1418 
   1419 #else   /* SG_SCSI_STRINGS */
   1420 
   1421 struct sg_lib_asc_ascq_range_t sg_lib_asc_ascq_range[] =
   1422 {
   1423     {0, 0, 0, NULL}
   1424 };
   1425 
   1426 struct sg_lib_asc_ascq_t sg_lib_asc_ascq[] =
   1427 {
   1428     {0, 0, NULL}
   1429 };
   1430 #endif /* SG_SCSI_STRINGS */
   1431 
   1432 const char * sg_lib_sense_key_desc[] = {
   1433     "No Sense",                 /* Filemark, ILI and/or EOM; progress
   1434                                    indication (during FORMAT); power
   1435                                    condition sensing (REQUEST SENSE) */
   1436     "Recovered Error",          /* The last command completed successfully
   1437                                    but used error correction */
   1438     "Not Ready",                /* The addressed target is not ready */
   1439     "Medium Error",             /* Data error detected on the medium */
   1440     "Hardware Error",           /* Controller or device failure */
   1441     "Illegal Request",
   1442     "Unit Attention",           /* Removable medium was changed, or
   1443                                    the target has been reset */
   1444     "Data Protect",             /* Access to the data is blocked */
   1445     "Blank Check",              /* Reached unexpected written or unwritten
   1446                                    region of the medium */
   1447     "Vendor specific(9)",       /* Vendor specific */
   1448     "Copy Aborted",             /* COPY or COMPARE was aborted */
   1449     "Aborted Command",          /* The target aborted the command */
   1450     "Equal",                    /* SEARCH DATA found data equal (obsolete) */
   1451     "Volume Overflow",          /* Medium full with data to be written */
   1452     "Miscompare",               /* Source data and data on the medium
   1453                                    do not agree */
   1454     "Completed"                 /* may occur for successful cmd (spc4r23) */
   1455 };
   1456 
   1457 const char * sg_lib_pdt_strs[32] = {    /* should have 2**5 elements */
   1458     /* 0 */ "disk",
   1459     "tape",
   1460     "printer",                  /* obsolete, spc5r01 */
   1461     "processor",        /* often SAF-TE device, copy manager */
   1462     "write once optical disk",  /* obsolete, spc5r01 */
   1463     /* 5 */ "cd/dvd",
   1464     "scanner",                  /* obsolete */
   1465     "optical memory device",
   1466     "medium changer",
   1467     "communications",           /* obsolete */
   1468     /* 0xa */ "graphics [0xa]", /* obsolete */
   1469     "graphics [0xb]",           /* obsolete */
   1470     "storage array controller",
   1471     "enclosure services device",
   1472     "simplified direct access device",
   1473     "optical card reader/writer device",
   1474     /* 0x10 */ "bridge controller commands",
   1475     "object based storage",
   1476     "automation/driver interface",
   1477     "security manager device",  /* obsolete, spc5r01 */
   1478     "zoned block commands",
   1479     "0x15", "0x16", "0x17", "0x18",
   1480     "0x19", "0x1a", "0x1b", "0x1c", "0x1d",
   1481     "well known logical unit",
   1482     "no physical device on this lu",
   1483 };
   1484 
   1485 const char * sg_lib_transport_proto_strs[] =
   1486 {
   1487     "Fibre Channel Protocol for SCSI (FCP-4)",
   1488     "SCSI Parallel Interface (SPI-5)",  /* obsolete in spc5r01 */
   1489     "Serial Storage Architecture SCSI-3 Protocol (SSA-S3P)",
   1490     "Serial Bus Protocol for IEEE 1394 (SBP-3)",
   1491     "SCSI RDMA Protocol (SRP)",
   1492     "Internet SCSI (iSCSI)",
   1493     "Serial Attached SCSI Protocol (SPL-4)",
   1494     "Automation/Drive Interface Transport (ADT-2)",
   1495     "AT Attachment Interface (ACS-2)",          /* 0x8 */
   1496     "USB Attached SCSI (UAS-2)",
   1497     "SCSI over PCI Express (SOP)",
   1498     "PCIe",                             /* added in spc5r02 */
   1499     "Oxc", "Oxd", "Oxe",
   1500     "No specific protocol"
   1501 };
   1502 
   1503 /* SCSI Feature Sets array. code->value, pdt->peri_dev_type (-1 for SPC) */
   1504 struct sg_lib_value_name_t sg_lib_scsi_feature_sets[] =
   1505 {
   1506     {SCSI_FS_SPC_DISCOVERY_2016, -1, "Discovery 2016"},
   1507     {SCSI_FS_SBC_BASE_2010, PDT_DISK, "SBC Base 2010"},
   1508     {SCSI_FS_SBC_BASE_2016, PDT_DISK, "SBC Base 2016"},
   1509     {SCSI_FS_SBC_BASIC_PROV_2016, PDT_DISK, "Basic provisioning 2016"},
   1510     {SCSI_FS_SBC_DRIVE_MAINT_2016, PDT_DISK, "Drive maintenance 2016"},
   1511     {0x0, 0, NULL},     /* 0x0 is reserved sfs; trailing sentinel */
   1512 };
   1513 
   1514 #if (SG_SCSI_STRINGS && HAVE_NVME && (! IGNORE_NVME))
   1515 
   1516 /* .value is completion queue's DW3 as follows: ((DW3 >> 17) & 0x3ff)
   1517  * .peri_dev_type is an index for the sg_lib_scsi_status_sense_arr[]
   1518  * .name is taken from NVMe 1.3a document, section 4.6.1.2.1 with less
   1519  *   capitalization.
   1520  * NVMe term bits 31:17 of DW3 in the completion field as the "Status
   1521  * Field" (SF). Bit 31 is "Do not retry" (DNR) and bit 30 is "More" (M).
   1522  * Bits 29:28 are reserved, bit 27:25 are the "Status Code Type" (SCT)
   1523  * and bits 24:17 are the Status Code (SC). This table is in ascending
   1524  * order of its .value field so a binary search could be done on it.  */
   1525 struct sg_lib_value_name_t sg_lib_nvme_cmd_status_arr[] =
   1526 {
   1527     /* Generic command status values, Status Code Type (SCT): 0h
   1528      * Lowest 8 bits are the Status Code (SC), in this case:
   1529      *   00h - 7Fh: Applicable to Admin Command Set, or across multiple
   1530      *              command sets
   1531      *   80h - BFh: I/O Command Set Specific status codes
   1532      *   c0h - FFh: I/O Vendor Specific status codes            */
   1533     {0x0,   0, "Successful completion"},
   1534     {0x1,   1, "Invalid command opcode"},
   1535     {0x2,   2, "Invalid field in command"},
   1536     {0x3,   2, "Command id conflict"},
   1537     {0x4,   3, "Data transfer error"},
   1538     {0x5,   4, "Command aborted due to power loss notication"},
   1539     {0x6,   5, "Internal error"},
   1540     {0x7,   6, "Command abort requested"},
   1541     {0x8,   6, "Command aborted due to SQ deletion"},
   1542     {0x9,   6, "Command aborted due to failed fused command"},
   1543     {0xa,   6, "Command aborted due to missing fused command"},
   1544     {0xb,   7, "Invalid namespace or format"},
   1545     {0xc,   5, "Command sequence error"},
   1546     {0xd,   5, "Invalid SGL segment descriptor"},
   1547     {0xe,   5, "Invalid number of SGL descriptors"},
   1548     {0xf,   5, "Data SGL length invalid"},
   1549     {0x10,  5, "Matadata SGL length invalid"},
   1550     {0x11,  5, "SGL descriptor type invalid"},
   1551     {0x12,  5, "Invalid use of controller memory buffer"},
   1552     {0x13,  5, "PRP offset invalid"},
   1553     {0x14,  2, "Atomic write unit exceeded"},
   1554     {0x15,  8, "Operation denied"},
   1555     {0x16,  5, "SGL offset invalid"},
   1556     {0x17,  5, "Reserved [0x17]"},
   1557     {0x18,  5, "Host identifier inconsistent format"},
   1558     {0x19,  5, "Keep alive timeout expired"},
   1559     {0x1a,  5, "Keep alive timeout invalid"},
   1560     {0x1b,  6, "Command aborted due to Preempt and Abort"},
   1561     {0x1c, 10, "Sanitize failed"},
   1562     {0x1d, 11, "Sanitize in progress"},
   1563     {0x1e,  5, "SGL data block granularity invalid"},
   1564     {0x1f,  5, "Command not supported for queue in CMB"},
   1565 
   1566     /* Generic command status values, NVM (I/O) Command Set */
   1567     {0x80, 12, "LBA out of range"},
   1568     {0x81,  3, "Capacity exceeded"},
   1569     {0x82, 13, "Namespace not ready"},
   1570     {0x83, 14, "Reservation conflict"},
   1571     {0x84, 15, "Format in progress"},
   1572     /* 0xc0 - 0xff: vendor specific */
   1573 
   1574     /* Command specific status values, Status Code Type (SCT): 1h */
   1575     {0x100, 5, "Completion queue invalid"},
   1576     {0x101, 5, "Invalid queue identifier"},
   1577     {0x102, 5, "Invalid queue size"},
   1578     {0x103, 5, "Abort command limit exceeded"},
   1579     {0x104, 5, "Reserved [0x104]"},
   1580     {0x105, 5, "Asynchronous event request limit exceeded"},
   1581     {0x106, 5, "Invalid firmware slot"},
   1582     {0x107, 5, "Invalid firmware image"},
   1583     {0x108, 5, "Invalid interrupt vector"},
   1584     {0x109, 5, "Invalid log page"},
   1585     {0x10a,16, "Invalid format"},
   1586     {0x10b, 5, "Firmware activation requires conventional reset"},
   1587     {0x10c, 5, "Invalid queue deletion"},
   1588     {0x10d, 5, "Feature identifier not saveable"},
   1589     {0x10e, 5, "Feature not changeable"},
   1590     {0x10f, 5, "Feature not namespace specific"},
   1591     {0x110, 5, "Firmware activation requires NVM subsystem reset"},
   1592     {0x111, 5, "Firmware activation requires reset"},
   1593     {0x112, 5, "Firmware activation requires maximum time violation"},
   1594     {0x113, 5, "Firmware activation prohibited"},
   1595     {0x114, 5, "Overlapping range"},
   1596     {0x115, 5, "Namespace insufficient capacity"},
   1597     {0x116, 5, "Namespace identifier unavailable"},
   1598     {0x117, 5, "Reserved [0x107]"},
   1599     {0x118, 5, "Namespace already attached"},
   1600     {0x119, 5, "Namespace is private"},
   1601     {0x11a, 5, "Namespace not attached"},
   1602     {0x11b, 3, "Thin provisioning not supported"},
   1603     {0x11c, 3, "Controller list invalid"},
   1604     {0x11d,17, "Device self-test in progress"},
   1605     {0x11e,18, "Boot partition write prohibited"},
   1606     {0x11f, 5, "Invalid controller identifier"},
   1607     {0x120, 5, "Invalid secondary controller state"},
   1608     {0x121, 5, "Invalid number of controller resorces"},
   1609     {0x122, 5, "Invalid resorce identifier"},
   1610 
   1611     /* Command specific status values, Status Code Type (SCT): 1h
   1612      * for NVM (I/O) Command Set */
   1613     {0x180, 2, "Conflicting attributes"},
   1614     {0x181,19, "Invalid protection information"},
   1615     {0x182,18, "Attempted write to read only range"},
   1616     /* 0x1c0 - 0x1ff: vendor specific */
   1617 
   1618     /* Media and Data Integrity error values, Status Code Type (SCT): 2h */
   1619     {0x280,20, "Write fault"},
   1620     {0x281,21, "Unrecovered read error"},
   1621     {0x282,22, "End-to-end guard check error"},
   1622     {0x283,23, "End-to-end application tag check error"},
   1623     {0x284,24, "End-to-end reference tag check error"},
   1624     {0x285,25, "Compare failure"},
   1625     {0x286, 8, "Access denied"},
   1626     {0x287,26, "Deallocated or unwritten logical block"},
   1627     /* 0x2c0 - 0x2ff: vendor specific */
   1628 
   1629     /* Leave this Sentinel value at end of this array */
   1630     {0x3ff, 0, NULL},
   1631 };
   1632 
   1633 /* The sg_lib_nvme_cmd_status_arr[n].peri_dev_type field is an index
   1634  * to this array. It allows an NVMe status (error) value to be mapped
   1635  * to this SCSI tuple: status, sense_key, additional sense code (asc) and
   1636  * asc qualifier (ascq). For brevity SAM_STAT_CHECK_CONDITION is written
   1637  * as 0x2. */
   1638 struct sg_lib_4tuple_u8 sg_lib_scsi_status_sense_arr[] =
   1639 {
   1640     {SAM_STAT_GOOD, SPC_SK_NO_SENSE, 0, 0},     /* it's all good */ /* 0 */
   1641     {SAM_STAT_CHECK_CONDITION, SPC_SK_ILLEGAL_REQUEST, 0x20, 0x0},/* opcode */
   1642     {0x2, SPC_SK_ILLEGAL_REQUEST, 0x24, 0x0},   /* field in cdb */
   1643     {0x2, SPC_SK_MEDIUM_ERROR, 0x0, 0x0},
   1644     {SAM_STAT_TASK_ABORTED, SPC_SK_ABORTED_COMMAND, 0xb, 0x8},
   1645     {0x2, SPC_SK_HARDWARE_ERROR, 0x44, 0x0},   /* internal error */ /* 5 */
   1646     {SAM_STAT_TASK_ABORTED, SPC_SK_ABORTED_COMMAND, 0x0, 0x0},
   1647     {0x2, SPC_SK_ILLEGAL_REQUEST, 0x20, 0x9},   /* invalid LU */
   1648     {0x2, SPC_SK_ILLEGAL_REQUEST, 0x20, 0x2},   /* access denied */
   1649     {0x2, SPC_SK_ILLEGAL_REQUEST, 0x2c, 0x0},   /* cmd sequence error */
   1650     {0x2, SPC_SK_MEDIUM_ERROR, 0x31, 0x3},   /* sanitize failed */ /* 10 */
   1651     {0x2, SPC_SK_NOT_READY, 0x4, 0x1b}, /* sanitize in progress */
   1652     {0x2, SPC_SK_ILLEGAL_REQUEST, 0x21, 0x0},   /* LBA out of range */
   1653     {0x2, SPC_SK_NOT_READY, 0x4, 0x0},  /* not reportable; 0x1: becoming */
   1654     {SAM_STAT_RESERVATION_CONFLICT, 0x0, 0x0, 0x0},
   1655     {0x2, SPC_SK_NOT_READY, 0x4, 0x4},  /* format in progress */  /* 15 */
   1656     {0x2, SPC_SK_ILLEGAL_REQUEST, 0x31, 0x1},  /* format failed */
   1657     {0x2, SPC_SK_NOT_READY, 0x4, 0x9},  /* self-test in progress */
   1658     {0x2, SPC_SK_DATA_PROTECT, 0x27, 0x0},      /* write prohibited */
   1659     {0x2, SPC_SK_ILLEGAL_REQUEST, 0x10, 0x5},  /* protection info */
   1660     {0x2, SPC_SK_MEDIUM_ERROR, 0x3, 0x0}, /* periph dev w fault */ /* 20 */
   1661     {0x2, SPC_SK_MEDIUM_ERROR, 0x11, 0x0},      /* unrecoc rd */
   1662     {0x2, SPC_SK_MEDIUM_ERROR, 0x10, 0x1},      /* PI guard */
   1663     {0x2, SPC_SK_MEDIUM_ERROR, 0x10, 0x2},      /* PI app tag */
   1664     {0x2, SPC_SK_MEDIUM_ERROR, 0x10, 0x2},      /* PI app tag */
   1665     {0x2, SPC_SK_MISCOMPARE, 0x1d, 0x0},        /* during verify */ /* 25 */
   1666     {0x2, SPC_SK_MEDIUM_ERROR, 0x21, 0x6},      /* read invalid data */
   1667 
   1668     /* Leave this Sentinel value at end of this array */
   1669     {0xff, 0xff, 0xff, 0xff},
   1670 };
   1671 
   1672 
   1673 #else           /* (SG_SCSI_STRINGS && HAVE_NVME && (! IGNORE_NVME)) */
   1674 struct sg_lib_value_name_t sg_lib_nvme_cmd_status_arr[] =
   1675 {
   1676 
   1677     /* Leave this Sentinel value at end of this array */
   1678     {0x3ff, 0, NULL},
   1679 };
   1680 
   1681 struct sg_lib_4tuple_u8 sg_lib_scsi_status_sense_arr[] =
   1682 {
   1683 
   1684     /* Leave this Sentinel value at end of this array */
   1685     {0xff, 0xff, 0xff, 0xff},
   1686 };
   1687 
   1688 #endif           /* (SG_SCSI_STRINGS && HAVE_NVME && (! IGNORE_NVME)) */
   1689