|
|
1.1 root 1: #include "an.h"
2: #if NAN > 0
3:
4: #include "../h/param.h"
5: #include "../h/systm.h"
6: #include "../h/buf.h"
7: #include "../h/conf.h"
8: #include "../h/dir.h"
9: #include "../h/user.h"
10: #include "../h/pte.h"
11: #include "../h/map.h"
12: #include "../h/vm.h"
13: #include "../h/anet.h"
14: #include "../h/cmap.h"
15: #include "../h/ubareg.h"
16: #include "../h/ubavar.h"
17: #include "../h/cpu.h"
18: #include "../h/proc.h"
19: #include "../h/status.h"
20:
21:
22: #ifdef ANDEBUG
23: int andebug = 1;
24: #else
25: int andebug = 0;
26: #endif
27:
28: /* flags for status */
29: #define INPUT 1
30: #define OUTPUT 2
31:
32: #define min(x,y) ((x) < (y) ? (x) : (y))
33: #define swab(x) (((x<<8) | ((x&0xFF00)>>8)) & 0xFFFF)
34:
35: #define ANPRI 28
36:
37: struct device {
38: short drcs;
39: short drout;
40: short drin;
41: };
42:
43: /* Command and Status word */
44: #define CSR0 0x1
45: #define CSR1 0x2
46: #define RIE 0x20
47: #define TIE 0x40
48: #define TEMPTY 0x80
49: #define RFULL 0x8000
50:
51: /*
52: * CSR1 CSR0
53: * 0 0 Write Data
54: * 0 1 Write EOP
55: * 1 0 Write Command
56: * 1 1 Read Status
57: */
58: #define DATA_MODE (RIE)
59: #define EOP_MODE (CSR0 | RIE)
60: #define CMD_MODE (CSR1 | RIE)
61: #define STATUS_MODE (CSR0 | CSR1 | RIE)
62:
63: #define MAXMSGLEN 2042
64: #define IBUF 1
65: #define OBUF 2
66:
67: struct an_dev {
68: char open;
69: char flag;
70: short uid;
71: short icnt, ocnt;
72: short ibuf[MAXMSGLEN/2];
73: short obuf[MAXMSGLEN/2];
74: } an_dev[NAN];
75:
76: #ifdef TIMEOUT
77: #define CKFUZZ 4 /* number of timeouts we wait for a response */
78: #define CKTICKS (hz/4) /* number of ticks per timeout */
79:
80: int an_state;
81: #define OPEN 1 /* set if at least one sn? is open */
82: #define TIMER 2 /* set if at timer is running */
83:
84: int cktimchk();
85: int an_opncnt;
86: #endif TIMEOUT
87:
88: /*struct anmach anmach[8] = {
89: { 1, 255 },
90: { 2, 254 },
91: { 3, 253 },
92: { 4, 252 },
93: { 5, 251 },
94: { 6, 250 },
95: { 7, 249 },
96: { 8, 248 } };*/
97:
98: #define RETURN(x) {u.u_error = x; return(0);}
99:
100: int anprobe(), anattach();
101: struct uba_device *andinfo[NAN];
102: u_short anstd[] = {0};
103: struct uba_driver andriver =
104: { anprobe, 0, anattach, 0, anstd, "an", andinfo};
105:
106: anprobe(reg)
107: caddr_t reg;
108: {
109: register int br, cvec; /* value result */
110:
111: br = 0x15;
112: cvec = 0510;
113: return(1);
114: }
115:
116: anattach()
117: {
118: register struct device *draddr;
119: register struct uba_device *ui;
120:
121: ui = andinfo[0];
122: draddr = (struct device *)ui->ui_addr;
123: draddr->drcs = CMD_MODE;
124: draddr->drout = 0;
125: draddr->drout = MASTER_CLEAR;
126: draddr->drout = 0;
127: draddr->drout = BOARD_RESET;
128: draddr->drout = 0;
129: draddr->drcs = STATUS_MODE;
130: printf("S/NET BIB #%d\n", (draddr->drin>>10)&0xF);
131:
132: }
133:
134: /*
135: open the argus network
136: */
137:
138: anopen(dev)
139: register dev_t dev;
140: {
141: register struct device *draddr;
142: register struct an_dev *an;
143: register struct uba_device *ui;
144: int net = NET(dev);
145:
146: if(andebug)
147: printf("anopen(%x)\n", dev);
148: if(net >= NAN || (ui = andinfo[net]) == 0 || ui->ui_alive == 0)
149: RETURN(ENXIO);
150: draddr = (struct device *)ui->ui_addr;
151:
152: an = &an_dev[net];
153: spl6();
154: if (an->open++ != 0) {
155: spl0();
156: RETURN(EBUSY);
157: }
158: an->uid = u.u_uid;
159: #ifdef TIMEOUT
160: sn_opncnt++;
161: sn_state |= OPEN;
162: if ((sn_state & TIMER) == 0) {
163: sn_state |= TIMER;
164: timeout(cktimchk, (caddr_t)0, CKTICKS);
165: }
166: #endif TIMEOUT
167: draddr->drcs = CMD_MODE;
168: draddr->drout = 0;
169: draddr->drout = BOARD_RESET;
170: draddr->drout = 0;
171: draddr->drcs = DATA_MODE;
172:
173: spl0();
174: return(1);
175: }
176:
177: anclose(dev)
178: {
179: struct uba_device *ui;
180: register struct an_dev *an;
181: int net = NET(dev);
182:
183: if(andebug)
184: printf("anclose(%x)\n", dev);
185: if(net >= NAN)
186: RETURN(ENXIO)
187: an = &an_dev[net];
188: spl6();
189: an->open = 0;
190: spl0();
191: }
192:
193: anread(dev)
194: dev_t dev;
195: {
196: int net;
197: register struct device *draddr;
198: register struct an_dev *an;
199: register struct uba_device *ui;
200: short stat;
201:
202: net = NET(dev);
203: if(net >= NAN)
204: RETURN(ENXIO)
205: ui = andinfo[net];
206: draddr = (struct device *)ui->ui_addr;
207: an = &an_dev[net];
208: if(an->open == 0) RETURN(ENXIO)
209: spl6();
210: if((an->flag&IBUF) == 0)
211: RETURN(EIO);
212: if(copyout(an->ibuf, u.u_base, an->icnt))
213: {
214: spl0();
215: RETURN(EFAULT);
216: }
217: u.u_count -= an->icnt;
218: an->flag &= ~IBUF;
219: spl0();
220: }
221:
222: anwrite(dev)
223: dev_t dev;
224: {
225: int net;
226: register struct device *draddr;
227: register struct an_dev *an;
228: register struct uba_device *ui;
229: short stat;
230:
231: net = NET(dev);
232: if(net >= NAN)
233: RETURN(ENXIO)
234: ui = andinfo[net];
235: draddr = (struct device *)ui->ui_addr;
236: an = &an_dev[net];
237: if(an->open == 0) RETURN(ENXIO)
238: if((an->ocnt = u.u_count) > MAXMSGLEN)
239: an->ocnt = MAXMSGLEN;
240: if(an->ocnt < 2)
241: RETURN(EIO);
242: if(copyin(u.u_base, an->obuf, an->ocnt))
243: RETURN(EFAULT);
244: if(andebug)
245: printf("write on dev %d of %d bytes, sh[0]=%x, sh[1]=%x\n",
246: net, u.u_count, an->obuf[0], an->obuf[1]);
247: an->flag |= OBUF;
248: if(anxstart(net))
249: u.u_count -= an->ocnt;
250: }
251:
252: anrint(net)
253: int net;
254: {
255: register struct an_dev *an;
256: register short *dp, *sp;
257: register struct device *draddr;
258: register struct uba_device *ui;
259: short stat;
260: int i, len, clen;
261:
262: an = &an_dev[net];
263: if(an->flag&IBUF)
264: {
265: andrain(net);
266: return;
267: }
268: ui = andinfo[net];
269: draddr = (struct device *)ui->ui_addr;
270: dp = &draddr->drin;
271:
272: len = *dp;
273: len = swab(len);
274: if(len > MAXMSGLEN)
275: len = MAXMSGLEN;
276: sp = an->ibuf;
277: an->icnt = len;
278: for(i = (len+1)/2; i; i--)
279: *sp++ = *dp;
280: draddr->drcs = STATUS_MODE;
281: *sp = *dp;
282: draddr->drcs = DATA_MODE;
283: i = spl6();
284: an->flag |= IBUF;
285: splx(i);
286: if ((*sp&INBUF_E) == 0)
287: andrain(net);
288: }
289:
290: andrain(net)
291: int net;
292: {
293: register struct an_dev *an;
294: register short *dp;
295: short sp;
296: register struct device *draddr;
297: register struct uba_device *ui;
298: short stat;
299: int i, len;
300:
301: ui = andinfo[net];
302: draddr = (struct device *)ui->ui_addr;
303: dp = &draddr->drin;
304:
305: do {
306: len = *dp;
307: len = swab(len);
308: if(len > MAXMSGLEN)
309: len = MAXMSGLEN;
310: for(i = (len+1)/2; i; i--)
311: sp = *dp;
312: sp = *dp;
313: sp = *dp;
314: draddr->drcs = STATUS_MODE;
315: sp = *dp;
316: draddr->drcs = DATA_MODE;
317: } while((sp&INBUF_E) == 0);
318: }
319:
320: anxstart(net)
321: int net;
322: {
323: register struct an_dev *an;
324: register short *dp, *sp;
325: register struct device *draddr;
326: register struct uba_device *ui;
327: int retrys, nreps;
328: int i, len;
329:
330: ui = andinfo[net];
331: draddr = (struct device *)ui->ui_addr;
332: an = &an_dev[net];
333: dp = &draddr->drout;
334: draddr->drcs = STATUS_MODE;
335:
336: i = draddr->drin;
337: nreps = retrys = 0;
338: if ( (i&OUTBUF_E) == 0 ) {
339: do {
340: if(++retrys > 100000)
341: {
342: nreps++;
343: printf("anxstart: %d retrys on OUTBUF_E loop\n", nreps*retrys);
344: retrys = 0;
345: draddr->drcs = CMD_MODE;
346: if(nreps >= 2)
347: {
348: printf("S/NET: MASTER CLEAR\n");
349: draddr->drout = 0;
350: draddr->drout = MASTER_CLEAR;
351: }
352: draddr->drout = 0;
353: draddr->drout = BOARD_RESET;
354: draddr->drout = 0;
355: draddr->drcs = DATA_MODE;
356: if(nreps >= 3) return(0);
357: }
358: i = draddr->drin;
359: } while( (i&OUTBUF_E) == 0 );
360: }
361: retrys = 0;
362: len = an->ocnt;
363:
364: loop:
365: sp = an->obuf;
366: draddr->drcs = CMD_MODE;
367: *dp = *sp++;
368: draddr->drcs = DATA_MODE;
369: for(i = (len+1)/2-1; i > 1; i--)
370: *dp = *sp++;
371: draddr->drcs = EOP_MODE;
372: *dp = *sp;
373:
374: draddr->drcs = STATUS_MODE;
375: i = draddr->drin;
376: draddr->drcs = DATA_MODE;
377: if(i&SNACK) {
378: if(++retrys < 100)
379: goto loop;
380: else
381: return(0);
382: }
383: return(1);
384: }
385:
386: anioctl(dev, cmd, addr, flag)
387: caddr_t addr;
388: dev_t dev;
389: {
390: int i;
391: int error;
392: int net = NET(dev);
393:
394: if(net >= NAN)
395: RETURN(ENXIO)
396: switch(cmd)
397: {
398: case ANRESET:
399: /*if(copyin(addr, (caddr_t)&args, sizeof(args)))
400: RETURN(EFAULT)*/
401: break;
402: }
403: }
404:
405: #ifdef TIMEOUT
406: cktimchk()
407: {
408: register struct chdat *cp;
409: register struct sninfo *sninfop;
410: int unit;
411: int s;
412:
413: for(cp=sn_chans; cp < &sn_chans[NUMLCH]; cp++) {
414: if( cp->flags&(SENTDATA|SENTRDY) && --cp->ckticks == 0 ) {
415: unit = cp->snunit;
416: sninfop = &sn_sninfo[unit];
417: sninfop->snsched++;
418: sninfop->snenqlost[cp->machno]++;
419: cp->flags |= RETRY;
420: if (cp->flags & SENTDATA) {
421: wakeup((caddr_t)cp->output.buf);
422: } else {
423: wakeup((caddr_t)cp->input.buf);
424: }
425: }
426: }
427: s = spl6();
428: if (sn_state & OPEN) {
429: timeout(cktimchk, (caddr_t)0, CKTICKS);
430: } else {
431: sn_state &= ~TIMER;
432: }
433: splx(s);
434: }
435: #endif TIMEOUT
436:
437: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.