xref: /freebsd/sys/cam/scsi/scsi_sa.h (revision 380a989b3223d455375b4fae70fd0b9bdd43bafb)
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