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*54774Storek * @(#)hpib.c 7.5 (Berkeley) 07/07/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 */ 3641480Smckusick int hpibidtimeout = 20000; /* # 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 /* 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) 134*54774Storek int unit; 13541480Smckusick { 13641480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 13741480Smckusick 13841480Smckusick hs->sc_flags |= HPIBF_PPOLL; 13941480Smckusick if (hs->sc_type == HPIBC) 140*54774Storek fhpibppwatch((void *)unit); 14141480Smckusick else 142*54774Storek nhpibppwatch((void *)unit); 14341480Smckusick } 14441480Smckusick 14541480Smckusick hpibswait(unit, slave) 14641480Smckusick register int unit; 14741480Smckusick { 14841480Smckusick register int timo = hpibtimeout; 14941480Smckusick register int mask, (*ppoll)(); 15041480Smckusick 15141480Smckusick ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll; 15241480Smckusick mask = 0x80 >> slave; 15341480Smckusick while (((ppoll)(unit) & mask) == 0) 15441480Smckusick if (--timo == 0) { 15541480Smckusick printf("hpib%d: swait timeout\n", unit); 15641480Smckusick return(-1); 15741480Smckusick } 15841480Smckusick return(0); 15941480Smckusick } 16041480Smckusick 16141480Smckusick hpibustart(unit) 16241480Smckusick { 16341480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 16441480Smckusick 16541480Smckusick if (hs->sc_type == HPIBA) 16641480Smckusick hs->sc_dq.dq_ctlr = DMA0; 16741480Smckusick else 16841480Smckusick hs->sc_dq.dq_ctlr = DMA0 | DMA1; 16941480Smckusick if (dmareq(&hs->sc_dq)) 17041480Smckusick return(1); 17141480Smckusick return(0); 17241480Smckusick } 17341480Smckusick 17441480Smckusick hpibstart(unit) 17541480Smckusick { 17641480Smckusick register struct devqueue *dq; 17741480Smckusick 17841480Smckusick dq = hpib_softc[unit].sc_sq.dq_forw; 17941480Smckusick (dq->dq_driver->d_go)(dq->dq_unit); 18041480Smckusick } 18141480Smckusick 18241480Smckusick hpibgo(unit, slave, sec, addr, count, rw) 18341480Smckusick register int unit; 18441480Smckusick { 18541480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 18641480Smckusick fhpibgo(unit, slave, sec, addr, count, rw); 18741480Smckusick else 18841480Smckusick nhpibgo(unit, slave, sec, addr, count, rw); 18941480Smckusick } 19041480Smckusick 19141480Smckusick hpibdone(unit) 19241480Smckusick register int unit; 19341480Smckusick { 19441480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 19541480Smckusick fhpibdone(unit); 19641480Smckusick else 19741480Smckusick nhpibdone(unit); 19841480Smckusick } 19941480Smckusick 20041480Smckusick hpibintr(unit) 20141480Smckusick register int unit; 20241480Smckusick { 20341480Smckusick int found; 20441480Smckusick 20541480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 20641480Smckusick found = fhpibintr(unit); 20741480Smckusick else 20841480Smckusick found = nhpibintr(unit); 20941480Smckusick return(found); 21041480Smckusick } 21141480Smckusick #endif 212