1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * This header is BSD licensed so anyone can use the definitions to implement 3*4882a593Smuzhiyun * compatible drivers/servers. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 6*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 7*4882a593Smuzhiyun * are met: 8*4882a593Smuzhiyun * 1. Redistributions of source code must retain the above copyright 9*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer. 10*4882a593Smuzhiyun * 2. Redistributions in binary form must reproduce the above copyright 11*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in the 12*4882a593Smuzhiyun * documentation and/or other materials provided with the distribution. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*4882a593Smuzhiyun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*4882a593Smuzhiyun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*4882a593Smuzhiyun * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 18*4882a593Smuzhiyun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*4882a593Smuzhiyun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*4882a593Smuzhiyun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*4882a593Smuzhiyun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*4882a593Smuzhiyun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*4882a593Smuzhiyun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*4882a593Smuzhiyun * SUCH DAMAGE. 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #ifndef _LINUX_VIRTIO_SCSI_H 28*4882a593Smuzhiyun #define _LINUX_VIRTIO_SCSI_H 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #include <linux/virtio_types.h> 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* Default values of the CDB and sense data size configuration fields */ 33*4882a593Smuzhiyun #define VIRTIO_SCSI_CDB_DEFAULT_SIZE 32 34*4882a593Smuzhiyun #define VIRTIO_SCSI_SENSE_DEFAULT_SIZE 96 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #ifndef VIRTIO_SCSI_CDB_SIZE 37*4882a593Smuzhiyun #define VIRTIO_SCSI_CDB_SIZE VIRTIO_SCSI_CDB_DEFAULT_SIZE 38*4882a593Smuzhiyun #endif 39*4882a593Smuzhiyun #ifndef VIRTIO_SCSI_SENSE_SIZE 40*4882a593Smuzhiyun #define VIRTIO_SCSI_SENSE_SIZE VIRTIO_SCSI_SENSE_DEFAULT_SIZE 41*4882a593Smuzhiyun #endif 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* SCSI command request, followed by data-out */ 44*4882a593Smuzhiyun struct virtio_scsi_cmd_req { 45*4882a593Smuzhiyun __u8 lun[8]; /* Logical Unit Number */ 46*4882a593Smuzhiyun __virtio64 tag; /* Command identifier */ 47*4882a593Smuzhiyun __u8 task_attr; /* Task attribute */ 48*4882a593Smuzhiyun __u8 prio; /* SAM command priority field */ 49*4882a593Smuzhiyun __u8 crn; 50*4882a593Smuzhiyun __u8 cdb[VIRTIO_SCSI_CDB_SIZE]; 51*4882a593Smuzhiyun } __attribute__((packed)); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* SCSI command request, followed by protection information */ 54*4882a593Smuzhiyun struct virtio_scsi_cmd_req_pi { 55*4882a593Smuzhiyun __u8 lun[8]; /* Logical Unit Number */ 56*4882a593Smuzhiyun __virtio64 tag; /* Command identifier */ 57*4882a593Smuzhiyun __u8 task_attr; /* Task attribute */ 58*4882a593Smuzhiyun __u8 prio; /* SAM command priority field */ 59*4882a593Smuzhiyun __u8 crn; 60*4882a593Smuzhiyun __virtio32 pi_bytesout; /* DataOUT PI Number of bytes */ 61*4882a593Smuzhiyun __virtio32 pi_bytesin; /* DataIN PI Number of bytes */ 62*4882a593Smuzhiyun __u8 cdb[VIRTIO_SCSI_CDB_SIZE]; 63*4882a593Smuzhiyun } __attribute__((packed)); 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* Response, followed by sense data and data-in */ 66*4882a593Smuzhiyun struct virtio_scsi_cmd_resp { 67*4882a593Smuzhiyun __virtio32 sense_len; /* Sense data length */ 68*4882a593Smuzhiyun __virtio32 resid; /* Residual bytes in data buffer */ 69*4882a593Smuzhiyun __virtio16 status_qualifier; /* Status qualifier */ 70*4882a593Smuzhiyun __u8 status; /* Command completion status */ 71*4882a593Smuzhiyun __u8 response; /* Response values */ 72*4882a593Smuzhiyun __u8 sense[VIRTIO_SCSI_SENSE_SIZE]; 73*4882a593Smuzhiyun } __attribute__((packed)); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* Task Management Request */ 76*4882a593Smuzhiyun struct virtio_scsi_ctrl_tmf_req { 77*4882a593Smuzhiyun __virtio32 type; 78*4882a593Smuzhiyun __virtio32 subtype; 79*4882a593Smuzhiyun __u8 lun[8]; 80*4882a593Smuzhiyun __virtio64 tag; 81*4882a593Smuzhiyun } __attribute__((packed)); 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun struct virtio_scsi_ctrl_tmf_resp { 84*4882a593Smuzhiyun __u8 response; 85*4882a593Smuzhiyun } __attribute__((packed)); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* Asynchronous notification query/subscription */ 88*4882a593Smuzhiyun struct virtio_scsi_ctrl_an_req { 89*4882a593Smuzhiyun __virtio32 type; 90*4882a593Smuzhiyun __u8 lun[8]; 91*4882a593Smuzhiyun __virtio32 event_requested; 92*4882a593Smuzhiyun } __attribute__((packed)); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct virtio_scsi_ctrl_an_resp { 95*4882a593Smuzhiyun __virtio32 event_actual; 96*4882a593Smuzhiyun __u8 response; 97*4882a593Smuzhiyun } __attribute__((packed)); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun struct virtio_scsi_event { 100*4882a593Smuzhiyun __virtio32 event; 101*4882a593Smuzhiyun __u8 lun[8]; 102*4882a593Smuzhiyun __virtio32 reason; 103*4882a593Smuzhiyun } __attribute__((packed)); 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun struct virtio_scsi_config { 106*4882a593Smuzhiyun __virtio32 num_queues; 107*4882a593Smuzhiyun __virtio32 seg_max; 108*4882a593Smuzhiyun __virtio32 max_sectors; 109*4882a593Smuzhiyun __virtio32 cmd_per_lun; 110*4882a593Smuzhiyun __virtio32 event_info_size; 111*4882a593Smuzhiyun __virtio32 sense_size; 112*4882a593Smuzhiyun __virtio32 cdb_size; 113*4882a593Smuzhiyun __virtio16 max_channel; 114*4882a593Smuzhiyun __virtio16 max_target; 115*4882a593Smuzhiyun __virtio32 max_lun; 116*4882a593Smuzhiyun } __attribute__((packed)); 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* Feature Bits */ 119*4882a593Smuzhiyun #define VIRTIO_SCSI_F_INOUT 0 120*4882a593Smuzhiyun #define VIRTIO_SCSI_F_HOTPLUG 1 121*4882a593Smuzhiyun #define VIRTIO_SCSI_F_CHANGE 2 122*4882a593Smuzhiyun #define VIRTIO_SCSI_F_T10_PI 3 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /* Response codes */ 125*4882a593Smuzhiyun #define VIRTIO_SCSI_S_OK 0 126*4882a593Smuzhiyun #define VIRTIO_SCSI_S_OVERRUN 1 127*4882a593Smuzhiyun #define VIRTIO_SCSI_S_ABORTED 2 128*4882a593Smuzhiyun #define VIRTIO_SCSI_S_BAD_TARGET 3 129*4882a593Smuzhiyun #define VIRTIO_SCSI_S_RESET 4 130*4882a593Smuzhiyun #define VIRTIO_SCSI_S_BUSY 5 131*4882a593Smuzhiyun #define VIRTIO_SCSI_S_TRANSPORT_FAILURE 6 132*4882a593Smuzhiyun #define VIRTIO_SCSI_S_TARGET_FAILURE 7 133*4882a593Smuzhiyun #define VIRTIO_SCSI_S_NEXUS_FAILURE 8 134*4882a593Smuzhiyun #define VIRTIO_SCSI_S_FAILURE 9 135*4882a593Smuzhiyun #define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED 10 136*4882a593Smuzhiyun #define VIRTIO_SCSI_S_FUNCTION_REJECTED 11 137*4882a593Smuzhiyun #define VIRTIO_SCSI_S_INCORRECT_LUN 12 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* Controlq type codes. */ 140*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TMF 0 141*4882a593Smuzhiyun #define VIRTIO_SCSI_T_AN_QUERY 1 142*4882a593Smuzhiyun #define VIRTIO_SCSI_T_AN_SUBSCRIBE 2 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun /* Valid TMF subtypes. */ 145*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TMF_ABORT_TASK 0 146*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET 1 147*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TMF_CLEAR_ACA 2 148*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET 3 149*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET 4 150*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET 5 151*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TMF_QUERY_TASK 6 152*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET 7 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun /* Events. */ 155*4882a593Smuzhiyun #define VIRTIO_SCSI_T_EVENTS_MISSED 0x80000000 156*4882a593Smuzhiyun #define VIRTIO_SCSI_T_NO_EVENT 0 157*4882a593Smuzhiyun #define VIRTIO_SCSI_T_TRANSPORT_RESET 1 158*4882a593Smuzhiyun #define VIRTIO_SCSI_T_ASYNC_NOTIFY 2 159*4882a593Smuzhiyun #define VIRTIO_SCSI_T_PARAM_CHANGE 3 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* Reasons of transport reset event */ 162*4882a593Smuzhiyun #define VIRTIO_SCSI_EVT_RESET_HARD 0 163*4882a593Smuzhiyun #define VIRTIO_SCSI_EVT_RESET_RESCAN 1 164*4882a593Smuzhiyun #define VIRTIO_SCSI_EVT_RESET_REMOVED 2 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun #define VIRTIO_SCSI_S_SIMPLE 0 167*4882a593Smuzhiyun #define VIRTIO_SCSI_S_ORDERED 1 168*4882a593Smuzhiyun #define VIRTIO_SCSI_S_HEAD 2 169*4882a593Smuzhiyun #define VIRTIO_SCSI_S_ACA 3 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #endif /* _LINUX_VIRTIO_SCSI_H */ 173