#ifndef _VIRTIO_SCSI_H
#define _VIRTIO_SCSI_H
#define VIRTIO_SCSI_F_INOUT 0x0001
#define VIRTIO_SCSI_F_HOTPLUG 0x0002
#define VIRTIO_SCSI_F_CHANGE 0x0004
#define VIRTIO_SCSI_CDB_SIZE 32
#define VIRTIO_SCSI_SENSE_SIZE 96
struct virtio_scsi_cmd_req {
uint8_t lun[8];
uint64_t tag;
uint8_t task_attr;
uint8_t prio;
uint8_t crn;
uint8_t cdb[VIRTIO_SCSI_CDB_SIZE];
} _PACKED;
struct virtio_scsi_cmd_resp {
uint32_t sense_len;
uint32_t resid;
uint16_t status_qualifier;
uint8_t status;
uint8_t response;
uint8_t sense[VIRTIO_SCSI_SENSE_SIZE];
} _PACKED;
struct virtio_scsi_ctrl_tmf_req {
uint32_t type;
uint32_t subtype;
uint8_t lun[8];
uint64_t tag;
} _PACKED;
struct virtio_scsi_ctrl_tmf_resp {
uint8_t response;
} _PACKED;
struct virtio_scsi_ctrl_an_req {
uint32_t type;
uint8_t lun[8];
uint32_t event_requested;
} _PACKED;
struct virtio_scsi_ctrl_an_resp {
uint32_t event_actual;
uint8_t response;
} _PACKED;
struct virtio_scsi_event {
uint32_t event;
uint8_t lun[8];
uint32_t reason;
} _PACKED;
struct virtio_scsi_config {
uint32_t num_queues;
uint32_t seg_max;
uint32_t max_sectors;
uint32_t cmd_per_lun;
uint32_t event_info_size;
uint32_t sense_size;
uint32_t cdb_size;
uint16_t max_channel;
uint16_t max_target;
uint32_t max_lun;
} _PACKED;
#define VIRTIO_SCSI_S_OK 0
#define VIRTIO_SCSI_S_FUNCTION_COMPLETE 0
#define VIRTIO_SCSI_S_OVERRUN 1
#define VIRTIO_SCSI_S_ABORTED 2
#define VIRTIO_SCSI_S_BAD_TARGET 3
#define VIRTIO_SCSI_S_RESET 4
#define VIRTIO_SCSI_S_BUSY 5
#define VIRTIO_SCSI_S_TRANSPORT_FAILURE 6
#define VIRTIO_SCSI_S_TARGET_FAILURE 7
#define VIRTIO_SCSI_S_NEXUS_FAILURE 8
#define VIRTIO_SCSI_S_FAILURE 9
#define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED 10
#define VIRTIO_SCSI_S_FUNCTION_REJECTED 11
#define VIRTIO_SCSI_S_INCORRECT_LUN 12
#define VIRTIO_SCSI_T_TMF 0
#define VIRTIO_SCSI_T_AN_QUERY 1
#define VIRTIO_SCSI_T_AN_SUBSCRIBE 2
#define VIRTIO_SCSI_T_TMF_ABORT_TASK 0
#define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET 1
#define VIRTIO_SCSI_T_TMF_CLEAR_ACA 2
#define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET 3
#define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET 4
#define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET 5
#define VIRTIO_SCSI_T_TMF_QUERY_TASK 6
#define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET 7
#define VIRTIO_SCSI_T_EVENTS_MISSED 0x80000000
#define VIRTIO_SCSI_T_NO_EVENT 0
#define VIRTIO_SCSI_T_TRANSPORT_RESET 1
#define VIRTIO_SCSI_T_ASYNC_NOTIFY 2
#define VIRTIO_SCSI_T_PARAM_CHANGE 3
#define VIRTIO_SCSI_EVT_RESET_HARD 0
#define VIRTIO_SCSI_EVT_RESET_RESCAN 1
#define VIRTIO_SCSI_EVT_RESET_REMOVED 2
#define VIRTIO_SCSI_S_SIMPLE 0
#define VIRTIO_SCSI_S_ORDERED 1
#define VIRTIO_SCSI_S_HEAD 2
#define VIRTIO_SCSI_S_ACA 3
#endif