The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/scsipi/scsi_spc.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: scsi_spc.h,v 1.7 2022/01/27 18:37:02 jakllsch Exp $    */
    2 
    3 /*-
    4  * Copyright (c) 2005 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Jason R. Thorpe.
    9  *
   10  * Redistribution and use in source and binary forms, with or without
   11  * modification, are permitted provided that the following conditions
   12  * are met:
   13  * 1. Redistributions of source code must retain the above copyright
   14  *    notice, this list of conditions and the following disclaimer.
   15  * 2. Redistributions in binary form must reproduce the above copyright
   16  *    notice, this list of conditions and the following disclaimer in the
   17  *    documentation and/or other materials provided with the distribution.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   29  * POSSIBILITY OF SUCH DAMAGE.
   30  */
   31 
   32 /*
   33  * SCSI Primary Commands (SPC) --
   34  *      Commands for all device types
   35  */
   36 
   37 /*
   38  * Largely written by Julian Elischer (julian@tfs.com)
   39  * for TRW Financial Systems.
   40  *
   41  * TRW Financial Systems, in accordance with their agreement with Carnegie
   42  * Mellon University, makes this software available to CMU to distribute
   43  * or use in any manner that they see fit as long as this message is kept with
   44  * the software. For this reason TFS also grants any other persons or
   45  * organisations permission to use or modify this software.
   46  *
   47  * TFS supplies this software to be publicly redistributed
   48  * on the understanding that TFS is not responsible for the correct
   49  * functioning of this software in any circumstances.
   50  *
   51  * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
   52  */
   53 
   54 #ifndef _DEV_SCSIPI_SCSI_SPC_H_
   55 #define _DEV_SCSIPI_SCSI_SPC_H_
   56 
   57 /*
   58  * EXTENDED COPY
   59  */
   60 
   61 /*
   62  * INQUIRY
   63  */
   64 
   65 /*
   66  * LOG SELECT
   67  */
   68 
   69 /*
   70  * LOG SENSE
   71  */
   72 
   73 /*
   74  * MODE SELECT
   75  */
   76 
   77 #define SCSI_MODE_SELECT_6              0x15
   78 struct scsi_mode_select_6 {
   79         uint8_t opcode;
   80         uint8_t byte2;
   81 #define SMS_SP          0x01    /* save page */
   82 #define SMS_PF          0x10    /* page format (0 = SCSI-1, 1 = SCSI-2) */
   83         uint8_t reserved[2];
   84         uint8_t length;
   85         uint8_t control;
   86 };
   87 
   88 #define SCSI_MODE_SELECT_10             0x55
   89 struct scsi_mode_select_10 {
   90         uint8_t opcode;
   91         uint8_t byte2;          /* see MODE SELECT (6) */
   92         uint8_t reserved[5];
   93         uint8_t length[2];
   94         uint8_t control;
   95 };
   96 
   97 /*
   98  * MODE SENSE
   99  */
  100 
  101 #define SCSI_MODE_SENSE_6               0x1a
  102 struct scsi_mode_sense_6 {
  103         uint8_t opcode;
  104         uint8_t byte2;
  105 #define SMS_DBD                         0x08 /* disable block descriptors */
  106         uint8_t page;
  107 #define SMS_PAGE_MASK                   0x3f
  108 #define SMS_PCTRL_MASK                  0xc0
  109 #define SMS_PCTRL_CURRENT               0x00
  110 #define SMS_PCTRL_CHANGEABLE            0x40
  111 #define SMS_PCTRL_DEFAULT               0x80
  112 #define SMS_PCTRL_SAVED                 0xc0
  113         uint8_t reserved;
  114         uint8_t length;
  115         uint8_t control;
  116 };
  117 
  118 #define SCSI_MODE_SENSE_10              0x5a
  119 struct scsi_mode_sense_10 {
  120         uint8_t opcode;
  121         uint8_t byte2;                  /* see MODE SENSE (6) */
  122 #define SMS_LLBAA                       0x10
  123         uint8_t page;                   /* See MODE SENSE (6) */
  124         uint8_t reserved[4];
  125         uint8_t length[2];
  126         uint8_t control;
  127 };
  128 
  129 /*
  130  * Page code usage:
  131  *      0x00            Vendor-specific (does not require page format)
  132  *      0x01 - 0x1f     Device-type-specific pages
  133  *      0x20 - 0x3e     Vendor-specific (page format required)
  134  *      0x3f            Return all mode pages
  135  */
  136 #define SMS_PAGE_ALL_PAGES              0x3f
  137 
  138 /*
  139  * Mode parameters are returned in the following format:
  140  *
  141  *      Mode parameter header
  142  *      Block descriptor(s)     [zero or more]
  143  *      Page(s)                 [zero or more, variable-length]
  144  */
  145 
  146 struct scsi_mode_parameter_header_6 {
  147         uint8_t data_length;
  148         uint8_t medium_type;
  149         uint8_t dev_spec;
  150         uint8_t blk_desc_len;           /* unused on ATAPI */
  151 };
  152 
  153 struct scsi_mode_parameter_header_10 {
  154         uint8_t data_length[2];
  155         uint8_t medium_type;
  156         uint8_t dev_spec;
  157         uint8_t byte5;
  158 #define SMPH_LONGLBA            0x01
  159         uint8_t reserved;
  160         uint8_t blk_desc_len[2];
  161 };
  162 
  163 struct scsi_general_block_descriptor {
  164         uint8_t density;
  165         uint8_t nblocks[3];
  166         uint8_t reserved;
  167         uint8_t blklen[3];
  168 };
  169 
  170 struct scsi_da_block_descriptor {
  171         uint8_t nblocks[4];
  172         uint8_t density;
  173         uint8_t blklen[3];
  174 };
  175 
  176 struct scsi_longlba_block_descriptor {
  177         uint8_t nblocks[8];
  178         uint8_t density;
  179         uint8_t reserved[3];
  180         uint8_t blklen[4];
  181 };
  182 
  183 /*
  184  * Header common to all mode parameter pages.
  185  */
  186 struct scsi_mode_page_header {
  187         uint8_t pg_code;
  188 #define PGCODE_MASK     0x3f            /* page code mask */
  189 #define PGCODE_PS       0x80            /* page is saveable */
  190         uint8_t pg_length;              /* page length (not including header) */
  191 };
  192 
  193 /*
  194  * Control mode page
  195  */
  196 #define SCSI_CONTROL_MODE_PAGE          0x0a
  197 struct scsi_control_mode_page {
  198         uint8_t pg_code;                /* 0x0a */
  199         uint8_t pg_length;              /* 0x0a */
  200         uint8_t byte3;
  201 #define SCMP_RLEC               0x01    /* report log exception condition */
  202 #define SCMP_GLTSD              0x02    /* global logging target save disable */
  203 #define SCMP_TST_mask           0x7     /* task set type */
  204 #define SCMP_TST_shift          5
  205 #define SCMP_TST_ALL_INIT       0       /* per LU for all initiators */
  206 #define SCMP_TST_PER_INIT       1       /* per initiator per LU */
  207         uint8_t queue_params;
  208 #define SCMP_DQue               0x01    /* disable queueing */
  209 #define SCMP_QErr_mask          0x3     /* queue error management */
  210 #define SCMP_QErr_shift         1
  211 #define SCMP_QAM_mask           0xf     /* queue algorithm modifier */
  212 #define SCMP_QAM_shift          4
  213 #define SCMP_QAM_RESTRICTED     0x0     /* restricted reordering allowed */
  214 #define SCMP_QAM_UNRESTRICTED   0x1     /* unrestricted reordering allowed */
  215                         /*      0x2 - 0x7       Reserved */
  216                         /*      0x8 - 0xf       Vendor-specific */
  217         uint8_t byte5;
  218 #define SCMP_EAERP              0x01
  219 #define SCMP_UAAERP             0x02
  220 #define SCMP_RAERP              0x04
  221 #define SCMP_SWP                0x08
  222 #define SCMP_RAC                0x40
  223 #define SCMP_TAS                0x80
  224         uint8_t byte6;
  225 #define SCMP_AM_mask            0x7     /* autload mode */
  226 #define SCMP_AM_FULL            0
  227 #define SCMP_AM_AUXMEM          1
  228 #define SCMP_AM_NOLOAD          2
  229         uint8_t rahp[2];                /* ready aer holdoff period */
  230         uint8_t btp[2];                 /* busy timeout period */
  231         uint8_t estct[2];               /* extended self-test completion time */
  232 };
  233 
  234 /*
  235  * Disconnect-reconnect page
  236  */
  237 #define SCSI_DISCONNECT_RECONNECT_PAGE  0x02
  238 struct scsi_disconnect_reconnect_page {
  239         uint8_t pg_code;                /* 0x02 */
  240         uint8_t pg_length;              /* 0x0e */
  241         uint8_t buffer_full_ratio;
  242         uint8_t buffer_empty_ratio;
  243         uint8_t bus_inactivity_limit[2];
  244         uint8_t disconnect_time_limit[2];
  245         uint8_t connect_time_limit[2];
  246         uint8_t maximum_burst_size[2];
  247         uint8_t flags;
  248 #define SDRP_DTDC_mask          0x7     /* data transfer disconnect control */
  249 #define SDRP_DImm               0x08
  250 #define SDRP_FA_mask            0x7
  251 #define SDRP_FA_shift           4
  252 #define SDRP_EMDP               0x80
  253         uint8_t reserved;
  254         uint8_t first_burst_size[2];
  255 };
  256 
  257 /*
  258  * Informational exceptions control page
  259  */
  260 #define SCSI_INFORMATIONAL_EXCEPTIONS_CONTROL_PAGE 0x1c
  261 struct scsi_informational_exceptions_control_page {
  262         uint8_t pg_code;                /* 0x1c */
  263         uint8_t pg_length;              /* 0x0a */
  264         uint8_t byte3;
  265 #define SIECP_LogErr            0x01
  266 #define SIECP_TEST              0x04
  267 #define SIECP_DExcpt            0x08
  268 #define SIECP_EWasc             0x10
  269 #define SIECP_EBF               0x20
  270 #define SIECP_PERF              0x80
  271         uint8_t byte4;
  272 #define SIECP_MRIE_mask                 0xf     /* method of reporting
  273                                                    informational exceptions */
  274 #define SIECP_MRIE_NO_REPORTING         0x00
  275 #define SIECP_MRIE_ASYNC_EVENT          0x01
  276 #define SIECP_MRIE_UNIT_ATN             0x02
  277 #define SIECP_MRIE_COND_RECOV_ERR       0x03
  278 #define SIECP_MRIE_UNCOND_RECOV_ERR     0x04
  279 #define SIECP_MRIE_NO_SENSE             0x05
  280 #define SIECP_MRIE_ON_REQUEST           0x06
  281                                 /*      0x07 - 0x0b reserved */
  282                                 /*      0x0c - 0x0f Vendor-specific */
  283         uint8_t interval_timer[2];
  284         uint8_t report_count[2];
  285 };
  286 
  287 /*
  288  * Power condition page
  289  */
  290 #define SCSI_POWER_CONDITION_PAGE       0x1a
  291 struct scsi_power_condition_page {
  292         uint8_t pg_code;                /* 0x1a */
  293         uint8_t pg_length;              /* 0x0a */
  294         uint8_t reserved;
  295         uint8_t byte4;
  296 #define SPCP_STANDBY            0x01
  297 #define SPCP_IDLE               0x02
  298         uint8_t idle_timer[2];          /* 100ms increments */
  299         uint8_t standby_timer[2];       /* 100ms increments */
  300 };
  301 
  302 /*
  303  * Protocol specific LUN page
  304  */
  305 #define SCSI_PROTOCOL_SPECIFIC_LUN_PAGE 0x18
  306 struct scsi_protocol_specific_lun_page {
  307         uint8_t pg_code;        /* 0x18 */
  308         uint8_t pg_length;      /* variable */
  309         uint8_t byte3;
  310 #define SPSLP_PROTOCOL_mask     0xf
  311 #define SPSLP_PROTOCOL_FCP      0x00    /* Fibre Channel */
  312 #define SPSLP_PROTOCOL_SPI      0x01    /* parallel SCSI */
  313 #define SPSLP_PROTOCOL_SSA      0x02    /* SSA-S2P or SSA-S3P */
  314 #define SPSLP_PROTOCOL_SBP2     0x03    /* IEEE 1394 */
  315 #define SPSLP_PROTOCOL_SRP      0x04    /* SCSI RDMA */
  316 #define SPSLP_PROTOCOL_ISCSI    0x05    /* iSCSI */
  317         /* protocol specific mode parameters follow */
  318 };
  319 
  320 /*
  321  * Protocol specific port page
  322  */
  323 #define SCSI_PROTOCOL_SPECIFIC_PORT_PAGE 0x19
  324 struct scsi_protocol_specific_port_page {
  325         uint8_t pg_code;        /* 0x18 */
  326         uint8_t pg_length;      /* variable */
  327         uint8_t byte3;          /* see SCSI PROTOCOL SPECIFIC LUN PAGE */
  328         /* protocol specific mode parameters follow */
  329 };
  330 
  331 /*
  332  * PERSISTENT RESERVE IN
  333  */
  334 
  335 /*
  336  * PERSISTENT RESERVE OUT
  337  */
  338 
  339 /*
  340  * PREVENT ALLOW MEDIUM REMOVAL
  341  */
  342 
  343 #define SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL       0x1e
  344 struct scsi_prevent_allow_medium_removal {
  345         uint8_t opcode;
  346         uint8_t byte2;
  347         uint8_t reserved[2];
  348         uint8_t how;
  349 #define SPAMR_ALLOW             0x00
  350 #define SPAMR_PREVENT_DT        0x01
  351 #define SPAMR_PREVENT_MC        0x02
  352 #define SPAMR_PREVENT_ALL       0x03
  353         uint8_t control;
  354 };
  355 
  356 /*
  357  * READ BUFFER
  358  */
  359 
  360 /*
  361  * RECEIVE COPY RESULTS
  362  */
  363 
  364 /*
  365  * RECEIVE DIAGNOSTIC RESULTS
  366  */
  367 
  368 /*
  369  * RESERVE / RELEASE
  370  */
  371 
  372 #define SCSI_RESERVE_6                  0x16
  373 #define SCSI_RELEASE_6                  0x17
  374 struct scsi_reserve_release_6 {
  375         uint8_t opcode;
  376         uint8_t byte2;
  377         uint8_t obsolete;
  378         uint8_t reserved[2];
  379         uint8_t control;
  380 };
  381 
  382 #define SCSI_RESERVE_10                 0x56
  383 #define SCSI_RELEASE_10                 0x57
  384 struct scsi_reserve_release_10 {
  385         uint8_t opcode;
  386         uint8_t byte2;
  387 #define SR_LongID               0x02
  388 #define SR_3rdPty               0x10
  389         uint8_t obsolete;
  390         uint8_t thirdpartyid;
  391         uint8_t reserved[3];
  392         uint8_t paramlen[2];
  393         uint8_t control;
  394 };
  395 
  396 struct scsi_reserve_release_10_idparam {
  397         uint8_t thirdpartyid[8];
  398 };
  399 
  400 /*
  401  * REPORT DEVICE IDENTIFIER
  402  */
  403 
  404 /*
  405  * REPORT LUNS
  406  */
  407 #define SCSI_REPORT_LUNS                0xa0
  408 
  409 struct scsi_report_luns {
  410         uint8_t opcode;
  411         uint8_t reserved1;
  412         uint8_t selectreport;
  413 #define SELECTREPORT_NORMAL             0x00
  414 #define SELECTREPORT_WELLKNOWN          0x01
  415 #define SELECTREPORT_ALL                0x02
  416         uint8_t reserved3[3];
  417         uint8_t alloclen[4];
  418         uint8_t reserved10;
  419         uint8_t control;
  420 };
  421 
  422 struct scsi_report_luns_header {
  423         uint8_t length[4];              /* in bytes, not including header */
  424         uint8_t _res4[4];
  425                                         /* followed by array of: */
  426 };
  427 
  428 struct scsi_report_luns_lun {
  429         uint8_t lun[8];
  430 };
  431 
  432 /*
  433  * MAINTENANCE_IN[REPORT SUPPORTED OPERATION CODES]
  434  */
  435 #define SCSI_MAINTENANCE_IN             0xA3
  436 
  437 struct scsi_repsuppopcode {
  438         u_int8_t opcode;
  439         u_int8_t svcaction;
  440 #define RSOC_REPORT_SUPPORTED_OPCODES   0x0C
  441 
  442         u_int8_t repoption;
  443 #define RSOC_ALL           0x00 /* report all */
  444 #define RSOC_ONE           0x01 /* report one */
  445 #define RSOC_ONESACD       0x02 /* report one or CHECK CONDITION */
  446 #define RSOC_ONESA         0x03 /* report one mark presense in data */
  447 #define RSOC_RCTD          0x80 /* report timeouts */
  448 
  449         u_int8_t reqopcode;
  450         u_int8_t reqsvcaction[2];
  451         u_int8_t alloclen[4];
  452         u_int8_t _res0;
  453         u_int8_t control;
  454 };
  455 
  456 struct scsi_repsupopcode_all_commands_descriptor {
  457         u_int8_t opcode;
  458         u_int8_t _res0;
  459         u_int8_t serviceaction[2];
  460         u_int8_t _res1;
  461         u_int8_t flags;
  462 #define RSOC_ACD_CTDP         0x02    /* timeouts present */
  463 #define RSOC_ACD_SERVACTV     0x01    /* service action valid */
  464         u_int8_t cdblen[2];
  465 };
  466 
  467 struct scsi_repsupopcode_one_command_descriptor {
  468         u_int8_t _res0;
  469         u_int8_t support;
  470 #define RSOC_OCD_CTDP              0x80 /* timeouts present */
  471 #define RSOC_OCD_SUP_NOT_AVAIL     0x00 /* not available */
  472 #define RSOC_OCD_SUP_NOT_SUPP      0x01 /* not supported */
  473 #define RSOC_OCD_SUP_SUPP_STD      0x03 /* supported - standard */
  474 #define RSOC_OCD_SUP_SUPP_VENDOR   0x05 /* supported - vendor */
  475 #define RSOC_OCD_SUP               0x07 /* mask for support field */
  476 
  477         u_int8_t cdblen[2];
  478         /*
  479          * u_int8_t usage[0...]- cdblen bytes
  480          * usage data
  481          */
  482         /*
  483          * scsi_repsupopcode_timeouts_descriptor
  484          * if  RSOC_OCD_CTDP is set
  485          */
  486 };
  487 
  488 struct scsi_repsupopcode_timeouts_descriptor {
  489         u_int8_t descriptor_length[2];
  490         u_int8_t _res0;
  491         u_int8_t cmd_specific;
  492         u_int8_t nom_process_timeout[4];
  493         u_int8_t cmd_process_timeout[4];
  494 };
  495 
  496 /*
  497  * REQUEST SENSE
  498  */
  499 
  500 #define SCSI_REQUEST_SENSE              0x03
  501 struct scsi_request_sense {
  502         uint8_t opcode;
  503         uint8_t byte2;
  504         uint8_t reserved[2];
  505         uint8_t length;
  506         uint8_t control;
  507 };
  508 
  509 struct scsi_sense_data {
  510 /* 1*/  uint8_t response_code;
  511 #define SSD_RCODE(x)            ((x) & 0x7f)
  512 #define SSD_RCODE_CURRENT       0x70
  513 #define SSD_RCODE_DEFERRED      0x71
  514 #define SSD_RCODE_VALID         0x80
  515 /* 2*/  uint8_t segment;        /* obsolete */
  516 /* 3*/  uint8_t flags;
  517 #define SSD_SENSE_KEY(x)        ((x) & 0x0f)
  518 #define SSD_ILI                 0x20
  519 #define SSD_EOM                 0x40
  520 #define SSD_FILEMARK            0x80
  521 /* 7*/  uint8_t info[4];
  522 /* 8*/  uint8_t extra_len;              /* Additional sense length */
  523 /*12*/  uint8_t csi[4];                 /* Command-specific information */
  524 /*13*/  uint8_t asc;                    /* Additional sense code */
  525 /*14*/  uint8_t ascq;                   /* Additional sense code qualifier */
  526 /*15*/  uint8_t fru;                    /* Field replaceable unit code */
  527         union {
  528                 uint8_t sks_bytes[3];
  529 
  530                 /* ILLEGAL REQUEST */
  531                 struct {
  532                         uint8_t byte0;
  533 #define SSD_SKS_FP_BIT(x)       ((x) & 0x7)
  534 #define SSD_SKS_FP_BPV          0x08
  535 #define SSK_SKS_FP_CD           0x40    /* 1=command, 0=data */
  536                         uint8_t val[2];
  537                 } field_pointer;
  538 
  539                 /* RECOVERED ERROR, HARDWARE ERROR, MEDIUM ERROR */
  540                 struct {
  541                         uint8_t byte0;
  542                         uint8_t val[2];
  543                 } actual_retry_count;
  544 
  545                 /* NOT READY, NO SENSE */
  546                 struct {
  547                         uint8_t byte0;
  548                         uint8_t val[2];
  549                 } progress_indication;
  550 
  551                 /* COPY ABORTED */
  552                 struct {
  553                         uint8_t byte0;
  554 #define SSD_SKS_SP_BIT(x)       ((x) & 0x7)
  555 #define SSD_SKS_SP_BPV          0x08
  556 #define SSD_SKS_SP_SD           0x20    /* 0=param list, 1=segment desc */
  557                         uint8_t val[2];
  558                 } segment_pointer;
  559 /*18*/  } sks;                          /* Sense-key specific */
  560 #define SSD_SKSV                0x80    /* byte0 of sks field */
  561 /*32*/  uint8_t extra_bytes[14];        /* really variable length */
  562 };
  563 
  564 /*
  565  * Sense bytes described by the extra_len field start at csi[], and can
  566  * only continue up to the end of the 32-byte sense structure that we
  567  * have defined (which might be too short for some cases).
  568  */
  569 #define SSD_ADD_BYTES_LIM(sp)                                           \
  570         ((((int)(sp)->extra_len) < (int)sizeof(struct scsi_sense_data) - 8) ? \
  571          (sp)->extra_len : sizeof(struct scsi_sense_data) - 8)
  572 
  573 #define SKEY_NO_SENSE           0x00
  574 #define SKEY_RECOVERED_ERROR    0x01
  575 #define SKEY_NOT_READY          0x02
  576 #define SKEY_MEDIUM_ERROR       0x03
  577 #define SKEY_HARDWARE_ERROR     0x04
  578 #define SKEY_ILLEGAL_REQUEST    0x05
  579 #define SKEY_UNIT_ATTENTION     0x06
  580 #define SKEY_DATA_PROTECT       0x07
  581 #define SKEY_BLANK_CHECK        0x08
  582 #define SKEY_VENDOR_SPECIFIC    0x09
  583 #define SKEY_COPY_ABORTED       0x0a
  584 #define SKEY_ABORTED_COMMAND    0x0b
  585 #define SKEY_EQUAL              0x0c    /* obsolete */
  586 #define SKEY_VOLUME_OVERFLOW    0x0d
  587 #define SKEY_MISCOMPARE         0x0e
  588                         /*      0x0f    reserved */
  589 
  590 /* XXX This is not described in SPC-2. */
  591 struct scsi_sense_data_unextended {
  592         uint8_t response_code;
  593         uint8_t block[3];
  594 };
  595 
  596 /*
  597  * SEND DIAGNOSTIC
  598  */
  599 
  600 #define SCSI_SEND_DIAGNOSTIC            0x1d
  601 struct scsi_send_diagnostic {
  602         uint8_t opcode;
  603         uint8_t byte2;
  604 #define SSD_UnitOffL            0x01
  605 #define SSD_DevOffL             0x02
  606 #define SSD_SelfTest            0x04    /* standard self-test */
  607 #define SSD_PF                  0x10    /* results in page format */
  608 #define SSD_CODE(x)             ((x) << 5)
  609         /*
  610          * Codes:
  611          *
  612          *      0       This value shall be used when the SelfTest bit is
  613          *              set to one or if the SEND DIAGNOSTIC command is not
  614          *              invoking one of the other self-test functions such
  615          *              as enclosure services or the Translate Address page.
  616          *
  617          *      1       Background short self-test.  Parameter length is 0.
  618          *
  619          *      2       Background extended self-test.  Parameter length is 0.
  620          *
  621          *      4       Abort background self-test.  Parameter length is 0.
  622          *
  623          *      5       Foreground short self-test.  Parameter length is 0.
  624          *
  625          *      6       Foreground extended self-test.  Parameter length is 0.
  626          */
  627         uint8_t reserved;
  628         uint8_t paramlen[2];
  629         uint8_t control;
  630 };
  631 
  632 /*
  633  * SET DEVICE IDENTIFIER
  634  */
  635 
  636 /*
  637  * TEST UNIT READY
  638  */
  639 
  640 #define SCSI_TEST_UNIT_READY            0x00
  641 struct scsi_test_unit_ready {
  642         uint8_t opcode;
  643         uint8_t byte2;
  644         uint8_t reserved[3];
  645         uint8_t control;
  646 };
  647 
  648 /*
  649  * WRITE BUFFER
  650  */
  651 
  652 #endif /* _DEV_SCSIPI_SCSI_SPC_H_ */

Cache object: 5ba410c4a63f5a551741b516468a850e


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.