xref: /csrg-svn/sys/hp300/dev/hpib.c (revision 63151)
141480Smckusick /*
2*63151Sbostic  * Copyright (c) 1982, 1990, 1993
3*63151Sbostic  *	The Regents of the University of California.  All rights reserved.
441480Smckusick  *
541480Smckusick  * %sccs.include.redist.c%
641480Smckusick  *
7*63151Sbostic  *	@(#)hpib.c	8.1 (Berkeley) 06/10/93
841480Smckusick  */
941480Smckusick 
1041480Smckusick /*
1141480Smckusick  * HPIB driver
1241480Smckusick  */
1341480Smckusick #include "hpib.h"
1441480Smckusick #if NHPIB > 0
1541480Smckusick 
1656507Sbostic #include <sys/param.h>
1756507Sbostic #include <sys/systm.h>
1856507Sbostic #include <sys/buf.h>
1941480Smckusick 
2056507Sbostic #include <hp/dev/device.h>
2156507Sbostic #include <hp300/dev/hpibvar.h>
2256507Sbostic #include <hp300/dev/dmavar.h>
2341480Smckusick 
2456507Sbostic #include <machine/cpu.h>
2556507Sbostic #include <hp300/hp300/isr.h>
2656507Sbostic 
2741480Smckusick int	hpibinit(), hpibstart(), hpibgo(), hpibintr(), hpibdone();
2841480Smckusick struct	driver hpibdriver = {
2941480Smckusick 	hpibinit, "hpib", hpibstart, hpibgo, hpibintr, hpibdone,
3041480Smckusick };
3141480Smckusick 
3241480Smckusick struct	hpib_softc hpib_softc[NHPIB];
3341480Smckusick struct	isr hpib_isr[NHPIB];
3441480Smckusick int	nhpibppoll(), fhpibppoll();
3541480Smckusick 
3641480Smckusick int	hpibtimeout = 100000;	/* # of status tests before we give up */
3756315Shibler int	hpibidtimeout = 10000;	/* # of status tests for hpibid() calls */
3845501Smckusick int	hpibdmathresh = 3;	/* byte count beyond which to attempt dma */
3941480Smckusick 
4041480Smckusick hpibinit(hc)
4141480Smckusick 	register struct hp_ctlr *hc;
4241480Smckusick {
4341480Smckusick 	register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
4441480Smckusick 
4541480Smckusick 	if (!nhpibtype(hc) && !fhpibtype(hc))
4641480Smckusick 		return(0);
4741480Smckusick 	hs->sc_hc = hc;
4841480Smckusick 	hs->sc_dq.dq_unit = hc->hp_unit;
4941480Smckusick 	hs->sc_dq.dq_driver = &hpibdriver;
5041480Smckusick 	hs->sc_sq.dq_forw = hs->sc_sq.dq_back = &hs->sc_sq;
5141480Smckusick 	hpib_isr[hc->hp_unit].isr_intr = hpibintr;
5241480Smckusick 	hpib_isr[hc->hp_unit].isr_ipl = hc->hp_ipl;
5341480Smckusick 	hpib_isr[hc->hp_unit].isr_arg = hc->hp_unit;
5441480Smckusick 	isrlink(&hpib_isr[hc->hp_unit]);
5541480Smckusick 	hpibreset(hc->hp_unit);
5641480Smckusick 	return(1);
5741480Smckusick }
5841480Smckusick 
5941480Smckusick hpibreset(unit)
6041480Smckusick 	register int unit;
6141480Smckusick {
6241480Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
6341480Smckusick 		fhpibreset(unit);
6441480Smckusick 	else
6541480Smckusick 		nhpibreset(unit);
6641480Smckusick }
6741480Smckusick 
6841480Smckusick hpibreq(dq)
6941480Smckusick 	register struct devqueue *dq;
7041480Smckusick {
7141480Smckusick 	register struct devqueue *hq;
7241480Smckusick 
7341480Smckusick 	hq = &hpib_softc[dq->dq_ctlr].sc_sq;
7441480Smckusick 	insque(dq, hq->dq_back);
7541480Smckusick 	if (dq->dq_back == hq)
7641480Smckusick 		return(1);
7741480Smckusick 	return(0);
7841480Smckusick }
7941480Smckusick 
8041480Smckusick hpibfree(dq)
8141480Smckusick 	register struct devqueue *dq;
8241480Smckusick {
8341480Smckusick 	register struct devqueue *hq;
8441480Smckusick 
8541480Smckusick 	hq = &hpib_softc[dq->dq_ctlr].sc_sq;
8641480Smckusick 	remque(dq);
8741480Smckusick 	if ((dq = hq->dq_forw) != hq)
8841480Smckusick 		(dq->dq_driver->d_start)(dq->dq_unit);
8941480Smckusick }
9041480Smckusick 
9141480Smckusick hpibid(unit, slave)
9241480Smckusick {
9341480Smckusick 	short id;
9441480Smckusick 	int ohpibtimeout;
9541480Smckusick 
9641480Smckusick 	/*
9756315Shibler 	 * XXX shorten timeout value so autoconfig doesn't
9856315Shibler 	 * take forever on slow CPUs.
9941480Smckusick 	 */
10041480Smckusick 	ohpibtimeout = hpibtimeout;
10156315Shibler 	hpibtimeout = hpibidtimeout * cpuspeed;
10241480Smckusick 	if (hpibrecv(unit, 31, slave, &id, 2) != 2)
10341480Smckusick 		id = 0;
10441480Smckusick 	hpibtimeout = ohpibtimeout;
10541480Smckusick 	return(id);
10641480Smckusick }
10741480Smckusick 
10841480Smckusick hpibsend(unit, slave, sec, addr, cnt)
10941480Smckusick 	register int unit;
11041480Smckusick {
11141480Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
11241480Smckusick 		return(fhpibsend(unit, slave, sec, addr, cnt));
11341480Smckusick 	else
11441480Smckusick 		return(nhpibsend(unit, slave, sec, addr, cnt));
11541480Smckusick }
11641480Smckusick 
11741480Smckusick hpibrecv(unit, slave, sec, addr, cnt)
11841480Smckusick 	register int unit;
11941480Smckusick {
12041480Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
12141480Smckusick 		return(fhpibrecv(unit, slave, sec, addr, cnt));
12241480Smckusick 	else
12341480Smckusick 		return(nhpibrecv(unit, slave, sec, addr, cnt));
12441480Smckusick }
12541480Smckusick 
12641480Smckusick hpibpptest(unit, slave)
12741480Smckusick 	register int unit;
12841480Smckusick {
12941480Smckusick 	int (*ppoll)();
13041480Smckusick 
13141480Smckusick 	ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
13241480Smckusick 	return((*ppoll)(unit) & (0x80 >> slave));
13341480Smckusick }
13441480Smckusick 
13541480Smckusick hpibawait(unit)
13654774Storek 	int unit;
13741480Smckusick {
13841480Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
13941480Smckusick 
14041480Smckusick 	hs->sc_flags |= HPIBF_PPOLL;
14141480Smckusick 	if (hs->sc_type == HPIBC)
14254774Storek 		fhpibppwatch((void *)unit);
14341480Smckusick 	else
14454774Storek 		nhpibppwatch((void *)unit);
14541480Smckusick }
14641480Smckusick 
14741480Smckusick hpibswait(unit, slave)
14841480Smckusick 	register int unit;
14941480Smckusick {
15041480Smckusick 	register int timo = hpibtimeout;
15141480Smckusick 	register int mask, (*ppoll)();
15241480Smckusick 
15341480Smckusick 	ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
15441480Smckusick 	mask = 0x80 >> slave;
15541480Smckusick 	while (((ppoll)(unit) & mask) == 0)
15641480Smckusick 		if (--timo == 0) {
15741480Smckusick 			printf("hpib%d: swait timeout\n", unit);
15841480Smckusick 			return(-1);
15941480Smckusick 		}
16041480Smckusick 	return(0);
16141480Smckusick }
16241480Smckusick 
16341480Smckusick hpibustart(unit)
16441480Smckusick {
16541480Smckusick 	register struct hpib_softc *hs = &hpib_softc[unit];
16641480Smckusick 
16741480Smckusick 	if (hs->sc_type == HPIBA)
16841480Smckusick 		hs->sc_dq.dq_ctlr = DMA0;
16941480Smckusick 	else
17041480Smckusick 		hs->sc_dq.dq_ctlr = DMA0 | DMA1;
17141480Smckusick 	if (dmareq(&hs->sc_dq))
17241480Smckusick 		return(1);
17341480Smckusick 	return(0);
17441480Smckusick }
17541480Smckusick 
17641480Smckusick hpibstart(unit)
17741480Smckusick {
17841480Smckusick 	register struct devqueue *dq;
17941480Smckusick 
18041480Smckusick 	dq = hpib_softc[unit].sc_sq.dq_forw;
18141480Smckusick 	(dq->dq_driver->d_go)(dq->dq_unit);
18241480Smckusick }
18341480Smckusick 
18441480Smckusick hpibgo(unit, slave, sec, addr, count, rw)
18541480Smckusick 	register int unit;
18641480Smckusick {
18741480Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
18841480Smckusick 		fhpibgo(unit, slave, sec, addr, count, rw);
18941480Smckusick 	else
19041480Smckusick 		nhpibgo(unit, slave, sec, addr, count, rw);
19141480Smckusick }
19241480Smckusick 
19341480Smckusick hpibdone(unit)
19441480Smckusick 	register int unit;
19541480Smckusick {
19641480Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
19741480Smckusick 		fhpibdone(unit);
19841480Smckusick 	else
19941480Smckusick 		nhpibdone(unit);
20041480Smckusick }
20141480Smckusick 
20241480Smckusick hpibintr(unit)
20341480Smckusick 	register int unit;
20441480Smckusick {
20541480Smckusick 	int found;
20641480Smckusick 
20741480Smckusick 	if (hpib_softc[unit].sc_type == HPIBC)
20841480Smckusick 		found = fhpibintr(unit);
20941480Smckusick 	else
21041480Smckusick 		found = nhpibintr(unit);
21141480Smckusick 	return(found);
21241480Smckusick }
21341480Smckusick #endif
214