blob: 5b16574612b5fc896f90e77ee41426eb75144d3d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
|
/*
* SCSI tape interface description
*/
/*
* Written by Julian Elischer (julian@tfs.com)
* for TRW Financial Systems.
*
* TRW Financial Systems, in accordance with their agreement with Carnegie
* Mellon University, makes this software available to CMU to distribute
* or use in any manner that they see fit as long as this message is kept with
* the software. For this reason TFS also grants any other persons or
* organisations permission to use or modify this software.
*
* TFS supplies this software to be publicly redistributed
* on the understanding that TFS is not responsible for the correct
* functioning of this software in any circumstances.
*
*/
/*
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
*
* $Id$
*/
#ifndef SCSI_SCSI_TAPE_H
#define SCSI_SCSI_TAPE_H 1
/*
* SCSI command formats
*/
struct scsi_rw_tape
{
u_char op_code;
u_char byte2;
#define SRWT_FIXED 0x01
u_char len[3];
u_char control;
};
struct scsi_space
{
u_char op_code;
u_char byte2;
#define SS_CODE 0x03
u_char number[3];
u_char control;
};
#define SP_BLKS 0
#define SP_FILEMARKS 1
#define SP_SEQ_FILEMARKS 2
#define SP_EOM 3
struct scsi_write_filemarks
{
u_char op_code;
u_char byte2;
u_char number[3];
u_char control;
};
struct scsi_rewind
{
u_char op_code;
u_char byte2;
#define SR_IMMED 0x01
u_char unused[3];
u_char control;
};
/*
** Tape erase - AKL: Andreas Klemm <andreas@knobel.gun.de>
*/
struct scsi_erase
{
u_char op_code;
u_char byte2;
#define SE_LONG 0x01 /*
** Archive Viper 2525 doesn't allow short
** erase, other tapes possibly don't allow
** that, too.
*/
#define SE_IMMED 0x02
u_char unused[3];
u_char control;
};
struct scsi_load
{
u_char op_code;
u_char byte2;
#define SL_IMMED 0x01
u_char unused[2];
u_char how;
u_char control;
};
#define LD_UNLOAD 0
#define LD_LOAD 1
#define LD_RETEN 2
struct scsi_blk_limits
{
u_char op_code;
u_char byte2;
u_char unused[3];
u_char control;
};
/*
* Opcodes
*/
#define REWIND 0x01
#define READ_BLK_LIMITS 0x05
#define READ_COMMAND_TAPE 0x08
#define WRITE_COMMAND_TAPE 0x0a
#define WRITE_FILEMARKS 0x10
#define SPACE 0x11
#define ERASE 0x19
#define LOAD_UNLOAD 0x1b
struct scsi_blk_limits_data
{
u_char reserved;
u_char max_length_2; /* Most significant */
u_char max_length_1;
u_char max_length_0; /* Least significant */
u_char min_length_1; /* Most significant */
u_char min_length_0; /* Least significant */
};
/* defines for the device specific byte in the mode select/sense header */
#define SMH_DSP_SPEED 0x0F
#define SMH_DSP_BUFF_MODE 0x70
#define SMH_DSP_BUFF_MODE_OFF 0x00
#define SMH_DSP_BUFF_MODE_ON 0x10
#define SMH_DSP_BUFF_MODE_MLTI 0x20
#define SMH_DSP_WRITE_PROT 0x80
/* A special for the CIPHER ST150S(old drive) */
struct blk_desc_cipher
{
u_char density;
u_char nblocks[3];
u_char reserved;
u_char blklen[3];
u_char other;
#define ST150_SEC 0x01 /* soft error count */
#define SR150_AUI 0x02 /* autoload inhibit */
};
/*
* This structure defines the various mode pages that tapes know about.
*/
#define PAGE_HEADERLEN 2
struct tape_pages
{
u_char pg_code; /* page code */
#define ST_PAGE_CONFIGURATION 0x10
#define ST_PAGE_MEDIUM_PART 0x11
#define ST_PAGE_MEDIUM_PART2 0x12
#define ST_PAGE_MEDIUM_PART3 0x13
#define ST_PAGE_MEDIUM_PART4 0x14
#define ST_P_CODE 0x3F /* page code */
#define ST_P_PS 0x80 /* page savable */
u_char pg_length; /* page length */
union
{
struct
{
u_char active_format; /* active format for density*/
#define ST_P_CAP 0x40 /* change active Partition */
#define ST_P_CAF 0x20 /* change active format */
#define ST_P_AF 0x1F /* active format */
u_char active_partition; /* */
u_char write_buffer_full_ratio; /* highwater writing*/
u_char read_buffer_empty_ratio; /* lowwater reading*/
u_char write_delay_high; /* # 100mSecs before flush*/
u_char write_delay_low; /* of buffer to the media */
u_char flags1; /* various single bit flags */
#define ST_P_DBR 0x80 /* supports data-buffer recovery */
#define ST_P_BIS 0x40 /* supports Block_ID */
#define ST_P_RSmk 0x20 /* Reports setmarks during reads and spaces */
#define ST_P_AVC 0x10 /* Supports Automatic Velocity Control */
#define ST_P_SOCF 0x0C /* Stop On Consecutive Filemarks, */
#define ST_P_RBO 0x02 /* Recoverd Buffered Data order, 1 = LIFO */
#define ST_P_REW 0x01 /* Report Early Warning (see SEW) */
u_char gap_size; /*I/B gap, 1=min 0=default */
u_char flags2; /* various single bit flags */
#define ST_P_EOD 0xE0 /* What is and EOD....*/
#define ST_P_EOD_DEF 0x00 /* Drive's default */
#define ST_P_EOD_FMT 0x20 /* define by format */
#define ST_P_EOD_SOCF 0x40 /* define by SOCF (above) */
#define ST_P_EEG 0x10 /* use EOD above */
#define ST_P_SEW 0x04 /* Synchronise at Early warning.. flush buffers*/
u_char early_warn_high;/* buf size at early warning */
u_char early_warn_med; /* after early warning, only */
u_char early_warn_low; /* buufer this much data */
u_char data_compress_alg; /* 0 = off, 1 = default */
u_char reserved; /* The standard says so */
} configuration;
struct
{
#define ST_MAXPARTS 16 /*for now*/
u_char max_add_parts; /* that drive allows */
u_char parts_defined; /* max min(ST_MAXPARTS,max_add_parts) */
u_char flags;
#define ST_P_FDP 0x80
#define ST_P_SDP 0x40
#define ST_P_IDP 0x20
#define ST_P_PSUM 0x18 /* units of part defs.. */
#define ST_P_PSUM_BYTES 0x0 /* units of part defs.. */
#define ST_P_PSUM_KBYTES 0x08 /* units of part defs.. */
#define ST_P_PSUM_MBYTES 0x10 /* units of part defs.. */
u_char medium_format_recog;
#define ST_P_REC_NONE 0x00
#define ST_P_REC_FMT 0x01 /* can recognise format of new media */
#define ST_P_REC_PART 0x02 /* can recognise partitions of new media */
#define ST_P_REC_FMT_PART 0x03 /* can recognise format and parts */
u_char reserved1;
u_char reserved2;
struct
{
u_char high;
u_char low;
}part[ST_MAXPARTS];
} medium_partition;
struct
{
struct
{
u_char high;
u_char low;
}part[ST_MAXPARTS];
} medium_partition_extra;
}pages;
};
#endif /*SCSI_SCSI_TAPE_H*/
|