[CMAKE]
[reactos.git] / drivers / storage / inc / tape.h
1 /*++
2
3 Copyright (c) 1992 Microsoft Corporation
4
5 Module Name:
6
7 tape.h
8
9 Abstract:
10
11 These are the structures and defines that are used in the
12 SCSI tape class drivers. The tape class driver is separated
13 into two modules. Tape.c contains code common to all tape
14 class drivers including the driver's major entry points.
15 The major entry point names each begin with the prefix
16 'ScsiTape.' The second module is the device specific code.
17 It provides support for a set of functions. Each device
18 specific function name is prefixed by 'Tape.'
19
20 Author:
21
22 Mike Glass
23
24 Revision History:
25
26 --*/
27
28 #include "scsi.h"
29 #include "class.h"
30
31 //
32 // Define the maximum inquiry data length.
33 //
34
35 #define MAXIMUM_TAPE_INQUIRY_DATA 252
36
37 //
38 // Tape device data
39 //
40
41 typedef struct _TAPE_DATA {
42 ULONG Flags;
43 ULONG CurrentPartition;
44 PVOID DeviceSpecificExtension;
45 PSCSI_INQUIRY_DATA InquiryData;
46 } TAPE_DATA, *PTAPE_DATA;
47
48 #define DEVICE_EXTENSION_SIZE sizeof(DEVICE_EXTENSION) + sizeof(TAPE_DATA)
49
50
51 //
52 // Define Device Configuration Page
53 //
54
55 typedef struct _MODE_DEVICE_CONFIGURATION_PAGE {
56
57 UCHAR PageCode : 6;
58 UCHAR Reserved1 : 1;
59 UCHAR PS : 1;
60 UCHAR PageLength;
61 UCHAR ActiveFormat : 5;
62 UCHAR CAFBit : 1;
63 UCHAR CAPBit : 1;
64 UCHAR Reserved2 : 1;
65 UCHAR ActivePartition;
66 UCHAR WriteBufferFullRatio;
67 UCHAR ReadBufferEmptyRatio;
68 UCHAR WriteDelayTime[2];
69 UCHAR REW : 1;
70 UCHAR RBO : 1;
71 UCHAR SOCF : 2;
72 UCHAR AVC : 1;
73 UCHAR RSmk : 1;
74 UCHAR BIS : 1;
75 UCHAR DBR : 1;
76 UCHAR GapSize;
77 UCHAR Reserved3 : 3;
78 UCHAR SEW : 1;
79 UCHAR EEG : 1;
80 UCHAR EODdefined : 3;
81 UCHAR BufferSize[3];
82 UCHAR DCAlgorithm;
83 UCHAR Reserved4;
84
85 } MODE_DEVICE_CONFIGURATION_PAGE, *PMODE_DEVICE_CONFIGURATION_PAGE;
86
87 //
88 // Define Medium Partition Page
89 //
90
91 typedef struct _MODE_MEDIUM_PARTITION_PAGE {
92
93 UCHAR PageCode : 6;
94 UCHAR Reserved1 : 1;
95 UCHAR PSBit : 1;
96 UCHAR PageLength;
97 UCHAR MaximumAdditionalPartitions;
98 UCHAR AdditionalPartitionDefined;
99 UCHAR Reserved2 : 3;
100 UCHAR PSUMBit : 2;
101 UCHAR IDPBit : 1;
102 UCHAR SDPBit : 1;
103 UCHAR FDPBit : 1;
104 UCHAR MediumFormatRecognition;
105 UCHAR Reserved3[2];
106 UCHAR Partition0Size[2];
107 UCHAR Partition1Size[2];
108
109 } MODE_MEDIUM_PARTITION_PAGE, *PMODE_MEDIUM_PARTITION_PAGE;
110
111 //
112 // Define Data Compression Page
113 //
114
115 typedef struct _MODE_DATA_COMPRESSION_PAGE {
116
117 UCHAR PageCode : 6;
118 UCHAR Reserved1 : 2;
119 UCHAR PageLength;
120 UCHAR Reserved2 : 6;
121 UCHAR DCC : 1;
122 UCHAR DCE : 1;
123 UCHAR Reserved3 : 5;
124 UCHAR RED : 2;
125 UCHAR DDE : 1;
126 UCHAR CompressionAlgorithm[4];
127 UCHAR DecompressionAlgorithm[4];
128 UCHAR Reserved4[4];
129
130 } MODE_DATA_COMPRESSION_PAGE, *PMODE_DATA_COMPRESSION_PAGE;
131
132 //
133 // Mode parameter list header and medium partition page -
134 // used in creating partitions
135 //
136
137 typedef struct _MODE_MEDIUM_PART_PAGE {
138
139 MODE_PARAMETER_HEADER ParameterListHeader;
140 MODE_MEDIUM_PARTITION_PAGE MediumPartPage;
141
142 } MODE_MEDIUM_PART_PAGE, *PMODE_MEDIUM_PART_PAGE;
143
144
145 //
146 // Mode parameters for retrieving tape or media information
147 //
148
149 typedef struct _MODE_TAPE_MEDIA_INFORMATION {
150
151 MODE_PARAMETER_HEADER ParameterListHeader;
152 MODE_PARAMETER_BLOCK ParameterListBlock;
153 MODE_MEDIUM_PARTITION_PAGE MediumPartPage;
154
155 } MODE_TAPE_MEDIA_INFORMATION, *PMODE_TAPE_MEDIA_INFORMATION;
156
157 //
158 // Mode parameter list header and device configuration page -
159 // used in retrieving device configuration information
160 //
161
162 typedef struct _MODE_DEVICE_CONFIG_PAGE {
163
164 MODE_PARAMETER_HEADER ParameterListHeader;
165 MODE_DEVICE_CONFIGURATION_PAGE DeviceConfigPage;
166
167 } MODE_DEVICE_CONFIG_PAGE, *PMODE_DEVICE_CONFIG_PAGE;
168
169
170 //
171 // Mode parameter list header and data compression page -
172 // used in retrieving data compression information
173 //
174
175 typedef struct _MODE_DATA_COMPRESS_PAGE {
176
177 MODE_PARAMETER_HEADER ParameterListHeader;
178 MODE_DATA_COMPRESSION_PAGE DataCompressPage;
179
180 } MODE_DATA_COMPRESS_PAGE, *PMODE_DATA_COMPRESS_PAGE;
181
182
183 \f
184 //
185 // The following routines are the exported entry points for
186 // all tape class drivers. Note all these routines name start
187 // with 'ScsiTape.'
188 //
189
190 NTSTATUS
191 DriverEntry(
192 IN PDRIVER_OBJECT DriverObject,
193 IN PUNICODE_STRING RegistryPath
194 );
195
196 NTSTATUS
197 ScsiTapeInitialize(
198 IN PDRIVER_OBJECT DriverObject
199 );
200
201 NTSTATUS
202 ScsiTapeCreate (
203 IN PDEVICE_OBJECT DeviceObject,
204 IN PIRP Irp
205 );
206
207 NTSTATUS
208 ScsiTapeReadWrite (
209 IN PDEVICE_OBJECT DeviceObject,
210 IN PIRP Irp
211 );
212
213 NTSTATUS
214 ScsiTapeDeviceControl(
215 IN PDEVICE_OBJECT DeviceObject,
216 IN PIRP Irp
217 );
218
219
220 \f
221 //
222 // The following routines are provided by the tape
223 // device-specific module. Each routine name is
224 // prefixed with 'Tape.'
225
226 NTSTATUS
227 TapeCreatePartition(
228 IN PDEVICE_OBJECT DeviceObject,
229 IN PIRP Irp
230 );
231
232 NTSTATUS
233 TapeErase(
234 IN PDEVICE_OBJECT DeviceObject,
235 IN PIRP Irp
236 );
237
238 VOID
239 TapeError(
240 PDEVICE_OBJECT DeviceObject,
241 PSCSI_REQUEST_BLOCK Srb,
242 NTSTATUS *Status,
243 BOOLEAN *Retry
244 );
245
246 NTSTATUS
247 TapeGetDriveParameters(
248 IN PDEVICE_OBJECT DeviceObject,
249 IN PIRP Irp
250 );
251
252 NTSTATUS
253 TapeGetMediaParameters(
254 IN PDEVICE_OBJECT DeviceObject,
255 IN PIRP Irp
256 );
257
258 NTSTATUS
259 TapeGetPosition(
260 IN PDEVICE_OBJECT DeviceObject,
261 IN PIRP Irp
262 );
263
264 NTSTATUS
265 TapeGetStatus(
266 IN PDEVICE_OBJECT DeviceObject,
267 IN PIRP Irp
268 );
269
270 NTSTATUS
271 TapePrepare(
272 IN PDEVICE_OBJECT DeviceObject,
273 IN PIRP Irp
274 );
275
276 NTSTATUS
277 TapeReadWrite(
278 IN PDEVICE_OBJECT DeviceObject,
279 IN PIRP Irp
280 );
281
282 NTSTATUS
283 TapeSetDriveParameters(
284 IN PDEVICE_OBJECT DeviceObject,
285 IN PIRP Irp
286 );
287
288 NTSTATUS
289 TapeSetMediaParameters(
290 IN PDEVICE_OBJECT DeviceObject,
291 IN PIRP Irp
292 );
293
294 NTSTATUS
295 TapeSetPosition(
296 IN PDEVICE_OBJECT DeviceObject,
297 IN PIRP Irp
298 );
299
300 BOOLEAN
301 TapeVerifyInquiry(
302 IN PSCSI_INQUIRY_DATA LunInfo
303 );
304
305 NTSTATUS
306 TapeWriteMarks(
307 IN PDEVICE_OBJECT DeviceObject,
308 IN PIRP Irp
309 );
310
311 \1a
312