Home | History | Annotate | Line # | Download | only in dev
hpib.c revision 1.5
      1 /*	$NetBSD: hpib.c,v 1.5 1995/01/07 10:30:12 mycroft Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1982, 1990, 1993
      5  *	The Regents of the University of California.  All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. All advertising materials mentioning features or use of this software
     16  *    must display the following acknowledgement:
     17  *	This product includes software developed by the University of
     18  *	California, Berkeley and its contributors.
     19  * 4. Neither the name of the University nor the names of its contributors
     20  *    may be used to endorse or promote products derived from this software
     21  *    without specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33  * SUCH DAMAGE.
     34  *
     35  *	@(#)hpib.c	8.2 (Berkeley) 1/12/94
     36  */
     37 
     38 /*
     39  * HPIB driver
     40  */
     41 #include "hpib.h"
     42 #if NHPIB > 0
     43 
     44 #include <sys/param.h>
     45 #include <sys/systm.h>
     46 #include <sys/buf.h>
     47 
     48 #include <hp300/dev/device.h>
     49 #include <hp300/dev/hpibvar.h>
     50 #include <hp300/dev/dmavar.h>
     51 
     52 #include <machine/cpu.h>
     53 #include <hp300/hp300/isr.h>
     54 
     55 int	hpibinit(), hpibstart(), hpibgo(), hpibintr(), hpibdone();
     56 struct	driver hpibdriver = {
     57 	hpibinit, "hpib", hpibstart, hpibgo, hpibintr, hpibdone,
     58 };
     59 
     60 struct	hpib_softc hpib_softc[NHPIB];
     61 struct	isr hpib_isr[NHPIB];
     62 int	nhpibppoll(), fhpibppoll();
     63 
     64 int	hpibtimeout = 100000;	/* # of status tests before we give up */
     65 int	hpibidtimeout = 10000;	/* # of status tests for hpibid() calls */
     66 int	hpibdmathresh = 3;	/* byte count beyond which to attempt dma */
     67 
     68 hpibinit(hc)
     69 	register struct hp_ctlr *hc;
     70 {
     71 	register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
     72 
     73 	if (!nhpibtype(hc) && !fhpibtype(hc))
     74 		return(0);
     75 	hs->sc_hc = hc;
     76 	hs->sc_dq.dq_unit = hc->hp_unit;
     77 	hs->sc_dq.dq_driver = &hpibdriver;
     78 	hs->sc_sq.dq_forw = hs->sc_sq.dq_back = &hs->sc_sq;
     79 	hpib_isr[hc->hp_unit].isr_intr = hpibintr;
     80 	hpib_isr[hc->hp_unit].isr_ipl = hc->hp_ipl;
     81 	hpib_isr[hc->hp_unit].isr_arg = hc->hp_unit;
     82 	isrlink(&hpib_isr[hc->hp_unit]);
     83 	hpibreset(hc->hp_unit);
     84 	return(1);
     85 }
     86 
     87 hpibreset(unit)
     88 	register int unit;
     89 {
     90 	if (hpib_softc[unit].sc_type == HPIBC)
     91 		fhpibreset(unit);
     92 	else
     93 		nhpibreset(unit);
     94 }
     95 
     96 hpibreq(dq)
     97 	register struct devqueue *dq;
     98 {
     99 	register struct devqueue *hq;
    100 
    101 	hq = &hpib_softc[dq->dq_ctlr].sc_sq;
    102 	insque(dq, hq->dq_back);
    103 	if (dq->dq_back == hq)
    104 		return(1);
    105 	return(0);
    106 }
    107 
    108 hpibfree(dq)
    109 	register struct devqueue *dq;
    110 {
    111 	register struct devqueue *hq;
    112 
    113 	hq = &hpib_softc[dq->dq_ctlr].sc_sq;
    114 	remque(dq);
    115 	if ((dq = hq->dq_forw) != hq)
    116 		(dq->dq_driver->d_start)(dq->dq_unit);
    117 }
    118 
    119 hpibid(unit, slave)
    120 	int unit, slave;
    121 {
    122 	short id;
    123 	int ohpibtimeout;
    124 
    125 	/*
    126 	 * XXX shorten timeout value so autoconfig doesn't
    127 	 * take forever on slow CPUs.
    128 	 */
    129 	ohpibtimeout = hpibtimeout;
    130 	hpibtimeout = hpibidtimeout * cpuspeed;
    131 	if (hpibrecv(unit, 31, slave, &id, 2) != 2)
    132 		id = 0;
    133 	hpibtimeout = ohpibtimeout;
    134 	return(id);
    135 }
    136 
    137 hpibsend(unit, slave, sec, addr, cnt)
    138 	register int unit;
    139 	int slave, sec, addr, cnt;
    140 {
    141 	if (hpib_softc[unit].sc_type == HPIBC)
    142 		return(fhpibsend(unit, slave, sec, addr, cnt));
    143 	else
    144 		return(nhpibsend(unit, slave, sec, addr, cnt));
    145 }
    146 
    147 hpibrecv(unit, slave, sec, addr, cnt)
    148 	register int unit;
    149 	int slave, sec, addr, cnt;
    150 {
    151 	if (hpib_softc[unit].sc_type == HPIBC)
    152 		return(fhpibrecv(unit, slave, sec, addr, cnt));
    153 	else
    154 		return(nhpibrecv(unit, slave, sec, addr, cnt));
    155 }
    156 
    157 hpibpptest(unit, slave)
    158 	register int unit;
    159 	int slave;
    160 {
    161 	int (*ppoll)();
    162 
    163 	ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
    164 	return((*ppoll)(unit) & (0x80 >> slave));
    165 }
    166 
    167 hpibppclear(unit)
    168 	int unit;
    169 {
    170 	hpib_softc[unit].sc_flags &= ~HPIBF_PPOLL;
    171 }
    172 
    173 hpibawait(unit)
    174 	int unit;
    175 {
    176 	register struct hpib_softc *hs = &hpib_softc[unit];
    177 
    178 	hs->sc_flags |= HPIBF_PPOLL;
    179 	if (hs->sc_type == HPIBC)
    180 		fhpibppwatch((void *)unit);
    181 	else
    182 		nhpibppwatch((void *)unit);
    183 }
    184 
    185 hpibswait(unit, slave)
    186 	register int unit;
    187 	int slave;
    188 {
    189 	register int timo = hpibtimeout;
    190 	register int mask, (*ppoll)();
    191 
    192 	ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
    193 	mask = 0x80 >> slave;
    194 	while (((ppoll)(unit) & mask) == 0)
    195 		if (--timo == 0) {
    196 			printf("hpib%d: swait timeout\n", unit);
    197 			return(-1);
    198 		}
    199 	return(0);
    200 }
    201 
    202 hpibustart(unit)
    203 	int unit;
    204 {
    205 	register struct hpib_softc *hs = &hpib_softc[unit];
    206 
    207 	if (hs->sc_type == HPIBA)
    208 		hs->sc_dq.dq_ctlr = DMA0;
    209 	else
    210 		hs->sc_dq.dq_ctlr = DMA0 | DMA1;
    211 	if (dmareq(&hs->sc_dq))
    212 		return(1);
    213 	return(0);
    214 }
    215 
    216 hpibstart(unit)
    217 	int unit;
    218 {
    219 	register struct devqueue *dq;
    220 
    221 	dq = hpib_softc[unit].sc_sq.dq_forw;
    222 	(dq->dq_driver->d_go)(dq->dq_unit);
    223 }
    224 
    225 hpibgo(unit, slave, sec, addr, count, rw, timo)
    226 	register int unit;
    227 	int slave, sec, addr, count, rw;
    228 {
    229 	if (hpib_softc[unit].sc_type == HPIBC)
    230 		fhpibgo(unit, slave, sec, addr, count, rw, timo);
    231 	else
    232 		nhpibgo(unit, slave, sec, addr, count, rw, timo);
    233 }
    234 
    235 hpibdone(unit)
    236 	register int unit;
    237 {
    238 	if (hpib_softc[unit].sc_type == HPIBC)
    239 		fhpibdone(unit);
    240 	else
    241 		nhpibdone(unit);
    242 }
    243 
    244 hpibintr(unit)
    245 	register int unit;
    246 {
    247 	int found;
    248 
    249 	if (hpib_softc[unit].sc_type == HPIBC)
    250 		found = fhpibintr(unit);
    251 	else
    252 		found = nhpibintr(unit);
    253 	return(found);
    254 }
    255 #endif
    256