pps_fetch: introduce a helper to handle timeouts
[dragonfly.git] / sys / bus / cam / scsi / scsi_sa.h
blob32a056e5fe82b308c7507e9ef102e6bfa27f03ca
1 /*
2 * Structure and function declarations for the
3 * SCSI Sequential Access Peripheral driver for CAM.
5 * Copyright (c) 1999, 2000 Matthew Jacob
6 * All rights reserved.
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.
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.
29 * $FreeBSD: src/sys/cam/scsi/scsi_sa.h,v 1.6.2.2 2001/01/12 02:50:39 steve Exp $
30 * $DragonFly: src/sys/bus/cam/scsi/scsi_sa.h,v 1.2 2003/06/17 04:28:19 dillon Exp $
33 #ifndef _SCSI_SCSI_SA_H
34 #define _SCSI_SCSI_SA_H 1
36 #include <sys/cdefs.h>
38 struct scsi_read_block_limits
40 u_int8_t opcode;
41 u_int8_t byte2;
42 u_int8_t unused[3];
43 u_int8_t control;
46 struct scsi_read_block_limits_data
48 u_int8_t gran;
49 #define RBL_GRAN_MASK 0x1F
50 #define RBL_GRAN(rblim) ((rblim)->gran & RBL_GRAN_MASK)
51 u_int8_t maximum[3];
52 u_int8_t minimum[2];
55 struct scsi_sa_rw
57 u_int8_t opcode;
58 u_int8_t sli_fixed;
59 #define SAR_SLI 0x02
60 #define SARW_FIXED 0x01
61 u_int8_t length[3];
62 u_int8_t control;
65 struct scsi_load_unload
67 u_int8_t opcode;
68 u_int8_t immediate;
69 #define SLU_IMMED 0x01
70 u_int8_t reserved[2];
71 u_int8_t eot_reten_load;
72 #define SLU_EOT 0x04
73 #define SLU_RETEN 0x02
74 #define SLU_LOAD 0x01
75 u_int8_t control;
78 struct scsi_rewind
80 u_int8_t opcode;
81 u_int8_t immediate;
82 #define SREW_IMMED 0x01
83 u_int8_t reserved[3];
84 u_int8_t control;
87 typedef enum {
88 SS_BLOCKS,
89 SS_FILEMARKS,
90 SS_SEQFILEMARKS,
91 SS_EOD,
92 SS_SETMARKS,
93 SS_SEQSETMARKS
94 } scsi_space_code;
96 struct scsi_space
98 u_int8_t opcode;
99 u_int8_t code;
100 #define SREW_IMMED 0x01
101 u_int8_t count[3];
102 u_int8_t control;
105 struct scsi_write_filemarks
107 u_int8_t opcode;
108 u_int8_t byte2;
109 #define SWFMRK_IMMED 0x01
110 #define SWFMRK_WSMK 0x02
111 u_int8_t num_marks[3];
112 u_int8_t control;
116 * Reserve and release unit have the same exact cdb format, but different
117 * opcodes.
119 struct scsi_reserve_release_unit
121 u_int8_t opcode;
122 u_int8_t lun_thirdparty;
123 #define SRRU_LUN_MASK 0xE0
124 #define SRRU_3RD_PARTY 0x10
125 #define SRRU_3RD_SHAMT 1
126 #define SRRU_3RD_MASK 0xE
127 u_int8_t reserved[3];
128 u_int8_t control;
132 * Erase a tape
134 struct scsi_erase
136 u_int8_t opcode;
137 u_int8_t lun_imm_long;
138 #define SE_LUN_MASK 0xE0
139 #define SE_LONG 0x1
140 #define SE_IMMED 0x2
141 u_int8_t reserved[3];
142 u_int8_t control;
146 * Dev specific mode page masks.
148 #define SMH_SA_WP 0x80
149 #define SMH_SA_BUF_MODE_MASK 0x70
150 #define SMH_SA_BUF_MODE_NOBUF 0x00
151 #define SMH_SA_BUF_MODE_SIBUF 0x10 /* Single-Initiator buffering */
152 #define SMH_SA_BUF_MODE_MIBUF 0x20 /* Multi-Initiator buffering */
153 #define SMH_SA_SPEED_MASK 0x0F
154 #define SMH_SA_SPEED_DEFAULT 0x00
157 * Sequential-access specific mode page numbers.
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 #define SA_DATA_COMPRESSION_PAGE 0x0f /* SCSI-3 */
167 * Mode page definitions.
170 /* See SCSI-II spec 9.3.3.1 */
171 struct scsi_dev_conf_page {
172 u_int8_t pagecode; /* 0x10 */
173 u_int8_t pagelength; /* 0x0e */
174 u_int8_t byte2; /* CAP, CAF, Active Format */
175 u_int8_t active_partition;
176 u_int8_t wb_full_ratio;
177 u_int8_t rb_empty_ratio;
178 u_int8_t wrdelay_time[2];
179 u_int8_t byte8;
180 #define SA_DBR 0x80 /* data buffer recovery */
181 #define SA_BIS 0x40 /* block identifiers supported */
182 #define SA_RSMK 0x20 /* report setmarks */
183 #define SA_AVC 0x10 /* automatic velocity control */
184 #define SA_SOCF_MASK 0xc0 /* stop on consecutive formats */
185 #define SA_RBO 0x20 /* recover buffer order */
186 #define SA_REW 0x10 /* report early warning */
187 u_int8_t gap_size;
188 u_int8_t byte10;
189 u_int8_t ew_bufsize[3];
190 u_int8_t sel_comp_alg;
191 #define SA_COMP_NONE 0x00
192 #define SA_COMP_DEFAULT 0x01
193 /* the following is 'reserved' in SCSI-2 but is defined in SSC-r22 */
194 u_int8_t extra_wp;
195 #define SA_ASOC_WP 0x04 /* Associated Write Protect */
196 #define SA_PERS_WP 0x02 /* Persistent Write Protect */
197 #define SA_PERM_WP 0x01 /* Permanent Write Protect */
200 /* from SCSI-3: SSC-Rev10 (6/97) */
201 struct scsi_data_compression_page {
202 u_int8_t page_code; /* 0x0f */
203 u_int8_t page_length; /* 0x0e */
204 u_int8_t dce_and_dcc;
205 #define SA_DCP_DCE 0x80 /* Data compression enable */
206 #define SA_DCP_DCC 0x40 /* Data compression capable */
207 u_int8_t dde_and_red;
208 #define SA_DCP_DDE 0x80 /* Data decompression enable */
209 #define SA_DCP_RED_MASK 0x60 /* Report Exception on Decomp. */
210 #define SA_DCP_RED_SHAMT 5
211 #define SA_DCP_RED_0 0x00
212 #define SA_DCP_RED_1 0x20
213 #define SA_DCP_RED_2 0x40
214 u_int8_t comp_algorithm[4];
215 u_int8_t decomp_algorithm[4];
216 u_int8_t reserved[4];
219 typedef union {
220 struct { u_int8_t pagecode, pagelength; } hdr;
221 struct scsi_dev_conf_page dconf;
222 struct scsi_data_compression_page dcomp;
223 } sa_comp_t;
225 struct scsi_tape_read_position {
226 u_int8_t opcode; /* READ_POSITION */
227 u_int8_t byte1; /* set LSB to read hardware block pos */
228 u_int8_t reserved[8];
231 struct scsi_tape_position_data { /* Short Form */
232 u_int8_t flags;
233 #define SA_RPOS_BOP 0x80 /* Beginning of Partition */
234 #define SA_RPOS_EOP 0x40 /* End of Partition */
235 #define SA_RPOS_BCU 0x20 /* Block Count Unknown (SCSI3) */
236 #define SA_RPOS_BYCU 0x10 /* Byte Count Unknown (SCSI3) */
237 #define SA_RPOS_BPU 0x04 /* Block Position Unknown */
238 #define SA_RPOS_PERR 0x02 /* Position Error (SCSI3) */
239 #define SA_RPOS_UNCERTAIN SA_RPOS_BPU
240 u_int8_t partition;
241 u_int8_t reserved[2];
242 u_int8_t firstblk[4];
243 u_int8_t lastblk[4];
244 u_int8_t reserved2;
245 u_int8_t nbufblk[3];
246 u_int8_t nbufbyte[4];
249 struct scsi_tape_locate {
250 u_int8_t opcode;
251 u_int8_t byte1;
252 #define SA_SPOS_IMMED 0x01
253 #define SA_SPOS_CP 0x02
254 #define SA_SPOS_BT 0x04
255 u_int8_t reserved1;
256 u_int8_t blkaddr[4];
257 u_int8_t reserved2;
258 u_int8_t partition;
259 u_int8_t control;
263 * Opcodes
265 #define REWIND 0x01
266 #define READ_BLOCK_LIMITS 0x05
267 #define SA_READ 0x08
268 #define SA_WRITE 0x0A
269 #define WRITE_FILEMARKS 0x10
270 #define SPACE 0x11
271 #define RESERVE_UNIT 0x16
272 #define RELEASE_UNIT 0x17
273 #define ERASE 0x19
274 #define LOAD_UNLOAD 0x1B
275 #define LOCATE 0x2B
276 #define READ_POSITION 0x34
279 * Tape specific density codes- only enough of them here to recognize
280 * some specific older units so we can choose 2FM@EOD or FIXED blocksize
281 * quirks.
283 #define SCSI_DENSITY_HALFINCH_800 0x01
284 #define SCSI_DENSITY_HALFINCH_1600 0x02
285 #define SCSI_DENSITY_HALFINCH_6250 0x03
286 #define SCSI_DENSITY_HALFINCH_6250C 0xC3 /* HP Compressed 6250 */
287 #define SCSI_DENSITY_QIC_11_4TRK 0x04
288 #define SCSI_DENSITY_QIC_11_9TRK 0x84 /* Vendor Unique Emulex */
289 #define SCSI_DENSITY_QIC_24 0x05
290 #define SCSI_DENSITY_HALFINCH_PE 0x06
291 #define SCSI_DENSITY_QIC_120 0x0f
292 #define SCSI_DENSITY_QIC_150 0x10
293 #define SCSI_DENSITY_QIC_525_320 0x11
294 #define SCSI_DENSITY_QIC_1320 0x12
295 #define SCSI_DENSITY_QIC_2GB 0x22
296 #define SCSI_DENSITY_QIC_4GB 0x26
297 #define SCSI_DENSITY_QIC_3080 0x29
299 __BEGIN_DECLS
300 void scsi_read_block_limits(struct ccb_scsiio *, u_int32_t,
301 void (*cbfcnp)(struct cam_periph *, union ccb *),
302 u_int8_t, struct scsi_read_block_limits_data *,
303 u_int8_t , u_int32_t);
305 void scsi_sa_read_write(struct ccb_scsiio *csio, u_int32_t retries,
306 void (*cbfcnp)(struct cam_periph *, union ccb *),
307 u_int8_t tag_action, int readop, int sli,
308 int fixed, u_int32_t length, u_int8_t *data_ptr,
309 u_int32_t dxfer_len, u_int8_t sense_len,
310 u_int32_t timeout);
312 void scsi_rewind(struct ccb_scsiio *csio, u_int32_t retries,
313 void (*cbfcnp)(struct cam_periph *, union ccb *),
314 u_int8_t tag_action, int immediate, u_int8_t sense_len,
315 u_int32_t timeout);
317 void scsi_space(struct ccb_scsiio *csio, u_int32_t retries,
318 void (*cbfcnp)(struct cam_periph *, union ccb *),
319 u_int8_t tag_action, scsi_space_code code,
320 u_int32_t count, u_int8_t sense_len, u_int32_t timeout);
322 void scsi_load_unload(struct ccb_scsiio *csio, u_int32_t retries,
323 void (*cbfcnp)(struct cam_periph *, union ccb *),
324 u_int8_t tag_action, int immediate, int eot,
325 int reten, int load, u_int8_t sense_len,
326 u_int32_t timeout);
328 void scsi_write_filemarks(struct ccb_scsiio *csio, u_int32_t retries,
329 void (*cbfcnp)(struct cam_periph *, union ccb *),
330 u_int8_t tag_action, int immediate, int setmark,
331 u_int32_t num_marks, u_int8_t sense_len,
332 u_int32_t timeout);
334 void scsi_reserve_release_unit(struct ccb_scsiio *csio, u_int32_t retries,
335 void (*cbfcnp)(struct cam_periph *,
336 union ccb *), u_int8_t tag_action,
337 int third_party, int third_party_id,
338 u_int8_t sense_len, u_int32_t timeout,
339 int reserve);
341 void scsi_erase(struct ccb_scsiio *csio, u_int32_t retries,
342 void (*cbfcnp)(struct cam_periph *, union ccb *),
343 u_int8_t tag_action, int immediate, int long_erase,
344 u_int8_t sense_len, u_int32_t timeout);
346 void scsi_data_comp_page(struct scsi_data_compression_page *page,
347 u_int8_t dce, u_int8_t dde, u_int8_t red,
348 u_int32_t comp_algorithm,
349 u_int32_t decomp_algorithm);
351 void scsi_read_position(struct ccb_scsiio *csio, u_int32_t retries,
352 void (*cbfcnp)(struct cam_periph *, union ccb *),
353 u_int8_t tag_action, int hardsoft,
354 struct scsi_tape_position_data *sbp,
355 u_int8_t sense_len, u_int32_t timeout);
357 void scsi_set_position(struct ccb_scsiio *csio, u_int32_t retries,
358 void (*cbfcnp)(struct cam_periph *, union ccb *),
359 u_int8_t tag_action, int hardsoft, u_int32_t blkno,
360 u_int8_t sense_len, u_int32_t timeout);
361 __END_DECLS
363 #endif /* _SCSI_SCSI_SA_H */