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