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.2 (Berkeley) 01/28/88 7 */ 8 9 #include "param.h" 10 #include "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 } 300