|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
4: All Rights Reserved
5:
6: Module Name:
7:
8: common.h
9:
10: Abstract:
11:
12: Data structures shared by drivers q117 and q117i
13:
14: Revision History:
15:
16: --*/
17:
18: #if DBG
19: //
20: // For checked kernels, define a macro to print out informational
21: // messages.
22: //
23: // QIC117Debug is normally 0. At compile-time or at run-time, it can be
24: // set to some bit patter for increasingly detailed messages.
25: //
26: // Big, nasty errors are noted with DBGP. Errors that might be
27: // recoverable are handled by the WARN bit. More information on
28: // unusual but possibly normal happenings are handled by the INFO bit.
29: // And finally, boring details such as routines entered and register
30: // dumps are handled by the SHOW bit.
31: //
32:
33: #define QIC117DBGP ((ULONG)0x00000001)
34: #define QIC117WARN ((ULONG)0x00000002)
35: #define QIC117INFO ((ULONG)0x00000004)
36: #define QIC117SHOWTD ((ULONG)0x00000008)
37: #define QIC117SHOWQD ((ULONG)0x00000010)
38: #define QIC117SHOWPOLL ((ULONG)0x00000020)
39: #define QIC117STOP ((ULONG)0x00000080)
40: #define QIC117MAKEBAD ((ULONG)0x00000100)
41: #define QIC117SHOWBAD ((ULONG)0x00000200)
42: #define QIC117DRVSTAT ((ULONG)0x00000400)
43: #define QIC117SHOWINT ((ULONG)0x00000800)
44:
45: extern ULONG QIC117DebugLevel;
46:
47: #define CheckedDump(LEVEL,STRING) \
48: if (QIC117DebugLevel & LEVEL) { \
49: DbgPrint STRING; \
50: }
51: #else
52: #define CheckedDump(LEVEL,STRING)
53: #endif
54:
55:
56: #define BUFFER_SPLIT
57:
58: typedef unsigned char UBYTE;
59: typedef unsigned short UWORD;
60: typedef unsigned short SEGMENT;
61: typedef unsigned long BLOCK;
62:
63: #ifndef TRUE
64: #define TRUE 1
65: #endif
66:
67: #ifndef NULL
68: #define NULL 0
69: #endif
70:
71: #ifndef FALSE
72: #define FALSE 0
73: #endif
74:
75: #define MAXLINE 100
76:
77: #define D_250 1 // 250Kb transfer rate
78: #define D_500 2 // 500Kb transfer rate
79:
80: //
81: // The following parameters are used to indicate the tape format code
82: //
83: #define QIC_FORMAT 2 // Indicates a standard or extended length tape
84: #define QICEST_FORMAT 3 // Indicates a 1100 foot tape
85:
86: //
87: // Tape Types
88: //
89: typedef enum _TAPE_TYPE {
90: QIC40_SHORT, // normal length cart (205 ft)
91: QIC40_LONG, // extended length cart (310 ft)
92: QICEST_40, // QIC-40 formatted tape (1100 ft)
93: QIC80_SHORT, // QIC-80 format 205 ft tape
94: QIC80_LONG, // QIC-80 format 310 ft tape
95: QICEST_80, // QIC-80 formatted tape (1100 ft)
96: QIC500_SHORT, // QIC-500 formatted tape
97: QICEST_500 // QIC-500 formatted tape (1100 ft)
98: } TAPE_TYPE;
99:
100: //
101: // Valid FDC types
102: //
103: typedef enum _FDC_TYPE {
104: FDC_UNKNOWN,
105: FDC_NORMAL,
106: FDC_ENHANCED,
107: FDC_82077,
108: FDC_82077AA,
109: FDC_82078_44,
110: FDC_82078_64,
111: FDC_NATIONAL
112: } FDC_TYPE;
113:
114: #define FDC_TDR_MASK 0x03 // mask for 82077aa tdr test
115: #define FDC_REPEAT 0x04 // number of times to loop through the tdr test
116:
117: #define MAX_SEGMENTS 4200 // maximum segments on any JUMBO drive
118:
119: #define MAX_PASSWORD_SIZE 8 // max volume password size
120: #define QIC_END 0xffea6dff // 12-31-2097, 23:59:59 in qictime
121:
122: typedef enum _STATUS {
123:
124: //
125: // If command completed successfully
126: //
127: NoErr,
128:
129: //
130: // Errors from the filer
131: //
132: // There aren't enough good blocks before the 127th bad block on tape
133: // to equal the no. of blocks for the bad block list, the tape directory, and
134: // the redundancy needed to recover the bad block list
135: UnusTape, // 1
136:
137: BadTape, // 2 All copies of first block of bad block list bad on tape, cannot use this tape
138: FMemErr, // 3 Filer memory insufficient in size
139: TapeFull, // 4 Tape full
140: VolFull, // 5 Volume directory full
141: RdncUnsc, // 6 Redundancy unsuccessful in recovering block
142: EndOfVol, // 7 Returned if ReadFile() or ReadBlock() had no more data to send
143: FCodeErr, // 8 Filer code error.
144: UpdErr, // 9 error while updating header segments - tape corrupted
145:
146: InvalVol, // 10 Volume nonexistent
147: NoVols, // 11 No volumes on tape
148: Unformat, // 12 tape not formatted
149: UnknownFormat, // 13 unknown tape format
150:
151: //
152: // DRIVER ERRORS
153: //
154:
155: BadBlk, // 14 Bad block detected (unrecoverable read error)
156: EndTapeErr, // 15 End of tape (end of tape when not expected)
157: DriveFlt, // 16 Command transmission unsuccessful
158: WProt, // 17 Write protected
159: NoTape, // 18 Reel not loaded
160: SeekErr, // 19 Seek error
161: NoDrive, // 20 No tape drive
162: InvalCmd, // 21 Invalid command
163: CodeErr, // 22 Requested data on a 64K boundry
164: NECFlt, // 23 NEC chip failed to respond
165: NoFDC, // 24 Can't access Floppy Disk Controller
166: BadFmt, // 25 Format of tape is unknown
167: CmdFlt, // 26 Command read-after-write error
168: BadNEC, // 27 NEC chip out of spec.
169: BadReq, // 28 Invalid logical sector specification in read/write
170: TooFast, // 29 Computer is too fast for current driver software
171: NoData, // 30 Tape appears to be unformatted
172: DAbort, // 31 ClearIO was called and the queue has been cleared
173: TapeFlt, // 32 Tape drive fault
174: UnspRate, // 33 speed sense failed (unsupported transfer rate
175: Already, // 34 Driver already installed in another task
176: TooNoisy, // 35 Environment too noisy
177: TimeOut, // 36 Time out error
178: BadMark, // 37 Deleted data address mark found
179: NewCart, // 38 New cartridge has been inserted
180: WrongFmt, // 39 Attempt to write on QIC40 formatted tape with QIC80 drive
181: FmtMisMatch, // 40 Same as WrongFmt, except occurs on tape linking
182: IncompTapeFmt, // 41 QIC80 formatted tape detected in a QIC40 drive
183: SCSIFmtMsmtch, // 42 QIC350 Tape detected during a SCSI BACKUP
184: QIC40InEagle, // 43 Set when a QIC40 formatted tape is detected in an Eagle
185: QIC80InEagle, // 44 Set when a QIC80 formatted tape is detected in an Eagle
186: ControllerBusy, // 45 Floppy controller is in use by another device
187: InQue, // 46 If request is currently queued to low-level driver
188: SplitRequests, // 47 If request is split and queued
189: EarlyWarning, // 48 returned when writing near end of tape
190: #ifndef NO_MARKS
191: SetMark, // 49
192: FileMark, // 50
193: LongFileMark, // 51
194: ShortFileMark, // 52
195: #endif
196:
197: MaxErrorVal //
198:
199: } STATUS;
200:
201: // Command values passed to the driver
202: typedef enum _DRIVER_COMMAND {
203: DNotUsed, // 00 command not used
204: DRead, // 01 Read from tape
205: DWrite, // 02 Write to tape
206: DFmt, // 03 Format tape
207: DEject, // 04 Eject tape
208: DFast, // 05 Run Fast (250 KB xfer rate)
209: DSlow, // 06 Run Slow (500 KB xfer rate)
210: DIgnore, // 07 Ignore Unlock Switch
211: DUseLock, // 08 Use Unlock Switch
212: DSndWPro, // 09 Send Write Protect
213: DSndReel, // 0a Send Reel In
214: DGetRev, // 0b Get Firmware Rev
215: DReten, // 0c Retension Tape
216: DGetCap, // 0d Get Tape Capacity
217: DVerify, // 0e Read with no retries
218: DRetry, // 0f Heroic retries
219: DChkDrv, // 10 get drive type
220: DWriteBad, // 11 write deleted address mark on tape
221: DGetCart, // 12 get new cartridge flag status
222: DGetSpeed, // 13 get the current processor and tape drive speed
223: DStatus, // 14 Get status of tape (type of drive/tape stats.)
224: DSelPart, // 15 Select data/directory partition (QFA)
225: DGetPos, // 16 Get current block number (QFA)
226: DFndDrv, // 17 Find drive (all other cmds return NoDrive until called)
227: DErase, // 18 Erase tape
228: DSeekEOD, // 19 Seek to end of data (QFA)
229: DReadBad, // 1a Read the tape header sectors
230: DGetFDC, // 1b Get the type of FDC
231: DGetDriveInfo, // 1c Get the Miscellaneous Drive Train Info from the drive
232: DChkFmt, // 1d Cross check the tape format with the drive type
233: DReportProtoVer, // 1e Gets the Firmware prototype version
234: DLocateDrv, // 0f Locates a tape drive at a given controller location
235: DDeselect, // 20 Deselects the tape drive
236: DClearNewCart // 21 Clears the persistent new cart flag
237: } DRIVER_COMMAND;
238:
239: //
240: // Tape Constants
241: //
242: #define UNIX_MAXBFS 5 // max. data buffers supported in the UNIX kernel
243:
244: #define MAGIC 0x636d // "cm"
245:
246: #define QIC40_DRIVE 0
247: #define QIC80_DRIVE 1
248: #define QIC500_DRIVE 2
249:
250: //
251: // Information about track buffers used by the system.
252: //
253:
254: typedef struct _SEGMENT_BUFFER {
255: PVOID logical;
256: } SEGMENT_BUFFER, *PSEGMENT_BUFFER;
257:
258: typedef struct _IO_REQUEST {
259:
260: PVOID Data; // Pointer to data buffer
261: DRIVER_COMMAND Command; // command
262: STATUS Status; // status of operation
263: USHORT FirmwareError; // Tape fault error (when status = TapeFlt)
264: ULONG BadList; // blocks for which retry not successful
265: ULONG RetryList; // blocks for which retry was successful
266: BLOCK Block; // block number where data is to be put
267: UCHAR Number; // Number of blocks of 512 to xfer
268: struct _IO_REQUEST *Next; // queue link (far pointer to next struct)
269:
270: //
271: // Upper driver (q117) specific information
272: //
273: KEVENT DoneEvent; // Event that IoCompleteReqeust will set
274: IO_STATUS_BLOCK IoStatus; // Status of request
275: PSEGMENT_BUFFER BufferInfo; // Buffer information
276:
277: } IO_REQUEST, *PIO_REQUEST;
278:
279: typedef struct _Q117_ADAPTER_INFO {
280: PADAPTER_OBJECT AdapterObject;
281: ULONG NumberOfMapRegisters;
282: } Q117_ADAPTER_INFO, *PQ117_ADAPTER_INFO;
283:
284: //
285: // QIC117 device specific ioclt's.
286: //
287:
288: #define IOCTL_QIC117_BASE FILE_DEVICE_TAPE
289:
290:
291: #define IOCTL_QIC117_DRIVE_REQUEST CTL_CODE(IOCTL_QIC117_BASE, 0x0001, METHOD_NEITHER, FILE_ANY_ACCESS)
292: #define IOCTL_QIC117_CLEAR_QUEUE CTL_CODE(IOCTL_QIC117_BASE, 0x0002, METHOD_NEITHER, FILE_ANY_ACCESS)
293:
294: //
295: // structure returned by DStatus command
296: //
297:
298: struct S_O_DStatus {
299: unsigned int underruns;
300: unsigned int retries;
301: unsigned int reserved[18];
302: };
303:
304:
305: typedef struct S_O_DGetCap {
306: unsigned int SectsPerSegment;
307: unsigned int MaxFSector;
308: unsigned int FTrackPerFSide;
309: ULONG SegmentsPerTrack;
310: ULONG SegmentsPerFTrack;
311: ULONG TracksPerTape;
312: unsigned char referenced; /* 0 = unformatted, >0 == formatted */
313: unsigned char drive_type;
314: USHORT TapeFormatCode;
315: unsigned int FormattableSegments; /* number of segments to be formatted
316: (based on the num_tracks entry in the
317: tape.cfg file) */
318: } DRIVE_CAPACITY, *PDRIVE_CAPACITY;
319:
320: struct S_O_DGetPos {
321: union {
322: struct {
323: ULONG block:20;
324: ULONG controll:4;
325: ULONG track:8;
326: } x;
327: long block;
328: } x;
329: };
330:
331:
332: struct S_O_DGetSpeed {
333: unsigned int CurSpeed;
334: unsigned int FmtSpeed;
335: };
336:
337: struct S_O_DSector_Id {
338: UBYTE track;
339: UBYTE cylinder; /* floppy cylinder, head and sector */
340: UBYTE head; /* information */
341: UBYTE sector;
342: };
343:
344: //
345: // Structure for storing the Miscellaneous Drive Informatiom |
346: //
347:
348: struct S_O_DMiscInfo {
349: char drive_type; /* Drive Type: QIC40 or QIC80 */
350: UBYTE ROM_Version; /* Version of the drive's ROM */
351: char info_exists; /* Indicates the existance of the drive train info */
352: UBYTE serial_number[4];/* a four byte array used to store the drive's serial number */
353: UBYTE man_date[2]; /* A two byte array used to store the drive's manufacturing date */
354: char oem[20]; /* A 20 byte array used to store the drive's OEM name */
355: };
356:
357: //
358: // Prototypes for common functions
359: //
360:
361: VOID
362: q117LogError(
363: IN PDEVICE_OBJECT DeviceObject,
364: IN ULONG SequenceNumber,
365: IN UCHAR MajorFunctionCode,
366: IN UCHAR RetryCount,
367: IN ULONG UniqueErrorValue,
368: IN NTSTATUS FinalStatus,
369: IN NTSTATUS SpecificIOStatus
370: );
371:
372: NTSTATUS q117MapStatus(
373: IN STATUS Status
374: );
375:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.