1106d81f5SMichael S. Tsirkin /* 2106d81f5SMichael S. Tsirkin * This header is BSD licensed so anyone can use the definitions to implement 3106d81f5SMichael S. Tsirkin * compatible drivers/servers. 4106d81f5SMichael S. Tsirkin * 5106d81f5SMichael S. Tsirkin * Redistribution and use in source and binary forms, with or without 6106d81f5SMichael S. Tsirkin * modification, are permitted provided that the following conditions 7106d81f5SMichael S. Tsirkin * are met: 8106d81f5SMichael S. Tsirkin * 1. Redistributions of source code must retain the above copyright 9106d81f5SMichael S. Tsirkin * notice, this list of conditions and the following disclaimer. 10106d81f5SMichael S. Tsirkin * 2. Redistributions in binary form must reproduce the above copyright 11106d81f5SMichael S. Tsirkin * notice, this list of conditions and the following disclaimer in the 12106d81f5SMichael S. Tsirkin * documentation and/or other materials provided with the distribution. 13106d81f5SMichael S. Tsirkin * 14106d81f5SMichael S. Tsirkin * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15106d81f5SMichael S. Tsirkin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16106d81f5SMichael S. Tsirkin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17106d81f5SMichael S. Tsirkin * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 18106d81f5SMichael S. Tsirkin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19106d81f5SMichael S. Tsirkin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20106d81f5SMichael S. Tsirkin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21106d81f5SMichael S. Tsirkin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22106d81f5SMichael S. Tsirkin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23106d81f5SMichael S. Tsirkin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24106d81f5SMichael S. Tsirkin * SUCH DAMAGE. 25106d81f5SMichael S. Tsirkin */ 26106d81f5SMichael S. Tsirkin 27106d81f5SMichael S. Tsirkin #ifndef _LINUX_VIRTIO_SCSI_H 28106d81f5SMichael S. Tsirkin #define _LINUX_VIRTIO_SCSI_H 29106d81f5SMichael S. Tsirkin 30106d81f5SMichael S. Tsirkin #include <linux/virtio_types.h> 31106d81f5SMichael S. Tsirkin 32a4994b81SMichael S. Tsirkin /* Default values of the CDB and sense data size configuration fields */ 33a4994b81SMichael S. Tsirkin #define VIRTIO_SCSI_CDB_DEFAULT_SIZE 32 34a4994b81SMichael S. Tsirkin #define VIRTIO_SCSI_SENSE_DEFAULT_SIZE 96 35a4994b81SMichael S. Tsirkin 36a4994b81SMichael S. Tsirkin #ifndef VIRTIO_SCSI_CDB_SIZE 37a4994b81SMichael S. Tsirkin #define VIRTIO_SCSI_CDB_SIZE VIRTIO_SCSI_CDB_DEFAULT_SIZE 38a4994b81SMichael S. Tsirkin #endif 39a4994b81SMichael S. Tsirkin #ifndef VIRTIO_SCSI_SENSE_SIZE 40a4994b81SMichael S. Tsirkin #define VIRTIO_SCSI_SENSE_SIZE VIRTIO_SCSI_SENSE_DEFAULT_SIZE 41a4994b81SMichael S. Tsirkin #endif 42106d81f5SMichael S. Tsirkin 43106d81f5SMichael S. Tsirkin /* SCSI command request, followed by data-out */ 44106d81f5SMichael S. Tsirkin struct virtio_scsi_cmd_req { 45fba7f020SMichael S. Tsirkin __u8 lun[8]; /* Logical Unit Number */ 46106d81f5SMichael S. Tsirkin __virtio64 tag; /* Command identifier */ 47fba7f020SMichael S. Tsirkin __u8 task_attr; /* Task attribute */ 48fba7f020SMichael S. Tsirkin __u8 prio; /* SAM command priority field */ 49fba7f020SMichael S. Tsirkin __u8 crn; 50fba7f020SMichael S. Tsirkin __u8 cdb[VIRTIO_SCSI_CDB_SIZE]; 51fba7f020SMichael S. Tsirkin } __attribute__((packed)); 52106d81f5SMichael S. Tsirkin 53106d81f5SMichael S. Tsirkin /* SCSI command request, followed by protection information */ 54106d81f5SMichael S. Tsirkin struct virtio_scsi_cmd_req_pi { 55fba7f020SMichael S. Tsirkin __u8 lun[8]; /* Logical Unit Number */ 56106d81f5SMichael S. Tsirkin __virtio64 tag; /* Command identifier */ 57fba7f020SMichael S. Tsirkin __u8 task_attr; /* Task attribute */ 58fba7f020SMichael S. Tsirkin __u8 prio; /* SAM command priority field */ 59fba7f020SMichael S. Tsirkin __u8 crn; 60106d81f5SMichael S. Tsirkin __virtio32 pi_bytesout; /* DataOUT PI Number of bytes */ 61106d81f5SMichael S. Tsirkin __virtio32 pi_bytesin; /* DataIN PI Number of bytes */ 62fba7f020SMichael S. Tsirkin __u8 cdb[VIRTIO_SCSI_CDB_SIZE]; 63fba7f020SMichael S. Tsirkin } __attribute__((packed)); 64106d81f5SMichael S. Tsirkin 65106d81f5SMichael S. Tsirkin /* Response, followed by sense data and data-in */ 66106d81f5SMichael S. Tsirkin struct virtio_scsi_cmd_resp { 67106d81f5SMichael S. Tsirkin __virtio32 sense_len; /* Sense data length */ 68106d81f5SMichael S. Tsirkin __virtio32 resid; /* Residual bytes in data buffer */ 69106d81f5SMichael S. Tsirkin __virtio16 status_qualifier; /* Status qualifier */ 70fba7f020SMichael S. Tsirkin __u8 status; /* Command completion status */ 71fba7f020SMichael S. Tsirkin __u8 response; /* Response values */ 72fba7f020SMichael S. Tsirkin __u8 sense[VIRTIO_SCSI_SENSE_SIZE]; 73fba7f020SMichael S. Tsirkin } __attribute__((packed)); 74106d81f5SMichael S. Tsirkin 75106d81f5SMichael S. Tsirkin /* Task Management Request */ 76106d81f5SMichael S. Tsirkin struct virtio_scsi_ctrl_tmf_req { 77106d81f5SMichael S. Tsirkin __virtio32 type; 78106d81f5SMichael S. Tsirkin __virtio32 subtype; 79fba7f020SMichael S. Tsirkin __u8 lun[8]; 80106d81f5SMichael S. Tsirkin __virtio64 tag; 81fba7f020SMichael S. Tsirkin } __attribute__((packed)); 82106d81f5SMichael S. Tsirkin 83106d81f5SMichael S. Tsirkin struct virtio_scsi_ctrl_tmf_resp { 84fba7f020SMichael S. Tsirkin __u8 response; 85fba7f020SMichael S. Tsirkin } __attribute__((packed)); 86106d81f5SMichael S. Tsirkin 87106d81f5SMichael S. Tsirkin /* Asynchronous notification query/subscription */ 88106d81f5SMichael S. Tsirkin struct virtio_scsi_ctrl_an_req { 89106d81f5SMichael S. Tsirkin __virtio32 type; 90fba7f020SMichael S. Tsirkin __u8 lun[8]; 91106d81f5SMichael S. Tsirkin __virtio32 event_requested; 92fba7f020SMichael S. Tsirkin } __attribute__((packed)); 93106d81f5SMichael S. Tsirkin 94106d81f5SMichael S. Tsirkin struct virtio_scsi_ctrl_an_resp { 95106d81f5SMichael S. Tsirkin __virtio32 event_actual; 96fba7f020SMichael S. Tsirkin __u8 response; 97fba7f020SMichael S. Tsirkin } __attribute__((packed)); 98106d81f5SMichael S. Tsirkin 99106d81f5SMichael S. Tsirkin struct virtio_scsi_event { 100106d81f5SMichael S. Tsirkin __virtio32 event; 101fba7f020SMichael S. Tsirkin __u8 lun[8]; 102106d81f5SMichael S. Tsirkin __virtio32 reason; 103fba7f020SMichael S. Tsirkin } __attribute__((packed)); 104106d81f5SMichael S. Tsirkin 105106d81f5SMichael S. Tsirkin struct virtio_scsi_config { 106*965b5350SMichael S. Tsirkin __virtio32 num_queues; 107*965b5350SMichael S. Tsirkin __virtio32 seg_max; 108*965b5350SMichael S. Tsirkin __virtio32 max_sectors; 109*965b5350SMichael S. Tsirkin __virtio32 cmd_per_lun; 110*965b5350SMichael S. Tsirkin __virtio32 event_info_size; 111*965b5350SMichael S. Tsirkin __virtio32 sense_size; 112*965b5350SMichael S. Tsirkin __virtio32 cdb_size; 113*965b5350SMichael S. Tsirkin __virtio16 max_channel; 114*965b5350SMichael S. Tsirkin __virtio16 max_target; 115*965b5350SMichael S. Tsirkin __virtio32 max_lun; 116fba7f020SMichael S. Tsirkin } __attribute__((packed)); 117106d81f5SMichael S. Tsirkin 118106d81f5SMichael S. Tsirkin /* Feature Bits */ 119106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_F_INOUT 0 120106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_F_HOTPLUG 1 121106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_F_CHANGE 2 122106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_F_T10_PI 3 123106d81f5SMichael S. Tsirkin 124106d81f5SMichael S. Tsirkin /* Response codes */ 125106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_OK 0 126106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_OVERRUN 1 127106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_ABORTED 2 128106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_BAD_TARGET 3 129106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_RESET 4 130106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_BUSY 5 131106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_TRANSPORT_FAILURE 6 132106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_TARGET_FAILURE 7 133106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_NEXUS_FAILURE 8 134106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_FAILURE 9 135106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED 10 136106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_FUNCTION_REJECTED 11 137106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_INCORRECT_LUN 12 138106d81f5SMichael S. Tsirkin 139106d81f5SMichael S. Tsirkin /* Controlq type codes. */ 140106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF 0 141106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_AN_QUERY 1 142106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_AN_SUBSCRIBE 2 143106d81f5SMichael S. Tsirkin 144106d81f5SMichael S. Tsirkin /* Valid TMF subtypes. */ 145106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_ABORT_TASK 0 146106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET 1 147106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_CLEAR_ACA 2 148106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET 3 149106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET 4 150106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET 5 151106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_QUERY_TASK 6 152106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET 7 153106d81f5SMichael S. Tsirkin 154106d81f5SMichael S. Tsirkin /* Events. */ 155106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_EVENTS_MISSED 0x80000000 156106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_NO_EVENT 0 157106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_TRANSPORT_RESET 1 158106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_ASYNC_NOTIFY 2 159106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_T_PARAM_CHANGE 3 160106d81f5SMichael S. Tsirkin 161106d81f5SMichael S. Tsirkin /* Reasons of transport reset event */ 162106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_EVT_RESET_HARD 0 163106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_EVT_RESET_RESCAN 1 164106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_EVT_RESET_REMOVED 2 165106d81f5SMichael S. Tsirkin 166106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_SIMPLE 0 167106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_ORDERED 1 168106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_HEAD 2 169106d81f5SMichael S. Tsirkin #define VIRTIO_SCSI_S_ACA 3 170106d81f5SMichael S. Tsirkin 171106d81f5SMichael S. Tsirkin 172106d81f5SMichael S. Tsirkin #endif /* _LINUX_VIRTIO_SCSI_H */ 173