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