/*
* Copyright (c) 2025 Jiri Svoboda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** @addtogroup libscsi
* @{
*/
/**
* @file SCSI Block Commands.
*/
#ifndef LIBSCSI_SBC_H_
#define LIBSCSI_SBC_H_
#include <stdint.h>
/** SCSI command codes defined in SCSI-SBC */
enum scsi_cmd_sbc {
SCSI_CMD_READ_6 = 0x08,
SCSI_CMD_READ_10 = 0x28,
SCSI_CMD_READ_12 = 0xa8,
SCSI_CMD_READ_16 = 0x88,
SCSI_CMD_READ_32 = 0x7f,
SCSI_CMD_READ_CAPACITY_10 = 0x25,
SCSI_CMD_READ_CAPACITY_16 = 0x9e,
SCSI_CMD_START_STOP_UNIT = 0x1b,
SCSI_CMD_SYNC_CACHE_10 = 0x35,
SCSI_CMD_SYNC_CACHE_16 = 0x91,
SCSI_CMD_WRITE_6 = 0x0a,
SCSI_CMD_WRITE_10 = 0x2a,
SCSI_CMD_WRITE_12 = 0xaa,
SCSI_CMD_WRITE_16 = 0x8a
};
/** SCSI Read (10) command */
typedef struct {
/** Operation code (SCSI_CMD_READ_10) */
uint8_t op_code;
/** RdProtect, DPO, FUA, Reserved, FUA_NV, Obsolete */
uint8_t flags;
/** Logical block address */
uint32_t lba;
/** Reserved, Group Number */
uint8_t group_no;
/** Transfer length */
uint16_t xfer_len;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_read_10_t;
/** SCSI Read (12) command */
typedef struct {
/** Operation code (SCSI_CMD_READ_12) */
uint8_t op_code;
/** RdProtect, DPO, FUA, Reserved, FUA_NV, Obsolete */
uint8_t flags;
/** Logical block address */
uint32_t lba;
/** Transfer length */
uint32_t xfer_len;
/** Reserved, Group Number */
uint8_t group_no;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_read_12_t;
/** SCSI Read (16) command */
typedef struct {
/** Operation code (SCSI_CMD_READ_16) */
uint8_t op_code;
/** RdProtect, DPO, FUA, Reserved, FUA_NV, Reserved */
uint8_t flags;
/** Logical block address */
uint64_t lba;
/** Transfer length */
uint32_t xfer_len;
/** Reserved, Group Number */
uint8_t group_no;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_read_16_t;
/** SCSI Read Capacity (10) command */
typedef struct {
/** Operation code (SCSI_CMD_READ_CAPACITY_10) */
uint8_t op_code;
/** Reserved, Obsolete */
uint8_t reserved_1;
/** Logical block address */
uint32_t lba;
/** Reserved */
uint32_t reserved_6;
/** Reserved, PM */
uint8_t pm;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_read_capacity_10_t;
/** Read Capacity (10) parameter data.
*
* Returned for Read Capacity (10) command.
*/
typedef struct {
/** Logical address of last block */
uint32_t last_lba;
/** Size of block in bytes */
uint32_t block_size;
} scsi_read_capacity_10_data_t;
/** SCSI Synchronize Cache (10) command */
typedef struct {
/** Operation code (SCSI_CMD_SYNC_CACHE_10) */
uint8_t op_code;
/** Reserved, Sync_NV, Immed, Reserved */
uint8_t flags;
/** Logical block address */
uint32_t lba;
/** Reserved, Group Number */
uint8_t group_no;
/** Number of Logical Blocks */
uint16_t numlb;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_sync_cache_10_t;
/** SCSI Synchronize Cache (16) command */
typedef struct {
/** Operation code (SCSI_CMD_SYNC_CACHE_16) */
uint8_t op_code;
/** Reserved, Sync_NV, Immed, Reserved */
uint8_t flags;
/** Logical block address */
uint64_t lba;
/** Number of Logical Blocks */
uint32_t numlb;
/** Reserved, Group Number */
uint8_t group_no;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_sync_cache_16_t;
/** SCSI Write (10) command */
typedef struct {
/** Operation code (SCSI_CMD_WRITE_10) */
uint8_t op_code;
/** WrProtect, DPO, FUA, Reserved, FUA_NV, Obsolete */
uint8_t flags;
/** Logical block address */
uint32_t lba;
/** Reserved, Group Number */
uint8_t group_no;
/** Transfer length */
uint16_t xfer_len;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_write_10_t;
/** SCSI Write (12) command */
typedef struct {
/** Operation code (SCSI_CMD_WRITE_12) */
uint8_t op_code;
/** WrProtect, DPO, FUA, Reserved, FUA_NV, Obsolete */
uint8_t flags;
/** Logical block address */
uint32_t lba;
/** Transfer length */
uint32_t xfer_len;
/** Reserved, Group Number */
uint8_t group_no;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_write_12_t;
/** SCSI Write (16) command */
typedef struct {
/** Operation code (SCSI_CMD_WRITE_16) */
uint8_t op_code;
/** WrProtect, DPO, FUA, Reserved, FUA_NV, Reserved */
uint8_t flags;
/** Logical block address */
uint64_t lba;
/** Transfer length */
uint32_t xfer_len;
/** Reserved, Group Number */
uint8_t group_no;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_write_16_t;
/** SCSI Start Stop Unit command */
typedef struct {
/** Operation code (SCSI_CMD_START_STOP_UNIT) */
uint8_t op_code;
/** Immediate */
uint8_t immed;
/** Reserved */
uint8_t reserved_2;
/** Reserved */
uint8_t reserved_3;
/** Power Conditions | Reserved | LoEj | Start */
uint8_t flags;
/** Control */
uint8_t control;
} __attribute__((packed)) scsi_cdb_start_stop_unit_t;
/** Constants for values in sccsi_cdb_start_stop_unit_t.flags */
enum scsi_start_stop_flags {
ssf_pc_no_change = 0x00,
ssf_pc_idle = 0x10,
ssf_pc_standby = 0x20,
ssf_pc_sleep = 0x50,
ssf_loej = 0x02,
ssf_start = 0x01
};
#endif
/** @}
*/