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