|
|
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.