[BACK]Return to nhpib.c CVS log [TXT][DIR] Up to [local] / sys / arch / hp300 / dev

Annotation of sys/arch/hp300/dev/nhpib.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: nhpib.c,v 1.16 2005/11/13 18:52:15 miod Exp $ */
                      2: /*     $NetBSD: nhpib.c,v 1.17 1997/05/05 21:06:41 thorpej Exp $       */
                      3:
                      4: /*
                      5:  * Copyright (c) 1996, 1997 Jason R. Thorpe.  All rights reserved.
                      6:  * Copyright (c) 1982, 1990, 1993
                      7:  *     The Regents of the University of California.  All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. 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     8.2 (Berkeley) 1/12/94
                     34:  */
                     35:
                     36: /*
                     37:  * Internal/98624 HPIB driver
                     38:  */
                     39:
                     40: #include <sys/param.h>
                     41: #include <sys/systm.h>
                     42: #include <sys/kernel.h>
                     43: #include <sys/buf.h>
                     44: #include <sys/device.h>
                     45: #include <sys/timeout.h>
                     46:
                     47: #include <machine/autoconf.h>
                     48: #include <machine/intr.h>
                     49:
                     50: #include <hp300/dev/dioreg.h>
                     51: #include <hp300/dev/diovar.h>
                     52: #include <hp300/dev/diodevs.h>
                     53:
                     54: #include <hp300/dev/dmavar.h>
                     55:
                     56: #include <hp300/dev/nhpibreg.h>
                     57: #include <hp300/dev/hpibvar.h>
                     58:
                     59: /*
                     60:  * ODD parity table for listen and talk addresses and secondary commands.
                     61:  * The TI9914A doesn't produce the parity bit.
                     62:  */
                     63: static const u_char listnr_par[] = {
                     64:        0040,0241,0242,0043,0244,0045,0046,0247,
                     65:        0250,0051,0052,0253,0054,0255,0256,0057,
                     66:        0260,0061,0062,0263,0064,0265,0266,0067,
                     67:        0070,0271,0272,0073,0274,0075,0076,0277,
                     68: };
                     69: static const u_char talker_par[] = {
                     70:        0100,0301,0302,0103,0304,0105,0106,0307,
                     71:        0310,0111,0112,0313,0114,0315,0316,0117,
                     72:        0320,0121,0122,0323,0124,0325,0326,0127,
                     73:        0130,0331,0332,0133,0334,0135,0136,0337,
                     74: };
                     75: static const u_char sec_par[] = {
                     76:        0340,0141,0142,0343,0144,0345,0346,0147,
                     77:        0150,0351,0352,0153,0354,0155,0156,0357,
                     78:        0160,0361,0362,0163,0364,0165,0166,0367,
                     79:        0370,0171,0172,0373,0174,0375,0376,0177
                     80: };
                     81:
                     82: void   nhpibifc(struct nhpibdevice *);
                     83: void   nhpibreadtimo(void *);
                     84: int    nhpibwait(struct nhpibdevice *, int);
                     85:
                     86: void   nhpibreset(struct hpibbus_softc *);
                     87: int    nhpibsend(struct hpibbus_softc *, int, int, void *, int);
                     88: int    nhpibrecv(struct hpibbus_softc *, int, int, void *, int);
                     89: int    nhpibppoll(struct hpibbus_softc *);
                     90: void   nhpibppwatch(void *);
                     91: void   nhpibgo(struct hpibbus_softc *, int, int, void *, int, int, int);
                     92: void   nhpibdone(struct hpibbus_softc *);
                     93: int    nhpibintr(void *);
                     94:
                     95: /*
                     96:  * Our controller ops structure.
                     97:  */
                     98: struct hpib_controller nhpib_controller = {
                     99:        nhpibreset,
                    100:        nhpibsend,
                    101:        nhpibrecv,
                    102:        nhpibppoll,
                    103:        nhpibppwatch,
                    104:        nhpibgo,
                    105:        nhpibdone,
                    106:        nhpibintr
                    107: };
                    108:
                    109: struct nhpib_softc {
                    110:        struct device sc_dev;           /* generic device glue */
                    111:        struct isr sc_isr;
                    112:        struct nhpibdevice *sc_regs;    /* device registers */
                    113:        struct hpibbus_softc *sc_hpibbus; /* XXX */
                    114:        struct timeout sc_read_to;      /* nhpibreadtimo timeout */
                    115:        struct timeout sc_watch_to;     /* nhpibppwatch timeout */
                    116: };
                    117:
                    118: int    nhpibmatch(struct device *, void *, void *);
                    119: void   nhpibattach(struct device *, struct device *, void *);
                    120:
                    121: struct cfattach nhpib_ca = {
                    122:        sizeof(struct nhpib_softc), nhpibmatch, nhpibattach
                    123: };
                    124:
                    125: struct cfdriver nhpib_cd = {
                    126:        NULL, "nhpib", DV_DULL
                    127: };
                    128:
                    129: int
                    130: nhpibmatch(parent, match, aux)
                    131:        struct device *parent;
                    132:        void *match, *aux;
                    133: {
                    134:        struct dio_attach_args *da = aux;
                    135:
                    136:        /*
                    137:         * Internal HP-IB doesn't always return a device ID,
                    138:         * so we rely on the sysflags.
                    139:         */
                    140:        if (da->da_scode == 7 && internalhpib)
                    141:                return (1);
                    142:
                    143:        if (da->da_id == DIO_DEVICE_ID_NHPIB)
                    144:                return (1);
                    145:
                    146:        return (0);
                    147: }
                    148:
                    149: void
                    150: nhpibattach(parent, self, aux)
                    151:        struct device *parent, *self;
                    152:        void *aux;
                    153: {
                    154:        struct nhpib_softc *sc = (struct nhpib_softc *)self;
                    155:        struct dio_attach_args *da = aux;
                    156:        struct hpibdev_attach_args ha;
                    157:        const char *desc;
                    158:        int ipl, type = HPIBA;
                    159:
                    160:        sc->sc_regs = (struct nhpibdevice *)iomap(dio_scodetopa(da->da_scode),
                    161:            da->da_size);
                    162:        if (sc->sc_regs == NULL) {
                    163:                printf("\n%s: can't map registers\n", self->dv_xname);
                    164:                return;
                    165:        }
                    166:
                    167:        ipl = DIO_IPL(sc->sc_regs);
                    168:
                    169:        if (da->da_scode == 7 && internalhpib)
                    170:                desc = DIO_DEVICE_DESC_IHPIB;
                    171:        else if (da->da_id == DIO_DEVICE_ID_NHPIB) {
                    172:                type = HPIBB;
                    173:                desc = DIO_DEVICE_DESC_NHPIB;
                    174:        } else
                    175:                desc = "unknown HP-IB!";
                    176:
                    177:        printf(" ipl %d: %s\n", ipl, desc);
                    178:
                    179:        /* Establish the interrupt handler. */
                    180:        sc->sc_isr.isr_func = nhpibintr;
                    181:        sc->sc_isr.isr_arg = sc;
                    182:        sc->sc_isr.isr_ipl = ipl;
                    183:        sc->sc_isr.isr_priority = IPL_BIO;
                    184:        dio_intr_establish(&sc->sc_isr, self->dv_xname);
                    185:
                    186:        /* Initialize timeout structures */
                    187:        timeout_set(&sc->sc_read_to, nhpibreadtimo, sc);
                    188:
                    189:        ha.ha_ops = &nhpib_controller;
                    190:        ha.ha_type = type;                      /* XXX */
                    191:        ha.ha_ba = (type == HPIBA) ? HPIBA_BA :
                    192:            (sc->sc_regs->hpib_csa & CSA_BA);
                    193:        ha.ha_softcpp = &sc->sc_hpibbus;        /* XXX */
                    194:        (void)config_found(self, &ha, hpibdevprint);
                    195: }
                    196:
                    197: void
                    198: nhpibreset(hs)
                    199:        struct hpibbus_softc *hs;
                    200: {
                    201:        struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
                    202:        struct nhpibdevice *hd = sc->sc_regs;
                    203:
                    204:        hd->hpib_acr = AUX_SSWRST;
                    205:        hd->hpib_ar = hs->sc_ba;
                    206:        hd->hpib_lim = LIS_ERR;
                    207:        hd->hpib_mim = 0;
                    208:        hd->hpib_acr = AUX_CDAI;
                    209:        hd->hpib_acr = AUX_CSHDW;
                    210:        hd->hpib_acr = AUX_SSTD1;
                    211:        hd->hpib_acr = AUX_SVSTD1;
                    212:        hd->hpib_acr = AUX_CPP;
                    213:        hd->hpib_acr = AUX_CHDFA;
                    214:        hd->hpib_acr = AUX_CHDFE;
                    215:        hd->hpib_acr = AUX_RHDF;
                    216:        hd->hpib_acr = AUX_CSWRST;
                    217:        nhpibifc(hd);
                    218:        hd->hpib_ie = IDS_IE;
                    219:        hd->hpib_data = C_DCL_P;
                    220:        DELAY(100000);
                    221: }
                    222:
                    223: void
                    224: nhpibifc(hd)
                    225:        struct nhpibdevice *hd;
                    226: {
                    227:        hd->hpib_acr = AUX_TCA;
                    228:        hd->hpib_acr = AUX_CSRE;
                    229:        hd->hpib_acr = AUX_SSIC;
                    230:        DELAY(100);
                    231:        hd->hpib_acr = AUX_CSIC;
                    232:        hd->hpib_acr = AUX_SSRE;
                    233: }
                    234:
                    235: int
                    236: nhpibsend(hs, slave, sec, ptr, origcnt)
                    237:        struct hpibbus_softc *hs;
                    238:        int slave, sec, origcnt;
                    239:        void *ptr;
                    240: {
                    241:        struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
                    242:        struct nhpibdevice *hd = sc->sc_regs;
                    243:        int cnt = origcnt;
                    244:        char *addr = ptr;
                    245:
                    246:        hd->hpib_acr = AUX_TCA;
                    247:        hd->hpib_data = C_UNL_P;
                    248:        if (nhpibwait(hd, MIS_BO))
                    249:                goto senderror;
                    250:        hd->hpib_data = talker_par[hs->sc_ba];
                    251:        hd->hpib_acr = AUX_STON;
                    252:        if (nhpibwait(hd, MIS_BO))
                    253:                goto senderror;
                    254:        hd->hpib_data = listnr_par[slave];
                    255:        if (nhpibwait(hd, MIS_BO))
                    256:                goto senderror;
                    257:        if (sec >= 0 || sec == -2) {
                    258:                if (sec == -2)          /* selected device clear KLUDGE */
                    259:                        hd->hpib_data = C_SDC_P;
                    260:                else
                    261:                        hd->hpib_data = sec_par[sec];
                    262:                if (nhpibwait(hd, MIS_BO))
                    263:                        goto senderror;
                    264:        }
                    265:        hd->hpib_acr = AUX_GTS;
                    266:        if (cnt) {
                    267:                while (--cnt > 0) {
                    268:                        hd->hpib_data = *addr++;
                    269:                        if (nhpibwait(hd, MIS_BO))
                    270:                                goto senderror;
                    271:                }
                    272:                hd->hpib_acr = AUX_EOI;
                    273:                hd->hpib_data = *addr;
                    274:                if (nhpibwait(hd, MIS_BO))
                    275:                        goto senderror;
                    276:                hd->hpib_acr = AUX_TCA;
                    277: #if 0
                    278:                /*
                    279:                 * May be causing 345 disks to hang due to interference
                    280:                 * with PPOLL mechanism.
                    281:                 */
                    282:                hd->hpib_data = C_UNL_P;
                    283:                (void) nhpibwait(hd, MIS_BO);
                    284: #endif
                    285:        }
                    286:        return(origcnt);
                    287:
                    288: senderror:
                    289:        nhpibifc(hd);
                    290:        return(origcnt - cnt - 1);
                    291: }
                    292:
                    293: int
                    294: nhpibrecv(hs, slave, sec, ptr, origcnt)
                    295:        struct hpibbus_softc *hs;
                    296:        int slave, sec, origcnt;
                    297:        void *ptr;
                    298: {
                    299:        struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
                    300:        struct nhpibdevice *hd = sc->sc_regs;
                    301:        int cnt = origcnt;
                    302:        char *addr = ptr;
                    303:
                    304:        /*
                    305:         * Slave < 0 implies continuation of a previous receive
                    306:         * that probably timed out.
                    307:         */
                    308:        if (slave >= 0) {
                    309:                hd->hpib_acr = AUX_TCA;
                    310:                hd->hpib_data = C_UNL_P;
                    311:                if (nhpibwait(hd, MIS_BO))
                    312:                        goto recverror;
                    313:                hd->hpib_data = listnr_par[hs->sc_ba];
                    314:                hd->hpib_acr = AUX_SLON;
                    315:                if (nhpibwait(hd, MIS_BO))
                    316:                        goto recverror;
                    317:                hd->hpib_data = talker_par[slave];
                    318:                if (nhpibwait(hd, MIS_BO))
                    319:                        goto recverror;
                    320:                if (sec >= 0) {
                    321:                        hd->hpib_data = sec_par[sec];
                    322:                        if (nhpibwait(hd, MIS_BO))
                    323:                                goto recverror;
                    324:                }
                    325:                hd->hpib_acr = AUX_RHDF;
                    326:                hd->hpib_acr = AUX_GTS;
                    327:        }
                    328:        if (cnt) {
                    329:                while (--cnt >= 0) {
                    330:                        if (nhpibwait(hd, MIS_BI))
                    331:                                goto recvbyteserror;
                    332:                        *addr++ = hd->hpib_data;
                    333:                }
                    334:                hd->hpib_acr = AUX_TCA;
                    335:                hd->hpib_data = (slave == 31) ? C_UNA_P : C_UNT_P;
                    336:                (void) nhpibwait(hd, MIS_BO);
                    337:        }
                    338:        return(origcnt);
                    339:
                    340: recverror:
                    341:        nhpibifc(hd);
                    342: recvbyteserror:
                    343:        return(origcnt - cnt - 1);
                    344: }
                    345:
                    346: void
                    347: nhpibgo(hs, slave, sec, ptr, count, rw, timo)
                    348:        struct hpibbus_softc *hs;
                    349:        int slave, sec, count, rw, timo;
                    350:        void *ptr;
                    351: {
                    352:        struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
                    353:        struct nhpibdevice *hd = sc->sc_regs;
                    354:        char *addr = ptr;
                    355:
                    356:        hs->sc_flags |= HPIBF_IO;
                    357:        if (timo)
                    358:                hs->sc_flags |= HPIBF_TIMO;
                    359:        if (rw == B_READ)
                    360:                hs->sc_flags |= HPIBF_READ;
                    361: #ifdef DEBUG
                    362:        else if (hs->sc_flags & HPIBF_READ) {
                    363:                printf("nhpibgo: HPIBF_READ still set\n");
                    364:                hs->sc_flags &= ~HPIBF_READ;
                    365:        }
                    366: #endif
                    367:        hs->sc_count = count;
                    368:        hs->sc_addr = addr;
                    369:        if (hs->sc_flags & HPIBF_READ) {
                    370:                hs->sc_curcnt = count;
                    371:                dmago(hs->sc_dq->dq_chan, addr, count, DMAGO_BYTE|DMAGO_READ);
                    372:                nhpibrecv(hs, slave, sec, 0, 0);
                    373:                hd->hpib_mim = MIS_END;
                    374:        } else {
                    375:                hd->hpib_mim = 0;
                    376:                if (count < hpibdmathresh) {
                    377:                        hs->sc_curcnt = count;
                    378:                        nhpibsend(hs, slave, sec, addr, count);
                    379:                        nhpibdone(hs);
                    380:                        return;
                    381:                }
                    382:                hs->sc_curcnt = --count;
                    383:                dmago(hs->sc_dq->dq_chan, addr, count, DMAGO_BYTE);
                    384:                nhpibsend(hs, slave, sec, 0, 0);
                    385:        }
                    386:        hd->hpib_ie = IDS_IE | IDS_DMA(hs->sc_dq->dq_chan);
                    387: }
                    388:
                    389: /*
                    390:  * This timeout can only happen if a DMA read finishes DMAing with the read
                    391:  * still pending (more data in read transaction than the driver was prepared
                    392:  * to accept).  At the moment, variable-record tape drives are the only things
                    393:  * capabale of doing this.  We repeat the necessary code from nhpibintr() -
                    394:  * easier and quicker than calling nhpibintr() for this special case.
                    395:  */
                    396: void
                    397: nhpibreadtimo(arg)
                    398:        void *arg;
                    399: {
                    400:        struct nhpib_softc *sc = arg;
                    401:        struct hpibbus_softc *hs = sc->sc_hpibbus;
                    402:        int s;
                    403:
                    404:        s = splbio();
                    405:        if (hs->sc_flags & HPIBF_IO) {
                    406:                struct nhpibdevice *hd = sc->sc_regs;
                    407:                struct hpibqueue *hq;
                    408:
                    409:                hd->hpib_mim = 0;
                    410:                hd->hpib_acr = AUX_TCA;
                    411:                hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ|HPIBF_TIMO);
                    412:                dmafree(hs->sc_dq);
                    413:
                    414:                hq = TAILQ_FIRST(&hs->sc_queue);
                    415:                (hq->hq_intr)(hq->hq_softc);
                    416:        }
                    417:        splx(s);
                    418: }
                    419:
                    420: void
                    421: nhpibdone(hs)
                    422:        struct hpibbus_softc *hs;
                    423: {
                    424:        struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
                    425:        struct nhpibdevice *hd = sc->sc_regs;
                    426:        int cnt;
                    427:
                    428:        cnt = hs->sc_curcnt;
                    429:        hs->sc_addr += cnt;
                    430:        hs->sc_count -= cnt;
                    431:        hs->sc_flags |= HPIBF_DONE;
                    432:        hd->hpib_ie = IDS_IE;
                    433:        if (hs->sc_flags & HPIBF_READ) {
                    434:                if ((hs->sc_flags & HPIBF_TIMO) &&
                    435:                    (hd->hpib_ids & IDS_IR) == 0)
                    436:                        timeout_add(&sc->sc_read_to, hz >> 2);
                    437:        } else {
                    438:                if (hs->sc_count == 1) {
                    439:                        (void) nhpibwait(hd, MIS_BO);
                    440:                        hd->hpib_acr = AUX_EOI;
                    441:                        hd->hpib_data = *hs->sc_addr;
                    442:                        hd->hpib_mim = MIS_BO;
                    443:                }
                    444: #ifdef DEBUG
                    445:                else if (hs->sc_count)
                    446:                        panic("nhpibdone");
                    447: #endif
                    448:        }
                    449: }
                    450:
                    451: int
                    452: nhpibintr(arg)
                    453:        void *arg;
                    454: {
                    455:        struct nhpib_softc *sc = arg;
                    456:        struct hpibbus_softc *hs = sc->sc_hpibbus;
                    457:        struct nhpibdevice *hd = sc->sc_regs;
                    458:        struct hpibqueue *hq;
                    459:        int stat0;
                    460:        int stat1;
                    461:
                    462: #ifdef lint
                    463:        if (stat1 = unit) return(1);
                    464: #endif
                    465:        if ((hd->hpib_ids & IDS_IR) == 0)
                    466:                return(0);
                    467:        stat0 = hd->hpib_mis;
                    468:        stat1 = hd->hpib_lis;
                    469:
                    470:        hq = TAILQ_FIRST(&hs->sc_queue);
                    471:
                    472:        if (hs->sc_flags & HPIBF_IO) {
                    473:                hd->hpib_mim = 0;
                    474:                if ((hs->sc_flags & HPIBF_DONE) == 0) {
                    475:                        hs->sc_flags &= ~HPIBF_TIMO;
                    476:                        dmastop(hs->sc_dq->dq_chan);
                    477:                } else if (hs->sc_flags & HPIBF_TIMO)
                    478:                        timeout_del(&sc->sc_read_to);
                    479:                hd->hpib_acr = AUX_TCA;
                    480:                hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ|HPIBF_TIMO);
                    481:
                    482:                dmafree(hs->sc_dq);
                    483:                (hq->hq_intr)(hq->hq_softc);
                    484:        } else if (hs->sc_flags & HPIBF_PPOLL) {
                    485:                hd->hpib_mim = 0;
                    486:                stat0 = nhpibppoll(hs);
                    487:                if (stat0 & (0x80 >> hq->hq_slave)) {
                    488:                        hs->sc_flags &= ~HPIBF_PPOLL;
                    489:                        (hq->hq_intr)(hq->hq_softc);
                    490:                }
                    491: #ifdef DEBUG
                    492:                else
                    493:                        printf("%s: PPOLL intr bad status %x\n",
                    494:                               hs->sc_dev.dv_xname, stat0);
                    495: #endif
                    496:        }
                    497:        return(1);
                    498: }
                    499:
                    500: int
                    501: nhpibppoll(hs)
                    502:        struct hpibbus_softc *hs;
                    503: {
                    504:        struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
                    505:        struct nhpibdevice *hd = sc->sc_regs;
                    506:        int ppoll;
                    507:
                    508:        hd->hpib_acr = AUX_SPP;
                    509:        DELAY(25);
                    510:        ppoll = hd->hpib_cpt;
                    511:        hd->hpib_acr = AUX_CPP;
                    512:        return(ppoll);
                    513: }
                    514:
                    515: #ifdef DEBUG
                    516: int nhpibreporttimo = 0;
                    517: #endif
                    518:
                    519: int
                    520: nhpibwait(hd, x)
                    521:        struct nhpibdevice *hd;
                    522:        int x;
                    523: {
                    524:        int timo = hpibtimeout;
                    525:
                    526:        while ((hd->hpib_mis & x) == 0 && --timo)
                    527:                DELAY(1);
                    528:        if (timo == 0) {
                    529: #ifdef DEBUG
                    530:                if (nhpibreporttimo)
                    531:                        printf("hpib0: %s timo\n", x==MIS_BO?"OUT":"IN");
                    532: #endif
                    533:                return(-1);
                    534:        }
                    535:        return(0);
                    536: }
                    537:
                    538: void
                    539: nhpibppwatch(arg)
                    540:        void *arg;
                    541: {
                    542:        struct hpibbus_softc *hs = arg;
                    543:        struct nhpib_softc *sc = (struct nhpib_softc *)hs->sc_dev.dv_parent;
                    544:
                    545:        if ((hs->sc_flags & HPIBF_PPOLL) == 0)
                    546:                return;
                    547:
                    548: again:
                    549:        if (nhpibppoll(hs) & (0x80 >> TAILQ_FIRST(&hs->sc_queue)->hq_slave))
                    550:                        sc->sc_regs->hpib_mim = MIS_BO;
                    551:        else if (cold)
                    552:                /* timeouts not working yet */
                    553:                goto again;
                    554:        else {
                    555:                timeout_set(&sc->sc_watch_to, nhpibppwatch, hs);
                    556:                timeout_add(&sc->sc_watch_to, 1);
                    557:        }
                    558: }

CVSweb