diff options
author | Thierry Deval <tdeval@cvs.openbsd.org> | 2002-06-26 15:55:35 +0000 |
---|---|---|
committer | Thierry Deval <tdeval@cvs.openbsd.org> | 2002-06-26 15:55:35 +0000 |
commit | bd09dafe39e2660b89e0bbfea3ecd5cf1d9588a7 (patch) | |
tree | 7b8972bacc2192b47ea847b7a93c2eb399a32697 /sys | |
parent | 0d06f07ccdc960e8244fc2a2c1360cf208da8357 (diff) |
cardbus fwohci support.
from NetBSD
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/cardbus/files.cardbus | 8 | ||||
-rw-r--r-- | sys/dev/cardbus/fwohci_cardbus.c | 212 |
2 files changed, 219 insertions, 1 deletions
diff --git a/sys/dev/cardbus/files.cardbus b/sys/dev/cardbus/files.cardbus index 52f6b7e0468..bb84787f976 100644 --- a/sys/dev/cardbus/files.cardbus +++ b/sys/dev/cardbus/files.cardbus @@ -1,4 +1,4 @@ -# $OpenBSD: files.cardbus,v 1.5 2002/06/08 00:10:54 aaron Exp $ +# $OpenBSD: files.cardbus,v 1.6 2002/06/26 15:55:34 tdeval Exp $ # $NetBSD: files.cardbus,v 1.8 2000/01/26 06:37:24 thorpej Exp $ # # files.cardbus @@ -38,6 +38,12 @@ attach fxp at cardbus with fxp_cardbus file dev/cardbus/if_fxp_cardbus.c fxp_cardbus # +# OHCI IEEE 1394 controller +# +attach fwohci at cardbus with fwohci_cardbus +file dev/cardbus/fwohci_cardbus.c fwohci_cardbus + +# # RealTek 8139 based CardBus cards # attach rl at cardbus with rl_cardbus diff --git a/sys/dev/cardbus/fwohci_cardbus.c b/sys/dev/cardbus/fwohci_cardbus.c new file mode 100644 index 00000000000..16000752d60 --- /dev/null +++ b/sys/dev/cardbus/fwohci_cardbus.c @@ -0,0 +1,212 @@ +/* $OpenBSD: fwohci_cardbus.c,v 1.1 2002/06/26 15:55:33 tdeval Exp $ */ +/* $NetBSD: fwohci_cardbus.c,v 1.5 2002/01/26 16:34:28 ichiro Exp $ */ + +/*- + * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Matt Thomas of 3am Software Foundry. + * + * 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 the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``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 FOUNDATION OR CONTRIBUTORS + * 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. + */ + +#include <sys/cdefs.h> +#ifdef __KERNEL_RCSID +__KERNEL_RCSID(0, "$NetBSD: fwohci_cardbus.c,v 1.5 2002/01/26 16:34:28 ichiro Exp $"); +#endif + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/mbuf.h> +#include <sys/socket.h> +#include <sys/ioctl.h> +#include <sys/errno.h> +#include <sys/malloc.h> +#include <sys/kernel.h> +#include <sys/proc.h> +#include <sys/device.h> + +#include <machine/bus.h> + +#include <dev/pci/pcivar.h> +#include <dev/pci/pcireg.h> +#include <dev/pci/pcidevs.h> + +#include <dev/cardbus/cardbusvar.h> +#include <dev/cardbus/cardbusdevs.h> + +#include <dev/ieee1394/ieee1394reg.h> +#include <dev/ieee1394/ieee1394var.h> +#include <dev/ieee1394/fwohcireg.h> +#include <dev/ieee1394/fwohcivar.h> + +struct fwohci_cardbus_softc { + struct fwohci_softc sc_sc; + cardbus_chipset_tag_t sc_cc; + cardbus_function_tag_t sc_cf; + cardbus_devfunc_t sc_ct; + void *sc_ih; +}; + +#ifdef __NetBSD__ +int fwohci_cardbus_match(struct device *, struct cfdata *, void *); +#else +int fwohci_cardbus_match(struct device *, void *, void *); +#endif +void fwohci_cardbus_attach(struct device *, struct device *, void *); +int fwohci_cardbus_detach(struct device *, int); + +struct cfattach fwohci_cardbus_ca = { + sizeof(struct fwohci_cardbus_softc), fwohci_cardbus_match, + fwohci_cardbus_attach, fwohci_cardbus_detach, fwohci_activate +}; + +#define CARDBUS_OHCI_MAP_REGISTER PCI_OHCI_MAP_REGISTER +#define CARDBUS_INTERFACE_OHCI PCI_INTERFACE_OHCI +#define cardbus_devinfo pci_devinfo + +int +fwohci_cardbus_match(parent, match, aux) + struct device *parent; +#ifdef __NetBSD__ + struct cfdata *match; + void *aux; +#else + void *match, *aux; +#endif +{ + struct cardbus_attach_args *ca = (struct cardbus_attach_args *)aux; + + if (CARDBUS_CLASS(ca->ca_class) == CARDBUS_CLASS_SERIALBUS && + CARDBUS_SUBCLASS(ca->ca_class) == + CARDBUS_SUBCLASS_SERIALBUS_FIREWIRE && + CARDBUS_INTERFACE(ca->ca_class) == CARDBUS_INTERFACE_OHCI) + return 1; + + return 0; +} + +void +fwohci_cardbus_attach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct cardbus_attach_args *ca = aux; + struct fwohci_cardbus_softc *sc = (struct fwohci_cardbus_softc *)self; + cardbus_devfunc_t ct = ca->ca_ct; + cardbus_chipset_tag_t cc = ct->ct_cc; + cardbus_function_tag_t cf = ct->ct_cf; + cardbusreg_t csr; + char devinfo[256]; + const char *devname = self->dv_xname; + + cardbus_devinfo(ca->ca_id, ca->ca_class, 0, devinfo); + printf(": %s (rev. 0x%02x)\n", devinfo, + CARDBUS_REVISION(ca->ca_class)); + + /* Map I/O registers */ + if (Cardbus_mapreg_map(ct, CARDBUS_OHCI_MAP_REGISTER, + CARDBUS_MAPREG_TYPE_MEM, 0, + &sc->sc_sc.sc_memt, &sc->sc_sc.sc_memh, + NULL, &sc->sc_sc.sc_memsize)) { + printf("%s: can't map OHCI register space\n", devname); + return; + } + + sc->sc_cc = cc; + sc->sc_cf = cf; + sc->sc_ct = ct; + sc->sc_sc.sc_dmat = ca->ca_dmat; + +#if rbus +#else +XXX (ct->ct_cf->cardbus_mem_open)(cc, 0, iob, iob + 0x40); +#endif + (ct->ct_cf->cardbus_ctrl)(cc, CARDBUS_MEM_ENABLE); + (ct->ct_cf->cardbus_ctrl)(cc, CARDBUS_BM_ENABLE); + + /* Disable interrupts, so we don't get any spurious ones. */ + OHCI_CSR_WRITE(&sc->sc_sc, OHCI_REG_IntMaskClear, + OHCI_Int_MasterEnable); + + /* Enable the device. */ + csr = cardbus_conf_read(cc, cf, ca->ca_tag, + CARDBUS_COMMAND_STATUS_REG); + cardbus_conf_write(cc, cf, ca->ca_tag, CARDBUS_COMMAND_STATUS_REG, + csr | CARDBUS_COMMAND_MASTER_ENABLE | CARDBUS_COMMAND_MEM_ENABLE); + +#if BYTE_ORDER == BIG_ENDIAN + csr = cardbus_conf_read(cc, cf, ca->ca_tag, + CARDBUS_OHCI_CONTROL_REGISTER); + cardbus_conf_write(cc, cf, ca->ca_tag, CARDBUS_OHCI_CONTROL_REGISTER, + csr | CARDBUS_GLOBAL_SWAP_BE); +#endif + + sc->sc_ih = cardbus_intr_establish(cc, cf, ca->ca_intrline, + IPL_BIO, fwohci_intr, sc); + if (sc->sc_ih == NULL) { + printf("%s: couldn't establish interrupt\n", devname); + return; + } + printf("%s: interrupting at %d\n", devname, ca->ca_intrline); + + /* XXX NULL should be replaced by some call to Cardbus code */ + if (fwohci_init(&sc->sc_sc, NULL) != 0) { + cardbus_intr_disestablish(cc, cf, sc->sc_ih); + bus_space_unmap(sc->sc_sc.sc_memt, sc->sc_sc.sc_memh, + sc->sc_sc.sc_memsize); + } +} + +int +fwohci_cardbus_detach(self, flags) + struct device *self; + int flags; +{ + struct fwohci_cardbus_softc *sc = (struct fwohci_cardbus_softc *)self; + cardbus_devfunc_t ct = sc->sc_ct; + int rv; + + rv = fwohci_detach(&sc->sc_sc, flags); + + if (rv) + return (rv); + if (sc->sc_ih != NULL) { + cardbus_intr_disestablish(ct->ct_cc, ct->ct_cf, sc->sc_ih); + sc->sc_ih = NULL; + } + if (sc->sc_sc.sc_memsize) { + Cardbus_mapreg_unmap(ct, CARDBUS_OHCI_MAP_REGISTER, + sc->sc_sc.sc_memt, sc->sc_sc.sc_memh, + sc->sc_sc.sc_memsize); + sc->sc_sc.sc_memsize = 0; + } + return (0); +} |