[BACK]Return to esp_pcmcia.c CVS log [TXT][DIR] Up to [local] / sys / dev / pcmcia

Annotation of sys/dev/pcmcia/esp_pcmcia.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: esp_pcmcia.c,v 1.6 2006/04/20 20:30:28 miod Exp $     */
                      2: /*     $NetBSD: esp_pcmcia.c,v 1.8 2000/06/05 15:36:45 tsutsui Exp $   */
                      3:
                      4: /*-
                      5:  * Copyright (c) 2000 The NetBSD Foundation, Inc.
                      6:  * All rights reserved.
                      7:  *
                      8:  * This code is derived from software contributed to The NetBSD Foundation
                      9:  * by Charles M. Hannum.
                     10:  *
                     11:  * Redistribution and use in source and binary forms, with or without
                     12:  * modification, are permitted provided that the following conditions
                     13:  * are met:
                     14:  * 1. Redistributions of source code must retain the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer.
                     16:  * 2. Redistributions in binary form must reproduce the above copyright
                     17:  *    notice, this list of conditions and the following disclaimer in the
                     18:  *    documentation and/or other materials provided with the distribution.
                     19:  * 3. All advertising materials mentioning features or use of this software
                     20:  *    must display the following acknowledgement:
                     21:  *        This product includes software developed by the NetBSD
                     22:  *        Foundation, Inc. and its contributors.
                     23:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     24:  *    contributors may be used to endorse or promote products derived
                     25:  *    from this software without specific prior written permission.
                     26:  *
                     27:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     28:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     29:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     30:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     31:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     32:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     33:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     34:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     35:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     36:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     37:  * POSSIBILITY OF SUCH DAMAGE.
                     38:  */
                     39:
                     40: #include <sys/param.h>
                     41: #include <sys/systm.h>
                     42: #include <sys/device.h>
                     43: #include <sys/buf.h>
                     44:
                     45: #include <machine/bus.h>
                     46: #include <machine/intr.h>
                     47:
                     48: #include <scsi/scsi_all.h>
                     49: #include <scsi/scsiconf.h>
                     50:
                     51: #include <dev/pcmcia/pcmciareg.h>
                     52: #include <dev/pcmcia/pcmciavar.h>
                     53: #include <dev/pcmcia/pcmciadevs.h>
                     54:
                     55: #include <dev/ic/ncr53c9xreg.h>
                     56: #include <dev/ic/ncr53c9xvar.h>
                     57:
                     58: struct esp_pcmcia_softc {
                     59:        struct ncr53c9x_softc   sc_ncr53c9x;    /* glue to MI code */
                     60:
                     61:        int             sc_active;              /* Pseudo-DMA state vars */
                     62:        int             sc_tc;
                     63:        int             sc_datain;
                     64:        size_t          sc_dmasize;
                     65:        size_t          sc_dmatrans;
                     66:        char            **sc_dmaaddr;
                     67:        size_t          *sc_pdmalen;
                     68:
                     69:        /* PCMCIA-specific goo. */
                     70:        struct pcmcia_io_handle sc_pcioh;       /* PCMCIA i/o space info */
                     71:        int sc_io_window;                       /* our i/o window */
                     72:        struct pcmcia_function *sc_pf;          /* our PCMCIA function */
                     73:        void *sc_ih;                            /* interrupt handler */
                     74: #ifdef ESP_PCMCIA_POLL
                     75:        struct callout sc_poll_ch;
                     76: #endif
                     77:        int sc_flags;
                     78: #define        ESP_PCMCIA_ATTACHED     1               /* attach completed */
                     79: #define ESP_PCMCIA_ATTACHING   2               /* attach in progress */
                     80: };
                     81:
                     82: int    esp_pcmcia_match(struct device *, void *, void *);
                     83: void   esp_pcmcia_attach(struct device *, struct device *, void *);
                     84: void   esp_pcmcia_init(struct esp_pcmcia_softc *);
                     85: int    esp_pcmcia_detach(struct device *, int);
                     86: int    esp_pcmcia_enable(void *, int);
                     87:
                     88: struct scsi_adapter esp_pcmcia_adapter = {
                     89:        ncr53c9x_scsi_cmd,      /* cmd */
                     90:        minphys,                /* minphys */
                     91:        0,                      /* open */
                     92:        0,                      /* close */
                     93: };
                     94:
                     95: struct cfattach esp_pcmcia_ca = {
                     96:        sizeof(struct esp_pcmcia_softc), esp_pcmcia_match, esp_pcmcia_attach
                     97: };
                     98:
                     99: /*
                    100:  * Functions and the switch for the MI code.
                    101:  */
                    102: #ifdef ESP_PCMCIA_POLL
                    103: void   esp_pcmcia_poll(void *);
                    104: #endif
                    105: u_char esp_pcmcia_read_reg(struct ncr53c9x_softc *, int);
                    106: void   esp_pcmcia_write_reg(struct ncr53c9x_softc *, int, u_char);
                    107: int    esp_pcmcia_dma_isintr(struct ncr53c9x_softc *);
                    108: void   esp_pcmcia_dma_reset(struct ncr53c9x_softc *);
                    109: int    esp_pcmcia_dma_intr(struct ncr53c9x_softc *);
                    110: int    esp_pcmcia_dma_setup(struct ncr53c9x_softc *, caddr_t *,
                    111:            size_t *, int, size_t *);
                    112: void   esp_pcmcia_dma_go(struct ncr53c9x_softc *);
                    113: void   esp_pcmcia_dma_stop(struct ncr53c9x_softc *);
                    114: int    esp_pcmcia_dma_isactive(struct ncr53c9x_softc *);
                    115:
                    116: struct ncr53c9x_glue esp_pcmcia_glue = {
                    117:        esp_pcmcia_read_reg,
                    118:        esp_pcmcia_write_reg,
                    119:        esp_pcmcia_dma_isintr,
                    120:        esp_pcmcia_dma_reset,
                    121:        esp_pcmcia_dma_intr,
                    122:        esp_pcmcia_dma_setup,
                    123:        esp_pcmcia_dma_go,
                    124:        esp_pcmcia_dma_stop,
                    125:        esp_pcmcia_dma_isactive,
                    126:        NULL,                   /* gl_clear_latched_intr */
                    127: };
                    128:
                    129: struct esp_pcmcia_product {
                    130:        u_int16_t       app_vendor;             /* PCMCIA vendor ID */
                    131:        u_int16_t       app_product;            /* PCMCIA product ID */
                    132:        int             app_expfunc;            /* expected function number */
                    133: } esp_pcmcia_prod[] = {
                    134:        { PCMCIA_VENDOR_PANASONIC, PCMCIA_PRODUCT_PANASONIC_KXLC002, 0 },
                    135:        { PCMCIA_VENDOR_PANASONIC, PCMCIA_PRODUCT_PANASONIC_KME, 0 },
                    136:        { PCMCIA_VENDOR_NEWMEDIA2, PCMCIA_PRODUCT_NEWMEDIA2_BUSTOASTER, 0 }
                    137: };
                    138:
                    139: int
                    140: esp_pcmcia_match(parent, match, aux)
                    141:        struct device *parent;
                    142:        void *match, *aux;
                    143: {
                    144:        struct pcmcia_attach_args *pa = aux;
                    145:        int i;
                    146:
                    147:        for (i = 0; i < sizeof(esp_pcmcia_prod)/sizeof(esp_pcmcia_prod[0]); i++)
                    148:                if (pa->manufacturer == esp_pcmcia_prod[i].app_vendor &&
                    149:                    pa->product == esp_pcmcia_prod[i].app_product &&
                    150:                    pa->pf->number == esp_pcmcia_prod[i].app_expfunc)
                    151:                        return (1);
                    152:        return (0);
                    153: }
                    154:
                    155: void
                    156: esp_pcmcia_attach(parent, self, aux)
                    157:        struct device *parent, *self;
                    158:        void *aux;
                    159: {
                    160:        struct esp_pcmcia_softc *esc = (void *)self;
                    161:        struct ncr53c9x_softc *sc = &esc->sc_ncr53c9x;
                    162:        struct pcmcia_attach_args *pa = aux;
                    163:        struct pcmcia_config_entry *cfe;
                    164:        struct pcmcia_function *pf = pa->pf;
                    165:        const char *intrstr;
                    166:
                    167:        esc->sc_pf = pf;
                    168:
                    169:        for (cfe = SIMPLEQ_FIRST(&pf->cfe_head); cfe != NULL;
                    170:            cfe = SIMPLEQ_NEXT(cfe, cfe_list)) {
                    171:                if (cfe->num_memspace != 0 ||
                    172:                    cfe->num_iospace != 1)
                    173:                        continue;
                    174:
                    175:                if (pcmcia_io_alloc(pa->pf, cfe->iospace[0].start,
                    176:                    cfe->iospace[0].length, 0, &esc->sc_pcioh) == 0)
                    177:                        break;
                    178:        }
                    179:
                    180:        if (cfe == 0) {
                    181:                printf(": can't alloc i/o space\n");
                    182:                goto no_config_entry;
                    183:        }
                    184:
                    185:        /* Enable the card. */
                    186:        pcmcia_function_init(pf, cfe);
                    187:        if (pcmcia_function_enable(pf)) {
                    188:                printf(": function enable failed\n");
                    189:                goto enable_failed;
                    190:        }
                    191:
                    192:        /* Map in the I/O space */
                    193:        if (pcmcia_io_map(pa->pf, PCMCIA_WIDTH_AUTO, 0, esc->sc_pcioh.size,
                    194:            &esc->sc_pcioh, &esc->sc_io_window)) {
                    195:                printf(": can't map i/o space\n");
                    196:                goto iomap_failed;
                    197:        }
                    198:
                    199:        printf(" port 0x%lx/%lu", esc->sc_pcioh.addr,
                    200:            (u_long)esc->sc_pcioh.size);
                    201:
                    202:        esp_pcmcia_init(esc);
                    203:
                    204:        esc->sc_ih = pcmcia_intr_establish(esc->sc_pf, IPL_BIO,
                    205:            ncr53c9x_intr, &esc->sc_ncr53c9x, sc->sc_dev.dv_xname);
                    206:        intrstr = pcmcia_intr_string(esc->sc_pf, esc->sc_ih);
                    207:        if (esc->sc_ih == NULL) {
                    208:                printf(", %s\n", intrstr);
                    209:                goto iomap_failed;
                    210:        }
                    211:        if (*intrstr)
                    212:                printf(", %s", intrstr);
                    213:
                    214:        /*
                    215:         *  Initialize nca board itself.
                    216:         */
                    217:        esc->sc_flags |= ESP_PCMCIA_ATTACHING;
                    218:        ncr53c9x_attach(sc, &esp_pcmcia_adapter, NULL);
                    219:        esc->sc_flags &= ~ESP_PCMCIA_ATTACHING;
                    220:        esc->sc_flags |= ESP_PCMCIA_ATTACHED;
                    221:        return;
                    222:
                    223: iomap_failed:
                    224:        /* Disable the device. */
                    225:        pcmcia_function_disable(esc->sc_pf);
                    226:
                    227: enable_failed:
                    228:        /* Unmap our I/O space. */
                    229:        pcmcia_io_free(esc->sc_pf, &esc->sc_pcioh);
                    230:
                    231: no_config_entry:
                    232:        return;
                    233: }
                    234:
                    235: void
                    236: esp_pcmcia_init(esc)
                    237:        struct esp_pcmcia_softc *esc;
                    238: {
                    239:        struct ncr53c9x_softc *sc = &esc->sc_ncr53c9x;
                    240:        bus_space_tag_t iot = esc->sc_pcioh.iot;
                    241:        bus_space_handle_t ioh = esc->sc_pcioh.ioh;
                    242:
                    243:        /* id 7, clock 40M, parity ON, sync OFF, fast ON, slow ON */
                    244:
                    245:        sc->sc_glue = &esp_pcmcia_glue;
                    246:
                    247: #ifdef ESP_PCMCIA_POLL
                    248:        callout_init(&esc->sc_poll_ch);
                    249: #endif
                    250:
                    251:        sc->sc_rev = NCR_VARIANT_ESP406;
                    252:        sc->sc_id = 7;
                    253:        sc->sc_freq = 40;
                    254:        /* try -PARENB -SLOW */
                    255:        sc->sc_cfg1 = sc->sc_id | NCRCFG1_PARENB | NCRCFG1_SLOW;
                    256:        /* try +FE */
                    257:        sc->sc_cfg2 = NCRCFG2_SCSI2;
                    258:        /* try -IDM -FSCSI -FCLK */
                    259:        sc->sc_cfg3 = NCRESPCFG3_CDB | NCRESPCFG3_FCLK | NCRESPCFG3_IDM |
                    260:            NCRESPCFG3_FSCSI;
                    261:        sc->sc_cfg4 = NCRCFG4_ACTNEG;
                    262:        /* try +INTP */
                    263:        sc->sc_cfg5 = NCRCFG5_CRS1 | NCRCFG5_AADDR | NCRCFG5_PTRINC;
                    264:        sc->sc_minsync = 0;
                    265:        sc->sc_maxxfer = 64 * 1024;
                    266:
                    267:        bus_space_write_1(iot, ioh, NCR_CFG5, sc->sc_cfg5);
                    268:
                    269:        bus_space_write_1(iot, ioh, NCR_PIOI, 0);
                    270:        bus_space_write_1(iot, ioh, NCR_PSTAT, 0);
                    271:        bus_space_write_1(iot, ioh, 0x09, 0x24);
                    272:
                    273:        bus_space_write_1(iot, ioh, NCR_CFG4, sc->sc_cfg4);
                    274: }
                    275:
                    276: #ifdef notyet
                    277: int
                    278: esp_pcmcia_detach(self, flags)
                    279:        struct device *self;
                    280:        int flags;
                    281: {
                    282:        struct esp_pcmcia_softc *esc = (void *)self;
                    283:        int error;
                    284:
                    285:        if ((esc->sc_flags & ESP_PCMCIA_ATTACHED) == 0) {
                    286:                /* Nothing to detach. */
                    287:                return (0);
                    288:        }
                    289:
                    290:        error = ncr53c9x_detach(&esc->sc_ncr53c9x, flags);
                    291:        if (error)
                    292:                return (error);
                    293:
                    294:        /* Unmap our i/o window and i/o space. */
                    295:        pcmcia_io_unmap(esc->sc_pf, esc->sc_io_window);
                    296:        pcmcia_io_free(esc->sc_pf, &esc->sc_pcioh);
                    297:
                    298:        return (0);
                    299: }
                    300: #endif
                    301:
                    302: int
                    303: esp_pcmcia_enable(arg, onoff)
                    304:        void *arg;
                    305:        int onoff;
                    306: {
                    307:        struct esp_pcmcia_softc *esc = arg;
                    308:
                    309:        if (onoff) {
                    310: #ifdef ESP_PCMCIA_POLL
                    311:                callout_reset(&esc->sc_poll_ch, 1, esp_pcmcia_poll, esc);
                    312: #else
                    313:                /* Establish the interrupt handler. */
                    314:                esc->sc_ih = pcmcia_intr_establish(esc->sc_pf, IPL_BIO,
                    315:                    ncr53c9x_intr, &esc->sc_ncr53c9x,
                    316:                    esc->sc_ncr53c9x.sc_dev.dv_xname);
                    317:                if (esc->sc_ih == NULL) {
                    318:                        printf("%s: couldn't establish interrupt handler\n",
                    319:                            esc->sc_ncr53c9x.sc_dev.dv_xname);
                    320:                        return (EIO);
                    321:                }
                    322: #endif
                    323:
                    324:                /*
                    325:                 * If attach is in progress, we know that card power is
                    326:                 * enabled and chip will be initialized later.
                    327:                 * Otherwise, enable and reset now.
                    328:                 */
                    329:                if ((esc->sc_flags & ESP_PCMCIA_ATTACHING) == 0) {
                    330:                        if (pcmcia_function_enable(esc->sc_pf)) {
                    331:                                printf("%s: couldn't enable PCMCIA function\n",
                    332:                                    esc->sc_ncr53c9x.sc_dev.dv_xname);
                    333:                                pcmcia_intr_disestablish(esc->sc_pf,
                    334:                                    esc->sc_ih);
                    335:                                return (EIO);
                    336:                        }
                    337:
                    338:                        /* Initialize only chip.  */
                    339:                        ncr53c9x_init(&esc->sc_ncr53c9x, 0);
                    340:                }
                    341:        } else {
                    342:                pcmcia_function_disable(esc->sc_pf);
                    343: #ifdef ESP_PCMCIA_POLL
                    344:                callout_stop(&esc->sc_poll_ch);
                    345: #else
                    346:                pcmcia_intr_disestablish(esc->sc_pf, esc->sc_ih);
                    347: #endif
                    348:        }
                    349:
                    350:        return (0);
                    351: }
                    352:
                    353: #ifdef ESP_PCMCIA_POLL
                    354: void
                    355: esp_pcmcia_poll(arg)
                    356:        void *arg;
                    357: {
                    358:        struct esp_pcmcia_softc *esc = arg;
                    359:
                    360:        (void) ncr53c9x_intr(&esc->sc_ncr53c9x);
                    361:        callout_reset(&esc->sc_poll_ch, 1, esp_pcmcia_poll, esc);
                    362: }
                    363: #endif
                    364:
                    365: /*
                    366:  * Glue functions.
                    367:  */
                    368: u_char
                    369: esp_pcmcia_read_reg(sc, reg)
                    370:        struct ncr53c9x_softc *sc;
                    371:        int reg;
                    372: {
                    373:        struct esp_pcmcia_softc *esc = (struct esp_pcmcia_softc *)sc;
                    374:        u_char v;
                    375:
                    376:        v = bus_space_read_1(esc->sc_pcioh.iot, esc->sc_pcioh.ioh, reg);
                    377:        return v;
                    378: }
                    379:
                    380: void
                    381: esp_pcmcia_write_reg(sc, reg, val)
                    382:        struct ncr53c9x_softc *sc;
                    383:        int reg;
                    384:        u_char val;
                    385: {
                    386:        struct esp_pcmcia_softc *esc = (struct esp_pcmcia_softc *)sc;
                    387:        u_char v = val;
                    388:
                    389:        if (reg == NCR_CMD && v == (NCRCMD_TRANS|NCRCMD_DMA))
                    390:                v = NCRCMD_TRANS;
                    391:        bus_space_write_1(esc->sc_pcioh.iot, esc->sc_pcioh.ioh, reg, v);
                    392: }
                    393:
                    394: int
                    395: esp_pcmcia_dma_isintr(sc)
                    396:        struct ncr53c9x_softc *sc;
                    397: {
                    398:
                    399:        return NCR_READ_REG(sc, NCR_STAT) & NCRSTAT_INT;
                    400: }
                    401:
                    402: void
                    403: esp_pcmcia_dma_reset(sc)
                    404:        struct ncr53c9x_softc *sc;
                    405: {
                    406:        struct esp_pcmcia_softc *esc = (struct esp_pcmcia_softc *)sc;
                    407:
                    408:        esc->sc_active = 0;
                    409:        esc->sc_tc = 0;
                    410: }
                    411:
                    412: int
                    413: esp_pcmcia_dma_intr(sc)
                    414:        struct ncr53c9x_softc *sc;
                    415: {
                    416:        struct esp_pcmcia_softc *esc = (struct esp_pcmcia_softc *)sc;
                    417:        u_char  *p;
                    418:        u_int   espphase, espstat, espintr;
                    419:        int     cnt;
                    420:
                    421:        if (esc->sc_active == 0) {
                    422:                printf("%s: dma_intr--inactive DMA\n", sc->sc_dev.dv_xname);
                    423:                return -1;
                    424:        }
                    425:
                    426:        if ((sc->sc_espintr & NCRINTR_BS) == 0) {
                    427:                esc->sc_active = 0;
                    428:                return 0;
                    429:        }
                    430:
                    431:        cnt = *esc->sc_pdmalen;
                    432:        if (*esc->sc_pdmalen == 0) {
                    433:                printf("%s: data interrupt, but no count left\n",
                    434:                    sc->sc_dev.dv_xname);
                    435:        }
                    436:
                    437:        p = *esc->sc_dmaaddr;
                    438:        espphase = sc->sc_phase;
                    439:        espstat = (u_int) sc->sc_espstat;
                    440:        espintr = (u_int) sc->sc_espintr;
                    441:        do {
                    442:                if (esc->sc_datain) {
                    443:                        *p++ = NCR_READ_REG(sc, NCR_FIFO);
                    444:                        cnt--;
                    445:                        if (espphase == DATA_IN_PHASE)
                    446:                                NCR_WRITE_REG(sc, NCR_CMD, NCRCMD_TRANS);
                    447:                        else
                    448:                                esc->sc_active = 0;
                    449:                } else {
                    450:                        if (espphase == DATA_OUT_PHASE ||
                    451:                            espphase == MESSAGE_OUT_PHASE) {
                    452:                                NCR_WRITE_REG(sc, NCR_FIFO, *p++);
                    453:                                cnt--;
                    454:                                NCR_WRITE_REG(sc, NCR_CMD, NCRCMD_TRANS);
                    455:                        } else
                    456:                                esc->sc_active = 0;
                    457:                }
                    458:
                    459:                if (esc->sc_active) {
                    460:                        while (!(NCR_READ_REG(sc, NCR_STAT) & NCRSTAT_INT));
                    461:                        espstat = NCR_READ_REG(sc, NCR_STAT);
                    462:                        espintr = NCR_READ_REG(sc, NCR_INTR);
                    463:                        espphase = (espintr & NCRINTR_DIS)
                    464:                                    ? /* Disconnected */ BUSFREE_PHASE
                    465:                                    : espstat & PHASE_MASK;
                    466:                }
                    467:        } while (esc->sc_active && espintr);
                    468:        sc->sc_phase = espphase;
                    469:        sc->sc_espstat = (u_char) espstat;
                    470:        sc->sc_espintr = (u_char) espintr;
                    471:        *esc->sc_dmaaddr = p;
                    472:        *esc->sc_pdmalen = cnt;
                    473:
                    474:        if (*esc->sc_pdmalen == 0)
                    475:                esc->sc_tc = NCRSTAT_TC;
                    476:        sc->sc_espstat |= esc->sc_tc;
                    477:        return 0;
                    478: }
                    479:
                    480: int
                    481: esp_pcmcia_dma_setup(sc, addr, len, datain, dmasize)
                    482:        struct ncr53c9x_softc *sc;
                    483:        caddr_t *addr;
                    484:        size_t *len;
                    485:        int datain;
                    486:        size_t *dmasize;
                    487: {
                    488:        struct esp_pcmcia_softc *esc = (struct esp_pcmcia_softc *)sc;
                    489:
                    490:        esc->sc_dmaaddr = addr;
                    491:        esc->sc_pdmalen = len;
                    492:        esc->sc_datain = datain;
                    493:        esc->sc_dmasize = *dmasize;
                    494:        esc->sc_tc = 0;
                    495:
                    496:        return 0;
                    497: }
                    498:
                    499: void
                    500: esp_pcmcia_dma_go(sc)
                    501:        struct ncr53c9x_softc *sc;
                    502: {
                    503:        struct esp_pcmcia_softc *esc = (struct esp_pcmcia_softc *)sc;
                    504:
                    505:        esc->sc_active = 1;
                    506: }
                    507:
                    508: void
                    509: esp_pcmcia_dma_stop(sc)
                    510:        struct ncr53c9x_softc *sc;
                    511: {
                    512: }
                    513:
                    514: int
                    515: esp_pcmcia_dma_isactive(sc)
                    516:        struct ncr53c9x_softc *sc;
                    517: {
                    518:        struct esp_pcmcia_softc *esc = (struct esp_pcmcia_softc *)sc;
                    519:
                    520:        return (esc->sc_active);
                    521: }

CVSweb