141480Smckusick /*
263151Sbostic * Copyright (c) 1982, 1990, 1993
363151Sbostic * The Regents of the University of California. All rights reserved.
441480Smckusick *
541480Smckusick * %sccs.include.redist.c%
641480Smckusick *
7*65636Sbostic * @(#)hpib.c 8.2 (Berkeley) 01/12/94
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
hpibinit(hc)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
hpibreset(unit)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
hpibreq(dq)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
hpibfree(dq)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
hpibid(unit,slave)9141480Smckusick hpibid(unit, slave)
92*65636Sbostic int unit, slave;
9341480Smckusick {
9441480Smckusick short id;
9541480Smckusick int ohpibtimeout;
9641480Smckusick
9741480Smckusick /*
9856315Shibler * XXX shorten timeout value so autoconfig doesn't
9956315Shibler * take forever on slow CPUs.
10041480Smckusick */
10141480Smckusick ohpibtimeout = hpibtimeout;
10256315Shibler hpibtimeout = hpibidtimeout * cpuspeed;
10341480Smckusick if (hpibrecv(unit, 31, slave, &id, 2) != 2)
10441480Smckusick id = 0;
10541480Smckusick hpibtimeout = ohpibtimeout;
10641480Smckusick return(id);
10741480Smckusick }
10841480Smckusick
hpibsend(unit,slave,sec,addr,cnt)10941480Smckusick hpibsend(unit, slave, sec, addr, cnt)
11041480Smckusick register int unit;
111*65636Sbostic int slave, sec, addr, cnt;
11241480Smckusick {
11341480Smckusick if (hpib_softc[unit].sc_type == HPIBC)
11441480Smckusick return(fhpibsend(unit, slave, sec, addr, cnt));
11541480Smckusick else
11641480Smckusick return(nhpibsend(unit, slave, sec, addr, cnt));
11741480Smckusick }
11841480Smckusick
hpibrecv(unit,slave,sec,addr,cnt)11941480Smckusick hpibrecv(unit, slave, sec, addr, cnt)
12041480Smckusick register int unit;
121*65636Sbostic int slave, sec, addr, cnt;
12241480Smckusick {
12341480Smckusick if (hpib_softc[unit].sc_type == HPIBC)
12441480Smckusick return(fhpibrecv(unit, slave, sec, addr, cnt));
12541480Smckusick else
12641480Smckusick return(nhpibrecv(unit, slave, sec, addr, cnt));
12741480Smckusick }
12841480Smckusick
hpibpptest(unit,slave)12941480Smckusick hpibpptest(unit, slave)
13041480Smckusick register int unit;
131*65636Sbostic int slave;
13241480Smckusick {
13341480Smckusick int (*ppoll)();
13441480Smckusick
13541480Smckusick ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
13641480Smckusick return((*ppoll)(unit) & (0x80 >> slave));
13741480Smckusick }
13841480Smckusick
hpibawait(unit)13941480Smckusick hpibawait(unit)
14054774Storek int unit;
14141480Smckusick {
14241480Smckusick register struct hpib_softc *hs = &hpib_softc[unit];
14341480Smckusick
14441480Smckusick hs->sc_flags |= HPIBF_PPOLL;
14541480Smckusick if (hs->sc_type == HPIBC)
14654774Storek fhpibppwatch((void *)unit);
14741480Smckusick else
14854774Storek nhpibppwatch((void *)unit);
14941480Smckusick }
15041480Smckusick
hpibswait(unit,slave)15141480Smckusick hpibswait(unit, slave)
15241480Smckusick register int unit;
153*65636Sbostic int slave;
15441480Smckusick {
15541480Smckusick register int timo = hpibtimeout;
15641480Smckusick register int mask, (*ppoll)();
15741480Smckusick
15841480Smckusick ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
15941480Smckusick mask = 0x80 >> slave;
16041480Smckusick while (((ppoll)(unit) & mask) == 0)
16141480Smckusick if (--timo == 0) {
16241480Smckusick printf("hpib%d: swait timeout\n", unit);
16341480Smckusick return(-1);
16441480Smckusick }
16541480Smckusick return(0);
16641480Smckusick }
16741480Smckusick
hpibustart(unit)16841480Smckusick hpibustart(unit)
169*65636Sbostic int unit;
17041480Smckusick {
17141480Smckusick register struct hpib_softc *hs = &hpib_softc[unit];
17241480Smckusick
17341480Smckusick if (hs->sc_type == HPIBA)
17441480Smckusick hs->sc_dq.dq_ctlr = DMA0;
17541480Smckusick else
17641480Smckusick hs->sc_dq.dq_ctlr = DMA0 | DMA1;
17741480Smckusick if (dmareq(&hs->sc_dq))
17841480Smckusick return(1);
17941480Smckusick return(0);
18041480Smckusick }
18141480Smckusick
hpibstart(unit)18241480Smckusick hpibstart(unit)
183*65636Sbostic int unit;
18441480Smckusick {
18541480Smckusick register struct devqueue *dq;
18641480Smckusick
18741480Smckusick dq = hpib_softc[unit].sc_sq.dq_forw;
18841480Smckusick (dq->dq_driver->d_go)(dq->dq_unit);
18941480Smckusick }
19041480Smckusick
hpibgo(unit,slave,sec,addr,count,rw)19141480Smckusick hpibgo(unit, slave, sec, addr, count, rw)
19241480Smckusick register int unit;
193*65636Sbostic int slave, sec, addr, count, rw;
19441480Smckusick {
19541480Smckusick if (hpib_softc[unit].sc_type == HPIBC)
19641480Smckusick fhpibgo(unit, slave, sec, addr, count, rw);
19741480Smckusick else
19841480Smckusick nhpibgo(unit, slave, sec, addr, count, rw);
19941480Smckusick }
20041480Smckusick
hpibdone(unit)20141480Smckusick hpibdone(unit)
20241480Smckusick register int unit;
20341480Smckusick {
20441480Smckusick if (hpib_softc[unit].sc_type == HPIBC)
20541480Smckusick fhpibdone(unit);
20641480Smckusick else
20741480Smckusick nhpibdone(unit);
20841480Smckusick }
20941480Smckusick
hpibintr(unit)21041480Smckusick hpibintr(unit)
21141480Smckusick register int unit;
21241480Smckusick {
21341480Smckusick int found;
21441480Smckusick
21541480Smckusick if (hpib_softc[unit].sc_type == HPIBC)
21641480Smckusick found = fhpibintr(unit);
21741480Smckusick else
21841480Smckusick found = nhpibintr(unit);
21941480Smckusick return(found);
22041480Smckusick }
22141480Smckusick #endif
222