Annotation of researchv10dc/cmd/oworm/scsi/init.c, revision 1.1.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.