linux/include/scsi/scsi.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * This header file contains public constants and structures used by
   4 * the SCSI initiator code.
   5 */
   6#ifndef _SCSI_SCSI_H
   7#define _SCSI_SCSI_H
   8
   9#include <linux/types.h>
  10#include <linux/scatterlist.h>
  11#include <linux/kernel.h>
  12#include <scsi/scsi_common.h>
  13#include <scsi/scsi_proto.h>
  14#include <scsi/scsi_status.h>
  15
  16struct scsi_cmnd;
  17
  18enum scsi_timeouts {
  19        SCSI_DEFAULT_EH_TIMEOUT         = 10 * HZ,
  20};
  21
  22/*
  23 * DIX-capable adapters effectively support infinite chaining for the
  24 * protection information scatterlist
  25 */
  26#define SCSI_MAX_PROT_SG_SEGMENTS       0xFFFF
  27
  28/*
  29 * Special value for scanning to specify scanning or rescanning of all
  30 * possible channels, (target) ids, or luns on a given shost.
  31 */
  32#define SCAN_WILD_CARD  ~0
  33
  34/*
  35 * standard mode-select header prepended to all mode-select commands
  36 */
  37
  38struct ccs_modesel_head {
  39        __u8 _r1;                       /* reserved */
  40        __u8 medium;            /* device-specific medium type */
  41        __u8 _r2;                       /* reserved */
  42        __u8 block_desc_length; /* block descriptor length */
  43        __u8 density;           /* device-specific density code */
  44        __u8 number_blocks_hi;  /* number of blocks in this block desc */
  45        __u8 number_blocks_med;
  46        __u8 number_blocks_lo;
  47        __u8 _r3;
  48        __u8 block_length_hi;   /* block length for blocks in this desc */
  49        __u8 block_length_med;
  50        __u8 block_length_lo;
  51};
  52
  53/*
  54 * The Well Known LUNS (SAM-3) in our int representation of a LUN
  55 */
  56#define SCSI_W_LUN_BASE 0xc100
  57#define SCSI_W_LUN_REPORT_LUNS (SCSI_W_LUN_BASE + 1)
  58#define SCSI_W_LUN_ACCESS_CONTROL (SCSI_W_LUN_BASE + 2)
  59#define SCSI_W_LUN_TARGET_LOG_PAGE (SCSI_W_LUN_BASE + 3)
  60
  61static inline int scsi_is_wlun(u64 lun)
  62{
  63        return (lun & 0xff00) == SCSI_W_LUN_BASE;
  64}
  65
  66/**
  67 * scsi_status_is_check_condition - check the status return.
  68 *
  69 * @status: the status passed up from the driver (including host and
  70 *          driver components)
  71 *
  72 * This returns true if the status code is SAM_STAT_CHECK_CONDITION.
  73 */
  74static inline int scsi_status_is_check_condition(int status)
  75{
  76        if (status < 0)
  77                return false;
  78        status &= 0xfe;
  79        return status == SAM_STAT_CHECK_CONDITION;
  80}
  81
  82/*
  83 *  Extended message codes.
  84 */
  85#define     EXTENDED_MODIFY_DATA_POINTER    0x00
  86#define     EXTENDED_SDTR                   0x01
  87#define     EXTENDED_EXTENDED_IDENTIFY      0x02    /* SCSI-I only */
  88#define     EXTENDED_WDTR                   0x03
  89#define     EXTENDED_PPR                    0x04
  90#define     EXTENDED_MODIFY_BIDI_DATA_PTR   0x05
  91
  92/*
  93 * Internal return values.
  94 */
  95enum scsi_disposition {
  96        NEEDS_RETRY             = 0x2001,
  97        SUCCESS                 = 0x2002,
  98        FAILED                  = 0x2003,
  99        QUEUED                  = 0x2004,
 100        SOFT_ERROR              = 0x2005,
 101        ADD_TO_MLQUEUE          = 0x2006,
 102        TIMEOUT_ERROR           = 0x2007,
 103        SCSI_RETURN_NOT_HANDLED = 0x2008,
 104        FAST_IO_FAIL            = 0x2009,
 105};
 106
 107/*
 108 * Midlevel queue return values.
 109 */
 110#define SCSI_MLQUEUE_HOST_BUSY   0x1055
 111#define SCSI_MLQUEUE_DEVICE_BUSY 0x1056
 112#define SCSI_MLQUEUE_EH_RETRY    0x1057
 113#define SCSI_MLQUEUE_TARGET_BUSY 0x1058
 114
 115/*
 116 *  Use these to separate status msg and our bytes
 117 *
 118 *  These are set by:
 119 *
 120 *      status byte = set from target device
 121 *      msg_byte    (unused)
 122 *      host_byte   = set by low-level driver to indicate status.
 123 */
 124#define host_byte(result)   (((result) >> 16) & 0xff)
 125
 126#define sense_class(sense)  (((sense) >> 4) & 0x7)
 127#define sense_error(sense)  ((sense) & 0xf)
 128#define sense_valid(sense)  ((sense) & 0x80)
 129
 130/*
 131 * default timeouts
 132*/
 133#define FORMAT_UNIT_TIMEOUT             (2 * 60 * 60 * HZ)
 134#define START_STOP_TIMEOUT              (60 * HZ)
 135#define MOVE_MEDIUM_TIMEOUT             (5 * 60 * HZ)
 136#define READ_ELEMENT_STATUS_TIMEOUT     (5 * 60 * HZ)
 137#define READ_DEFECT_DATA_TIMEOUT        (60 * HZ )
 138
 139
 140#define IDENTIFY_BASE       0x80
 141#define IDENTIFY(can_disconnect, lun)   (IDENTIFY_BASE |\
 142                     ((can_disconnect) ?  0x40 : 0) |\
 143                     ((lun) & 0x07))
 144
 145/*
 146 *  struct scsi_device::scsi_level values. For SCSI devices other than those
 147 *  prior to SCSI-2 (i.e. over 12 years old) this value is (resp[2] + 1)
 148 *  where "resp" is a byte array of the response to an INQUIRY. The scsi_level
 149 *  variable is visible to the user via sysfs.
 150 */
 151
 152#define SCSI_UNKNOWN    0
 153#define SCSI_1          1
 154#define SCSI_1_CCS      2
 155#define SCSI_2          3
 156#define SCSI_3          4        /* SPC */
 157#define SCSI_SPC_2      5
 158#define SCSI_SPC_3      6
 159
 160/*
 161 * INQ PERIPHERAL QUALIFIERS
 162 */
 163#define SCSI_INQ_PQ_CON         0x00
 164#define SCSI_INQ_PQ_NOT_CON     0x01
 165#define SCSI_INQ_PQ_NOT_CAP     0x03
 166
 167
 168/*
 169 * Here are some scsi specific ioctl commands which are sometimes useful.
 170 *
 171 * Note that include/linux/cdrom.h also defines IOCTL 0x5300 - 0x5395
 172 */
 173
 174/* Used to obtain PUN and LUN info.  Conflicts with CDROMAUDIOBUFSIZ */
 175#define SCSI_IOCTL_GET_IDLUN            0x5382
 176
 177/* 0x5383 and 0x5384 were used for SCSI_IOCTL_TAGGED_{ENABLE,DISABLE} */
 178
 179/* Used to obtain the host number of a device. */
 180#define SCSI_IOCTL_PROBE_HOST           0x5385
 181
 182/* Used to obtain the bus number for a device */
 183#define SCSI_IOCTL_GET_BUS_NUMBER       0x5386
 184
 185/* Used to obtain the PCI location of a device */
 186#define SCSI_IOCTL_GET_PCI              0x5387
 187
 188/** scsi_status_is_good - check the status return.
 189 *
 190 * @status: the status passed up from the driver (including host and
 191 *          driver components)
 192 *
 193 * This returns true for known good conditions that may be treated as
 194 * command completed normally
 195 */
 196static inline bool scsi_status_is_good(int status)
 197{
 198        if (status < 0)
 199                return false;
 200
 201        if (host_byte(status) == DID_NO_CONNECT)
 202                return false;
 203
 204        /*
 205         * FIXME: bit0 is listed as reserved in SCSI-2, but is
 206         * significant in SCSI-3.  For now, we follow the SCSI-2
 207         * behaviour and ignore reserved bits.
 208         */
 209        status &= 0xfe;
 210        return ((status == SAM_STAT_GOOD) ||
 211                (status == SAM_STAT_CONDITION_MET) ||
 212                /* Next two "intermediate" statuses are obsolete in SAM-4 */
 213                (status == SAM_STAT_INTERMEDIATE) ||
 214                (status == SAM_STAT_INTERMEDIATE_CONDITION_MET) ||
 215                /* FIXME: this is obsolete in SAM-3 */
 216                (status == SAM_STAT_COMMAND_TERMINATED));
 217}
 218
 219#endif /* _SCSI_SCSI_H */
 220