Commit 149d0e48 authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen
Browse files

scsi: core: Introduce enums for the SAM and host status codes

Make it possible for the compiler to verify whether SAM and host
status codes are used correctly.

[mkp: resolve conflicts with Hannes' SCSI result series]

Link: https://lore.kernel.org/r/20210524025457.11299-3-bvanassche@acm.org


Cc: Hannes Reinecke <hare@suse.com>
Reviewed-by: default avatarJohn Garry <john.garry@huawei.com>
Reviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent d377f415
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -408,8 +408,8 @@ static const char * const hostbyte_table[]={

const char *scsi_hostbyte_string(int result)
{
	enum scsi_host_status hb = host_byte(result);
	const char *hb_string = NULL;
	int hb = host_byte(result);

	if (hb < ARRAY_SIZE(hostbyte_table))
		hb_string = hostbyte_table[hb];
+1 −1
Original line number Diff line number Diff line
@@ -1044,7 +1044,7 @@ static void pscsi_req_done(struct request *req, blk_status_t status)
	struct se_cmd *cmd = req->end_io_data;
	struct pscsi_plugin_task *pt = cmd->priv;
	int result = scsi_req(req)->result;
	u8 scsi_status = result & 0xff;
	enum sam_status scsi_status = result & 0xff;

	if (scsi_status != SAM_STAT_GOOD) {
		pr_debug("PSCSI Status Byte exception at cmd: %p CDB:"
+2 −65
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#include <linux/kernel.h>
#include <scsi/scsi_common.h>
#include <scsi/scsi_proto.h>
#include <scsi/scsi_status.h>

struct scsi_cmnd;

@@ -79,78 +80,14 @@ static inline int scsi_status_is_check_condition(int status)
}

/*
 *  MESSAGE CODES
 *  Extended message codes.
 */

#define COMMAND_COMPLETE    0x00
#define EXTENDED_MESSAGE    0x01
#define     EXTENDED_MODIFY_DATA_POINTER    0x00
#define     EXTENDED_SDTR                   0x01
#define     EXTENDED_EXTENDED_IDENTIFY      0x02    /* SCSI-I only */
#define     EXTENDED_WDTR                   0x03
#define     EXTENDED_PPR                    0x04
#define     EXTENDED_MODIFY_BIDI_DATA_PTR   0x05
#define SAVE_POINTERS       0x02
#define RESTORE_POINTERS    0x03
#define DISCONNECT          0x04
#define INITIATOR_ERROR     0x05
#define ABORT_TASK_SET      0x06
#define MESSAGE_REJECT      0x07
#define NOP                 0x08
#define MSG_PARITY_ERROR    0x09
#define LINKED_CMD_COMPLETE 0x0a
#define LINKED_FLG_CMD_COMPLETE 0x0b
#define TARGET_RESET        0x0c
#define ABORT_TASK          0x0d
#define CLEAR_TASK_SET      0x0e
#define INITIATE_RECOVERY   0x0f            /* SCSI-II only */
#define RELEASE_RECOVERY    0x10            /* SCSI-II only */
#define TERMINATE_IO_PROC   0x11            /* SCSI-II only */
#define CLEAR_ACA           0x16
#define LOGICAL_UNIT_RESET  0x17
#define SIMPLE_QUEUE_TAG    0x20
#define HEAD_OF_QUEUE_TAG   0x21
#define ORDERED_QUEUE_TAG   0x22
#define IGNORE_WIDE_RESIDUE 0x23
#define ACA                 0x24
#define QAS_REQUEST         0x55

/* Old SCSI2 names, don't use in new code */
#define BUS_DEVICE_RESET    TARGET_RESET
#define ABORT               ABORT_TASK_SET

/*
 * Host byte codes
 */

#define DID_OK          0x00	/* NO error                                */
#define DID_NO_CONNECT  0x01	/* Couldn't connect before timeout period  */
#define DID_BUS_BUSY    0x02	/* BUS stayed busy through time out period */
#define DID_TIME_OUT    0x03	/* TIMED OUT for other reason              */
#define DID_BAD_TARGET  0x04	/* BAD target.                             */
#define DID_ABORT       0x05	/* Told to abort for some other reason     */
#define DID_PARITY      0x06	/* Parity error                            */
#define DID_ERROR       0x07	/* Internal error                          */
#define DID_RESET       0x08	/* Reset by somebody.                      */
#define DID_BAD_INTR    0x09	/* Got an interrupt we weren't expecting.  */
#define DID_PASSTHROUGH 0x0a	/* Force command past mid-layer            */
#define DID_SOFT_ERROR  0x0b	/* The low level driver just wish a retry  */
#define DID_IMM_RETRY   0x0c	/* Retry without decrementing retry count  */
#define DID_REQUEUE	0x0d	/* Requeue command (no immediate retry) also
				 * without decrementing the retry count	   */
#define DID_TRANSPORT_DISRUPTED 0x0e /* Transport error disrupted execution
				      * and the driver blocked the port to
				      * recover the link. Transport class will
				      * retry or fail IO */
#define DID_TRANSPORT_FAILFAST	0x0f /* Transport class fastfailed the io */
#define DID_TARGET_FAILURE 0x10 /* Permanent target failure, do not retry on
				 * other paths */
#define DID_NEXUS_FAILURE 0x11  /* Permanent nexus failure, retry on other
				 * paths might yield different results */
#define DID_ALLOC_FAILURE 0x12  /* Space allocation on the device failed */
#define DID_MEDIUM_ERROR  0x13  /* Medium error */
#define DID_TRANSPORT_MARGINAL 0x14 /* Transport marginal errors */
#define DRIVER_OK       0x00	/* Driver status                           */

/*
 * Internal return values.
+13 −11
Original line number Diff line number Diff line
@@ -190,17 +190,19 @@ struct scsi_varlen_cdb_hdr {
 *  SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft
 *  T10/1561-D Revision 4 Draft dated 7th November 2002.
 */
#define SAM_STAT_GOOD            0x00
#define SAM_STAT_CHECK_CONDITION 0x02
#define SAM_STAT_CONDITION_MET   0x04
#define SAM_STAT_BUSY            0x08
#define SAM_STAT_INTERMEDIATE    0x10
#define SAM_STAT_INTERMEDIATE_CONDITION_MET 0x14
#define SAM_STAT_RESERVATION_CONFLICT 0x18
#define SAM_STAT_COMMAND_TERMINATED 0x22	/* obsolete in SAM-3 */
#define SAM_STAT_TASK_SET_FULL   0x28
#define SAM_STAT_ACA_ACTIVE      0x30
#define SAM_STAT_TASK_ABORTED    0x40
enum sam_status {
	SAM_STAT_GOOD				= 0x00,
	SAM_STAT_CHECK_CONDITION		= 0x02,
	SAM_STAT_CONDITION_MET			= 0x04,
	SAM_STAT_BUSY				= 0x08,
	SAM_STAT_INTERMEDIATE			= 0x10,
	SAM_STAT_INTERMEDIATE_CONDITION_MET	= 0x14,
	SAM_STAT_RESERVATION_CONFLICT		= 0x18,
	SAM_STAT_COMMAND_TERMINATED		= 0x22,	/* obsolete in SAM-3 */
	SAM_STAT_TASK_SET_FULL			= 0x28,
	SAM_STAT_ACA_ACTIVE			= 0x30,
	SAM_STAT_TASK_ABORTED			= 0x40,
};

#define STATUS_MASK         0xfe
/*
+74 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */

#ifndef _SCSI_SCSI_STATUS_H
#define _SCSI_SCSI_STATUS_H

#include <linux/types.h>
#include <scsi/scsi_proto.h>

/* Message codes. */
enum scsi_msg_byte {
	COMMAND_COMPLETE	= 0x00,
	EXTENDED_MESSAGE	= 0x01,
	SAVE_POINTERS		= 0x02,
	RESTORE_POINTERS	= 0x03,
	DISCONNECT		= 0x04,
	INITIATOR_ERROR		= 0x05,
	ABORT_TASK_SET		= 0x06,
	MESSAGE_REJECT		= 0x07,
	NOP			= 0x08,
	MSG_PARITY_ERROR	= 0x09,
	LINKED_CMD_COMPLETE	= 0x0a,
	LINKED_FLG_CMD_COMPLETE	= 0x0b,
	TARGET_RESET		= 0x0c,
	ABORT_TASK		= 0x0d,
	CLEAR_TASK_SET		= 0x0e,
	INITIATE_RECOVERY	= 0x0f,            /* SCSI-II only */
	RELEASE_RECOVERY	= 0x10,            /* SCSI-II only */
	TERMINATE_IO_PROC	= 0x11,            /* SCSI-II only */
	CLEAR_ACA		= 0x16,
	LOGICAL_UNIT_RESET	= 0x17,
	SIMPLE_QUEUE_TAG	= 0x20,
	HEAD_OF_QUEUE_TAG	= 0x21,
	ORDERED_QUEUE_TAG	= 0x22,
	IGNORE_WIDE_RESIDUE	= 0x23,
	ACA			= 0x24,
	QAS_REQUEST		= 0x55,

	/* Old SCSI2 names, don't use in new code */
	BUS_DEVICE_RESET	= TARGET_RESET,
	ABORT			= ABORT_TASK_SET,
};

/* Host byte codes. */
enum scsi_host_status {
	DID_OK		= 0x00,	/* NO error                                */
	DID_NO_CONNECT	= 0x01,	/* Couldn't connect before timeout period  */
	DID_BUS_BUSY	= 0x02,	/* BUS stayed busy through time out period */
	DID_TIME_OUT	= 0x03,	/* TIMED OUT for other reason              */
	DID_BAD_TARGET	= 0x04,	/* BAD target.                             */
	DID_ABORT	= 0x05,	/* Told to abort for some other reason     */
	DID_PARITY	= 0x06,	/* Parity error                            */
	DID_ERROR	= 0x07,	/* Internal error                          */
	DID_RESET	= 0x08,	/* Reset by somebody.                      */
	DID_BAD_INTR	= 0x09,	/* Got an interrupt we weren't expecting.  */
	DID_PASSTHROUGH	= 0x0a,	/* Force command past mid-layer            */
	DID_SOFT_ERROR	= 0x0b,	/* The low level driver just wish a retry  */
	DID_IMM_RETRY	= 0x0c,	/* Retry without decrementing retry count  */
	DID_REQUEUE	= 0x0d,	/* Requeue command (no immediate retry) also
				 * without decrementing the retry count	   */
	DID_TRANSPORT_DISRUPTED = 0x0e, /* Transport error disrupted execution
					 * and the driver blocked the port to
					 * recover the link. Transport class will
					 * retry or fail IO */
	DID_TRANSPORT_FAILFAST = 0x0f, /* Transport class fastfailed the io */
	DID_TARGET_FAILURE = 0x10, /* Permanent target failure, do not retry on
				    * other paths */
	DID_NEXUS_FAILURE = 0x11,  /* Permanent nexus failure, retry on other
				    * paths might yield different results */
	DID_ALLOC_FAILURE = 0x12,  /* Space allocation on the device failed */
	DID_MEDIUM_ERROR = 0x13,  /* Medium error */
	DID_TRANSPORT_MARGINAL = 0x14, /* Transport marginal errors */
};

#endif /* _SCSI_SCSI_STATUS_H */