Annotation of 43BSDTahoe/sys/vaxstand/imploop.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1982, 1986 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  *     @(#)imptst.c    6.2 (Berkeley) 6/8/85
                      7:  */
                      8: #include "../machine/pte.h"
                      9: 
                     10: #include "param.h"
                     11: #include "inode.h"
                     12: #include "fs.h"
                     13: 
                     14: #include "../vaxuba/ubareg.h"
                     15: 
                     16: #include "../netinet/in.h"
                     17: #include "../netinet/in_systm.h"
                     18: #define        IMPLEADERS
                     19: #include "../netimp/if_imp.h"
                     20: #include "../vaxif/if_accreg.h"
                     21: 
                     22: #include "saio.h"
                     23: #include "savax.h"
                     24: 
                     25: #define min(a,b) (a<b ? a : b)
                     26: #define BUFSIZ (1006+sizeof(struct imp_leader))
                     27: 
                     28: char   input[132];
                     29: char   inbuf[BUFSIZ];
                     30: char   outbuf[BUFSIZ];
                     31: struct imp_leader *oip = (struct imp_leader *)outbuf;
                     32: struct imp_leader *iip = (struct imp_leader *)inbuf;
                     33: int    verbose = 1;       
                     34: int    datalen = 0;       
                     35: 
                     36: main()
                     37: {
                     38:        register error = 0, i, len;
                     39:        short type, host, impno, link;
                     40:        register struct accdevice *addr =
                     41:                (struct accdevice *)ubamem(0, 0767700);
                     42:        register char *p, pattern = 0;
                     43: 
                     44:        printf("imp interface loopback diagnostic\n");
                     45:        printf("verbose(y or n)? ");
                     46:        gets(input);
                     47:        verbose = (*input != 'n');
                     48:        printf("enter destination host number: ");
                     49:        gets(input);
                     50:        while ((host = (short)atol(input)) < 0 || host > 255) {
                     51:                printf("range [0, 255], re-enter: ");
                     52:                gets(input);
                     53:        }
                     54:        printf("imp number: ");
                     55:        gets(input);
                     56:        while ((impno = (short)atol(input)) < 0 || impno > 32767) {
                     57:                printf("range [0, 32767], re-enter: ");
                     58:                gets(input);
                     59:        }
                     60:        printf("link number: ");
                     61:        gets(input);
                     62:        while ((link = (short)atol(input)) < 0 || link > 255) {
                     63:                printf("range [0, 255], re-enter: ");
                     64:                gets(input);
                     65:        }
                     66:        printf("initialization starting...\n");
                     67:        impinit();
                     68:        oip->il_format = IMP_NFF;
                     69:        oip->il_mtype = IMPTYPE_NOOP;
                     70: #define noop
                     71: #ifdef noop
                     72:        /* send 3 noops and init imp leader buffer */
                     73:        impnoops((struct control_leader *)oip);
                     74: #endif
                     75:        printf("initialization complete\n");
                     76:        while (1) {
                     77: if (verbose)
                     78: printf("starting write test...\n");
                     79:                oip->il_host = host;
                     80:                oip->il_imp = htons((u_short)impno);
                     81:                oip->il_link = link;
                     82:                for (p = (char *)(oip + 1), i = datalen; i--; )
                     83:                        *p = pattern++;
                     84:                error = impwrite(oip, datalen + sizeof (*oip));
                     85:                if (error)
                     86:                        printf("imp write error, ocsr=%b\n", (short)error,
                     87:                                ACC_OUTBITS);
                     88: 
                     89: if (verbose)
                     90: printf("starting read test...\n");
                     91: if (verbose)
                     92: printf("impread(%d)\n", sizeof (*iip));
                     93:                bzero(inbuf, sizeof(inbuf));
                     94:                error = impread(iip, sizeof (inbuf));
                     95: if (verbose)
                     96: printf("impread, error=%b\n", error, ACC_INBITS);
                     97: if (verbose)
                     98:                printleader(iip);
                     99:                if (bcmp(iip, oip, sizeof(*iip) != 0))
                    100:                        printf("leader data error\n");
                    101:                len = ntohs(iip->il_length);
                    102:                if (len != datalen)
                    103:                        printf("length mismatch, got %d instead of %d\n",
                    104:                                len, datalen);
                    105:                /* read any data */
                    106:                p = (char *)(iip + 1);
                    107:                while ((error & IN_EOM) == 0 &&
                    108:                  (error & ~IN_EOM) == 0 && len > 0) {
                    109:                        i = min(len, BUFSIZ);
                    110: printf("impread(%d)\n", i);
                    111:                        error = impread(p, i);
                    112:                        len -= i;
                    113:                        p += i;
                    114: printf("error=%b, len=%d\n", error, ACC_INBITS, len);
                    115:                }
                    116:                error &= ~IN_EOM;
                    117:                if (error == 0 && (len > 0 || addr->iwc))
                    118:                        printf("imp input length mismatch\n");
                    119:                if (error)
                    120:                        printf("imp read error, icsr=%b\n",
                    121:                                (short)error, ACC_INBITS);
                    122:                else if (bcmp(iip + 1, oip + 1, datalen))
                    123:                        printf("data comparison error\n");
                    124:        }
                    125: }
                    126: 
                    127: impnoops(cp)
                    128:        register struct control_leader *cp;
                    129: {
                    130:        register i, error;
                    131: 
                    132:        bzero((caddr_t)cp, sizeof (struct control_leader));
                    133:        cp->dl_format = IMP_NFF;
                    134:        cp->dl_mtype = IMPTYPE_NOOP;
                    135:        for (i = 0; i < IMP_DROPCNT + 1; i++ ) { 
                    136:                 cp->dl_link = i;
                    137:                if ((error = impwrite(cp, sizeof (*cp))) != 0) {
                    138:                        printf("imp init error, ocsr=%b\n", (short)error,
                    139:                                ACC_OUTBITS);
                    140:                        _stop();
                    141:                }
                    142:        }
                    143:        for (i = 0; i < IMP_DROPCNT + 1; i++ ) { 
                    144:                bzero((caddr_t)iip, sizeof(*iip));
                    145:                error = impread(iip, sizeof (inbuf));
                    146: if (verbose)
                    147: printf("impread, error=%b\n", error, ACC_INBITS);
                    148: if (verbose)
                    149:                printleader(iip);
                    150:        }
                    151: }
                    152: 
                    153: impwrite(buf, len)
                    154:        register struct imp *buf;
                    155:        register len;
                    156: {
                    157:        register uba, error;
                    158:        struct iob io;
                    159:        register struct accdevice *addr =
                    160:            (struct accdevice *)ubamem(0, 0767600);
                    161: 
                    162:        /* set up uba mapping */
                    163:        io.i_ma = (caddr_t)buf;
                    164:        io.i_cc = len;
                    165:        uba = ubasetup(&io, 0);
                    166: 
                    167:        /* set regs and perform i/o */
                    168:        addr->oba = (u_short)uba;
                    169:        addr->owc = -((io.i_cc + 1) >> 1);
                    170:        addr->ocsr = ((short) ((uba & 0x30000) >> 12) | OUT_ENLB | ACC_GO);
                    171:        while ((addr->ocsr & ACC_RDY) == 0)
                    172:                ;
                    173:        error = addr->ocsr & (ACC_NXM|ACC_ERR);
                    174:        ubafree(uba);
                    175:        return(error);
                    176: }
                    177: 
                    178: impread(buf, len)
                    179:        register struct imp *buf;
                    180:        register len;
                    181: {
                    182:        register uba, error;
                    183:        struct iob io;
                    184:        register struct accdevice *addr =
                    185:            (struct accdevice *)ubamem(0, 0767600);
                    186: 
                    187:        /* set up uba mapping */
                    188:        io.i_ma = (caddr_t)buf;
                    189:        io.i_cc = len;
                    190:        uba = ubasetup(&io, 0);
                    191:        /* set regs and perform i/o */
                    192:        addr->iba = (u_short)uba;
                    193:        addr->iwc = -(io.i_cc >> 1);
                    194:        addr->icsr = IN_MRDY | IN_WEN | ((uba & 0x30000) >> 12) | ACC_GO;
                    195:        while ((addr->icsr & ACC_RDY) == 0)
                    196:                ;
                    197:        error = addr->icsr & (IN_EOM|ACC_ERR|IN_RMR|ACC_NXM);
                    198:        ubafree(uba);
                    199:        return(error);
                    200: }
                    201: 
                    202: impinit()
                    203: {      
                    204:        register struct accdevice *addr = 
                    205:                (struct accdevice *)ubamem(0, 0767600);
                    206:        register int i;
                    207: 
                    208:        /*
                    209:         * Reset the imp interface;
                    210:         * the delays are pure guesswork.
                    211:         */
                    212:        addr->icsr = ACC_RESET; DELAY(5000);
                    213:         addr->ocsr = ACC_RESET; DELAY(5000);
                    214:        addr->ocsr = OUT_BBACK; DELAY(5000);    /* reset host master ready */
                    215:        addr->ocsr = 0;
                    216:        addr->icsr = IN_MRDY | IN_WEN;          /* close the relay */
                    217:        DELAY(10000);
                    218:        /* YECH!!! */
                    219:        for (i = 0; i < 500; i++) {
                    220:                if ((addr->icsr & IN_HRDY) &&
                    221:                    (addr->icsr & (IN_RMR | IN_IMPBSY)) == 0)
                    222:                        return;
                    223:                addr->icsr = IN_MRDY | IN_WEN; DELAY(10000);
                    224:                /* keep turning IN_RMR off */
                    225:        }
                    226:        printf("impinit: imp doesn't respond, icsr=%b, ocsr=%b\n",
                    227:                addr->icsr, ACC_INBITS, addr->ocsr, ACC_OUTBITS);
                    228: }
                    229: 
                    230: /*
                    231:  *  Convert null-terminated ascii string to binary
                    232:  *  and return value.
                    233:  *  1st char in string :
                    234:  *     0 -> octal
                    235:  *     x -> hex
                    236:  *     else decimal
                    237:  */
                    238: atol(as)
                    239:        register char *as;
                    240: {
                    241:        register value = 0;
                    242:        register base = 10;
                    243:        register sign = 1;
                    244:        register digit = 0;
                    245:  
                    246: aloop :
                    247:        if ((digit = (*as++)) == 0)
                    248:                return(value) ; /* null */
                    249:        if (digit == '-') {
                    250:                sign = -sign;
                    251:                goto aloop ;
                    252:        }
                    253:        if (digit == '0')
                    254:                base = 8 ;
                    255:        else if (digit == 'x')
                    256:                base = 16 ;
                    257:        else
                    258:                value = digit - '0';
                    259:        while (digit = (*as++)) {
                    260:                if (digit < '0')
                    261:                        return(0);
                    262:                switch (base) {
                    263: 
                    264:                case 8 :
                    265:                        if (digit > '7')
                    266:                                return(0);
                    267:                        digit -= '0';
                    268:                        break;
                    269: 
                    270:                case 10 :
                    271:                        if (digit > '9')
                    272:                                return(0);
                    273:                        digit -= '0';
                    274:                        break;
                    275: 
                    276:                case 16 :
                    277:                        if (digit <= '9') {
                    278:                                digit -= 060 ;
                    279:                                break;
                    280:                        }
                    281:                        if ((digit >= 'A') && (digit <= 'F')) {
                    282:                                digit -= 'A' + 10;
                    283:                                break;
                    284:                        }
                    285:                        if ((digit >= 'a') && (digit <= 'f')) {
                    286:                                digit -= 'a' + 10 ;
                    287:                                break;
                    288:                        }
                    289:                        return(0);
                    290:                }
                    291:                value = (value * base) + digit;
                    292:        }
                    293:        return (value * sign);
                    294: }
                    295: 
                    296: printleader(ip)
                    297:        register struct imp_leader *ip;
                    298: {
                    299:        printbyte((char *)ip, 12);
                    300:        printf("<fmt=%x,net=%x,flags=%x,mtype=", ip->il_format, ip->il_network,
                    301:                ip->il_flags);
                    302:        if (ip->il_mtype <= IMPTYPE_READY)
                    303:                printf("%s,", impleaders[ip->il_mtype]);
                    304:        else
                    305:                printf("%x,", ip->il_mtype);
                    306:        printf("htype=%x,host=%x,imp=%x,link=", ip->il_htype, ip->il_host,
                    307:                ntohs(ip->il_imp));
                    308:        if (ip->il_link == IMPLINK_IP)
                    309:                printf("ip,");
                    310:        else
                    311:                printf("%x,", ip->il_link);
                    312:        printf("subtype=%x,len=%x>\n",ip->il_subtype,ntohs(ip->il_length)>>3);
                    313: }
                    314: 
                    315: printbyte(cp, n)
                    316:        register char *cp;
                    317:        int n;
                    318: {
                    319:        register i, j, c;
                    320: 
                    321:        for (i=0; i<n; i++) {
                    322:                c = *cp++;
                    323:                for (j=0; j<2; j++)
                    324:                        putchar("0123456789abcdef"[(c>>((1-j)*4))&0xf]);
                    325:                putchar(' ');
                    326:        }
                    327:        putchar('\n');
                    328: }

unix.superglobalmegacorp.com

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