diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/isa/pcmcia_isa.c | 342 | ||||
-rw-r--r-- | sys/dev/isa/pcmcia_pcic.c | 1065 |
2 files changed, 0 insertions, 1407 deletions
diff --git a/sys/dev/isa/pcmcia_isa.c b/sys/dev/isa/pcmcia_isa.c deleted file mode 100644 index 6c6592d910e..00000000000 --- a/sys/dev/isa/pcmcia_isa.c +++ /dev/null @@ -1,342 +0,0 @@ -/* $OpenBSD: pcmcia_isa.c,v 1.10 1997/03/01 22:42:57 niklas Exp $ */ -/* - * Copyright (c) 1995,1996 John T. Kohl. All rights reserved. - * Copyright (c) 1994 Stefan Grefen. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Charles Hannum. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/* TODO add modload support and loadable lists of devices */ -/* How to do cards with more than one function (modem/ethernet ..) */ -#include <sys/types.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/device.h> -#include <vm/vm.h> - -#include <machine/bus.h> - -#include <dev/pcmcia/pcmciavar.h> -#include <dev/pcmcia/pcmciareg.h> - -#include <dev/isa/isareg.h> -#include <dev/isa/isavar.h> -#include <dev/ic/i8042reg.h> -#include <i386/isa/isa_machdep.h> /* XXX USES ISA HOLE DIRECTLY */ - -#ifdef IBM_WD -#define PCMCIA_ISA_DEBUG -#endif - -#ifdef PCMCIA_ISA_DEBUG -#define STATIC -#else -#define STATIC static -#endif - -STATIC int pcmcia_isa_init __P((struct device *, struct cfdata *, - void *, struct pcmcia_adapter *, int)); -STATIC int pcmcia_isa_search __P((struct device *, void *, cfprint_t)); -STATIC int pcmcia_isa_probe __P((struct device *, void *, - void *, struct pcmcia_link *)); -STATIC int pcmcia_isa_config __P((struct pcmcia_link *, struct device *, - struct pcmcia_conf *, struct cfdata *)); -STATIC int pcmcia_isa_unconfig __P((struct pcmcia_link *)); - -struct pcmciabus_link pcmcia_isa_link = { - pcmcia_isa_config, - pcmcia_isa_unconfig, - pcmcia_isa_probe, - pcmcia_isa_search, - pcmcia_isa_init -}; - -/* copy out the addr and length from machine specific attach struct */ -STATIC int -pcmcia_isa_init(parent, cf, aux, pca, flag) - struct device *parent; - struct cfdata *cf; - void *aux; - struct pcmcia_adapter *pca; - int flag; -{ - struct pcmciabus_attach_args *pa = aux; - -#ifdef PCMCIA_ISA_DEBUG - if (parent != NULL) - printf("PARENT %s\n", parent->dv_xname); -#endif - if (flag == 0) { /* match */ - pca->scratch_memsiz = pa->pba_msize; - pca->scratch_memh = pa->pba_memh; - pca->pa_memt = pa->pba_memt; -#ifdef PCMCIA_ISA_DEBUG - printf("pbaaddr %p maddr %x msize %x\n", - pa, pa->pba_maddr, pa->pba_msize); - printf("PCA %p mem %p size %d memt %x memh %x\n", - pca, pca->scratch_mem, pca->scratch_memsiz, - pca->pa_memt, pca->scratch_memh); -#endif - } - return 1; -} - -/* Ease some typing by providing a nice typedef. */ -typedef int (*probe_t) __P((struct device *, void *, void *, - struct pcmcia_link *)); - -/* probe and attach a device, the has to be configured already */ -STATIC int -pcmcia_isa_probe(parent, match, aux, pc_link) - struct device *parent; - void *match; - void *aux; - struct pcmcia_link *pc_link; -{ - struct device *dev = match; - struct cfdata *cf = aux; - struct isa_attach_args ia; - struct pcmciadevs *pcs = pc_link->device; - probe_t probe = (pcs != NULL) ? pcs->dev->pcmcia_probe : NULL; - - if (cf->cf_loc[6] != -1 && cf->cf_loc[6] != pc_link->slot) { -#ifdef PCMCIA_ISA_DEBUG - printf("- isa probe slot mismatch: cf %d <> link %d\n", - cf->cf_loc[6], pc_link->slot); -#endif - return 0; - } -#if 0 - if (pcs == NULL || pcs->dev->pcmcia_probe == NULL) { -#ifdef PCMCIA_ISA_DEBUG - printf("- isa probe null proberoutine %p\n", pcs); -#endif - return 0; - } -#endif - ia.ia_iobase = cf->cf_loc[0]; - ia.ia_iosize = cf->cf_loc[1] == -1 ? 0x666 : cf->cf_loc[1]; - ia.ia_maddr = cf->cf_loc[2]; - ia.ia_msize = cf->cf_loc[3]; - ia.ia_irq = cf->cf_loc[4] == 2 ? 9 : cf->cf_loc[4] ; - ia.ia_drq = cf->cf_loc[5]; - ia.ia_iot = pc_link->bus->sc_iot; - ia.ia_memt = pc_link->bus->sc_memt; - -#ifdef PCMCIA_ISA_DEBUG - printf("pcmcia probe %x %x %p\n", ia.ia_iobase, ia.ia_irq, - probe == NULL ? cf->cf_attach->ca_match : probe); - printf("parentname = %s\n", parent->dv_xname); - printf("devname = %s\n", dev->dv_xname); - printf("driver name = %s\n", cf->cf_driver->cd_name); -#endif - if ((probe == NULL ? (*cf->cf_attach->ca_match)(parent, dev, &ia) : - (*probe)(parent, dev, &ia, pc_link)) > 0) { - extern int isaprint __P((void *, const char *)); - - config_attach(parent, dev, &ia, isaprint); -#ifdef PCMCIA_ISA_DEBUG - printf("biomask %x netmask %x ttymask %x\n", - (u_short) imask[IPL_BIO], (u_short) imask[IPL_NET], - (u_short) imask[IPL_TTY]); -#endif - return 1; - } - else if (parent->dv_cfdata->cf_driver->cd_indirect == 0) - free(dev, M_DEVBUF); - return 0; -} - -/* - * Modify a pcmcia_conf struct to match the config entry. Pc_cf was filled - * with config data from the card and may be modified before and after the - * call to pcmcia_isa_config. Unless the FIXED_WIN flag is set we assume - * contiguous windows and shift according to the offset for the first not - * fixed window - */ -STATIC int -pcmcia_isa_config(pc_link, self, pc_cf, cf) - struct pcmcia_link *pc_link; - struct device *self; - struct pcmcia_conf *pc_cf; - struct cfdata *cf; -{ - struct isa_attach_args ia; - struct pcmciadevs *pcs = pc_link->device; - - ia.ia_iobase = cf->cf_loc[0]; - ia.ia_iosize = 0x666; - ia.ia_maddr = cf->cf_loc[2]; - ia.ia_msize = cf->cf_loc[3]; - ia.ia_irq = cf->cf_loc[4]; - ia.ia_drq = cf->cf_loc[5]; -#ifdef PCMCIA_ISA_DEBUG - printf("pcmcia_isa_config iobase=%x maddr=%x msize=%x irq=%d drq=%d slot=%d\n", - ia.ia_iobase, ISA_HOLE_VADDR(ia.ia_maddr), ia.ia_msize, - ia.ia_irq, ia.ia_drq, cf->cf_loc[6]); -#endif - - if (pcs && strcmp(pcs->devname, self->dv_cfdata->cf_driver->cd_name)) { -#ifdef PCMCIA_ISA_DEBUG - printf("- wrong driver %s vs %s\n", pcs->devname, - self->dv_cfdata->cf_driver->cd_name); -#endif - return ENODEV; - } - - if (ia.ia_irq != IRQUNK) { - int irq = 1 << ia.ia_irq; - /* - * This is tricky irq 9 must match irq 2 in a device mask and - * configured irq 9 must match irq 2 - */ -#ifdef PCMCIA_ISA_DEBUG - printf("pcmcia_isa_config irq=%x num=%x mask=%x and=%x\n", irq, - 1 << pc_cf->irq_num, pc_cf->irq_mask, - irq & pc_cf->irq_mask); -#endif - if (irq != (1 << pc_cf->irq_num) && - !(irq == (1 << 9) && pc_cf->irq_num == 2)) { - if (irq == (1 << 9) || irq == (1 << 2)) - irq = (1 << 9) | (1 << 2); - if ((irq & pc_cf->irq_mask) == 0) { - printf("%s: slot %d requested irq %d, avail_mask %x\n", - self->dv_parent->dv_xname, - pc_link->slot, - ia.ia_irq, - pc_cf->irq_mask); - return ENODEV; - } - /* 2 is 9 is 2 ... */ - irq&=~(1 << 2); - cf->cf_loc[4] = pc_cf->irq_num = ffs(irq) - 1; -#ifdef PCMCIA_ISA_DEBUG - printf("pcmcia_isa_config modify num=%x\n", - pc_cf->irq_num); -#endif - } - } - if (ia.ia_iobase != IOBASEUNK) { - int i; - int offs = 0; - if (pc_cf->iowin == 0) - return 0; - for (i = 0; i < pc_cf->iowin; i++) { - if (pc_cf->io[i].flags & PCMCIA_FIXED_WIN) - continue; - if (offs == 0) { - if (pc_cf->io[i].start != ia.ia_iobase) { - offs = ia.ia_iobase - - pc_cf->io[i].start; - } else - break; - } - pc_cf->io[i].start += offs; - } - } else - pc_cf->iowin = 0; - if (ia.ia_maddr != MADDRUNK && ia.ia_msize) { - int i; - unsigned long offs = 0; - int mlen = ia.ia_msize; - int maddr = (int) ISA_HOLE_VADDR(ia.ia_maddr); - - if (pc_cf->memwin == 0) - return ENODEV; - -#ifdef PCMCIA_ISA_DEBUG - printf("Doing ia=%x ma=%x ms=%d\n", ia.ia_maddr, - maddr, ia.ia_msize); -#endif - for (i = 0; i < pc_cf->memwin && mlen > 0; i++) { -#ifdef PCMCIA_ISA_DEBUG - printf("Doing i=%d st=%x len=%d, flags=%x offs=%d mlen=%d\n", - i, pc_cf->mem[i].start, pc_cf->mem[i].len, - pc_cf->mem[i].flags, offs, mlen); -#endif - if (pc_cf->mem[i].flags & PCMCIA_FIXED_WIN) - continue; - if (offs == 0) { - if (pc_cf->mem[i].start != maddr) { - offs = maddr - pc_cf->mem[i].start; - } else - break; - } - mlen -= pc_cf->mem[i].len; - if (mlen < 0) - pc_cf->mem[i].len += mlen; - pc_cf->mem[i].start += offs; - } - } else - pc_cf->memwin = 0; - return 0; -} - - -STATIC int -pcmcia_isa_unconfig(pc_link) - struct pcmcia_link *pc_link; -{ -#if 0 - if (pc_link && pc_link->intr > 0) { - /* THIS IS A GUESS ... TODO check all possible drivers */ - struct softc { - struct device sc_dev; - void *sc_ih; - bus_space_tag_t sc_iot; - bus_space_tag_t sc_memt; - } *sc = pc_link->devp; - if (sc) - isa_intr_disestablish(sc->sc_ic, sc->sc_ih); - } -#endif - return 0; -} - -/* Searches for for configured devices on the pcmciabus */ -STATIC int -pcmcia_isa_search(parent, aux, print) - struct device *parent; - void *aux; - cfprint_t print; -{ - static char *msgs[3] = {"", " not configured\n", " unsupported\n"}; - -#ifdef PCMCIA_ISA_DEBUG - printf("pcmcia_isa_search\n"); -#endif - if (config_search(pcmcia_configure, parent, aux) != NULL) - return 1; - - if (print) { - int i; - i = (*print) (aux, parent->dv_xname); - printf(msgs[i]); - } - return 0; -} diff --git a/sys/dev/isa/pcmcia_pcic.c b/sys/dev/isa/pcmcia_pcic.c deleted file mode 100644 index 22df9794bee..00000000000 --- a/sys/dev/isa/pcmcia_pcic.c +++ /dev/null @@ -1,1065 +0,0 @@ -/* $OpenBSD: pcmcia_pcic.c,v 1.15 1997/04/16 23:29:28 niklas Exp $ */ - -/* - * Copyright (c) 1995, 1996 John T. Kohl - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -/* - * Device Driver for Intel 82365 based pcmcia slots - * - * Copyright (c) 1994 Stefan Grefen. This software may be used, modified, - * copied, distributed, and sold, in both source and binary form provided that - * the above copyright and these terms are retained. Under no circumstances is - * the author responsible for the proper functioning of this software, nor does - * the author assume any responsibility for damages incurred with its use. - * - */ - - -#include <sys/types.h> -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/errno.h> -#include <sys/ioctl.h> -#include <sys/mbuf.h> -#include <sys/device.h> -#include <sys/proc.h> -#include <sys/user.h> - -#include <machine/bus.h> - -#include <dev/isa/isavar.h> -#include <dev/ic/i82365reg.h> - -#include <dev/pcmcia/pcmciavar.h> -#include <dev/pcmcia/pcmciareg.h> - -#ifdef IBM_WD -#define PCIC_DEBUG 0xf -#endif -#if PCIC_DEBUG -#define PCDMEM 0x01 -#define PCDIO 0x02 -#define PCDINTR 0x04 -#define PCDSERV 0x08 -#define PCDRW 0x10 -#define PCDCONF 0x20 -int pcic_debug = PCIC_DEBUG; -#define PDEBUG(a) (pcic_debug & (a)) -#else -#define PDEBUG(a) (0) -#endif - -/* - * pcic_softc: per line info and status - */ -#define MAX_IOSECTION 2 -#define MAX_MEMSECTION 5 -struct slot { - int status; -#define SLOT_EMPTY 0x01 -#define SLOT_PROBING 0x02 -#define SLOT_INUSE 0x04 - u_short io_addr[MAX_IOSECTION], io_len[MAX_IOSECTION]; - u_short io_used[MAX_IOSECTION]; - caddr_t mem_caddr[MAX_MEMSECTION]; - u_int mem_haddr[MAX_MEMSECTION]; - u_int mem_len[MAX_MEMSECTION], mem_used[MAX_MEMSECTION]; - u_short region_flag; - u_short ioctl_flag; - u_short irq; - u_short pow; - u_short irqt; - u_short reg_off;/* 2 chips share an address */ - void (*handler)(struct slot *, void *); - void * handle_arg; - struct pcmcia_link *link; - struct pcic_softc *chip; -}; - -struct pcic_softc { - struct device sc_dev; - bus_space_tag_t sc_iot; - bus_space_tag_t sc_memt; - struct pcmcia_adapter sc_adapter; - void *sc_ih; - int sc_polltimo; - int sc_pcic_irq; - bus_space_handle_t sc_ioh; - bus_space_handle_t sc_memh; - u_short pcic_base; /* base port for each board */ - u_char chip_inf; - struct slot slot[4]; /* treat up to 4 as on the same pcic */ -}; -#define pcic_parent(sc) ((struct pcicmaster_softc *)(sc)->sc_dev.dv_parent) - -int pcic_map_io __P((struct pcmcia_link *, u_int, u_int, int)); -int pcic_map_mem __P((struct pcmcia_link *, bus_space_tag_t, caddr_t, - u_int, u_int, int)); -int pcic_map_intr __P((struct pcmcia_link *, int, int)); -int pcic_service __P((struct pcmcia_link *, int, void *, int)); - -static struct pcmcia_funcs pcic_funcs = { - pcic_map_io, - pcic_map_mem, - pcic_map_intr, - pcic_service -}; - -int pcic_probe __P((struct device *, void *, void *)); -void pcic_attach __P((struct device *, struct device *, void *)); -int pcic_print __P((void *, const char *)); - -int pcicmaster_probe __P((struct device *, void *, void *)); -void pcicmaster_attach __P((struct device *, struct device *, void *)); -int pcicmaster_print __P((void *, const char *)); -int pcic_intr __P((void *)); - -extern struct pcmciabus_link pcmcia_isa_link; - -struct cfattach pcic_ca = { - sizeof(struct pcic_softc), pcic_probe, pcic_attach, -}; - -struct cfdriver pcic_cd = { - NULL, "pcic", DV_DULL -}; - -struct pcicmaster_softc { - struct device sc_dev; - isa_chipset_tag_t sc_ic; - bus_space_tag_t sc_iot; - bus_space_tag_t sc_memt; - bus_space_handle_t sc_ioh; - struct pcic_softc *sc_ctlrs[2]; - char sc_slavestate[2]; -#define SLAVE_NOTPRESENT 0 -#define SLAVE_FOUND 1 -#define SLAVE_CONFIGURED 2 -}; - -struct cfattach pcicmaster_ca = { - sizeof(struct pcicmaster_softc), pcicmaster_probe, pcicmaster_attach, -}; - -struct cfdriver pcicmaster_cd = { - NULL, "pcicmaster", DV_DULL, 1 -}; - -struct pcic_attach_args { - int pia_ctlr; /* pcic ctlr number */ - isa_chipset_tag_t pia_ic; /* isa chipset tag */ - bus_space_tag_t pia_iot; /* bus chipset tag */ - bus_space_tag_t pia_memt; /* bus chipset tag */ - bus_space_handle_t pia_ioh; /* base i/o address */ - int pia_iosize; /* span of ports used */ - int pia_irq; /* interrupt request */ - int pia_drq; /* DMA request */ - int pia_maddr; /* physical i/o mem addr */ - u_int pia_msize; /* size of i/o memory */ -}; - -static __inline u_char pcic_rd __P((struct slot *, int)); -static __inline void pcic_wr __P((struct slot *, int, int)); -static __inline int pcic_wait __P((struct slot *, int)); - -static __inline u_char -pcic_rd(slot, reg) - struct slot *slot; - int reg; -{ - u_char res; - bus_space_tag_t iot = slot->chip->sc_iot; - bus_space_handle_t ioh = slot->chip->sc_ioh; - - if (PDEBUG(PCDRW)) - printf("pcic_rd(%x [%x %x]) = ", reg, slot->reg_off, ioh); - bus_space_write_1(iot, ioh, 0, slot->reg_off + reg); - delay(1); - res = bus_space_read_1(iot, ioh, 1); - if (PDEBUG(PCDRW)) - printf("%x\n", res); - return res; -} - -static __inline void -pcic_wr(slot, reg, val) - struct slot *slot; - int reg, val; -{ - bus_space_tag_t iot = slot->chip->sc_iot; - bus_space_handle_t ioh = slot->chip->sc_ioh; - - bus_space_write_1(iot, ioh, 0, slot->reg_off + reg); - delay(1); - bus_space_write_1(iot, ioh, 1, val); - if (PDEBUG(PCDRW)) { - int res; - delay(1); - bus_space_write_1(iot, ioh, 0, slot->reg_off + reg); - delay(1); - res = bus_space_read_1(iot, ioh, 1); - printf("pcic_wr(%x %x) = %x\n", reg, val, res); - } -} - -static __inline int -pcic_wait(slot, i) - struct slot *slot; - int i; -{ - while (i-- && ((pcic_rd(slot, PCIC_STATUS) & PCIC_READY) == 0)) - delay(500); - return i; -} - -int -pcic_probe(parent, self, aux) - struct device *parent; - void *self; - void *aux; -{ - struct pcic_softc *pcic = self; - struct pcicmaster_softc *pcicm = (struct pcicmaster_softc *)parent; - struct pcic_attach_args *pia = aux; - u_int chip_inf = 0, ochip_inf = 0; - int first = 1; - int i, j, maxslot; - - bzero(pcic->slot, sizeof(pcic->slot)); - - if (PDEBUG(PCDCONF)) { - printf("pcic_probe controller %d unit %d\n", pia->pia_ctlr, - pcic->sc_dev.dv_unit); - delay(2000000); - } - if (pcicm->sc_slavestate[pia->pia_ctlr] != SLAVE_FOUND) - return 0; - if (pcic->sc_dev.dv_cfdata->cf_loc[1] == -1 || - pcic->sc_dev.dv_cfdata->cf_loc[2] == 0) - return 0; - - /* - * select register offsets based on which controller we are. - * 2 pcic controllers (w/ 2 slots each) possible at each - * IO port location, for a total of 8 possible PCMCIA slots. - * - * for VLSI controllers, we probe up to 4 slots for the same chip type, - * and handle them on one controller. This is slightly - * cheating (two separate pcic's are required for 4 slots, according - * to the i82365 spec). - * - * For other controllers, we only take up to 2 slots. - */ - pcic->sc_ioh = pia->pia_ioh; - pcic->sc_iot = pia->pia_iot; - pcic->sc_memt = pia->pia_memt; - pcic->sc_adapter.nslots = 0; - maxslot = 2; - for (i = j = 0; i < maxslot; i++) { - pcic->slot[j].reg_off = 0x80 * pia->pia_ctlr + 0x40 * i; - pcic->slot[j].chip = pcic; - - chip_inf = pcic_rd(&pcic->slot[j], PCIC_ID_REV); - if (PDEBUG(PCDCONF)) { - printf("pcic_probe read info %x\n", chip_inf); - delay(2000000); - } - if (!first && ochip_inf != chip_inf) - continue; /* don't attach, it's different */ - ochip_inf = chip_inf; - switch (chip_inf) { - case PCIC_INTEL0: - pcic->chip_inf = PCMICA_CHIP_82365_0; - goto ok; - case PCIC_INTEL1: - pcic->chip_inf = PCMICA_CHIP_82365_1; - goto ok; - case PCIC_IBM1: - pcic->chip_inf = PCMICA_CHIP_IBM_1; - goto ok; - case PCIC_146FC6: - pcic->chip_inf = PCMICA_CHIP_146FC6; - maxslot = 4; - goto ok; - case PCIC_146FC7: - pcic->chip_inf = PCMICA_CHIP_146FC7; - maxslot = 4; - goto ok; - case PCIC_IBM2: - pcic->chip_inf = PCMICA_CHIP_IBM_2; -ok: - if (first) { - pcic->sc_adapter.adapter_softc = (void *)pcic; - pcic->sc_adapter.chip_link = &pcic_funcs; - pcic->sc_adapter.bus_link = &pcmcia_isa_link; - pcicm->sc_ctlrs[pia->pia_ctlr] = pcic; - pcicm->sc_slavestate[pia->pia_ctlr] = - SLAVE_CONFIGURED; - first = 0; - } - pcic->sc_adapter.nslots++; - j++; - default: - if (PDEBUG(PCDCONF)) { - printf("found ID %x at pcic%d position\n", - chip_inf & 0xff, pcic->sc_dev.dv_unit); - } - continue; - } - } - if (pcic->sc_adapter.nslots != 0) { - if (bus_space_map(pia->pia_memt, - pcic->sc_dev.dv_cfdata->cf_loc[1], - pcic->sc_dev.dv_cfdata->cf_loc[2], 0, &pcic->sc_memh)) - return 0; - return 1; - } - if (PDEBUG(PCDCONF)) { - printf("pcic_probe failed\n"); - delay(2000000); - } - return 0; -} - -int -pcic_print(aux, name) - void *aux; - const char *name; -{ - if (name != NULL) - printf("%s: pcmciabus ", name); - return UNCONF; -} - -void -pcic_attach(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - struct pcic_softc *pcic = (void *) self; - struct pcic_attach_args *pia = aux; - struct pcmciabus_attach_args pba; - struct slot *slot; - int i; - static char *pcic_names[] = { - "Intel 82365sl Rev. 0", - "Intel 82365sl Rev. 1", - "IBM 82365sl clone Rev. 1", - "IBM 82365sl clone Rev. 2", - "VL82146 (82365sl clone) Rev. 6", - "VL82146 (82365sl clone) Rev. 7" }; - if (PDEBUG(PCDCONF)) { - printf("pcic_attach found\n"); - delay(2000000); - } - pia->pia_irq = self->dv_cfdata->cf_loc[0]; - pia->pia_maddr = self->dv_cfdata->cf_loc[1]; - pia->pia_msize = self->dv_cfdata->cf_loc[2]; - - printf(": %s slots %d-%d iomem %x-%x", - pcic_names[pcic->chip_inf - PCMICA_CHIP_82365_0], - pcic->sc_dev.dv_unit * 2, - pcic->sc_dev.dv_unit * 2 + pcic->sc_adapter.nslots - 1, - pia->pia_maddr, pia->pia_maddr + pia->pia_msize - 1); - if (pia->pia_irq != IRQUNK) - printf(" irq %d\n", pia->pia_irq); - else - printf("\n"); - if (PDEBUG(PCDCONF)) - delay(2000000); - -#ifdef PCMCIA_ISA_DEBUG - printf("pcic %p slots %p,%p\nisaaddr %p ports %x size %d irq %d drq %d maddr %x msize %x\n", - pcic, &pcic->slot[0], &pcic->slot[1], - pia, pia->pia_ioh, pia->pia_iosize, - pia->pia_irq, pia->pia_drq, pia->pia_maddr, pia->pia_msize); - if (PDEBUG(PCDCONF)) - delay(2000000); -#endif - - /* enable interrupts on events */ - if (pia->pia_irq != IRQUNK) - pcic->sc_pcic_irq = pia->pia_irq; - else - pcic->sc_pcic_irq = 0; - - for (i = 0; i < pcic->sc_adapter.nslots; i++) { - slot = &pcic->slot[i]; - /* - * Arrange for card status change interrupts - * to be steered to specified IRQ. - * Treat all cards as I/O cards for the moment so we get - * sensible card change interrupt codes (besides, we don't - * support memory cards :) - */ - pcic_wr(slot, PCIC_STAT_INT, - (pcic->sc_pcic_irq << 4) | - PCIC_CDTCH | PCIC_IOCARD); - slot->irq = pcic_rd(slot, PCIC_INT_GEN) & ~PCIC_INTR_ENA; - pcic_wr(slot, PCIC_INT_GEN, slot->irq); - (void) pcic_rd(slot, PCIC_STAT_CHG); - } - if (pia->pia_irq == IRQUNK) { - pcic->sc_polltimo = hz/2; - timeout((void (*)(void *))pcic_intr, pcic, pcic->sc_polltimo); - } else { - pcic->sc_ih = isa_intr_establish(pia->pia_ic, pia->pia_irq, - IST_EDGE, IPL_PCMCIA, pcic_intr, pcic, pcic->sc_dev.dv_xname); - pcic->sc_polltimo = 0; - } - /* - * Probe the pcmciabus at this controller. - */ - pba.pba_iot = pia->pia_iot; - pba.pba_memt = pia->pia_memt; - pba.pba_memh = pcic->sc_memh; - pba.pba_maddr = pia->pia_maddr; - pba.pba_msize = pia->pia_msize; - pba.pba_aux = &pcic->sc_adapter; -#ifdef PCMCIA_DEBUG - printf("config_found(%p, %p, %p)\n", - self, &pba, pcic_print); -#endif - config_found(self, (void *)&pba, pcic_print); -} - -int -pcic_intr(arg) - void *arg; -{ - struct pcic_softc *pcic = arg; - u_char statchg, intgen; - register int i; - -#ifdef PCMCIA_PCIC_DEBUG - if (pcic->sc_polltimo == 0) - printf("%s: interrupt:", pcic->sc_dev.dv_xname); -#endif - for (i = 0; i < pcic->sc_adapter.nslots; i++) { - struct pcmcia_link *link = pcic->slot[i].link; - statchg = pcic_rd(&pcic->slot[i], PCIC_STAT_CHG); - if (statchg == 0) - continue; - intgen = pcic_rd(&pcic->slot[i], PCIC_INT_GEN); -#ifdef PCMCIA_PCIC_DEBUG - if (intgen & PCIC_IOCARD) { - printf("%s: slot %d iocard status %s%s\n", - pcic->sc_dev.dv_xname, i, - statchg & PCIC_STCH ? "statchange " : "", - statchg & PCIC_CDTCH ? "cardchange" : ""); - } else { - printf("%s: slot %d memcard status %x\n", - pcic->sc_dev.dv_xname, i, statchg); - } -#endif - if ((statchg & PCIC_CDTCH) && - (link->flags & PCMCIA_SLOT_OPEN) == 0) { -#if 0 - if (pcic->slot[i].status & SLOT_INUSE) { - pcmcia_unconfigure(link); - } else { - if (link) { - link->fordriver = NULL; - pcmcia_probe_bus(link, 0, link->slot, - NULL); - } - } -#endif - } - if (link && (link->flags & PCMCIA_SLOT_OPEN)) { - link->flags |= PCMCIA_SLOT_EVENT; - selwakeup(&link->pcmcialink_sel); - } - if (pcic->slot[i].handler == NULL) - continue; - (*pcic->slot[i].handler)(&pcic->slot[i], - pcic->slot[i].handle_arg); - } - if (pcic->sc_polltimo) - timeout((void (*)(void *))pcic_intr, pcic, pcic->sc_polltimo); - return 1; -} - -int -pcic_map_io(link, start, len, flags) - struct pcmcia_link *link; - u_int start, len; - int flags; -{ - struct pcic_softc *sc = link->adapter->adapter_softc; - struct slot *slot; - if (link->slot >= sc->sc_adapter.nslots) - return ENXIO; - slot = &sc->slot[link->slot]; - - len--; - if (PDEBUG(PCDIO)) { - printf("pcic_map_io %x %x %x\n", start, len, flags); - } - if (!(flags & PCMCIA_UNMAP)) { - u_int stop; - int window; - int winid; - int ioflags; - - if (flags & PCMCIA_LAST_WIN) { - window = MAX_IOSECTION - 1; - } else if (flags & PCMCIA_FIRST_WIN) { - window = 0; - } else if (flags & PCMCIA_ANY_WIN) { - for (window = 0; window < MAX_IOSECTION; window++) { - if (slot->io_used[window] == 0) - break; - if (window >= MAX_IOSECTION) - return EBUSY; - } - } else { - window = flags & 0xf; - if (window >= MAX_IOSECTION) - return EINVAL; - } - slot->status |= SLOT_INUSE; - slot->io_used[window] = 1; - winid = window * 0x4 + 0x08; - stop = start + len; - - pcic_wr(slot, winid | PCIC_START | PCIC_ADDR_LOW, - (u_long) start & 0xff); - pcic_wr(slot, winid | PCIC_START | PCIC_ADDR_HIGH, - ((u_long) start >> 8) & 0xff); - - pcic_wr(slot, winid | PCIC_END | PCIC_ADDR_LOW, - stop & 0xff); - pcic_wr(slot, winid | PCIC_END | PCIC_ADDR_HIGH, - (stop >> 8) & 0xff); - flags &= (PCMCIA_MAP_8 | PCMCIA_MAP_16); - switch (flags) { - case PCMCIA_MAP_8: - ioflags = PCIC_IO0_0WS; - break; - case PCMCIA_MAP_16: - ioflags = PCIC_IO0_16BIT; - break; - default: - ioflags = PCIC_IO0_CS16; - break; - } - - if (window == 1) { - ioflags <<= 4; - slot->ioctl_flag &= ~(3 << 4); - } - else { - slot->ioctl_flag &= ~3; - } - - delay(1000); - - pcic_wr(slot, PCIC_IOCTL, slot->ioctl_flag |= ioflags); - pcic_wr(slot, PCIC_ADDRWINE, - slot->region_flag |= (0x40 << window)); - slot->io_addr[window] = start; - slot->io_len[window] = len; - delay(1000); - return 0; - } else { - int window; - int winid; - if (flags & PCMCIA_LAST_WIN) { - window = MAX_IOSECTION - 1; - } else if (flags & PCMCIA_FIRST_WIN) { - window = 0; - } else if (flags & PCMCIA_ANY_WIN) { - for (window = 0; window < MAX_IOSECTION; window++) { - if (slot->io_addr[window] == start) - if (len == -1 || - slot->io_len[window] == len) - break; - } - if (window >= MAX_IOSECTION) - return EINVAL; - } else { - window = flags & 0xf; - if (window >= MAX_IOSECTION) - return EINVAL; - } - slot->status &= ~SLOT_INUSE; - winid = window * 0x4 + 0x08; - - pcic_wr(slot, PCIC_ADDRWINE, - slot->region_flag &= ~(0x40 << window)); - delay(1000); - pcic_wr(slot, PCIC_IOCTL, - slot->ioctl_flag &= ~(0xf << window)); - pcic_wr(slot, winid | PCIC_START | PCIC_ADDR_LOW, 0); - pcic_wr(slot, winid | PCIC_START | PCIC_ADDR_HIGH, 0); - pcic_wr(slot, winid | PCIC_END | PCIC_ADDR_LOW, 0); - pcic_wr(slot, winid | PCIC_END | PCIC_ADDR_HIGH, 0); - - slot->io_addr[window] = start; - slot->io_len[window] = len; - return 0; - } -} - -int -pcic_map_mem(link, memt, haddr, start, len, flags) - struct pcmcia_link *link; - bus_space_tag_t memt; - caddr_t haddr; - u_int start, len; - int flags; -{ - vm_offset_t physaddr; - struct pcic_softc *sc = link->adapter->adapter_softc; - struct slot *slot; - - if (link->slot >= sc->sc_adapter.nslots) - return ENXIO; - - slot = &sc->slot[link->slot]; - - if (flags & PCMCIA_PHYSICAL_ADDR) - physaddr = (vm_offset_t)haddr; - else - physaddr = pmap_extract(pmap_kernel(), (vm_offset_t)haddr); - if (PDEBUG(PCDMEM)) - printf("pcic_map_mem %p %x %x %x %x\n", haddr, physaddr, start, - len, flags); - - physaddr >>= 12; - start >>= 12; - len = (len - 1) >> 12; - - if (!(flags & PCMCIA_UNMAP)) { - u_int offs; - u_int stop; - int window; - int winid; - - if (flags & PCMCIA_LAST_WIN) { - window = MAX_MEMSECTION - 1; - } else if (flags & PCMCIA_FIRST_WIN) { - window = 0; - } else if (flags & PCMCIA_ANY_WIN) { - for (window = 0; window < MAX_MEMSECTION; window++) { - if (slot->mem_used[window] == 0) - break; - if (window >= MAX_MEMSECTION) - return EBUSY; - } - } else { - window = flags & 0xf; - if (window >= MAX_MEMSECTION) - return EINVAL; - } - slot->mem_used[window] = 1; - - offs = (start - (u_long) physaddr) & 0x3fff; - if (PDEBUG(PCDMEM)) - printf("mapmem 2:%x %x %x\n", offs, physaddr + offs, - start); - - stop = (u_long)physaddr + len; - - winid = window * 0x8 + 0x10; - - pcic_wr(slot, winid | PCIC_START | PCIC_ADDR_LOW, - (u_long)physaddr & 0xff); - pcic_wr(slot, winid | PCIC_START | PCIC_ADDR_HIGH, - (((u_long) physaddr >> 8) & 0x3f) | /* PCIC_ZEROWS| */ - ((flags & PCMCIA_MAP_16) ? PCIC_DATA16 : 0)); - - pcic_wr(slot, winid | PCIC_END | PCIC_ADDR_LOW, stop & 0xff); - pcic_wr(slot, winid | PCIC_END | PCIC_ADDR_HIGH, - PCIC_MW1 | ((stop >> 8) & 0x3f)); - - - pcic_wr(slot, winid | PCIC_MOFF | PCIC_ADDR_LOW, offs & 0xff); - pcic_wr(slot, winid | PCIC_MOFF | PCIC_ADDR_HIGH, - ((offs >> 8) & 0x3f) | - ((flags & PCMCIA_MAP_ATTR) ? PCIC_REG : 0)); - delay(1000); - - pcic_wr(slot, PCIC_ADDRWINE, - slot->region_flag |= ((1 << window) | PCIC_MEMCS16)); - slot->mem_caddr[window] = (caddr_t)physaddr; - slot->mem_haddr[window] = start; - slot->mem_len[window] = len; - delay(1000); - return 0; - } else { - int window; - int winid; - - if (flags & PCMCIA_LAST_WIN) { - window = MAX_MEMSECTION - 1; - } else if (flags & PCMCIA_FIRST_WIN) { - window = 0; - } else if (flags & PCMCIA_ANY_WIN) { - for (window = 0; window < MAX_MEMSECTION; window++) { - if ((slot->mem_caddr[window] == - (caddr_t)physaddr) && - ((start == -1) || - (slot->mem_haddr[window] == start)) && - ((len == -1) || - (slot->mem_len[window] == len))) - break; - } - if (window >= MAX_MEMSECTION) - return EINVAL; - } else { - window = flags & 0xf; - if (window >= MAX_MEMSECTION) - return EINVAL; - } - winid = window * 0x8 + 0x10; - - slot->region_flag &= (~(1 << window)); - pcic_wr(slot, PCIC_ADDRWINE, slot->region_flag); - delay(1000); - pcic_wr(slot, winid | PCIC_START | PCIC_ADDR_LOW, 0); - pcic_wr(slot, winid | PCIC_START | PCIC_ADDR_HIGH, 0); - pcic_wr(slot, winid | PCIC_END | PCIC_ADDR_LOW, 0); - pcic_wr(slot, winid | PCIC_END | PCIC_ADDR_HIGH, 0); - pcic_wr(slot, winid | PCIC_MOFF | PCIC_ADDR_LOW, 0); - pcic_wr(slot, winid | PCIC_MOFF | PCIC_ADDR_HIGH, 0); - slot->mem_caddr[window] = 0; - slot->mem_haddr[window] = 0; - slot->mem_len[window] = 0; - slot->mem_used[window] = 0; - return 0; - } -} - -int -pcic_map_intr(link, irq, flags) - struct pcmcia_link *link; - int irq, flags; -{ - struct pcic_softc *sc = link->adapter->adapter_softc; - struct slot *slot; - - if (link->slot >= sc->sc_adapter.nslots) - return ENXIO; - - slot = &sc->slot[link->slot]; - - if (PDEBUG(PCDINTR)) - printf("pcic_map_intr %x %x\n", irq, flags); - - if (flags & PCMCIA_UNMAP) { - slot->irq &= ~(PCIC_INT_MASK|PCIC_INTR_ENA); - pcic_wr(slot, PCIC_INT_GEN, slot->irq); - } else { - if (irq < 2 || irq > 15 || irq == 6 || irq == 8 || irq == 13) - return EINVAL; - if(irq==2) - irq=9; - slot->irq &= ~(PCIC_INTR_ENA|PCIC_INT_MASK); - slot->irq |= irq | PCIC_CARDRESET; /* reset is inverted */ - pcic_wr(slot, PCIC_INT_GEN, slot->irq); - } - return 0; -} - - -int -pcic_service(link, opcode, arg, flags) - struct pcmcia_link *link; - int opcode; - void *arg; - int flags; -{ - struct pcic_softc *sc = link->adapter->adapter_softc; - struct slot *slot; - - if (link->slot >= sc->sc_adapter.nslots) - return ENXIO; - - slot = &sc->slot[link->slot]; - - slot->link = link; /* save it for later :) */ - switch (opcode) { - case PCMCIA_OP_STATUS: { - u_char cp; - int *iarg = arg; - - if (PDEBUG(PCDSERV)) - printf("pcic_service(status)\n"); - cp = pcic_rd(slot, PCIC_STATUS); - if (PDEBUG(PCDSERV)) - printf("status for slot %d %b\n", link->slot, cp, - PCIC_STATUSBITS); - *iarg = 0; -#define DO_STATUS(cp, val, map) ((cp & val) == val ? map : 0) - *iarg |= DO_STATUS(cp, PCIC_CD, PCMCIA_CARD_PRESENT); - *iarg |= DO_STATUS(cp, PCIC_BVD, PCMCIA_BATTERY); - *iarg |= DO_STATUS(cp, PCIC_MWP, PCMCIA_WRITE_PROT); - *iarg |= DO_STATUS(cp, PCIC_READY, PCMCIA_READY); - *iarg |= DO_STATUS(cp, PCIC_POW, PCMCIA_POWER); - *iarg |= DO_STATUS(cp, PCIC_VPPV, PCMCIA_POWER_PP); - return 0; - } - case PCMCIA_OP_WAIT: { - int iarg = (int)arg; - int i = iarg * 4; - - if (PDEBUG(PCDSERV)) - printf("pcic_service(wait)\n"); - i = pcic_wait(slot, i); - if (PDEBUG(PCDSERV)) - printf("op99 %b %d\n", - pcic_rd(slot, PCIC_STATUS), PCIC_STATUSBITS, i); - if (i <= 0) - return EIO; - else - return 0; - } - case PCMCIA_OP_RESET: { - int force = ((int) arg) < 0; - int iarg = abs((int) arg); - int i = iarg * 4; - - if (PDEBUG(PCDSERV)) - printf("pcic_service(reset)\n"); - if (flags) - slot->irq |= PCIC_IOCARD; - else - slot->irq &= ~PCIC_IOCARD; /* XXX? */ - pcic_wr(slot, PCIC_POWER, slot->pow &= ~PCIC_DISRST); - slot->irq &= ~PCIC_CARDRESET; - pcic_wr(slot, PCIC_INT_GEN, slot->irq); - if (iarg == 0) - return 0; - delay(iarg); - pcic_wr(slot, PCIC_POWER, slot->pow |= PCIC_DISRST); - slot->irq |= PCIC_CARDRESET; - pcic_wr(slot, PCIC_INT_GEN, slot->irq); - delay(iarg); - i = pcic_wait(slot, i); - if (PDEBUG(PCDSERV)) - printf("opreset %d %b %d\n", force, - pcic_rd(slot, PCIC_STATUS), PCIC_STATUSBITS, i); - if (i <= 0) - return EIO; - else - return 0; - } - case PCMCIA_OP_POWER: { - int iarg = (int) arg; - if (PDEBUG(PCDSERV)) - printf("pcic_service(power): "); - if (flags & PCMCIA_POWER_ON) { - int nv = (PCIC_DISRST|PCIC_OUTENA); - pcic_wr(slot, PCIC_INT_GEN, - slot->irq = PCIC_IOCARD); - if(flags & PCMCIA_POWER_3V) - nv |= PCIC_VCC3V; - if(flags & PCMCIA_POWER_5V) - nv |= PCIC_VCC5V; - if(flags & PCMCIA_POWER_AUTO) - nv |= PCIC_APSENA|PCIC_VCC5V|PCIC_VCC3V; - slot->pow &= ~(PCIC_APSENA|PCIC_VCC5V|PCIC_VCC3V| - PCIC_VPP12V|PCIC_VPP5V); - slot->pow |= nv; - pcic_wr(slot, PCIC_POWER, slot->pow); -#if 0 - delay(iarg); - slot->pow |= PCIC_OUTENA; - pcic_wr(slot, PCIC_POWER, slot->pow); -#endif - delay(iarg); - if (PDEBUG(PCDSERV)) - printf("on\n"); - } else { - slot->pow &= ~(PCIC_APSENA|PCIC_VCC5V|PCIC_VCC3V); - slot->pow &= ~(PCIC_DISRST|PCIC_OUTENA); - pcic_wr(slot,PCIC_POWER, slot->pow); - if (PDEBUG(PCDSERV)) - printf("off\n"); - } - return 0; - } - case PCMCIA_OP_GETREGS: { - struct pcic_regs *pi = arg; - int i; - - if (PDEBUG(PCDSERV)) - printf("pcic_service(getregs)\n"); - pi->chip_vers = sc->chip_inf; - for (i = 0; i < pi->cnt; i++) - pi->reg[i].val = pcic_rd(slot, pi->reg[i].addr); - return 0; - } - default: - if (PDEBUG(PCDSERV)) - printf("pcic_service(%x)\n", opcode); - return EINVAL; - } -} - -/* - * Handle I/O space mapping for children. Thin layer. - */ -int -pcicmaster_probe(parent, self, aux) - struct device *parent; - void *self; - void *aux; -{ - struct pcicmaster_softc *pcicm = self; - struct isa_attach_args *ia = aux; - struct cfdata *cf = pcicm->sc_dev.dv_cfdata; - bus_space_tag_t iot; - bus_space_handle_t ioh; - u_int chip_inf = 0; - int i, j; - int rval = 0; - struct pcic_softc pcic; /* faked up for probing only */ - - if (PDEBUG(PCDCONF)) { - printf("pcicmaster_probe\n"); - delay(2000000); - } - iot = ia->ia_iot; - if (bus_space_map(iot, ia->ia_iobase, PCIC_NPORTS, 0, &ioh)) - return (0); - /* - * Probe the slots for each of the possible child controllers, - * and if any are there we return a positive indication. - */ - pcic.sc_iot = iot; - pcic.sc_ioh = ioh; - for (i = 0; i < 2; i++) { - bzero(pcic.slot, sizeof(pcic.slot)); - pcic.slot[0].chip = &pcic; - pcic.slot[0].reg_off = i * 0x80; - chip_inf = pcic_rd(&pcic.slot[0], PCIC_ID_REV); - switch (chip_inf) { - case PCIC_INTEL0: - case PCIC_INTEL1: - case PCIC_IBM1: - case PCIC_146FC6: - case PCIC_146FC7: - case PCIC_IBM2: - if (PDEBUG(PCDCONF)) { - printf("pcicmaster_probe found, cf=%p\n", cf); - delay(2000000); - } - pcicm->sc_slavestate[i] = SLAVE_FOUND; - rval++; - break; - default: - pcicm->sc_slavestate[i] = SLAVE_NOTPRESENT; - if (PDEBUG(PCDCONF)) { - printf("found ID %x at slave %d\n", - chip_inf & 0xff, i); - } - break; - } - if (pcicm->sc_slavestate[i] != SLAVE_FOUND) { - /* reset mappings .... */ - pcic_wr(&pcic.slot[0], PCIC_POWER, - pcic.slot[0].pow=PCIC_DISRST); - delay(1000); - for (j = PCIC_INT_GEN; j < 0x40; j++) { - pcic_wr(&pcic.slot[0], j, 0); - } - delay(10000); - } - } - if (rval) { - ia->ia_iosize = 2; - pcicm->sc_ic = ia->ia_ic; - pcicm->sc_iot = iot; - pcicm->sc_memt = ia->ia_memt; - pcicm->sc_ioh = ioh; - } else - bus_space_unmap(iot, ioh, PCIC_NPORTS); - return rval; -} - -void -pcicmaster_attach(parent, self, aux) - struct device *parent, *self; - void *aux; -{ - struct pcicmaster_softc *pcicm = (void *)self; - struct isa_attach_args *ia = aux; - struct pcic_attach_args pia; - int i; - - printf("\n"); - if (PDEBUG(PCDCONF)) { - printf("pcicmaster_attach\n"); - delay(2000000); - } -#ifdef PCMCIA_ISA_DEBUG - printf("pcicm %p isaaddr %p ports %x size %d irq %d drq %d maddr %x " - "msize %x\n", pcicm, ia, ia->ia_iobase, ia->ia_iosize, ia->ia_irq, - ia->ia_drq, ia->ia_maddr, ia->ia_msize); - if (PDEBUG(PCDCONF)) - delay(2000000); -#endif - /* attach up to two PCICs at this I/O address */ - for (i = 0; i < 2; i++) { - if (pcicm->sc_slavestate[i] == SLAVE_FOUND) { - pia.pia_ctlr = i; - /* - * share the I/O space and memory mapping space. - */ - pia.pia_ic = pcicm->sc_ic; - pia.pia_iot = pcicm->sc_iot; - pia.pia_memt = pcicm->sc_memt; - pia.pia_ioh = pcicm->sc_ioh; - pia.pia_iosize = ia->ia_iosize; - pia.pia_drq = ia->ia_drq; -#if 0 - pia.pia_irq = ia->ia_irq; - pia.pia_irq = cf->cf_loc[0]; /* irq from master */ -#endif - pia.pia_maddr = ia->ia_maddr + (ia->ia_msize / 2) * i; - pia.pia_msize = ia->ia_msize / 2; - - config_found(self, &pia, pcicmaster_print); - } - } -} - -int -pcicmaster_print(aux, name) - void *aux; - const char *name; -{ - if (name != NULL) - printf("%s: master controller", name); - return UNCONF; -} |