|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
4: All Rights Reserved
5:
6: Module Name:
7:
8: geterror.c
9:
10: Abstract:
11:
12: Converts QIC117 firmware errors.
13:
14: Revision History:
15:
16:
17:
18:
19: --*/
20:
21: //
22: // include files
23: //
24:
25: #include <ntddk.h> // various NT definitions
26: #include <ntdddisk.h> // disk device driver I/O control codes
27: #include <ntiologc.h>
28: #include "common.h"
29: #include "drvtask.h" // this driver's data declarations
30: #include "mt1defs.h" // this driver's data declarations
31: #include "mt1strc.h" // this driver's data declarations
32: #include "q117data.h" // this driver's data declarations
33:
34:
35: STATUS
36: Q117iConvertFirmwareError(
37: IN FIRMWARE_ERROR FirmwareError
38: )
39:
40: /*++
41:
42: Routine Description:
43:
44: Arguments:
45:
46: FirmwareError -
47:
48: Return Value:
49:
50: --*/
51:
52: {
53: CheckedDump(QIC117INFO,( "Q117i - Firmware error %d (decimal)\n", FirmwareError ));
54:
55: switch (FirmwareError) {
56:
57: case 0: // 0 - no error
58: return(NoErr);
59: break;
60:
61: case 1: // 1 - command receive while drive not ready
62: return(InvalCmd);
63: break;
64:
65: case 2: // 2 - cartridge not present or removed
66: return(NoTape);
67: break;
68:
69: case 3: // 3 - motor speed error
70: case 4: // 4 - motor speed anomaly (motor jammed or gross speed error)
71: return(TapeFlt);
72: break;
73:
74: case 5: // 5 - cartridge write protected
75: return(WProt);
76: break;
77:
78: case 6: // 6 - undefined or reserved command code
79: return(InvalCmd);
80: break;
81:
82: case 7: // 7 - illegal track address specified for Seek
83: CheckedDump(QIC117WARN,( "SeekErr - illegal track address specified for Seek\n" ));
84: return(SeekErr);
85: break;
86:
87: case 8: // 8 - illegal command in report subcontext
88: case 9: // 9 - illegal entry attempt into a diagnostic mode
89: return(InvalCmd);
90: break;
91:
92: case 10: // 10 - broken tape detected (based on hole and motor sensors)
93: case 11: // 11 - Warning -- read gain setting error
94: return(TapeFlt);
95: break;
96:
97: case 12: // 12 - command Received while error status pending
98: case 13: // 13 - command received while new cartridge pending
99: case 14: // 14 - command illegal or undefined in primary mode
100: case 15: // 15 - command illegal or undefined in format mode
101: case 16: // 16 - command illegal or undefined in verify mode
102: return(InvalCmd);
103: break;
104:
105: case 17: // 17 - logical forward not a logical BOT in format mode
106: CheckedDump(QIC117WARN,( "SeekErr - logical forward not a logical BOT in format mode\n" ));
107: return(SeekErr);
108: break;
109:
110: case 18: // 18 - logical EOT before all segments generated -- format mode
111: return(EndTapeErr);
112: break;
113:
114: case 19: // 19 - command illegal when cartridge not referenced
115: return(InvalCmd);
116: break;
117:
118: case 20: // 20 - self-diagnostic failed -- NOTE: this error CANNOT BE CLEARED
119: case 21: // 21 - Warning -- EEPROM not initialized default settings in effect
120: case 22: // 22 - EEPROM contents corrupted or EEPROM hardware malfunction
121: case 23: // 23 - tape motion timeout (max EOT-to-BOT time exceeded)
122: case 24: // 24 - data segment too long -- logical forward or pause
123: case 25: // 25 - command transmit overrun (usually a firmware bug)
124: case 26: // 26 - power on reset occurred
125: case 27: // 27 - software initiated reset occurred
126: case 28: // 28 - model-dependant diagnostic error
127: case 29: // 29 - model-independant diagnostic error
128: return(TapeFlt);
129: break;
130:
131: case 30: // 30 - command received during non-interruptible process
132: return(InvalCmd);
133: break;
134:
135: case 31: // 31 - speed selection requested is not available on this drive
136: return(UnspRate);
137: break;
138:
139: case 32: // 32 - command illegal while in high speed mode
140: return(InvalCmd);
141: break;
142:
143: case 33: // 33 - illegal segment specified for Seek
144: CheckedDump(QIC117WARN,( "SeekErr - illegal segment specified for Seek\n" ));
145: return(SeekErr);
146: break;
147:
148: case 34: // 34 - invalid tape media
149: case 35: // 35 - head reference failure
150: case 36: // 36 - edge seek error
151: case 37: // 37 - Missing Training Table
152: case 38: // 38 - Invalid Format
153: case 39: // 39 - EOT/BOT Sensor Failure
154: case 40: // 40 - Training Table Checksum Error
155: case 41: // 41 - Watchdog Timer Reset Occurred
156: case 42: // 42 - Illegal Error Number
157: return(TapeFlt);
158: break;
159:
160: default:
161: return(TapeFlt);
162:
163: }
164: }
165:
166:
167: STATUS
168: Q117iGetDriveError(
169: IN PTAPE_EXTENSION TapeExtension
170: )
171: /*++
172:
173: Routine Description:
174:
175: Read the tape drive Status byte and, if necessary, the tape drive
176: Error information.
177:
178: Read the Drive Status byte from the tape drive.
179:
180: If the drive status indicates that the tape drive has an error to
181: report, read the error information which includes both the error
182: code and the command that was being executed when the error occurred.
183:
184: Arguments:
185:
186: TapeExtension -
187:
188: Return Value:
189:
190: --*/
191:
192: {
193: STATUS retval = 0;
194: struct DriveStatus drvStat;
195: USHORT drvErr;
196: BOOLEAN repeatReport;
197: BOOLEAN newCart;
198: BOOLEAN ESD_Retry = FALSE;
199:
200: TapeExtension->FirmwareError = NoErr;
201: newCart = FALSE;
202:
203: do {
204:
205: repeatReport = FALSE;
206:
207: if ((retval = Q117iReport(TapeExtension,
208: Report_Status,
209: (USHORT *)&drvStat,
210: READ_BYTE,
211: &ESD_Retry)) != NoErr) {
212:
213: return(retval);
214:
215: }
216:
217: CheckedDump(QIC117DRVSTAT,( "QIC117: Drv status = %02x\n",drvStat ));
218:
219: TapeExtension->DriveParms.Status = drvStat;
220:
221: if (!drvStat.Ready) {
222:
223: return(NotRdy);
224:
225: }
226:
227: if (!drvStat.CartPresent) {
228:
229: TapeExtension->NoCart = TRUE;
230: TapeExtension->PersistentNewCart = FALSE;
231:
232: }
233:
234: if (TapeExtension->DriveParms.Flavor == IOMEGA) {
235:
236: if (drvStat.CartPresent &&
237: TapeExtension->NoCart) {
238:
239: newCart = TRUE;
240: TapeExtension->NewCart = TRUE;
241: TapeExtension->NoCart = FALSE;
242:
243: }
244:
245: }
246:
247: if (drvStat.NewCart) {
248:
249: newCart = TRUE;
250: TapeExtension->NewCart = TRUE;
251:
252: }
253:
254: if (drvStat.NewCart || drvStat.Error) {
255:
256: if((retval = Q117iReport(TapeExtension,
257: Report_Error,
258: &drvErr,
259: READ_WORD,
260: &ESD_Retry)) != NoErr) {
261:
262: return(retval);
263:
264: }
265:
266: CheckedDump(QIC117DRVSTAT,( "QIC117: Drv error = 0x%02x\n",drvErr ));
267:
268: if (drvStat.Error) {
269:
270: TapeExtension->FirmwareError = (UCHAR)drvErr;
271:
272: if (TapeExtension->FirmwareError == Cmd_on_New_Cart) {
273:
274: newCart = TRUE;
275: TapeExtension->NewCart = TRUE;
276:
277: }
278:
279: } else {
280:
281: TapeExtension->FirmwareError = NoErr;
282:
283: }
284:
285: if (TapeExtension->FirmwareError) {
286:
287: if ((TapeExtension->FirmwareError == Cmd_in_Rpt) &&
288: ESD_Retry) {
289:
290: ESD_Retry = FALSE;
291: repeatReport = TRUE;
292:
293: } else {
294:
295: return(Q117iConvertFirmwareError(
296: TapeExtension->FirmwareError));
297:
298: }
299: }
300: }
301:
302: } while (repeatReport);
303:
304: if (newCart) {
305:
306: TapeExtension->PersistentNewCart = TRUE;
307:
308: }
309:
310:
311: if (TapeExtension->Found) {
312:
313: if (!drvStat.CartPresent) {
314:
315: return(NoTape);
316:
317: }
318:
319: if (newCart) {
320:
321: return(NewCart);
322:
323: }
324: }
325:
326: return(retval);
327: }
328:
329:
330: STATUS
331: Q117iReport(
332: IN OUT PTAPE_EXTENSION TapeExtension,
333: IN CHAR Command,
334: IN USHORT *ReportData,
335: IN SHORT ReportSize,
336: IN OUT CHAR *EsdRetry
337: )
338:
339: /*++
340:
341: Routine Description:
342:
343: Send a report command to the tape drive and get the response data. If
344: a communication failure occurs, then we assume that it is a result of
345: an ESD hit and retry the communication.
346:
347: Arguments:
348:
349: TapeExtension -
350:
351: Command -
352:
353: ReportData -
354:
355: ReportSize -
356:
357: EsdRetry -
358:
359: Return Value:
360:
361: --*/
362:
363: {
364: SHORT i = 0;
365: STATUS ret;
366: STATUS ret1 = NoErr;
367:
368: do {
369:
370: if (TapeExtension->QControllerData->EndFormatMode) {
371:
372: TapeExtension->QControllerData->EndFormatMode = FALSE;
373: ret = NoErr;
374:
375: } else {
376:
377: ret = Q117iSendByte(TapeExtension, Command);
378:
379: }
380:
381: if (ret == NoErr) {
382:
383: if ((ret = Q117iReceiveByte(TapeExtension, ReportSize, ReportData))
384: != NoErr) {
385:
386: if ((ret == DriveFlt) ||
387: (TapeExtension->FirmwareError == Xmit_Overrun)) {
388:
389: if (EsdRetry != NULL) {
390:
391: *EsdRetry = TRUE;
392: ret1 = Q117iSelectDrive(TapeExtension);
393:
394: }
395: }
396: }
397: }
398:
399: } while (++i < REPORT_RPT && ret != NoErr && ret1 == NoErr);
400:
401: if (ret1 != NoErr) {
402:
403: return(ret1);
404:
405: } else {
406:
407: return(ret);
408:
409: }
410: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.