brintos

brintos / linux-shallow public Read only

0
0
Text · 5.9 KiB · 96b3503 Raw
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