Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * This header is BSD licensed so anyone can use the definitions to implement
0003  * compatible drivers/servers.
0004  *
0005  * Redistribution and use in source and binary forms, with or without
0006  * modification, are permitted provided that the following conditions
0007  * are met:
0008  * 1. Redistributions of source code must retain the above copyright
0009  *    notice, this list of conditions and the following disclaimer.
0010  * 2. Redistributions in binary form must reproduce the above copyright
0011  *    notice, this list of conditions and the following disclaimer in the
0012  *    documentation and/or other materials provided with the distribution.
0013  *
0014  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
0015  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0016  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0017  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
0018  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
0019  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
0020  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
0021  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
0022  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
0023  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
0024  * SUCH DAMAGE.
0025  */
0026 
0027 #ifndef _LINUX_VIRTIO_SCSI_H
0028 #define _LINUX_VIRTIO_SCSI_H
0029 
0030 #include <linux/virtio_types.h>
0031 
0032 /* Default values of the CDB and sense data size configuration fields */
0033 #define VIRTIO_SCSI_CDB_DEFAULT_SIZE   32
0034 #define VIRTIO_SCSI_SENSE_DEFAULT_SIZE 96
0035 
0036 #ifndef VIRTIO_SCSI_CDB_SIZE
0037 #define VIRTIO_SCSI_CDB_SIZE VIRTIO_SCSI_CDB_DEFAULT_SIZE
0038 #endif
0039 #ifndef VIRTIO_SCSI_SENSE_SIZE
0040 #define VIRTIO_SCSI_SENSE_SIZE VIRTIO_SCSI_SENSE_DEFAULT_SIZE
0041 #endif
0042 
0043 /* SCSI command request, followed by data-out */
0044 struct virtio_scsi_cmd_req {
0045     __u8 lun[8];        /* Logical Unit Number */
0046     __virtio64 tag;     /* Command identifier */
0047     __u8 task_attr;     /* Task attribute */
0048     __u8 prio;      /* SAM command priority field */
0049     __u8 crn;
0050     __u8 cdb[VIRTIO_SCSI_CDB_SIZE];
0051 } __attribute__((packed));
0052 
0053 /* SCSI command request, followed by protection information */
0054 struct virtio_scsi_cmd_req_pi {
0055     __u8 lun[8];        /* Logical Unit Number */
0056     __virtio64 tag;     /* Command identifier */
0057     __u8 task_attr;     /* Task attribute */
0058     __u8 prio;      /* SAM command priority field */
0059     __u8 crn;
0060     __virtio32 pi_bytesout; /* DataOUT PI Number of bytes */
0061     __virtio32 pi_bytesin;      /* DataIN PI Number of bytes */
0062     __u8 cdb[VIRTIO_SCSI_CDB_SIZE];
0063 } __attribute__((packed));
0064 
0065 /* Response, followed by sense data and data-in */
0066 struct virtio_scsi_cmd_resp {
0067     __virtio32 sense_len;       /* Sense data length */
0068     __virtio32 resid;       /* Residual bytes in data buffer */
0069     __virtio16 status_qualifier;    /* Status qualifier */
0070     __u8 status;        /* Command completion status */
0071     __u8 response;      /* Response values */
0072     __u8 sense[VIRTIO_SCSI_SENSE_SIZE];
0073 } __attribute__((packed));
0074 
0075 /* Task Management Request */
0076 struct virtio_scsi_ctrl_tmf_req {
0077     __virtio32 type;
0078     __virtio32 subtype;
0079     __u8 lun[8];
0080     __virtio64 tag;
0081 } __attribute__((packed));
0082 
0083 struct virtio_scsi_ctrl_tmf_resp {
0084     __u8 response;
0085 } __attribute__((packed));
0086 
0087 /* Asynchronous notification query/subscription */
0088 struct virtio_scsi_ctrl_an_req {
0089     __virtio32 type;
0090     __u8 lun[8];
0091     __virtio32 event_requested;
0092 } __attribute__((packed));
0093 
0094 struct virtio_scsi_ctrl_an_resp {
0095     __virtio32 event_actual;
0096     __u8 response;
0097 } __attribute__((packed));
0098 
0099 struct virtio_scsi_event {
0100     __virtio32 event;
0101     __u8 lun[8];
0102     __virtio32 reason;
0103 } __attribute__((packed));
0104 
0105 struct virtio_scsi_config {
0106     __virtio32 num_queues;
0107     __virtio32 seg_max;
0108     __virtio32 max_sectors;
0109     __virtio32 cmd_per_lun;
0110     __virtio32 event_info_size;
0111     __virtio32 sense_size;
0112     __virtio32 cdb_size;
0113     __virtio16 max_channel;
0114     __virtio16 max_target;
0115     __virtio32 max_lun;
0116 } __attribute__((packed));
0117 
0118 /* Feature Bits */
0119 #define VIRTIO_SCSI_F_INOUT                    0
0120 #define VIRTIO_SCSI_F_HOTPLUG                  1
0121 #define VIRTIO_SCSI_F_CHANGE                   2
0122 #define VIRTIO_SCSI_F_T10_PI                   3
0123 
0124 /* Response codes */
0125 #define VIRTIO_SCSI_S_OK                       0
0126 #define VIRTIO_SCSI_S_OVERRUN                  1
0127 #define VIRTIO_SCSI_S_ABORTED                  2
0128 #define VIRTIO_SCSI_S_BAD_TARGET               3
0129 #define VIRTIO_SCSI_S_RESET                    4
0130 #define VIRTIO_SCSI_S_BUSY                     5
0131 #define VIRTIO_SCSI_S_TRANSPORT_FAILURE        6
0132 #define VIRTIO_SCSI_S_TARGET_FAILURE           7
0133 #define VIRTIO_SCSI_S_NEXUS_FAILURE            8
0134 #define VIRTIO_SCSI_S_FAILURE                  9
0135 #define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED       10
0136 #define VIRTIO_SCSI_S_FUNCTION_REJECTED        11
0137 #define VIRTIO_SCSI_S_INCORRECT_LUN            12
0138 
0139 /* Controlq type codes.  */
0140 #define VIRTIO_SCSI_T_TMF                      0
0141 #define VIRTIO_SCSI_T_AN_QUERY                 1
0142 #define VIRTIO_SCSI_T_AN_SUBSCRIBE             2
0143 
0144 /* Valid TMF subtypes.  */
0145 #define VIRTIO_SCSI_T_TMF_ABORT_TASK           0
0146 #define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET       1
0147 #define VIRTIO_SCSI_T_TMF_CLEAR_ACA            2
0148 #define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET       3
0149 #define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET      4
0150 #define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET   5
0151 #define VIRTIO_SCSI_T_TMF_QUERY_TASK           6
0152 #define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET       7
0153 
0154 /* Events.  */
0155 #define VIRTIO_SCSI_T_EVENTS_MISSED            0x80000000
0156 #define VIRTIO_SCSI_T_NO_EVENT                 0
0157 #define VIRTIO_SCSI_T_TRANSPORT_RESET          1
0158 #define VIRTIO_SCSI_T_ASYNC_NOTIFY             2
0159 #define VIRTIO_SCSI_T_PARAM_CHANGE             3
0160 
0161 /* Reasons of transport reset event */
0162 #define VIRTIO_SCSI_EVT_RESET_HARD             0
0163 #define VIRTIO_SCSI_EVT_RESET_RESCAN           1
0164 #define VIRTIO_SCSI_EVT_RESET_REMOVED          2
0165 
0166 #define VIRTIO_SCSI_S_SIMPLE                   0
0167 #define VIRTIO_SCSI_S_ORDERED                  1
0168 #define VIRTIO_SCSI_S_HEAD                     2
0169 #define VIRTIO_SCSI_S_ACA                      3
0170 
0171 
0172 #endif /* _LINUX_VIRTIO_SCSI_H */