Annotation of 42BSD/sys/stand/idc.c, revision 1.1.1.1

1.1       root        1: /*     idc.c   6.1     83/07/29        */
                      2: 
                      3: /*
                      4:  * IDC (RB730)
                      5:  */
                      6: #include "../machine/pte.h"
                      7: 
                      8: #include "../h/param.h"
                      9: #include "../h/inode.h"
                     10: #include "../h/fs.h"
                     11: 
                     12: #include "../vaxuba/idcreg.h"
                     13: #include "../vaxuba/ubareg.h"
                     14: 
                     15: #include "saio.h"
                     16: #include "savax.h"
                     17: 
                     18: u_short        idcstd[] = { 0175606 };
                     19: short  rb02_off[] = { 0, 400, 0, -1, -1, -1, -1, -1 };
                     20: short  rb80_off[] = { 0, 37, 0, -1, -1, -1, 115, 305 };
                     21: 
                     22: int idc_type[4];
                     23: 
                     24: idcopen(io)
                     25:        register struct iob *io;
                     26: {
                     27:        register struct idcdevice *idcaddr;
                     28:        register int i;
                     29: 
                     30:        idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_unit) + 0x200);
                     31:        if (io->i_boff < 0 || io->i_boff > 7)
                     32:                _stop("idc bad unit");
                     33:        idcaddr->idcmpr = IDCGS_GETSTAT;
                     34:        idcaddr->idccsr = IDC_GETSTAT|(io->i_unit<<8);
                     35:        idcwait(idcaddr);
                     36:        i = idcaddr->idcmpr;
                     37:        idcaddr->idccsr = IDC_CRDY|(1<<(io->i_unit+16));
                     38:        idcwait(idcaddr);
                     39:        idcaddr->idccsr = (io->i_unit<<8)|IDC_RHDR;
                     40:        idcwait(idcaddr);
                     41:        if (idcaddr->idccsr & IDC_ERR) {
                     42:                printf("idc error: idccsr %x\n", idcaddr->idccsr);
                     43:                _stop("idc fatal error");
                     44:        }
                     45:        i = idcaddr->idcmpr;
                     46:        i = idcaddr->idcmpr;
                     47:        if (idcaddr->idccsr & IDC_R80) {
                     48:                idc_type[io->i_unit] = 1;
                     49:                io->i_boff = rb80_off[io->i_boff];
                     50:        } else {
                     51:                idc_type[io->i_unit] = 0;
                     52:                io->i_boff = rb02_off[io->i_boff];
                     53:        }
                     54:        if (io->i_boff < 0)
                     55:                _stop("idc%d: bad unit type", io->i_unit);
                     56: }
                     57: 
                     58: idcstrategy(io, func)
                     59:        register struct iob *io;
                     60: {
                     61:        register struct idcdevice *idcaddr;
                     62:        int com;
                     63:        daddr_t bn;
                     64:        short dn, cn, sn, tn;
                     65:        short ccleft, thiscc = 0;
                     66:        int ubinfo, errcnt = 0;
                     67: 
                     68:        idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_unit) + 0x200);
                     69:        ubinfo = ubasetup(io, 1);
                     70:        bn = io->i_bn;
                     71:        ccleft = io->i_cc;
                     72: retry:
                     73:        dn = io->i_unit;
                     74:        if (idc_type[dn]) {
                     75:                cn = bn/(NRB80SECT*NRB80TRK);
                     76:                sn = bn%NRB80SECT;
                     77:                tn = (bn / NRB80SECT) % NRB80TRK;
                     78:                thiscc = (NRB80SECT - sn) * 512;
                     79:        } else {
                     80:                cn = 2*bn/(NRB02SECT*NRB02TRK);
                     81:                sn = (2*bn)%NRB02SECT;
                     82:                tn = (2*bn / NRB02SECT) % NRB02TRK;
                     83:                thiscc = (NRB02SECT - sn) * 256;
                     84:        }
                     85:        thiscc = MIN(thiscc, ccleft);
                     86:        ccleft -= thiscc;
                     87:        cn += io->i_boff;
                     88:        idcaddr->idccsr = IDC_CRDY|IDC_SEEK|(dn<<8)|(1<<(dn+16));
                     89:        idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
                     90:        idcaddr->idccsr = IDC_SEEK|(dn<<8);
                     91:        idcwait(idcaddr);
                     92:        idcaddr->idccsr &= ~IDC_ATTN;
                     93:        com = dn<<8;
                     94:        if (func == READ)
                     95:                com |= IDC_READ;
                     96:        else
                     97:                com |= IDC_WRITE;
                     98:        idcaddr->idccsr = IDC_CRDY|com;
                     99:        idcaddr->idcbar = ubinfo&0x3ffff;
                    100:        idcaddr->idcbcr = -thiscc;
                    101:        idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
                    102:        idcaddr->idccsr = com;
                    103:        idcwait(idcaddr);
                    104:        if (idcaddr->idccsr & IDC_ERR) {
                    105:                printf("idc error: (cyl,trk,sec)=(%d,%d,%d) csr=%b\n",
                    106:                    cn, tn, sn, idcaddr->idccsr, IDCCSR_BITS);
                    107:                if (errcnt == 10) {
                    108:                        printf("idc: unrecovered error\n");
                    109:                        ubafree(io, ubinfo);
                    110:                        return (-1);
                    111:                }
                    112:                errcnt++;
                    113:                goto retry;
                    114:        }
                    115:        if (errcnt)
                    116:                printf("idc: recovered by retry\n");
                    117:        if (ccleft) {
                    118:                bn += thiscc/NBPG;
                    119:                ubinfo += thiscc;
                    120:                goto retry;
                    121:        }
                    122:        ubafree(io, ubinfo);
                    123:        return (io->i_cc);
                    124: }
                    125: 
                    126: idcwait(idcaddr)
                    127:        register struct idcdevice *idcaddr;
                    128: {
                    129:        register int i;
                    130: 
                    131:        while ((idcaddr->idccsr & (IDC_CRDY|IDC_DRDY)) != (IDC_CRDY|IDC_DRDY))
                    132:                for (i = 10; i; i--)
                    133:                        ;
                    134: }
                    135: 
                    136: /*ARGSUSED*/
                    137: idcioctl(io, cmd, arg)
                    138:        struct iob *io;
                    139:        int cmd;
                    140:        caddr_t arg;
                    141: {
                    142: 
                    143:        return (ECMD);
                    144: }

unix.superglobalmegacorp.com

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