1 /* 2 * Structure and function declartaions for the 3 * SCSI Sequential Access Peripheral driver for CAM. 4 * 5 * Copyright (c) 1997 Justin T. Gibbs 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions, and the following disclaimer, 13 * without modification, immediately at the beginning of the file. 14 * 2. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 21 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * $Id: scsi_sa.h,v 1.2 1998/12/17 19:04:18 mjacob Exp $ 30 */ 31 32 #ifndef _SCSI_SCSI_SA_H 33 #define _SCSI_SCSI_SA_H 1 34 35 #include <sys/cdefs.h> 36 37 struct scsi_read_block_limits 38 { 39 u_int8_t opcode; 40 u_int8_t byte2; 41 u_int8_t unused[3]; 42 u_int8_t control; 43 }; 44 45 struct scsi_read_block_limits_data 46 { 47 u_int8_t gran; 48 #define RBL_GRAN_MASK 0x1F 49 #define RBL_GRAN(rblim) ((rblim)->gran & RBL_GRAN_MASK) 50 u_int8_t maximum[3]; 51 u_int8_t minimum[2]; 52 }; 53 54 struct scsi_sa_rw 55 { 56 u_int8_t opcode; 57 u_int8_t sli_fixed; 58 #define SAR_SLI 0x02 59 #define SARW_FIXED 0x01 60 u_int8_t length[3]; 61 u_int8_t control; 62 }; 63 64 struct scsi_load_unload 65 { 66 u_int8_t opcode; 67 u_int8_t immediate; 68 #define SLU_IMMED 0x01 69 u_int8_t reserved[2]; 70 u_int8_t eot_reten_load; 71 #define SLU_EOT 0x04 72 #define SLU_RETEN 0x02 73 #define SLU_LOAD 0x01 74 u_int8_t control; 75 }; 76 77 struct scsi_rewind 78 { 79 u_int8_t opcode; 80 u_int8_t immediate; 81 #define SREW_IMMED 0x01 82 u_int8_t reserved[3]; 83 u_int8_t control; 84 }; 85 86 typedef enum { 87 SS_BLOCKS, 88 SS_FILEMARKS, 89 SS_SEQFILEMARKS, 90 SS_EOD, 91 SS_SETMARKS, 92 SS_SEQSETMARKS 93 } scsi_space_code; 94 95 struct scsi_space 96 { 97 u_int8_t opcode; 98 u_int8_t code; 99 #define SREW_IMMED 0x01 100 u_int8_t count[3]; 101 u_int8_t control; 102 }; 103 104 struct scsi_write_filemarks 105 { 106 u_int8_t opcode; 107 u_int8_t byte2; 108 #define SWFMRK_IMMED 0x01 109 #define SWFMRK_WSMK 0x02 110 u_int8_t num_marks[3]; 111 u_int8_t control; 112 }; 113 114 /* 115 * Reserve and release unit have the same exact cdb format, but different 116 * opcodes. 117 */ 118 struct scsi_reserve_release_unit 119 { 120 u_int8_t opcode; 121 u_int8_t lun_thirdparty; 122 #define SRRU_LUN_MASK 0xE0 123 #define SRRU_3RD_PARTY 0x10 124 #define SRRU_3RD_SHAMT 1 125 #define SRRU_3RD_MASK 0xE 126 u_int8_t reserved[3]; 127 u_int8_t control; 128 }; 129 130 /* 131 * Erase a tape 132 */ 133 struct scsi_erase 134 { 135 u_int8_t opcode; 136 u_int8_t lun_imm_long; 137 #define SE_LUN_MASK 0xE0 138 #define SE_LONG 0x1 139 #define SE_IMMED 0x2 140 u_int8_t reserved[3]; 141 u_int8_t control; 142 }; 143 144 /* 145 * Dev specific mode page masks. 146 */ 147 #define SMH_SA_WP 0x80 148 #define SMH_SA_BUF_MODE_MASK 0x70 149 #define SMH_SA_BUF_MODE_NOBUF 0x00 150 #define SMH_SA_BUF_MODE_SIBUF 0x10 /* Single-Initiator buffering */ 151 #define SMH_SA_BUF_MODE_MIBUF 0x20 /* Multi-Initiator buffering */ 152 #define SMH_SA_SPEED_MASK 0x0F 153 #define SMH_SA_SPEED_DEFAULT 0x00 154 155 /* 156 * Sequential-access specific mode page numbers. 157 */ 158 #define SA_DATA_COMPRESSION_PAGE 0x0f 159 #define SA_DEVICE_CONFIGURATION_PAGE 0x10 160 #define SA_MEDIUM_PARTITION_PAGE_1 0x11 161 #define SA_MEDIUM_PARTITION_PAGE_2 0x12 162 #define SA_MEDIUM_PARTITION_PAGE_3 0x13 163 #define SA_MEDIUM_PARTITION_PAGE_4 0x14 164 165 /* 166 * Mode page definitions. 167 */ 168 169 struct scsi_data_compression_page { 170 u_int8_t page_code; 171 u_int8_t page_length; 172 #define SA_DCP_DCE 0x80 /* Data compression enable */ 173 #define SA_DCP_DCC 0x40 /* Data compression capable */ 174 u_int8_t dce_and_dcc; 175 #define SA_DCP_DDE 0x80 /* Data decompression enable */ 176 #define SA_DCP_RED_MASK 0x60 /* Report Exception on Decomp. */ 177 #define SA_DCP_RED_SHAMT 5 178 #define SA_DCP_RED_0 0x00 179 #define SA_DCP_RED_1 0x20 180 #define SA_DCP_RED_2 0x40 181 u_int8_t dde_and_red; 182 u_int8_t comp_algorithm[4]; 183 u_int8_t decomp_algorithm[4]; 184 u_int8_t reserved[4]; 185 }; 186 187 struct scsi_tape_read_position { 188 u_int8_t opcode; /* READ_POSITION */ 189 u_int8_t byte1; /* set LSB to read hardware block pos */ 190 u_int8_t reserved[8]; 191 }; 192 193 struct scsi_tape_position_data { /* Short Form */ 194 u_int8_t flags; 195 #define SA_RPOS_BOP 0x80 /* Beginning of Partition */ 196 #define SA_RPOS_EOP 0x40 /* End of Partition */ 197 #define SA_RPOS_BCU 0x20 /* Block Count Unknown (SCSI3) */ 198 #define SA_RPOS_BYCU 0x10 /* Byte Count Unknown (SCSI3) */ 199 #define SA_RPOS_BPU 0x04 /* Block Position Unknown */ 200 #define SA_RPOS_PERR 0x02 /* Position Error (SCSI3) */ 201 #define SA_RPOS_UNCERTAIN SA_RPOS_BPU 202 u_int8_t partition; 203 u_int8_t reserved[2]; 204 u_int8_t firstblk[4]; 205 u_int8_t lastblk[4]; 206 u_int8_t reserved2; 207 u_int8_t nbufblk[3]; 208 u_int8_t nbufbyte[4]; 209 }; 210 211 struct scsi_tape_locate { 212 u_int8_t opcode; 213 u_int8_t byte1; 214 #define SA_SPOS_IMMED 0x01 215 #define SA_SPOS_CP 0x02 216 #define SA_SPOS_BT 0x04 217 u_int8_t reserved1; 218 u_int8_t blkaddr[4]; 219 u_int8_t reserved2; 220 u_int8_t partition; 221 u_int8_t control; 222 }; 223 224 /* 225 * Opcodes 226 */ 227 #define REWIND 0x01 228 #define READ_BLOCK_LIMITS 0x05 229 #define SA_READ 0x08 230 #define SA_WRITE 0x0A 231 #define WRITE_FILEMARKS 0x10 232 #define SPACE 0x11 233 #define RESERVE_UNIT 0x16 234 #define RELEASE_UNIT 0x17 235 #define ERASE 0x19 236 #define LOAD_UNLOAD 0x1B 237 #define LOCATE 0x2B 238 #define READ_POSITION 0x34 239 240 /* 241 * Tape specific density codes- only enough of them here to recognize 242 * some specific older units so we can choose 2FM@EOD or FIXED blocksize 243 * quirks. 244 */ 245 #define SCSI_DENSITY_HALFINCH_800 0x01 246 #define SCSI_DENSITY_HALFINCH_1600 0x02 247 #define SCSI_DENSITY_HALFINCH_6250 0x03 248 #define SCSI_DENSITY_HALFINCH_6250C 0xC3 /* HP Compressed 6250 */ 249 #define SCSI_DENSITY_QIC_11_4TRK 0x04 250 #define SCSI_DENSITY_QIC_11_9TRK 0x84 /* Vendor Unique Emulex */ 251 #define SCSI_DENSITY_QIC_24 0x05 252 #define SCSI_DENSITY_HALFINCH_PE 0x06 253 #define SCSI_DENSITY_QIC_120 0x0f 254 #define SCSI_DENSITY_QIC_150 0x10 255 256 __BEGIN_DECLS 257 void scsi_read_block_limits(struct ccb_scsiio *, u_int32_t, 258 void (*cbfcnp)(struct cam_periph *, union ccb *), 259 u_int8_t, struct scsi_read_block_limits_data *, 260 u_int8_t , u_int32_t); 261 262 void scsi_sa_read_write(struct ccb_scsiio *csio, u_int32_t retries, 263 void (*cbfcnp)(struct cam_periph *, union ccb *), 264 u_int8_t tag_action, int readop, int sli, 265 int fixed, u_int32_t length, u_int8_t *data_ptr, 266 u_int32_t dxfer_len, u_int8_t sense_len, 267 u_int32_t timeout); 268 269 void scsi_rewind(struct ccb_scsiio *csio, u_int32_t retries, 270 void (*cbfcnp)(struct cam_periph *, union ccb *), 271 u_int8_t tag_action, int immediate, u_int8_t sense_len, 272 u_int32_t timeout); 273 274 void scsi_space(struct ccb_scsiio *csio, u_int32_t retries, 275 void (*cbfcnp)(struct cam_periph *, union ccb *), 276 u_int8_t tag_action, scsi_space_code code, 277 u_int32_t count, u_int8_t sense_len, u_int32_t timeout); 278 279 void scsi_load_unload(struct ccb_scsiio *csio, u_int32_t retries, 280 void (*cbfcnp)(struct cam_periph *, union ccb *), 281 u_int8_t tag_action, int immediate, int eot, 282 int reten, int load, u_int8_t sense_len, 283 u_int32_t timeout); 284 285 void scsi_write_filemarks(struct ccb_scsiio *csio, u_int32_t retries, 286 void (*cbfcnp)(struct cam_periph *, union ccb *), 287 u_int8_t tag_action, int immediate, int setmark, 288 u_int32_t num_marks, u_int8_t sense_len, 289 u_int32_t timeout); 290 291 void scsi_reserve_release_unit(struct ccb_scsiio *csio, u_int32_t retries, 292 void (*cbfcnp)(struct cam_periph *, 293 union ccb *), u_int8_t tag_action, 294 int third_party, int third_party_id, 295 u_int8_t sense_len, u_int32_t timeout, 296 int reserve); 297 298 void scsi_erase(struct ccb_scsiio *csio, u_int32_t retries, 299 void (*cbfcnp)(struct cam_periph *, union ccb *), 300 u_int8_t tag_action, int immediate, int long_erase, 301 u_int8_t sense_len, u_int32_t timeout); 302 303 void scsi_data_comp_page(struct scsi_data_compression_page *page, 304 u_int8_t dce, u_int8_t dde, u_int8_t red, 305 u_int32_t comp_algorithm, 306 u_int32_t decomp_algorithm); 307 308 void scsi_read_position(struct ccb_scsiio *csio, u_int32_t retries, 309 void (*cbfcnp)(struct cam_periph *, union ccb *), 310 u_int8_t tag_action, int hardsoft, 311 struct scsi_tape_position_data *sbp, 312 u_int8_t sense_len, u_int32_t timeout); 313 314 void scsi_set_position(struct ccb_scsiio *csio, u_int32_t retries, 315 void (*cbfcnp)(struct cam_periph *, union ccb *), 316 u_int8_t tag_action, int hardsoft, u_int32_t blkno, 317 u_int8_t sense_len, u_int32_t timeout); 318 __END_DECLS 319 320 #endif /* _SCSI_SCSI_SA_H */ 321