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