Annotation of researchv10dc/cmd/oworm/scsi/internal.c, revision 1.1

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

unix.superglobalmegacorp.com

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