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
main()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
impnoops(cp)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
impwrite(buf,len)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
impread(buf,len)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
impinit()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 */
atol(as)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
printleader(ip)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
printbyte(cp,n)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