|
|
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 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.