Annotation of Net2/arch/hp300/dev/nhpib.c, revision 1.1.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:  *     @(#)nhpib.c     7.4 (Berkeley) 5/7/91
                     34:  */
                     35: 
                     36: /*
                     37:  * Internal/98624 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: 
                     46: #include "device.h"
                     47: #include "nhpibreg.h"
                     48: #include "hpibvar.h"
                     49: #include "dmavar.h"
                     50: 
                     51: nhpibtype(hc)
                     52:        register struct hp_ctlr *hc;
                     53: {
                     54:        register struct hpib_softc *hs = &hpib_softc[hc->hp_unit];
                     55:        register struct nhpibdevice *hd = (struct nhpibdevice *)hc->hp_addr;
                     56: 
                     57:        if (hc->hp_addr == internalhpib) {
                     58:                hs->sc_type = HPIBA;
                     59:                hs->sc_ba = HPIBA_BA;
                     60:                hc->hp_ipl = HPIBA_IPL;
                     61:        }
                     62:        else if (hd->hpib_cid == HPIBB) {
                     63:                hs->sc_type = HPIBB;
                     64:                hs->sc_ba = hd->hpib_csa & CSA_BA;
                     65:                hc->hp_ipl = HPIB_IPL(hd->hpib_ids);
                     66:        }
                     67:        else
                     68:                return(0);
                     69:        return(1);
                     70: }
                     71: 
                     72: nhpibreset(unit)
                     73: {
                     74:        register struct hpib_softc *hs = &hpib_softc[unit];
                     75:        register struct nhpibdevice *hd;
                     76: 
                     77:        hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
                     78:        hd->hpib_acr = AUX_SSWRST;
                     79:        hd->hpib_ar = hs->sc_ba;
                     80:        hd->hpib_lim = LIS_ERR;
                     81:        hd->hpib_mim = 0;
                     82:        hd->hpib_acr = AUX_CDAI;
                     83:        hd->hpib_acr = AUX_CSHDW;
                     84:        hd->hpib_acr = AUX_SSTD1;
                     85:        hd->hpib_acr = AUX_SVSTD1;
                     86:        hd->hpib_acr = AUX_CPP;
                     87:        hd->hpib_acr = AUX_CHDFA;
                     88:        hd->hpib_acr = AUX_CHDFE;
                     89:        hd->hpib_acr = AUX_RHDF;
                     90:        hd->hpib_acr = AUX_CSWRST;
                     91:        nhpibifc(hd);
                     92:        hd->hpib_ie = IDS_IE;
                     93:        hd->hpib_data = C_DCL;
                     94:        DELAY(100000);
                     95: }
                     96: 
                     97: nhpibifc(hd)
                     98:        register struct nhpibdevice *hd;
                     99: {
                    100:        hd->hpib_acr = AUX_TCA;
                    101:        hd->hpib_acr = AUX_CSRE;
                    102:        hd->hpib_acr = AUX_SSIC;
                    103:        DELAY(100);
                    104:        hd->hpib_acr = AUX_CSIC;
                    105:        hd->hpib_acr = AUX_SSRE;
                    106: }
                    107: 
                    108: nhpibsend(unit, slave, sec, addr, origcnt)
                    109:        register char *addr;
                    110: {
                    111:        register struct hpib_softc *hs = &hpib_softc[unit];
                    112:        register struct nhpibdevice *hd;
                    113:        register int cnt = origcnt;
                    114: 
                    115:        hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
                    116:        hd->hpib_acr = AUX_TCA;
                    117:        hd->hpib_data = C_UNL;
                    118:        if (nhpibwait(hd, MIS_BO))
                    119:                goto senderror;
                    120:        hd->hpib_data = C_TAG + hs->sc_ba;
                    121:        hd->hpib_acr = AUX_STON;
                    122:        if (nhpibwait(hd, MIS_BO))
                    123:                goto senderror;
                    124:        hd->hpib_data = C_LAG + slave;
                    125:        if (nhpibwait(hd, MIS_BO))
                    126:                goto senderror;
                    127:        if (sec != -1) {
                    128:                hd->hpib_data = C_SCG + sec;
                    129:                if (nhpibwait(hd, MIS_BO))
                    130:                        goto senderror;
                    131:        }
                    132:        hd->hpib_acr = AUX_GTS;
                    133:        if (cnt) {
                    134:                while (--cnt > 0) {
                    135:                        hd->hpib_data = *addr++;
                    136:                        if (nhpibwait(hd, MIS_BO))
                    137:                                goto senderror;
                    138:                }
                    139:                hd->hpib_acr = AUX_EOI;
                    140:                hd->hpib_data = *addr;
                    141:                if (nhpibwait(hd, MIS_BO))
                    142:                        goto senderror;
                    143:                hd->hpib_acr = AUX_TCA;
                    144: #if 0
                    145:                /*
                    146:                 * May be causing 345 disks to hang due to interference
                    147:                 * with PPOLL mechanism.
                    148:                 */
                    149:                hd->hpib_data = C_UNL;
                    150:                (void) nhpibwait(hd, MIS_BO);
                    151: #endif
                    152:        }
                    153:        return(origcnt);
                    154: senderror:
                    155:        nhpibifc(hd);
                    156:        return(origcnt - cnt - 1);
                    157: }
                    158: 
                    159: nhpibrecv(unit, slave, sec, addr, origcnt)
                    160:        register char *addr;
                    161: {
                    162:        register struct hpib_softc *hs = &hpib_softc[unit];
                    163:        register struct nhpibdevice *hd;
                    164:        register int cnt = origcnt;
                    165: 
                    166:        hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
                    167:        hd->hpib_acr = AUX_TCA;
                    168:        hd->hpib_data = C_UNL;
                    169:        if (nhpibwait(hd, MIS_BO))
                    170:                goto recverror;
                    171:        hd->hpib_data = C_LAG + hs->sc_ba;
                    172:        hd->hpib_acr = AUX_SLON;
                    173:        if (nhpibwait(hd, MIS_BO))
                    174:                goto recverror;
                    175:        hd->hpib_data = C_TAG + slave;
                    176:        if (nhpibwait(hd, MIS_BO))
                    177:                goto recverror;
                    178:        if (sec != -1) {
                    179:                hd->hpib_data = C_SCG + sec;
                    180:                if (nhpibwait(hd, MIS_BO))
                    181:                        goto recverror;
                    182:        }
                    183:        hd->hpib_acr = AUX_RHDF;
                    184:        hd->hpib_acr = AUX_GTS;
                    185:        if (cnt) {
                    186:                while (--cnt >= 0) {
                    187:                        if (nhpibwait(hd, MIS_BI))
                    188:                                goto recvbyteserror;
                    189:                        *addr++ = hd->hpib_data;
                    190:                }
                    191:                hd->hpib_acr = AUX_TCA;
                    192:                hd->hpib_data = (slave == 31) ? C_UNA : C_UNT;
                    193:                (void) nhpibwait(hd, MIS_BO);
                    194:        }
                    195:        return(origcnt);
                    196: recverror:
                    197:        nhpibifc(hd);
                    198: recvbyteserror:
                    199:        return(origcnt - cnt - 1);
                    200: }
                    201: 
                    202: nhpibgo(unit, slave, sec, addr, count, rw)
                    203:        register int unit, slave;
                    204:        char *addr;
                    205: {
                    206:        register struct hpib_softc *hs = &hpib_softc[unit];
                    207:        register struct nhpibdevice *hd;
                    208: 
                    209:        hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
                    210:        hs->sc_flags |= HPIBF_IO;
                    211:        if (rw == B_READ)
                    212:                hs->sc_flags |= HPIBF_READ;
                    213: #ifdef DEBUG
                    214:        else if (hs->sc_flags & HPIBF_READ) {
                    215:                printf("nhpibgo: HPIBF_READ still set\n");
                    216:                hs->sc_flags &= ~HPIBF_READ;
                    217:        }
                    218: #endif
                    219:        hs->sc_count = count;
                    220:        hs->sc_addr = addr;
                    221:        if (hs->sc_flags & HPIBF_READ) {
                    222:                hs->sc_curcnt = count;
                    223:                dmago(hs->sc_dq.dq_ctlr, addr, count, DMAGO_BYTE|DMAGO_READ);
                    224:                nhpibrecv(unit, slave, sec, 0, 0);
                    225:                hd->hpib_mim = MIS_END;
                    226:        } else {
                    227:                hd->hpib_mim = 0;
                    228:                if (count < hpibdmathresh) {
                    229:                        hs->sc_curcnt = count;
                    230:                        nhpibsend(unit, slave, sec, addr, count);
                    231:                        nhpibdone(unit);
                    232:                        return;
                    233:                }
                    234:                hs->sc_curcnt = --count;
                    235:                dmago(hs->sc_dq.dq_ctlr, addr, count, DMAGO_BYTE);
                    236:                nhpibsend(unit, slave, sec, 0, 0);
                    237:        }
                    238:        hd->hpib_ie = IDS_IE | IDS_DMA(hs->sc_dq.dq_ctlr);
                    239: }
                    240: 
                    241: nhpibdone(unit)
                    242:        register int unit;
                    243: {
                    244:        register struct hpib_softc *hs = &hpib_softc[unit];
                    245:        register struct nhpibdevice *hd;
                    246:        register int cnt;
                    247: 
                    248:        hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
                    249:        cnt = hs->sc_curcnt;
                    250:        hs->sc_addr += cnt;
                    251:        hs->sc_count -= cnt;
                    252:        hs->sc_flags |= HPIBF_DONE;
                    253:        hd->hpib_ie = IDS_IE;
                    254:        if ((hs->sc_flags & HPIBF_READ) == 0) {
                    255:                if (hs->sc_count == 1) {
                    256:                        (void) nhpibwait(hd, MIS_BO);
                    257:                        hd->hpib_acr = AUX_EOI;
                    258:                        hd->hpib_data = *hs->sc_addr;
                    259:                        hd->hpib_mim = MIS_BO;
                    260:                }
                    261: #ifdef DEBUG
                    262:                else if (hs->sc_count)
                    263:                        panic("nhpibdone");
                    264: #endif
                    265:        }
                    266: }
                    267: 
                    268: nhpibintr(unit)
                    269:        register int unit;
                    270: {
                    271:        register struct hpib_softc *hs = &hpib_softc[unit];
                    272:        register struct nhpibdevice *hd;
                    273:        register struct devqueue *dq;
                    274:        register int stat0;
                    275:        int stat1;
                    276: 
                    277: #ifdef lint
                    278:        if (stat1 = unit) return(1);
                    279: #endif
                    280:        hd = (struct nhpibdevice *)hs->sc_hc->hp_addr;
                    281:        if ((hd->hpib_ids & IDS_IR) == 0)
                    282:                return(0);
                    283:        stat0 = hd->hpib_mis;
                    284:        stat1 = hd->hpib_lis;
                    285:        dq = hs->sc_sq.dq_forw;
                    286:        if (hs->sc_flags & HPIBF_IO) {
                    287:                hd->hpib_mim = 0;
                    288:                if ((hs->sc_flags & HPIBF_DONE) == 0)
                    289:                        dmastop(hs->sc_dq.dq_ctlr);
                    290:                hd->hpib_acr = AUX_TCA;
                    291:                hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ);
                    292:                dmafree(&hs->sc_dq);
                    293:                (dq->dq_driver->d_intr)(dq->dq_unit);
                    294:        } else if (hs->sc_flags & HPIBF_PPOLL) {
                    295:                hd->hpib_mim = 0;
                    296:                stat0 = nhpibppoll(unit);
                    297:                if (stat0 & (0x80 >> dq->dq_slave)) {
                    298:                        hs->sc_flags &= ~HPIBF_PPOLL;
                    299:                        (dq->dq_driver->d_intr)(dq->dq_unit);
                    300:                }
                    301: #ifdef DEBUG
                    302:                else
                    303:                        printf("hpib%d: PPOLL intr bad status %x\n",
                    304:                               unit, stat0);
                    305: #endif
                    306:        }
                    307:        return(1);
                    308: }
                    309: 
                    310: nhpibppoll(unit)
                    311:        int unit;
                    312: {
                    313:        register struct nhpibdevice *hd;
                    314:        register int ppoll;
                    315: 
                    316:        hd = (struct nhpibdevice *)hpib_softc[unit].sc_hc->hp_addr;
                    317:        hd->hpib_acr = AUX_SPP;
                    318:        DELAY(25);
                    319:        ppoll = hd->hpib_cpt;
                    320:        hd->hpib_acr = AUX_CPP;
                    321:        return(ppoll);
                    322: }
                    323: 
                    324: nhpibwait(hd, x)
                    325:        register struct nhpibdevice *hd;
                    326: {
                    327:        register int timo = hpibtimeout;
                    328: 
                    329:        while ((hd->hpib_mis & x) == 0 && --timo)
                    330:                DELAY(1);
                    331:        if (timo == 0)
                    332:                return(-1);
                    333:        return(0);
                    334: }
                    335: 
                    336: nhpibppwatch(unit)
                    337:        register int unit;
                    338: {
                    339:        register struct hpib_softc *hs = &hpib_softc[unit];
                    340: 
                    341:        if ((hs->sc_flags & HPIBF_PPOLL) == 0)
                    342:                return;
                    343:        if (nhpibppoll(unit) & (0x80 >> hs->sc_sq.dq_forw->dq_slave))
                    344:                        ((struct nhpibdevice *)hs->sc_hc->hp_addr)->hpib_mim = MIS_BO;
                    345:        else
                    346:                timeout(nhpibppwatch, unit, 1);
                    347: }
                    348: #endif

unix.superglobalmegacorp.com

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