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

Defined functions

atol defined in line 209; used 7 times
impinit defined in line 173; used 1 times
  • in line 66
impnoops defined in line 106; used 1 times
  • in line 68
impread defined in line 149; used 2 times
impwrite defined in line 124; used 2 times
main defined in line 30; never used
printbyte defined in line 286; used 1 times
printleader defined in line 267; used 1 times
  • in line 85

Defined variables

imps defined in line 26; used 1 times
  • in line 26
inbuf defined in line 27; used 1 times
  • in line 93
input defined in line 25; used 14 times
ip defined in line 26; used 29 times
writeflg defined in line 28; used 2 times

Defined macros

BUFSIZ defined in line 23; used 2 times
IMPLEADERS defined in line 15; never used
min defined in line 22; used 1 times
  • in line 91
Last modified: 1986-06-05
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1231
Valid CSS Valid XHTML 1.0 Strict