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