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