Annotation of Net2/arch/hp300/dev/hpib.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.