|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "../scsi.h" ! 3: #include "../scsish.h" ! 4: #include "../tcl.h" ! 5: #include "fns.h" ! 6: ! 7: static ! 8: internal(int n, int b1, int nb, struct scsi_return *ret, char *err) ! 9: { ! 10: struct scsi_cmd cmd; ! 11: ! 12: set6(cmd, 0x1D, b1, 0, 0, 10, 0); ! 13: setlongtimeout(&cmd); ! 14: cmd.data[0] = n; ! 15: cmd.data[1] = b1>>8; ! 16: cmd.data[2] = 0; ! 17: cmd.data[3] = 0; ! 18: cmd.data[4] = 0; ! 19: cmd.data[5] = 0; ! 20: cmd.data[6] = 0; ! 21: cmd.data[7] = 0; ! 22: cmd.data[8] = 0; ! 23: cmd.data[9] = 0; ! 24: if(n = s_io(0, &cmd, 10, ret, 0, err)) ! 25: return(n); ! 26: setdiag(cmd, 0, nb); ! 27: if(n = s_io(0, &cmd, 0, ret, nb, err)) ! 28: return(n); ! 29: return(0); ! 30: } ! 31: ! 32: static char *cmds[] = { ! 33: "internal command table", ! 34: "error information table", ! 35: "arm controller diagnostics", ! 36: "scsi control board diagnostics", ! 37: "drive controller diagnostics", ! 38: "jukebox status", ! 39: 0 ! 40: }; ! 41: ! 42: static char *msg1[16] = ! 43: { ! 44: "drive not connected or powered off", ! 45: "drive connected but no disk", ! 46: "diagnostic aborted: write-protect", ! 47: "diagnostic aborted: write area full", ! 48: "urk 4", "urk 5", "urk 6", "urk 7", "urk 8", "urk 9", "urk 10", ! 49: "urk 11", "urk 12", "urk 13", "urk 14", "urk 15" ! 50: }; ! 51: ! 52: static char *testn[10] = ! 53: { ! 54: "drive on/off", ! 55: "read disk id", ! 56: "move", ! 57: "seek", ! 58: "blank sector search", ! 59: "written sector search", ! 60: "search writable area", ! 61: "write", ! 62: "ECC margin check", ! 63: "read data compare" ! 64: }; ! 65: ! 66: int ! 67: sony_internal(ClientData cd, Tcl_Interp *it, int argc, char **argv) ! 68: { ! 69: struct scsi_cmd cmd; ! 70: struct scsi_return ret; ! 71: register unsigned char *d; ! 72: int i, drive, lower, arg, j; ! 73: long t1, t2; ! 74: char c; ! 75: extern char *cmesg[]; ! 76: extern char *i0com[], *i1err[], *scsicmd[], *busid[], *scsiident[]; ! 77: ! 78: if(argc <= 1){ ! 79: printf("available internal commands:\n"); ! 80: for(i = 0; cmds[i]; i++) ! 81: printf("\tinternal %d: %s\n", i, cmds[i]); ! 82: return(TCL_OK); ! 83: } ! 84: switch(arg = atoi(argv[1])) ! 85: { ! 86: case 0: ! 87: if(internal(0xE5, 0, 256, &ret, cd->err)) ! 88: ERR_RETURN ! 89: printf("internal 0 (%s):\n", cmds[arg]); ! 90: printf("Diagnostic #E5: last 16 internal tasks (drive,shelf)\n"); ! 91: for(i = 0, d = ret.data; i < 16; i++, d += 16){ ! 92: printf("[%d] %s (%d,%d) ", ! 93: d[0], i0com[d[1]], d[2], d[3]); ! 94: c = '['; ! 95: for(j = 0; j < 16; j += 4){ ! 96: printf("%c#%x#%x#%x#%x", c, d[j], d[j+1], d[j+2], d[j+3]); ! 97: c = ' '; ! 98: } ! 99: printf("]\n"); ! 100: } ! 101: break; ! 102: case 1: ! 103: if(internal(0xE4, 0, 256, &ret, cd->err)) ! 104: ERR_RETURN ! 105: printf("internal 1 (%s):\n", cmds[arg]); ! 106: printf("Diagnostic #E4: last 16 errors; initiator[identify] error[sense] (cmd)\n"); ! 107: for(i = 0, d = ret.data; i < 16; i++, d += 16){ ! 108: printf("%s[%s]: %s[#%x] (%s) ", ! 109: busid[d[0]], scsiident[d[1]], i1err[d[14]], d[15], scsicmd[d[4]]); ! 110: c = '['; ! 111: for(j = 0; j < 16; j += 4){ ! 112: printf("%c#%x#%x#%x#%x", c, d[j], d[j+1], d[j+2], d[j+3]); ! 113: c = ' '; ! 114: } ! 115: printf("]\n"); ! 116: } ! 117: break; ! 118: case 2: ! 119: printf("internal 2 (%s):\n", cmds[arg]); ! 120: fflush(stdout); ! 121: time(&t1); ! 122: if(internal(0x90, 0, 8, &ret, cd->err)) ! 123: ERR_RETURN ! 124: time(&t2); ! 125: d = ret.data; ! 126: if(d[0] == 0) ! 127: printf("\tended normally"); ! 128: else ! 129: printf("\tfailed, error codes=#%x, #%x, #%x", ! 130: d[0], d[1], d[2]); ! 131: printf(" (time: %lds)\n", t2-t1); ! 132: break; ! 133: case 3: ! 134: printf("internal 3 (%s):\n", cmds[arg]); ! 135: fflush(stdout); ! 136: time(&t1); ! 137: if(internal(0xe0, 0, 8, &ret, cd->err)) ! 138: ERR_RETURN ! 139: time(&t2); ! 140: d = ret.data; ! 141: if(d[0] == 0) ! 142: printf("\tended normally"); ! 143: else ! 144: printf("\tfailed, error codes=#%x, #%x, #%x", ! 145: d[0], d[1], d[2]); ! 146: printf(" (time: %lds)\n", t2-t1); ! 147: break; ! 148: case 4: ! 149: drive = (argc >= 3)? atoi(argv[2]) : 0; ! 150: if(sony_istatus(&ret, cd->err)) ! 151: ERR_RETURN ! 152: if((ret.data[100]&0x80) && (drive == (ret.data[100]&7))) ! 153: lower = 0x100; ! 154: else if((ret.data[101]&0x80) && (drive == (ret.data[101]&7))) ! 155: lower = 0x200; ! 156: else { ! 157: fprintf(stderr, "drive %d not occupied\n", drive); ! 158: ERR_RETURN ! 159: } ! 160: printf("drive %d[%ser]: %s\n", drive, (lower == 0x200)?"low":"upp", cmds[arg]); ! 161: fflush(stdout); ! 162: time(&t1); ! 163: if(internal(0x18, lower, 256, &ret, cd->err)) ! 164: ERR_RETURN ! 165: time(&t2); ! 166: d = ret.data; ! 167: if(d[1]&0x80){ ! 168: printf("diagnostic result:"); ! 169: if((d[1]&0x70) == 0) ! 170: printf(" no faults"); ! 171: else { ! 172: if(d[1]&0x10) ! 173: printf(" controller-fault"); ! 174: if(d[1]&0x20) ! 175: printf(" drive-fault"); ! 176: if(d[1]&0x10) ! 177: printf(" disk-fault"); ! 178: printf(" (last error code 0x%2.2ux)", d[4]); ! 179: } ! 180: } else ! 181: printf("diagnostic not performed: %s", msg1[d[1]&0xF]); ! 182: printf(" (time: %lds)\n", t2-t1); ! 183: for(i = 0; i < 10; i++) ! 184: printf("test %d[%s]: %s\n", i, testn[i], cmesg[d[i*8+drive+8]]); ! 185: printf("diagnostic count (drive:avail):"); ! 186: for(d += 104, i = 0; i < 8; i++, d += 2) ! 187: printf(" %d:%d", i, d[0]+d[1]*256); ! 188: printf("\n"); ! 189: break; ! 190: case 5: ! 191: set10(cmd, 0xD3, 0, 0, 0, 0, 0, 0, 0, 0, 0); ! 192: if(s_io(0, &cmd, 0, &ret, 20, cd->err)) ! 193: ERR_RETURN ! 194: printf("%s: component(fatal err/err/cmds)\n", cmds[arg]); ! 195: d = ret.data; ! 196: #define ONE(str, x, sep) printf("%s(%d/%d/%d)%c", str, d[x+3], d[x+2], d[x+1]+256*d[x], sep) ! 197: ! 198: ONE("upper drive", 4, ' '); ! 199: ONE("lower drive", 8, ' '); ! 200: ONE("sys control", 12, ' '); ! 201: printf("backup mem(0/%d/%d)\n", d[19]+256*d[18], d[17]+256*d[16]); ! 202: break; ! 203: } ! 204: return(TCL_OK); ! 205: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.