|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1990 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: * 3. All advertising materials mentioning features or use of this software
14: * must display the following acknowledgement:
15: * This product includes software developed by the University of
16: * California, Berkeley and its contributors.
17: * 4. Neither the name of the University nor the names of its contributors
18: * may be used to endorse or promote products derived from this software
19: * without specific prior written permission.
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31: * SUCH DAMAGE.
32: *
33: * @(#)hpib.c 7.3 (Berkeley) 12/16/90
34: */
35:
36: /*
37: * HPIB driver
38: */
39: #include "hpib.h"
40: #if NHPIB > 0
41:
42: #include "sys/param.h"
43: #include "sys/systm.h"
44: #include "sys/buf.h"
45: #include "device.h"
46: #include "hpibvar.h"
47: #include "dmavar.h"
48:
49: #include "../include/cpu.h"
50: #include "../hp300/isr.h"
51:
52: int hpibinit(), hpibstart(), hpibgo(), hpibintr(), hpibdone();
53: struct driver hpibdriver = {
54: hpibinit, "hpib", hpibstart, hpibgo, hpibintr, hpibdone,
55: };
56:
57: struct hpib_softc hpib_softc[NHPIB];
58: struct isr hpib_isr[NHPIB];
59: int nhpibppoll(), fhpibppoll();
60:
61: int hpibtimeout = 100000; /* # of status tests before we give up */
62: int hpibidtimeout = 20000; /* # of status tests for hpibid() calls */
63: int hpibdmathresh = 3; /* byte count beyond which to attempt dma */
64:
65: hpibinit(hc)
66: register struct hp_ctlr *hc;
67: {
68: register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
69:
70: if (!nhpibtype(hc) && !fhpibtype(hc))
71: return(0);
72: hs->sc_hc = hc;
73: hs->sc_dq.dq_unit = hc->hp_unit;
74: hs->sc_dq.dq_driver = &hpibdriver;
75: hs->sc_sq.dq_forw = hs->sc_sq.dq_back = &hs->sc_sq;
76: hpib_isr[hc->hp_unit].isr_intr = hpibintr;
77: hpib_isr[hc->hp_unit].isr_ipl = hc->hp_ipl;
78: hpib_isr[hc->hp_unit].isr_arg = hc->hp_unit;
79: isrlink(&hpib_isr[hc->hp_unit]);
80: hpibreset(hc->hp_unit);
81: return(1);
82: }
83:
84: hpibreset(unit)
85: register int unit;
86: {
87: if (hpib_softc[unit].sc_type == HPIBC)
88: fhpibreset(unit);
89: else
90: nhpibreset(unit);
91: }
92:
93: hpibreq(dq)
94: register struct devqueue *dq;
95: {
96: register struct devqueue *hq;
97:
98: hq = &hpib_softc[dq->dq_ctlr].sc_sq;
99: insque(dq, hq->dq_back);
100: if (dq->dq_back == hq)
101: return(1);
102: return(0);
103: }
104:
105: hpibfree(dq)
106: register struct devqueue *dq;
107: {
108: register struct devqueue *hq;
109:
110: hq = &hpib_softc[dq->dq_ctlr].sc_sq;
111: remque(dq);
112: if ((dq = hq->dq_forw) != hq)
113: (dq->dq_driver->d_start)(dq->dq_unit);
114: }
115:
116: hpibid(unit, slave)
117: {
118: short id;
119: int ohpibtimeout;
120:
121: /*
122: * XXX: shorten timeout value (so autoconfig doesn't take forever)
123: */
124: ohpibtimeout = hpibtimeout;
125: hpibtimeout = hpibidtimeout;
126: if (hpibrecv(unit, 31, slave, &id, 2) != 2)
127: id = 0;
128: hpibtimeout = ohpibtimeout;
129: return(id);
130: }
131:
132: hpibsend(unit, slave, sec, addr, cnt)
133: register int unit;
134: {
135: if (hpib_softc[unit].sc_type == HPIBC)
136: return(fhpibsend(unit, slave, sec, addr, cnt));
137: else
138: return(nhpibsend(unit, slave, sec, addr, cnt));
139: }
140:
141: hpibrecv(unit, slave, sec, addr, cnt)
142: register int unit;
143: {
144: if (hpib_softc[unit].sc_type == HPIBC)
145: return(fhpibrecv(unit, slave, sec, addr, cnt));
146: else
147: return(nhpibrecv(unit, slave, sec, addr, cnt));
148: }
149:
150: hpibpptest(unit, slave)
151: register int unit;
152: {
153: int (*ppoll)();
154:
155: ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
156: return((*ppoll)(unit) & (0x80 >> slave));
157: }
158:
159: hpibawait(unit)
160: {
161: register struct hpib_softc *hs = &hpib_softc[unit];
162:
163: hs->sc_flags |= HPIBF_PPOLL;
164: if (hs->sc_type == HPIBC)
165: fhpibppwatch(unit);
166: else
167: nhpibppwatch(unit);
168: }
169:
170: hpibswait(unit, slave)
171: register int unit;
172: {
173: register int timo = hpibtimeout;
174: register int mask, (*ppoll)();
175:
176: ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
177: mask = 0x80 >> slave;
178: while (((ppoll)(unit) & mask) == 0)
179: if (--timo == 0) {
180: printf("hpib%d: swait timeout\n", unit);
181: return(-1);
182: }
183: return(0);
184: }
185:
186: hpibustart(unit)
187: {
188: register struct hpib_softc *hs = &hpib_softc[unit];
189:
190: if (hs->sc_type == HPIBA)
191: hs->sc_dq.dq_ctlr = DMA0;
192: else
193: hs->sc_dq.dq_ctlr = DMA0 | DMA1;
194: if (dmareq(&hs->sc_dq))
195: return(1);
196: return(0);
197: }
198:
199: hpibstart(unit)
200: {
201: register struct devqueue *dq;
202:
203: dq = hpib_softc[unit].sc_sq.dq_forw;
204: (dq->dq_driver->d_go)(dq->dq_unit);
205: }
206:
207: hpibgo(unit, slave, sec, addr, count, rw)
208: register int unit;
209: {
210: if (hpib_softc[unit].sc_type == HPIBC)
211: fhpibgo(unit, slave, sec, addr, count, rw);
212: else
213: nhpibgo(unit, slave, sec, addr, count, rw);
214: }
215:
216: hpibdone(unit)
217: register int unit;
218: {
219: if (hpib_softc[unit].sc_type == HPIBC)
220: fhpibdone(unit);
221: else
222: nhpibdone(unit);
223: }
224:
225: hpibintr(unit)
226: register int unit;
227: {
228: int found;
229:
230: if (hpib_softc[unit].sc_type == HPIBC)
231: found = fhpibintr(unit);
232: else
233: found = nhpibintr(unit);
234: return(found);
235: }
236: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.