Home | History | Annotate | Line # | Download | only in dev
hpib.c revision 1.4
      1 /*	$NetBSD: hpib.c,v 1.4 1994/10/26 07:24:17 cgd 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 hpibawait(unit)
    168 	int unit;
    169 {
    170 	register struct hpib_softc *hs = &hpib_softc[unit];
    171 
    172 	hs->sc_flags |= HPIBF_PPOLL;
    173 	if (hs->sc_type == HPIBC)
    174 		fhpibppwatch((void *)unit);
    175 	else
    176 		nhpibppwatch((void *)unit);
    177 }
    178 
    179 hpibswait(unit, slave)
    180 	register int unit;
    181 	int slave;
    182 {
    183 	register int timo = hpibtimeout;
    184 	register int mask, (*ppoll)();
    185 
    186 	ppoll = (hpib_softc[unit].sc_type == HPIBC) ? fhpibppoll : nhpibppoll;
    187 	mask = 0x80 >> slave;
    188 	while (((ppoll)(unit) & mask) == 0)
    189 		if (--timo == 0) {
    190 			printf("hpib%d: swait timeout\n", unit);
    191 			return(-1);
    192 		}
    193 	return(0);
    194 }
    195 
    196 hpibustart(unit)
    197 	int unit;
    198 {
    199 	register struct hpib_softc *hs = &hpib_softc[unit];
    200 
    201 	if (hs->sc_type == HPIBA)
    202 		hs->sc_dq.dq_ctlr = DMA0;
    203 	else
    204 		hs->sc_dq.dq_ctlr = DMA0 | DMA1;
    205 	if (dmareq(&hs->sc_dq))
    206 		return(1);
    207 	return(0);
    208 }
    209 
    210 hpibstart(unit)
    211 	int unit;
    212 {
    213 	register struct devqueue *dq;
    214 
    215 	dq = hpib_softc[unit].sc_sq.dq_forw;
    216 	(dq->dq_driver->d_go)(dq->dq_unit);
    217 }
    218 
    219 hpibgo(unit, slave, sec, addr, count, rw)
    220 	register int unit;
    221 	int slave, sec, addr, count, rw;
    222 {
    223 	if (hpib_softc[unit].sc_type == HPIBC)
    224 		fhpibgo(unit, slave, sec, addr, count, rw);
    225 	else
    226 		nhpibgo(unit, slave, sec, addr, count, rw);
    227 }
    228 
    229 hpibdone(unit)
    230 	register int unit;
    231 {
    232 	if (hpib_softc[unit].sc_type == HPIBC)
    233 		fhpibdone(unit);
    234 	else
    235 		nhpibdone(unit);
    236 }
    237 
    238 hpibintr(unit)
    239 	register int unit;
    240 {
    241 	int found;
    242 
    243 	if (hpib_softc[unit].sc_type == HPIBC)
    244 		found = fhpibintr(unit);
    245 	else
    246 		found = nhpibintr(unit);
    247 	return(found);
    248 }
    249 #endif
    250