Annotation of researchv10dc/cmd/oworm/oscsi/drdiag.c, revision 1.1

1.1     ! root        1: #include       "scsi.h"
        !             2: 
        !             3: static
        !             4: drdiag1(drive, lower, o)
        !             5:        struct scsi_o *o;
        !             6: {
        !             7:        struct scsi_i input;
        !             8:        int i, n;
        !             9:        struct scsi_o output;
        !            10: 
        !            11:        input.bus_id = 1<<scsi_id;
        !            12:        input.cmd[0] = 0x1D;
        !            13:        input.cmd[1] = drive<<5;
        !            14:        input.cmd[2] = 0;
        !            15:        input.cmd[3] = 0;
        !            16:        input.cmd[4] = 10;
        !            17:        input.cmd[5] = 0;
        !            18:        input.data[0] = 0x18;   /* drive diagnostic */
        !            19:        input.data[1] = lower? 2:1;
        !            20:        input.data[2] = 0;
        !            21:        input.data[3] = 0;
        !            22:        input.data[4] = 0;
        !            23:        input.data[5] = 0;
        !            24:        input.data[6] = 0;
        !            25:        input.data[7] = 0;
        !            26:        input.data[8] = 0;
        !            27:        input.data[9] = 0;
        !            28:        if(scsiio(&input, o, 10, "drdiag") < 0)
        !            29:                return(1);
        !            30:        for(i = 0; i < 15; i++){
        !            31:                s_sense(drive, 1);
        !            32:                sleep(2);
        !            33:        }
        !            34:        s_diag(drive, 256, o);
        !            35:        if(CHECK(*o)){
        !            36:                scsidump(o);
        !            37:                return(1);
        !            38:        }
        !            39:        return(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: static char *cmesg[256] =
        !            52: {
        !            53:        0
        !            54: };
        !            55: static char *testn[10] =
        !            56: {
        !            57:        "drive on/off",
        !            58:        "read disk id",
        !            59:        "move",
        !            60:        "seek",
        !            61:        "blank sector search",
        !            62:        "written sector search",
        !            63:        "search writable area",
        !            64:        "write",
        !            65:        "ECC margin check",
        !            66:        "read data compare"
        !            67: };
        !            68: 
        !            69: s_drdiag(drive)
        !            70: {
        !            71:        struct scsi_o o;
        !            72:        int i;
        !            73:        register unsigned char *d;
        !            74:        char buf[256];
        !            75:        int lower;
        !            76: 
        !            77:        if(s_istatus(drive, &o))
        !            78:                return(1);
        !            79:        if((o.data[100]&0x80) && (drive == (o.data[100]&7)))
        !            80:                lower = 0;
        !            81:        else if((o.data[101]&0x80) && (drive == (o.data[101]&7)))
        !            82:                lower = 1;
        !            83:        else {
        !            84:                fprint(2, "drive %d not occupied\n", drive);
        !            85:                return(1);
        !            86:        }
        !            87:        Fprint(1, "drive %d[%ser]: drive diagnostic\n", drive, lower?"low":"upp");
        !            88:        Fflush(1);
        !            89:        if(drdiag1(drive, lower, &o))
        !            90:                return(1);
        !            91:        d = o.data;
        !            92:        if(d[1]&0x80)
        !            93:                Fprint(1, "diagnostic not performed: %s\n", msg1[d[1]&0xF]);
        !            94:        else {
        !            95:                Fprint(1, "diagnostic result:");
        !            96:                if((d[1]&0x70) == 0)
        !            97:                        Fprint(1, "no faults");
        !            98:                if(d[1]&0x10)
        !            99:                        Fprint(1, " controller-fault");
        !           100:                if(d[1]&0x20)
        !           101:                        Fprint(1, " drive-fault");
        !           102:                if(d[1]&0x10)
        !           103:                        Fprint(1, " disk-fault");
        !           104:                Fprint(1, " (last error code 0x%2.2ux)\n", d[4]);
        !           105:        }
        !           106:        if(cmesg[0] == 0){
        !           107:                for(i = 0; i < 256; i++){
        !           108:                        sprint(buf, "error code 0x%x", i);
        !           109:                        cmesg[i] = strdup(buf);
        !           110:                }
        !           111:                cmesg[0] = "good";
        !           112:                cmesg[0xE0] = "test not done";
        !           113:                cmesg[0xFE] = "drive not ready (no disk)";
        !           114:                cmesg[0xFF] = "not connected or power off";
        !           115:                cmesg[0xEE] = "diagnostic could not be done";
        !           116:        }
        !           117:        for(i = 0; i < 10; i++)
        !           118:                Fprint(1, "test %d %s: %s\n", i, testn[i], cmesg[d[i*8+drive+8]]);
        !           119:        Fprint(1, "diagnostic count:");
        !           120:        for(i = 104; i < 120; i++)
        !           121:                Fprint(1, " %2.2ux", d[i]);
        !           122:        Fprint(1, "\n");
        !           123:        Fflush(1);
        !           124:        return(0);
        !           125: }

unix.superglobalmegacorp.com

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