1*41480Smckusick /* 2*41480Smckusick * Copyright (c) 1982, 1990 The Regents of the University of California. 3*41480Smckusick * All rights reserved. 4*41480Smckusick * 5*41480Smckusick * %sccs.include.redist.c% 6*41480Smckusick * 7*41480Smckusick * @(#)hpib.c 7.1 (Berkeley) 05/08/90 8*41480Smckusick */ 9*41480Smckusick 10*41480Smckusick /* 11*41480Smckusick * HPIB driver 12*41480Smckusick */ 13*41480Smckusick #include "hpib.h" 14*41480Smckusick #if NHPIB > 0 15*41480Smckusick 16*41480Smckusick #include "param.h" 17*41480Smckusick #include "systm.h" 18*41480Smckusick #include "buf.h" 19*41480Smckusick #include "device.h" 20*41480Smckusick #include "hpibvar.h" 21*41480Smckusick #include "dmavar.h" 22*41480Smckusick 23*41480Smckusick #include "machine/cpu.h" 24*41480Smckusick #include "machine/isr.h" 25*41480Smckusick 26*41480Smckusick int internalhpib = IOV(0x478000); 27*41480Smckusick 28*41480Smckusick int hpibinit(), hpibstart(), hpibgo(), hpibintr(), hpibdone(); 29*41480Smckusick struct driver hpibdriver = { 30*41480Smckusick hpibinit, "hpib", hpibstart, hpibgo, hpibintr, hpibdone, 31*41480Smckusick }; 32*41480Smckusick 33*41480Smckusick struct hpib_softc hpib_softc[NHPIB]; 34*41480Smckusick struct isr hpib_isr[NHPIB]; 35*41480Smckusick int nhpibppoll(), fhpibppoll(); 36*41480Smckusick 37*41480Smckusick int hpibtimeout = 100000; /* # of status tests before we give up */ 38*41480Smckusick int hpibidtimeout = 20000; /* # of status tests for hpibid() calls */ 39*41480Smckusick 40*41480Smckusick hpibinit(hc) 41*41480Smckusick register struct hp_ctlr *hc; 42*41480Smckusick { 43*41480Smckusick register struct hpib_softc *hs = &hpib_softc[hc->hp_unit]; 44*41480Smckusick 45*41480Smckusick if (!nhpibtype(hc) && !fhpibtype(hc)) 46*41480Smckusick return(0); 47*41480Smckusick hs->sc_hc = hc; 48*41480Smckusick hs->sc_dq.dq_unit = hc->hp_unit; 49*41480Smckusick hs->sc_dq.dq_driver = &hpibdriver; 50*41480Smckusick hs->sc_sq.dq_forw = hs->sc_sq.dq_back = &hs->sc_sq; 51*41480Smckusick hpib_isr[hc->hp_unit].isr_intr = hpibintr; 52*41480Smckusick hpib_isr[hc->hp_unit].isr_ipl = hc->hp_ipl; 53*41480Smckusick hpib_isr[hc->hp_unit].isr_arg = hc->hp_unit; 54*41480Smckusick isrlink(&hpib_isr[hc->hp_unit]); 55*41480Smckusick hpibreset(hc->hp_unit); 56*41480Smckusick return(1); 57*41480Smckusick } 58*41480Smckusick 59*41480Smckusick hpibreset(unit) 60*41480Smckusick register int unit; 61*41480Smckusick { 62*41480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 63*41480Smckusick fhpibreset(unit); 64*41480Smckusick else 65*41480Smckusick nhpibreset(unit); 66*41480Smckusick } 67*41480Smckusick 68*41480Smckusick hpibreq(dq) 69*41480Smckusick register struct devqueue *dq; 70*41480Smckusick { 71*41480Smckusick register struct devqueue *hq; 72*41480Smckusick 73*41480Smckusick hq = &hpib_softc[dq->dq_ctlr].sc_sq; 74*41480Smckusick insque(dq, hq->dq_back); 75*41480Smckusick if (dq->dq_back == hq) 76*41480Smckusick return(1); 77*41480Smckusick return(0); 78*41480Smckusick } 79*41480Smckusick 80*41480Smckusick hpibfree(dq) 81*41480Smckusick register struct devqueue *dq; 82*41480Smckusick { 83*41480Smckusick register struct devqueue *hq; 84*41480Smckusick 85*41480Smckusick hq = &hpib_softc[dq->dq_ctlr].sc_sq; 86*41480Smckusick remque(dq); 87*41480Smckusick if ((dq = hq->dq_forw) != hq) 88*41480Smckusick (dq->dq_driver->d_start)(dq->dq_unit); 89*41480Smckusick } 90*41480Smckusick 91*41480Smckusick hpibid(unit, slave) 92*41480Smckusick { 93*41480Smckusick short id; 94*41480Smckusick int ohpibtimeout; 95*41480Smckusick 96*41480Smckusick /* 97*41480Smckusick * XXX: shorten timeout value (so autoconfig doesn't take forever) 98*41480Smckusick */ 99*41480Smckusick ohpibtimeout = hpibtimeout; 100*41480Smckusick hpibtimeout = hpibidtimeout; 101*41480Smckusick if (hpibrecv(unit, 31, slave, &id, 2) != 2) 102*41480Smckusick id = 0; 103*41480Smckusick hpibtimeout = ohpibtimeout; 104*41480Smckusick return(id); 105*41480Smckusick } 106*41480Smckusick 107*41480Smckusick hpibsend(unit, slave, sec, addr, cnt) 108*41480Smckusick register int unit; 109*41480Smckusick { 110*41480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 111*41480Smckusick return(fhpibsend(unit, slave, sec, addr, cnt)); 112*41480Smckusick else 113*41480Smckusick return(nhpibsend(unit, slave, sec, addr, cnt)); 114*41480Smckusick } 115*41480Smckusick 116*41480Smckusick hpibrecv(unit, slave, sec, addr, cnt) 117*41480Smckusick register int unit; 118*41480Smckusick { 119*41480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 120*41480Smckusick return(fhpibrecv(unit, slave, sec, addr, cnt)); 121*41480Smckusick else 122*41480Smckusick return(nhpibrecv(unit, slave, sec, addr, cnt)); 123*41480Smckusick } 124*41480Smckusick 125*41480Smckusick hpibpptest(unit, slave) 126*41480Smckusick register int unit; 127*41480Smckusick { 128*41480Smckusick int (*ppoll)(); 129*41480Smckusick 130*41480Smckusick ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll; 131*41480Smckusick return((*ppoll)(unit) & (0x80 >> slave)); 132*41480Smckusick } 133*41480Smckusick 134*41480Smckusick hpibawait(unit) 135*41480Smckusick { 136*41480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 137*41480Smckusick 138*41480Smckusick hs->sc_flags |= HPIBF_PPOLL; 139*41480Smckusick if (hs->sc_type == HPIBC) 140*41480Smckusick fhpibppwatch(unit); 141*41480Smckusick else 142*41480Smckusick nhpibppwatch(unit); 143*41480Smckusick } 144*41480Smckusick 145*41480Smckusick hpibswait(unit, slave) 146*41480Smckusick register int unit; 147*41480Smckusick { 148*41480Smckusick register int timo = hpibtimeout; 149*41480Smckusick register int mask, (*ppoll)(); 150*41480Smckusick 151*41480Smckusick ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll; 152*41480Smckusick mask = 0x80 >> slave; 153*41480Smckusick while (((ppoll)(unit) & mask) == 0) 154*41480Smckusick if (--timo == 0) { 155*41480Smckusick printf("hpib%d: swait timeout\n", unit); 156*41480Smckusick return(-1); 157*41480Smckusick } 158*41480Smckusick return(0); 159*41480Smckusick } 160*41480Smckusick 161*41480Smckusick hpibustart(unit) 162*41480Smckusick { 163*41480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 164*41480Smckusick 165*41480Smckusick if (hs->sc_type == HPIBA) 166*41480Smckusick hs->sc_dq.dq_ctlr = DMA0; 167*41480Smckusick else 168*41480Smckusick hs->sc_dq.dq_ctlr = DMA0 | DMA1; 169*41480Smckusick if (dmareq(&hs->sc_dq)) 170*41480Smckusick return(1); 171*41480Smckusick return(0); 172*41480Smckusick } 173*41480Smckusick 174*41480Smckusick hpibstart(unit) 175*41480Smckusick { 176*41480Smckusick register struct devqueue *dq; 177*41480Smckusick 178*41480Smckusick dq = hpib_softc[unit].sc_sq.dq_forw; 179*41480Smckusick (dq->dq_driver->d_go)(dq->dq_unit); 180*41480Smckusick } 181*41480Smckusick 182*41480Smckusick hpibgo(unit, slave, sec, addr, count, rw) 183*41480Smckusick register int unit; 184*41480Smckusick { 185*41480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 186*41480Smckusick fhpibgo(unit, slave, sec, addr, count, rw); 187*41480Smckusick else 188*41480Smckusick nhpibgo(unit, slave, sec, addr, count, rw); 189*41480Smckusick } 190*41480Smckusick 191*41480Smckusick hpibdone(unit) 192*41480Smckusick register int unit; 193*41480Smckusick { 194*41480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 195*41480Smckusick fhpibdone(unit); 196*41480Smckusick else 197*41480Smckusick nhpibdone(unit); 198*41480Smckusick } 199*41480Smckusick 200*41480Smckusick hpibintr(unit) 201*41480Smckusick register int unit; 202*41480Smckusick { 203*41480Smckusick int found; 204*41480Smckusick 205*41480Smckusick if (hpib_softc[unit].sc_type == HPIBC) 206*41480Smckusick found = fhpibintr(unit); 207*41480Smckusick else 208*41480Smckusick found = nhpibintr(unit); 209*41480Smckusick return(found); 210*41480Smckusick } 211*41480Smckusick #endif 212