Annotation of researchv8dc/sys/dev/an.c, revision 1.1.1.1

1.1       root        1: #include "an.h"
                      2: #if NAN > 0
                      3: 
                      4: #include "../h/param.h"
                      5: #include "../h/systm.h"
                      6: #include "../h/buf.h"
                      7: #include "../h/conf.h"
                      8: #include "../h/dir.h"
                      9: #include "../h/user.h"
                     10: #include "../h/pte.h"
                     11: #include "../h/map.h"
                     12: #include "../h/vm.h"
                     13: #include "../h/anet.h"
                     14: #include "../h/cmap.h"
                     15: #include "../h/ubareg.h"
                     16: #include "../h/ubavar.h"
                     17: #include "../h/cpu.h"
                     18: #include "../h/proc.h"
                     19: #include "../h/status.h"
                     20: 
                     21: 
                     22: #ifdef ANDEBUG
                     23: int andebug = 1;
                     24: #else
                     25: int andebug = 0;
                     26: #endif
                     27: 
                     28: /* flags for status */
                     29: #define INPUT  1
                     30: #define OUTPUT 2
                     31: 
                     32: #define min(x,y) ((x) < (y) ? (x) : (y))
                     33: #define        swab(x) (((x<<8) | ((x&0xFF00)>>8)) & 0xFFFF)
                     34: 
                     35: #define ANPRI  28
                     36: 
                     37: struct device {
                     38:        short drcs;
                     39:        short drout;
                     40:        short drin;
                     41: };
                     42: 
                     43: /* Command and Status word */
                     44: #define CSR0 0x1
                     45: #define CSR1 0x2
                     46: #define RIE 0x20
                     47: #define TIE 0x40
                     48: #define TEMPTY 0x80
                     49: #define RFULL 0x8000
                     50: 
                     51: /*
                     52:  *     CSR1 CSR0
                     53:  *      0    0         Write Data
                     54:  *      0    1         Write EOP
                     55:  *      1    0         Write Command
                     56:  *      1    1         Read Status
                     57:  */
                     58: #define DATA_MODE      (RIE)
                     59: #define EOP_MODE       (CSR0 | RIE)
                     60: #define CMD_MODE       (CSR1 | RIE)
                     61: #define STATUS_MODE    (CSR0 | CSR1 | RIE)
                     62: 
                     63: #define MAXMSGLEN 2042
                     64: #define        IBUF    1
                     65: #define        OBUF    2
                     66: 
                     67: struct an_dev {
                     68:        char open;
                     69:        char flag;
                     70:        short uid;
                     71:        short icnt, ocnt;
                     72:        short ibuf[MAXMSGLEN/2];
                     73:        short obuf[MAXMSGLEN/2];
                     74: } an_dev[NAN];
                     75: 
                     76: #ifdef TIMEOUT
                     77: #define CKFUZZ         4       /* number of timeouts we wait for a response */
                     78: #define CKTICKS        (hz/4)  /* number of ticks per timeout */
                     79: 
                     80: int an_state;
                     81: #define        OPEN 1          /* set if at least one sn? is open */
                     82: #define        TIMER 2         /* set if at timer is running */
                     83: 
                     84: int cktimchk();
                     85: int an_opncnt;
                     86: #endif TIMEOUT
                     87: 
                     88: /*struct anmach anmach[8] = {
                     89:        { 1, 255 },
                     90:        { 2, 254 },
                     91:        { 3, 253 },
                     92:        { 4, 252 },
                     93:        { 5, 251 },
                     94:        { 6, 250 },
                     95:        { 7, 249 },
                     96:        { 8, 248 } };*/
                     97: 
                     98: #define RETURN(x)      {u.u_error = x; return(0);}
                     99: 
                    100: int    anprobe(), anattach();
                    101: struct uba_device *andinfo[NAN];
                    102: u_short        anstd[] = {0};
                    103: struct uba_driver andriver =
                    104:        { anprobe, 0, anattach, 0, anstd, "an", andinfo};
                    105: 
                    106: anprobe(reg)
                    107: caddr_t reg;
                    108: {
                    109:        register int br, cvec;  /* value result */
                    110: 
                    111:        br = 0x15;
                    112:        cvec = 0510;
                    113:        return(1);
                    114: }
                    115: 
                    116: anattach()
                    117: {
                    118:        register struct device *draddr;
                    119:        register struct uba_device *ui;
                    120: 
                    121:        ui = andinfo[0];
                    122:        draddr = (struct device *)ui->ui_addr;
                    123:        draddr->drcs = CMD_MODE;
                    124:        draddr->drout = 0;
                    125:        draddr->drout = MASTER_CLEAR;
                    126:        draddr->drout = 0;
                    127:        draddr->drout = BOARD_RESET;
                    128:        draddr->drout = 0;
                    129:        draddr->drcs = STATUS_MODE;
                    130:        printf("S/NET BIB #%d\n", (draddr->drin>>10)&0xF);
                    131: 
                    132: }
                    133: 
                    134: /*
                    135:        open the argus network
                    136: */
                    137: 
                    138: anopen(dev)
                    139:        register dev_t dev;
                    140: {
                    141:        register struct device *draddr;
                    142:        register struct an_dev *an;
                    143:        register struct uba_device *ui;
                    144:        int net = NET(dev);
                    145: 
                    146:        if(andebug)
                    147:                printf("anopen(%x)\n", dev);
                    148:        if(net >= NAN || (ui = andinfo[net]) == 0 || ui->ui_alive == 0)
                    149:                RETURN(ENXIO);
                    150:        draddr = (struct device *)ui->ui_addr;
                    151: 
                    152:        an = &an_dev[net];
                    153:        spl6();
                    154:        if (an->open++ != 0) {
                    155:                spl0();
                    156:                RETURN(EBUSY);
                    157:        }
                    158:        an->uid = u.u_uid;
                    159: #ifdef TIMEOUT
                    160:        sn_opncnt++;
                    161:        sn_state |= OPEN;
                    162:        if ((sn_state & TIMER) == 0) {
                    163:                sn_state |= TIMER;
                    164:                timeout(cktimchk, (caddr_t)0, CKTICKS);
                    165:        }
                    166: #endif TIMEOUT
                    167:        draddr->drcs = CMD_MODE;
                    168:        draddr->drout = 0;
                    169:        draddr->drout = BOARD_RESET;
                    170:        draddr->drout = 0;
                    171:        draddr->drcs = DATA_MODE;
                    172: 
                    173:        spl0();
                    174:        return(1);
                    175: }
                    176: 
                    177: anclose(dev)
                    178: {
                    179:        struct uba_device *ui;
                    180:        register struct an_dev *an;
                    181:        int net = NET(dev);
                    182:        
                    183:        if(andebug)
                    184:                printf("anclose(%x)\n", dev);
                    185:        if(net >= NAN)
                    186:                RETURN(ENXIO)
                    187:        an = &an_dev[net];
                    188:        spl6();
                    189:        an->open = 0;
                    190:        spl0();
                    191: }
                    192: 
                    193: anread(dev)
                    194:        dev_t dev;
                    195: {
                    196:        int net;
                    197:        register struct device *draddr;
                    198:        register struct an_dev *an;
                    199:        register struct uba_device *ui;
                    200:        short stat;
                    201: 
                    202:        net = NET(dev);
                    203:        if(net >= NAN)
                    204:                RETURN(ENXIO)
                    205:        ui = andinfo[net];
                    206:        draddr = (struct device *)ui->ui_addr;
                    207:        an = &an_dev[net];
                    208:        if(an->open == 0) RETURN(ENXIO)
                    209:        spl6();
                    210:        if((an->flag&IBUF) == 0)
                    211:                RETURN(EIO);
                    212:        if(copyout(an->ibuf, u.u_base, an->icnt))
                    213:        {
                    214:                spl0();
                    215:                RETURN(EFAULT);
                    216:        }
                    217:        u.u_count -= an->icnt;
                    218:        an->flag &= ~IBUF;
                    219:        spl0();
                    220: }
                    221: 
                    222: anwrite(dev)
                    223:        dev_t dev;
                    224: {
                    225:        int net;
                    226:        register struct device *draddr;
                    227:        register struct an_dev *an;
                    228:        register struct uba_device *ui;
                    229:        short stat;
                    230: 
                    231:        net = NET(dev);
                    232:        if(net >= NAN)
                    233:                RETURN(ENXIO)
                    234:        ui = andinfo[net];
                    235:        draddr = (struct device *)ui->ui_addr;
                    236:        an = &an_dev[net];
                    237:        if(an->open == 0) RETURN(ENXIO)
                    238:        if((an->ocnt = u.u_count) > MAXMSGLEN)
                    239:                an->ocnt = MAXMSGLEN;
                    240:        if(an->ocnt < 2)
                    241:                RETURN(EIO);
                    242:        if(copyin(u.u_base, an->obuf, an->ocnt))
                    243:                RETURN(EFAULT);
                    244:        if(andebug)
                    245:                printf("write on dev %d of %d bytes, sh[0]=%x, sh[1]=%x\n",
                    246:                        net, u.u_count, an->obuf[0], an->obuf[1]);
                    247:        an->flag |= OBUF;
                    248:        if(anxstart(net))
                    249:                u.u_count -= an->ocnt;
                    250: }
                    251: 
                    252: anrint(net)
                    253:        int net;
                    254: {
                    255:        register struct an_dev *an;
                    256:        register short *dp, *sp;
                    257:        register struct device *draddr;
                    258:        register struct uba_device *ui;
                    259:        short stat;
                    260:        int i, len, clen;
                    261: 
                    262:        an = &an_dev[net];
                    263:        if(an->flag&IBUF)
                    264:        {
                    265:                andrain(net);
                    266:                return;
                    267:        }
                    268:        ui = andinfo[net];
                    269:        draddr = (struct device *)ui->ui_addr;
                    270:        dp = &draddr->drin;
                    271: 
                    272:        len = *dp;
                    273:        len = swab(len);
                    274:        if(len > MAXMSGLEN)
                    275:                len = MAXMSGLEN;
                    276:        sp = an->ibuf;
                    277:        an->icnt = len;
                    278:        for(i = (len+1)/2; i; i--)
                    279:                *sp++ = *dp;
                    280:        draddr->drcs = STATUS_MODE;
                    281:        *sp = *dp;
                    282:        draddr->drcs = DATA_MODE;
                    283:        i = spl6();
                    284:        an->flag |= IBUF;
                    285:        splx(i);
                    286:        if ((*sp&INBUF_E) == 0)
                    287:                andrain(net);
                    288: }
                    289: 
                    290: andrain(net)
                    291:        int net;
                    292: {
                    293:        register struct an_dev *an;
                    294:        register short *dp;
                    295:        short sp;
                    296:        register struct device *draddr;
                    297:        register struct uba_device *ui;
                    298:        short stat;
                    299:        int i, len;
                    300: 
                    301:        ui = andinfo[net];
                    302:        draddr = (struct device *)ui->ui_addr;
                    303:        dp = &draddr->drin;
                    304: 
                    305:        do {
                    306:                len = *dp;
                    307:                len = swab(len);
                    308:                if(len > MAXMSGLEN)
                    309:                        len = MAXMSGLEN;
                    310:                for(i = (len+1)/2; i; i--)
                    311:                        sp = *dp;
                    312:                sp = *dp;
                    313:                sp = *dp;
                    314:                draddr->drcs = STATUS_MODE;
                    315:                sp = *dp;
                    316:                draddr->drcs = DATA_MODE;
                    317:        } while((sp&INBUF_E) == 0);
                    318: }
                    319: 
                    320: anxstart(net)
                    321:        int net;
                    322: {
                    323:        register struct an_dev *an;
                    324:        register short *dp, *sp;
                    325:        register struct device *draddr;
                    326:        register struct uba_device *ui;
                    327:        int retrys, nreps;
                    328:        int i, len;
                    329: 
                    330:        ui = andinfo[net];
                    331:        draddr = (struct device *)ui->ui_addr;
                    332:        an = &an_dev[net];
                    333:        dp = &draddr->drout;
                    334:        draddr->drcs = STATUS_MODE;
                    335: 
                    336:        i = draddr->drin;
                    337:        nreps = retrys = 0;
                    338:        if ( (i&OUTBUF_E) == 0 ) {
                    339:                do {
                    340:                        if(++retrys > 100000)
                    341:                        {
                    342:                                nreps++;
                    343:                                printf("anxstart: %d retrys on OUTBUF_E loop\n", nreps*retrys);
                    344:                                retrys = 0;
                    345:                                draddr->drcs = CMD_MODE;
                    346:                                if(nreps >= 2)
                    347:                                {
                    348:                                        printf("S/NET: MASTER CLEAR\n");
                    349:                                        draddr->drout = 0;
                    350:                                        draddr->drout = MASTER_CLEAR;
                    351:                                }
                    352:                                draddr->drout = 0;
                    353:                                draddr->drout = BOARD_RESET;
                    354:                                draddr->drout = 0;
                    355:                                draddr->drcs = DATA_MODE;
                    356:                                if(nreps >= 3) return(0);
                    357:                        }
                    358:                        i = draddr->drin;
                    359:                } while( (i&OUTBUF_E) == 0 );
                    360:        }
                    361:        retrys = 0;
                    362:        len = an->ocnt;
                    363: 
                    364: loop:
                    365:        sp = an->obuf;
                    366:        draddr->drcs = CMD_MODE;
                    367:        *dp = *sp++;
                    368:        draddr->drcs = DATA_MODE;
                    369:        for(i = (len+1)/2-1; i > 1; i--)
                    370:                *dp = *sp++;
                    371:        draddr->drcs = EOP_MODE;
                    372:        *dp = *sp;
                    373: 
                    374:        draddr->drcs = STATUS_MODE;
                    375:        i = draddr->drin;
                    376:        draddr->drcs = DATA_MODE;
                    377:        if(i&SNACK) {
                    378:                if(++retrys < 100)
                    379:                        goto loop;
                    380:                else
                    381:                        return(0);
                    382:        }
                    383:        return(1);
                    384: }
                    385: 
                    386: anioctl(dev, cmd, addr, flag)
                    387:        caddr_t addr;
                    388:        dev_t dev;
                    389: {
                    390:        int i;
                    391:        int error;
                    392:        int net = NET(dev);
                    393: 
                    394:        if(net >= NAN)
                    395:                RETURN(ENXIO)
                    396:        switch(cmd)
                    397:        {
                    398:        case ANRESET:
                    399:                /*if(copyin(addr, (caddr_t)&args, sizeof(args)))
                    400:                        RETURN(EFAULT)*/
                    401:                break;
                    402:        }
                    403: }
                    404: 
                    405: #ifdef TIMEOUT
                    406: cktimchk()
                    407: {
                    408:        register struct chdat *cp;
                    409:        register struct sninfo *sninfop;
                    410:        int unit;
                    411:        int s;
                    412: 
                    413:        for(cp=sn_chans; cp < &sn_chans[NUMLCH]; cp++) {
                    414:                if( cp->flags&(SENTDATA|SENTRDY) && --cp->ckticks == 0 ) {
                    415:                        unit = cp->snunit;
                    416:                        sninfop = &sn_sninfo[unit];
                    417:                        sninfop->snsched++;
                    418:                        sninfop->snenqlost[cp->machno]++;
                    419:                        cp->flags |= RETRY;
                    420:                        if (cp->flags & SENTDATA) {
                    421:                                wakeup((caddr_t)cp->output.buf);
                    422:                        } else {
                    423:                                wakeup((caddr_t)cp->input.buf);
                    424:                        }
                    425:                }
                    426:        }
                    427:        s = spl6();
                    428:        if (sn_state & OPEN) {
                    429:                timeout(cktimchk, (caddr_t)0, CKTICKS);
                    430:        } else {
                    431:                sn_state &= ~TIMER;
                    432:        }
                    433:        splx(s);
                    434: }
                    435: #endif TIMEOUT
                    436: 
                    437: #endif

unix.superglobalmegacorp.com

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