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: }