226 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * This header file contains public constants and structures used by4 * the SCSI initiator code.5 */6#ifndef _SCSI_SCSI_H7#define _SCSI_SCSI_H8 9#include <linux/types.h>10 11#include <asm/param.h>12 13#include <scsi/scsi_common.h>14#include <scsi/scsi_proto.h>15#include <scsi/scsi_status.h>16 17struct scsi_cmnd;18 19enum scsi_timeouts {20 SCSI_DEFAULT_EH_TIMEOUT = 10 * HZ,21};22 23/*24 * DIX-capable adapters effectively support infinite chaining for the25 * protection information scatterlist26 */27#define SCSI_MAX_PROT_SG_SEGMENTS 0xFFFF28 29/*30 * Special value for scanning to specify scanning or rescanning of all31 * possible channels, (target) ids, or luns on a given shost.32 */33#define SCAN_WILD_CARD ~034 35/*36 * standard mode-select header prepended to all mode-select commands37 */38 39struct ccs_modesel_head {40 __u8 _r1; /* reserved */41 __u8 medium; /* device-specific medium type */42 __u8 _r2; /* reserved */43 __u8 block_desc_length; /* block descriptor length */44 __u8 density; /* device-specific density code */45 __u8 number_blocks_hi; /* number of blocks in this block desc */46 __u8 number_blocks_med;47 __u8 number_blocks_lo;48 __u8 _r3;49 __u8 block_length_hi; /* block length for blocks in this desc */50 __u8 block_length_med;51 __u8 block_length_lo;52};53 54/*55 * The Well Known LUNS (SAM-3) in our int representation of a LUN56 */57#define SCSI_W_LUN_BASE 0xc10058#define SCSI_W_LUN_REPORT_LUNS (SCSI_W_LUN_BASE + 1)59#define SCSI_W_LUN_ACCESS_CONTROL (SCSI_W_LUN_BASE + 2)60#define SCSI_W_LUN_TARGET_LOG_PAGE (SCSI_W_LUN_BASE + 3)61 62static inline int scsi_is_wlun(u64 lun)63{64 return (lun & 0xff00) == SCSI_W_LUN_BASE;65}66 67/**68 * scsi_status_is_check_condition - check the status return.69 *70 * @status: the status passed up from the driver (including host and71 * driver components)72 *73 * Returns: %true if the status code is SAM_STAT_CHECK_CONDITION.74 */75static inline int scsi_status_is_check_condition(int status)76{77 if (status < 0)78 return false;79 status &= 0xfe;80 return status == SAM_STAT_CHECK_CONDITION;81}82 83/*84 * Extended message codes.85 */86#define EXTENDED_MODIFY_DATA_POINTER 0x0087#define EXTENDED_SDTR 0x0188#define EXTENDED_EXTENDED_IDENTIFY 0x02 /* SCSI-I only */89#define EXTENDED_WDTR 0x0390#define EXTENDED_PPR 0x0491#define EXTENDED_MODIFY_BIDI_DATA_PTR 0x0592 93/*94 * Internal return values.95 */96enum scsi_disposition {97 NEEDS_RETRY = 0x2001,98 SUCCESS = 0x2002,99 FAILED = 0x2003,100 QUEUED = 0x2004,101 SOFT_ERROR = 0x2005,102 ADD_TO_MLQUEUE = 0x2006,103 TIMEOUT_ERROR = 0x2007,104 SCSI_RETURN_NOT_HANDLED = 0x2008,105 FAST_IO_FAIL = 0x2009,106};107 108/*109 * Midlevel queue return values.110 */111#define SCSI_MLQUEUE_HOST_BUSY 0x1055112#define SCSI_MLQUEUE_DEVICE_BUSY 0x1056113#define SCSI_MLQUEUE_EH_RETRY 0x1057114#define SCSI_MLQUEUE_TARGET_BUSY 0x1058115 116/*117 * Use these to separate status msg and our bytes118 *119 * These are set by:120 *121 * status byte = set from target device122 * msg_byte (unused)123 * host_byte = set by low-level driver to indicate status.124 */125#define status_byte(result) (result & 0xff)126#define host_byte(result) (((result) >> 16) & 0xff)127 128#define sense_class(sense) (((sense) >> 4) & 0x7)129#define sense_error(sense) ((sense) & 0xf)130#define sense_valid(sense) ((sense) & 0x80)131 132/*133 * default timeouts134*/135#define FORMAT_UNIT_TIMEOUT (2 * 60 * 60 * HZ)136#define START_STOP_TIMEOUT (60 * HZ)137#define MOVE_MEDIUM_TIMEOUT (5 * 60 * HZ)138#define READ_ELEMENT_STATUS_TIMEOUT (5 * 60 * HZ)139#define READ_DEFECT_DATA_TIMEOUT (60 * HZ )140 141 142#define IDENTIFY_BASE 0x80143#define IDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\144 ((can_disconnect) ? 0x40 : 0) |\145 ((lun) & 0x07))146 147/*148 * struct scsi_device::scsi_level values. For SCSI devices other than those149 * prior to SCSI-2 (i.e. over 12 years old) this value is (resp[2] + 1)150 * where "resp" is a byte array of the response to an INQUIRY. The scsi_level151 * variable is visible to the user via sysfs.152 */153 154#define SCSI_UNKNOWN 0155#define SCSI_1 1156#define SCSI_1_CCS 2157#define SCSI_2 3158#define SCSI_3 4 /* SPC */159#define SCSI_SPC_2 5160#define SCSI_SPC_3 6161#define SCSI_SPC_4 7162#define SCSI_SPC_5 8163#define SCSI_SPC_6 14164 165/*166 * INQ PERIPHERAL QUALIFIERS167 */168#define SCSI_INQ_PQ_CON 0x00169#define SCSI_INQ_PQ_NOT_CON 0x01170#define SCSI_INQ_PQ_NOT_CAP 0x03171 172 173/*174 * Here are some scsi specific ioctl commands which are sometimes useful.175 *176 * Note that include/linux/cdrom.h also defines IOCTL 0x5300 - 0x5395177 */178 179/* Used to obtain PUN and LUN info. Conflicts with CDROMAUDIOBUFSIZ */180#define SCSI_IOCTL_GET_IDLUN 0x5382181 182/* 0x5383 and 0x5384 were used for SCSI_IOCTL_TAGGED_{ENABLE,DISABLE} */183 184/* Used to obtain the host number of a device. */185#define SCSI_IOCTL_PROBE_HOST 0x5385186 187/* Used to obtain the bus number for a device */188#define SCSI_IOCTL_GET_BUS_NUMBER 0x5386189 190/* Used to obtain the PCI location of a device */191#define SCSI_IOCTL_GET_PCI 0x5387192 193/**194 * scsi_status_is_good - check the status return.195 *196 * @status: the status passed up from the driver (including host and197 * driver components)198 *199 * Returns: %true for known good conditions that may be treated as200 * command completed normally201 */202static inline bool scsi_status_is_good(int status)203{204 if (status < 0)205 return false;206 207 if (host_byte(status) == DID_NO_CONNECT)208 return false;209 210 /*211 * FIXME: bit0 is listed as reserved in SCSI-2, but is212 * significant in SCSI-3. For now, we follow the SCSI-2213 * behaviour and ignore reserved bits.214 */215 status &= 0xfe;216 return ((status == SAM_STAT_GOOD) ||217 (status == SAM_STAT_CONDITION_MET) ||218 /* Next two "intermediate" statuses are obsolete in SAM-4 */219 (status == SAM_STAT_INTERMEDIATE) ||220 (status == SAM_STAT_INTERMEDIATE_CONDITION_MET) ||221 /* FIXME: this is obsolete in SAM-3 */222 (status == SAM_STAT_COMMAND_TERMINATED));223}224 225#endif /* _SCSI_SCSI_H */226