Annotation of researchv10dc/cmd/worm/oscsi/sony/internal.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.