Skip to content

Commit

Permalink
scsi: core: Introduce enums for the SAM and host status codes
Browse files Browse the repository at this point in the history
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: John Garry <john.garry@huawei.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Bart Van Assche authored and Martin K. Petersen committed Jun 3, 2021
1 parent d377f41 commit 149d0e4
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 78 deletions.
2 changes: 1 addition & 1 deletion drivers/scsi/constants.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
2 changes: 1 addition & 1 deletion drivers/target/target_core_pscsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:"
Expand Down
67 changes: 2 additions & 65 deletions include/scsi/scsi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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.
Expand Down
24 changes: 13 additions & 11 deletions include/scsi/scsi_proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
/*
Expand Down
74 changes: 74 additions & 0 deletions include/scsi/scsi_status.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/* 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 */

0 comments on commit 149d0e4

Please sign in to comment.