Annotation of researchv10no/cmd/worm/scsi/sony/internal.c, revision 1.1

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

unix.superglobalmegacorp.com

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