1 /*
2 * Copyright (c) 1982, 1990, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 *
7 * @(#)hpib.c 8.2 (Berkeley) 01/12/94
8 */
9
10 /*
11 * HPIB driver
12 */
13 #include "hpib.h"
14 #if NHPIB > 0
15
16 #include <sys/param.h>
17 #include <sys/systm.h>
18 #include <sys/buf.h>
19
20 #include <hp/dev/device.h>
21 #include <hp300/dev/hpibvar.h>
22 #include <hp300/dev/dmavar.h>
23
24 #include <machine/cpu.h>
25 #include <hp300/hp300/isr.h>
26
27 int hpibinit(), hpibstart(), hpibgo(), hpibintr(), hpibdone();
28 struct driver hpibdriver = {
29 hpibinit, "hpib", hpibstart, hpibgo, hpibintr, hpibdone,
30 };
31
32 struct hpib_softc hpib_softc[NHPIB];
33 struct isr hpib_isr[NHPIB];
34 int nhpibppoll(), fhpibppoll();
35
36 int hpibtimeout = 100000; /* # of status tests before we give up */
37 int hpibidtimeout = 10000; /* # of status tests for hpibid() calls */
38 int hpibdmathresh = 3; /* byte count beyond which to attempt dma */
39
hpibinit(hc)40 hpibinit(hc)
41 register struct hp_ctlr *hc;
42 {
43 register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
44
45 if (!nhpibtype(hc) && !fhpibtype(hc))
46 return(0);
47 hs->sc_hc = hc;
48 hs->sc_dq.dq_unit = hc->hp_unit;
49 hs->sc_dq.dq_driver = &hpibdriver;
50 hs->sc_sq.dq_forw = hs->sc_sq.dq_back = &hs->sc_sq;
51 hpib_isr[hc->hp_unit].isr_intr = hpibintr;
52 hpib_isr[hc->hp_unit].isr_ipl = hc->hp_ipl;
53 hpib_isr[hc->hp_unit].isr_arg = hc->hp_unit;
54 isrlink(&hpib_isr[hc->hp_unit]);
55 hpibreset(hc->hp_unit);
56 return(1);
57 }
58
hpibreset(unit)59 hpibreset(unit)
60 register int unit;
61 {
62 if (hpib_softc[unit].sc_type == HPIBC)
63 fhpibreset(unit);
64 else
65 nhpibreset(unit);
66 }
67
hpibreq(dq)68 hpibreq(dq)
69 register struct devqueue *dq;
70 {
71 register struct devqueue *hq;
72
73 hq = &hpib_softc[dq->dq_ctlr].sc_sq;
74 insque(dq, hq->dq_back);
75 if (dq->dq_back == hq)
76 return(1);
77 return(0);
78 }
79
hpibfree(dq)80 hpibfree(dq)
81 register struct devqueue *dq;
82 {
83 register struct devqueue *hq;
84
85 hq = &hpib_softc[dq->dq_ctlr].sc_sq;
86 remque(dq);
87 if ((dq = hq->dq_forw) != hq)
88 (dq->dq_driver->d_start)(dq->dq_unit);
89 }
90
hpibid(unit,slave)91 hpibid(unit, slave)
92 int unit, slave;
93 {
94 short id;
95 int ohpibtimeout;
96
97 /*
98 * XXX shorten timeout value so autoconfig doesn't
99 * take forever on slow CPUs.
100 */
101 ohpibtimeout = hpibtimeout;
102 hpibtimeout = hpibidtimeout * cpuspeed;
103 if (hpibrecv(unit, 31, slave, &id, 2) != 2)
104 id = 0;
105 hpibtimeout = ohpibtimeout;
106 return(id);
107 }
108
hpibsend(unit,slave,sec,addr,cnt)109 hpibsend(unit, slave, sec, addr, cnt)
110 register int unit;
111 int slave, sec, addr, cnt;
112 {
113 if (hpib_softc[unit].sc_type == HPIBC)
114 return(fhpibsend(unit, slave, sec, addr, cnt));
115 else
116 return(nhpibsend(unit, slave, sec, addr, cnt));
117 }
118
hpibrecv(unit,slave,sec,addr,cnt)119 hpibrecv(unit, slave, sec, addr, cnt)
120 register int unit;
121 int slave, sec, addr, cnt;
122 {
123 if (hpib_softc[unit].sc_type == HPIBC)
124 return(fhpibrecv(unit, slave, sec, addr, cnt));
125 else
126 return(nhpibrecv(unit, slave, sec, addr, cnt));
127 }
128
hpibpptest(unit,slave)129 hpibpptest(unit, slave)
130 register int unit;
131 int slave;
132 {
133 int (*ppoll)();
134
135 ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
136 return((*ppoll)(unit) & (0x80 >> slave));
137 }
138
hpibawait(unit)139 hpibawait(unit)
140 int unit;
141 {
142 register struct hpib_softc *hs = &hpib_softc[unit];
143
144 hs->sc_flags |= HPIBF_PPOLL;
145 if (hs->sc_type == HPIBC)
146 fhpibppwatch((void *)unit);
147 else
148 nhpibppwatch((void *)unit);
149 }
150
hpibswait(unit,slave)151 hpibswait(unit, slave)
152 register int unit;
153 int slave;
154 {
155 register int timo = hpibtimeout;
156 register int mask, (*ppoll)();
157
158 ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
159 mask = 0x80 >> slave;
160 while (((ppoll)(unit) & mask) == 0)
161 if (--timo == 0) {
162 printf("hpib%d: swait timeout\n", unit);
163 return(-1);
164 }
165 return(0);
166 }
167
hpibustart(unit)168 hpibustart(unit)
169 int unit;
170 {
171 register struct hpib_softc *hs = &hpib_softc[unit];
172
173 if (hs->sc_type == HPIBA)
174 hs->sc_dq.dq_ctlr = DMA0;
175 else
176 hs->sc_dq.dq_ctlr = DMA0 | DMA1;
177 if (dmareq(&hs->sc_dq))
178 return(1);
179 return(0);
180 }
181
hpibstart(unit)182 hpibstart(unit)
183 int unit;
184 {
185 register struct devqueue *dq;
186
187 dq = hpib_softc[unit].sc_sq.dq_forw;
188 (dq->dq_driver->d_go)(dq->dq_unit);
189 }
190
hpibgo(unit,slave,sec,addr,count,rw)191 hpibgo(unit, slave, sec, addr, count, rw)
192 register int unit;
193 int slave, sec, addr, count, rw;
194 {
195 if (hpib_softc[unit].sc_type == HPIBC)
196 fhpibgo(unit, slave, sec, addr, count, rw);
197 else
198 nhpibgo(unit, slave, sec, addr, count, rw);
199 }
200
hpibdone(unit)201 hpibdone(unit)
202 register int unit;
203 {
204 if (hpib_softc[unit].sc_type == HPIBC)
205 fhpibdone(unit);
206 else
207 nhpibdone(unit);
208 }
209
hpibintr(unit)210 hpibintr(unit)
211 register int unit;
212 {
213 int found;
214
215 if (hpib_softc[unit].sc_type == HPIBC)
216 found = fhpibintr(unit);
217 else
218 found = nhpibintr(unit);
219 return(found);
220 }
221 #endif
222