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*56315Shibler * @(#)hpib.c 7.7 (Berkeley) 09/21/92 841480Smckusick */ 941480Smckusick 1041480Smckusick /* 1141480Smckusick * HPIB driver 1241480Smckusick */ 1341480Smckusick #include "hpib.h" 1441480Smckusick #if NHPIB > 0 1541480Smckusick 1645788Sbostic #include "sys/param.h" 1745788Sbostic #include "sys/systm.h" 1845788Sbostic #include "sys/buf.h" 1953929Shibler #include "hp/dev/device.h" 2041480Smckusick #include "hpibvar.h" 2141480Smckusick #include "dmavar.h" 2241480Smckusick 2345788Sbostic #include "../include/cpu.h" 2445788Sbostic #include "../hp300/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 */ 36*56315Shibler int hpibidtimeout = 10000; /* # of status tests for hpibid() calls */ 3745501Smckusick 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 /* 96*56315Shibler * XXX shorten timeout value so autoconfig doesn't 97*56315Shibler * take forever on slow CPUs. 9841480Smckusick */ 9941480Smckusick ohpibtimeout = hpibtimeout; 100*56315Shibler hpibtimeout = hpibidtimeout * cpuspeed; 10141480Smckusick if (hpibrecv(unit, 31, slave, &id, 2) != 2) 10241480Smckusick id = 0; 10341480Smckusick hpibtimeout = ohpibtimeout; 10441480Smckusick return(id); 10541480Smckusick } 10641480Smckusick 10741480Smckusick hpibsend(unit, slave, sec, addr, cnt) 10841480Smckusick register int unit; 10941480Smckusick { 11041480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 11141480Smckusick return(fhpibsend(unit, slave, sec, addr, cnt)); 11241480Smckusick else 11341480Smckusick return(nhpibsend(unit, slave, sec, addr, cnt)); 11441480Smckusick } 11541480Smckusick 11641480Smckusick hpibrecv(unit, slave, sec, addr, cnt) 11741480Smckusick register int unit; 11841480Smckusick { 11941480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 12041480Smckusick return(fhpibrecv(unit, slave, sec, addr, cnt)); 12141480Smckusick else 12241480Smckusick return(nhpibrecv(unit, slave, sec, addr, cnt)); 12341480Smckusick } 12441480Smckusick 12541480Smckusick hpibpptest(unit, slave) 12641480Smckusick register int unit; 12741480Smckusick { 12841480Smckusick int (*ppoll)(); 12941480Smckusick 13041480Smckusick ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll; 13141480Smckusick return((*ppoll)(unit) & (0x80 >> slave)); 13241480Smckusick } 13341480Smckusick 13441480Smckusick hpibawait(unit) 13554774Storek int unit; 13641480Smckusick { 13741480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 13841480Smckusick 13941480Smckusick hs->sc_flags |= HPIBF_PPOLL; 14041480Smckusick if (hs->sc_type == HPIBC) 14154774Storek fhpibppwatch((void *)unit); 14241480Smckusick else 14354774Storek nhpibppwatch((void *)unit); 14441480Smckusick } 14541480Smckusick 14641480Smckusick hpibswait(unit, slave) 14741480Smckusick register int unit; 14841480Smckusick { 14941480Smckusick register int timo = hpibtimeout; 15041480Smckusick register int mask, (*ppoll)(); 15141480Smckusick 15241480Smckusick ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll; 15341480Smckusick mask = 0x80 >> slave; 15441480Smckusick while (((ppoll)(unit) & mask) == 0) 15541480Smckusick if (--timo == 0) { 15641480Smckusick printf("hpib%d: swait timeout\n", unit); 15741480Smckusick return(-1); 15841480Smckusick } 15941480Smckusick return(0); 16041480Smckusick } 16141480Smckusick 16241480Smckusick hpibustart(unit) 16341480Smckusick { 16441480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 16541480Smckusick 16641480Smckusick if (hs->sc_type == HPIBA) 16741480Smckusick hs->sc_dq.dq_ctlr = DMA0; 16841480Smckusick else 16941480Smckusick hs->sc_dq.dq_ctlr = DMA0 | DMA1; 17041480Smckusick if (dmareq(&hs->sc_dq)) 17141480Smckusick return(1); 17241480Smckusick return(0); 17341480Smckusick } 17441480Smckusick 17541480Smckusick hpibstart(unit) 17641480Smckusick { 17741480Smckusick register struct devqueue *dq; 17841480Smckusick 17941480Smckusick dq = hpib_softc[unit].sc_sq.dq_forw; 18041480Smckusick (dq->dq_driver->d_go)(dq->dq_unit); 18141480Smckusick } 18241480Smckusick 18341480Smckusick hpibgo(unit, slave, sec, addr, count, rw) 18441480Smckusick register int unit; 18541480Smckusick { 18641480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 18741480Smckusick fhpibgo(unit, slave, sec, addr, count, rw); 18841480Smckusick else 18941480Smckusick nhpibgo(unit, slave, sec, addr, count, rw); 19041480Smckusick } 19141480Smckusick 19241480Smckusick hpibdone(unit) 19341480Smckusick register int unit; 19441480Smckusick { 19541480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 19641480Smckusick fhpibdone(unit); 19741480Smckusick else 19841480Smckusick nhpibdone(unit); 19941480Smckusick } 20041480Smckusick 20141480Smckusick hpibintr(unit) 20241480Smckusick register int unit; 20341480Smckusick { 20441480Smckusick int found; 20541480Smckusick 20641480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 20741480Smckusick found = fhpibintr(unit); 20841480Smckusick else 20941480Smckusick found = nhpibintr(unit); 21041480Smckusick return(found); 21141480Smckusick } 21241480Smckusick #endif 213