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

1.1     ! root        1: #include       "scsi.h"
        !             2: 
        !             3: #define        DEV     "/dev/scsi"
        !             4: 
        !             5: static char *regname[][2] =
        !             6: {
        !             7:        "??", "",
        !             8:        "sa", "mscp",
        !             9:        "csr", "per"
        !            10: };
        !            11: 
        !            12: int scsi_fd;
        !            13: int scsi_id;
        !            14: int scsi_verbose;
        !            15: int scsi_shush;
        !            16: 
        !            17: scsiinit(complain)
        !            18: {
        !            19:        scsi_shush = 0;
        !            20:        if((scsi_fd = open(DEV, 2)) < 0){
        !            21:                if(complain)
        !            22:                        perror(DEV);
        !            23:                return(1);
        !            24:        }
        !            25:        return(0);
        !            26: }
        !            27: 
        !            28: scsiid(id)
        !            29: {
        !            30:        scsi_id = id;
        !            31: }
        !            32: 
        !            33: scsiclro(o)
        !            34:        register struct scsi_o *o;
        !            35: {
        !            36:        extern char *memset();
        !            37:        memset((char *)o, 0xDD, sizeof(*o));
        !            38: }
        !            39: 
        !            40: tdreg(fd, sa, mscp)
        !            41: {
        !            42:        char buf[256];
        !            43:        extern char *strcat();
        !            44: 
        !            45: #define        add(x)  strcat(buf, x)
        !            46: 
        !            47:        buf[0] = 0;
        !            48:        if(mscp&0x8000) add(", host buffer access");
        !            49:        if(mscp&0x2000) add(", SCSI bus hung");
        !            50:        if(mscp&0x1000) add(", resettable bad bus phase");
        !            51:        if(mscp&0x0800) add(", select timeout");
        !            52:        if(mscp&0x0200) add(", parity error");
        !            53:        switch(mscp&0x3F)
        !            54:        {
        !            55:        case 011:       add(", dma error"); break;
        !            56:        case 012:       add(", controller error"); break;
        !            57:        default:        add(", bad mscp error code!!"); break;
        !            58:        }
        !            59:        if(buf[0] == 0)
        !            60:                fprint(fd, "mscp: zero");
        !            61:        else {
        !            62:                fprint(fd, "mscp:%s", &buf[1]);
        !            63:        }
        !            64:        fprint(fd, "; ");
        !            65:        fprint(fd, "sa: %hux\n", sa);
        !            66: }
        !            67: 
        !            68: #define                CSR_DONE        0x8000
        !            69: #define                CSR_ERROR       0x1000
        !            70: #define                CSR_R           0x0020
        !            71: #define                CSR_M           0x0010
        !            72: #define                CSR_I           0x0008
        !            73: #define                CSR_C           0x0004
        !            74: #define                CSR_S           0x0002
        !            75: #define                CSR_B           0x0001
        !            76: #define                CSR_BITS        (CSR_DONE|CSR_ERROR|CSR_R|CSR_M|CSR_I|CSR_C|CSR_S|CSR_B)
        !            77: 
        !            78: #define                PER_CHECK       0x2000
        !            79: #define                PER_DRBUSY      0x1000
        !            80: #define                PER_SBUSY       0x0040
        !            81: #define                PER_SELECT      0x0010
        !            82: 
        !            83: usreg(fd, csr, per)
        !            84: {
        !            85:        char buf[256];
        !            86:        extern char *strcat();
        !            87: 
        !            88:        buf[0] = 0;
        !            89:        if(csr&CSR_DONE) add(", i/o done");
        !            90:        if(csr&CSR_ERROR) add(", error");
        !            91:        if(csr&CSR_R) add(", request active");
        !            92:        if(csr&CSR_M) add(", message active");
        !            93:        if(csr&CSR_I) add(", i/o active");
        !            94:        if(csr&CSR_C) add(", c/d active");
        !            95:        if(csr&CSR_S) add(", select active");
        !            96:        if(csr&CSR_B) add(", busy active");
        !            97:        if(buf[0] == 0)
        !            98:                fprint(fd, "CSR: zero");
        !            99:        else {
        !           100:                fprint(fd, "CSR:%s", &buf[1]);
        !           101:                if(csr&!CSR_BITS)
        !           102:                        fprint(fd, " BAD BITS SET 0x%ux", csr&!CSR_BITS);
        !           103:        }
        !           104:        fprint(fd, "; ");
        !           105:        buf[0] = 0;
        !           106:        if(per&PER_CHECK) add(", check status");
        !           107:        if(per&PER_DRBUSY) add(", drive busy");
        !           108:        if(per&PER_SBUSY) add(", busy timeout");
        !           109:        if(per&PER_SELECT) add(", select timeout");
        !           110:        if(buf[0] == 0)
        !           111:                fprint(fd, "PER: zero\n");
        !           112:        else
        !           113:                fprint(fd, "PER:%s\n", &buf[1]);
        !           114: }
        !           115: 
        !           116: scsidump(o)
        !           117:        register struct scsi_o *o;
        !           118: {
        !           119:        extern char *exstab[], *smsg[];
        !           120: 
        !           121:        Fprint(1, "%s=0x%uhx %s=0x%uhx status=0x%uhx(%s) message=0x%uhx\n",
        !           122:                regname[o->type][0], o->reg1, regname[o->type][1], o->reg2,
        !           123:                o->scsistatus, smsg[(o->scsistatus>>1)&0xF], o->scsimesg);
        !           124:        Fprint(1, "data=0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", o->data[0],
        !           125:                o->data[1], o->data[2], o->data[3], o->data[4], o->data[5],
        !           126:                o->data[6], o->data[7], o->data[8], o->data[9], o->data[10],
        !           127:                o->data[11]);
        !           128:        if(o->data[0] == 0x70)
        !           129:                Fprint(1, " (extended sense: %s)", exstab[o->data[2]&0xF]);
        !           130:        Fprint(1, "\n");
        !           131: }
        !           132: 
        !           133: prcheck(fd, o)
        !           134:        register struct scsi_o *o;
        !           135: {
        !           136:        int ot;
        !           137:        extern char *exstab[], *smsg[];
        !           138: 
        !           139:        ot = o->type;
        !           140:        if((ot < 0) || (ot > 2)) ot = 0;
        !           141:        Fprint(fd, "%s=0x%uhx %s=0x%uhx status=0x%uhx(%s)",
        !           142:                regname[ot][0], o->reg1, regname[ot][1], o->reg2,
        !           143:                o->scsistatus, smsg[(o->scsistatus>>1)&0xF]);
        !           144:        if(o->data[0] == 0x70)
        !           145:                Fprint(fd, " (ext: %s)", exstab[o->data[2]&0xF]);
        !           146:        Fputc(fd, '\n');
        !           147: }
        !           148: 
        !           149: scsiio(i, icnt, o, ocnt, str)
        !           150:        struct scsi_i *i;
        !           151:        struct scsi_o *o;
        !           152:        char *str;
        !           153: {
        !           154:        int n, loop;
        !           155: 
        !           156:        for(loop = 0; loop < 20; loop++){
        !           157:                if((n = write(scsi_fd, (char *)i, INN(icnt))) != INN(icnt)){
        !           158:                        perror("write");
        !           159:                        fprint(2, "%s: wrote %d, really wrote %d\n", str, INN(icnt), n);
        !           160:                        return(-1);
        !           161:                }
        !           162:                scsiclro(o);
        !           163:                if((n = read(scsi_fd, (char *)o, OUTN(ocnt))) != OUTN(ocnt)){
        !           164:                        if((n == 8) && (o->scsistatus == 8))
        !           165:                                continue;
        !           166:                        if(!scsi_shush){
        !           167:                                if(n < 0)
        !           168:                                        perror("read");
        !           169:                                fprint(2, "%s: wanted %d, got %d\n", str, OUTN(ocnt), n);
        !           170:                                prcheck(2, o);
        !           171:                                Fflush(2);
        !           172:                        }
        !           173:                        if(n < 0)
        !           174:                                switch(o->type)
        !           175:                                {
        !           176:                                case TD_VIKING: tdreg(2, o->reg1, o->reg2); break;
        !           177:                                case USD_1158:  usreg(2, o->reg1, o->reg2); break;
        !           178:                                default:        fprint(2, "BAD board type %d\n", o->type); break;
        !           179:                                }
        !           180:                        return(-1);
        !           181:                }
        !           182:                if(o->scsistatus == 0)
        !           183:                        break;
        !           184:        }
        !           185:        return(0);
        !           186: }

unix.superglobalmegacorp.com

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