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