From 55c46e5b71faba163a242794c96696e8b315d674 Mon Sep 17 00:00:00 2001 From: imp Date: Fri, 29 Sep 2000 03:58:06 +0000 Subject: [PATCH] Add support for pccard attachments of the ex driver. It supports the Olicom OC-2220 card, and maybe others. Submitted by: iwasaki Reviewed by: mdodd --- sys/conf/files | 1 + sys/dev/ex/if_ex.c | 4 +- sys/dev/ex/if_ex_isa.c | 2 +- sys/dev/ex/if_ex_pccard.c | 163 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 sys/dev/ex/if_ex_pccard.c diff --git a/sys/conf/files b/sys/conf/files index 30221ae452d3..f9b56ff60a68 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -149,6 +149,7 @@ dev/ep/if_ep_mca.c optional ep mca dev/ep/if_ep_pccard.c optional ep card dev/ex/if_ex.c optional ex dev/ex/if_ex_isa.c optional ex isa +dev/ex/if_ex_pccard.c optional ex card dev/fe/if_fe.c optional fe dev/fe/if_fe_pccard.c optional fe card dev/hea/eni.c optional hea diff --git a/sys/dev/ex/if_ex.c b/sys/dev/ex/if_ex.c index ba91071a2ef9..8e1152fc8f82 100644 --- a/sys/dev/ex/if_ex.c +++ b/sys/dev/ex/if_ex.c @@ -103,7 +103,7 @@ static void ex_ifmedia_sts __P((struct ifnet *, struct ifmediareq *)); static int ex_get_media __P((u_int32_t iobase)); -static void ex_stop __P((struct ex_softc *)); + void ex_stop __P((struct ex_softc *)); static void ex_reset __P((struct ex_softc *)); static void ex_tx_intr __P((struct ex_softc *)); @@ -543,7 +543,7 @@ ex_start(struct ifnet *ifp) DODEBUG(Start_End, printf("ex_start%d: finish\n", unit);); } -static void +void ex_stop(struct ex_softc *sc) { int iobase = sc->iobase; diff --git a/sys/dev/ex/if_ex_isa.c b/sys/dev/ex/if_ex_isa.c index d6603b286818..a7036220fda4 100644 --- a/sys/dev/ex/if_ex_isa.c +++ b/sys/dev/ex/if_ex_isa.c @@ -76,7 +76,7 @@ static driver_t ex_driver = { sizeof(struct ex_softc), }; -static devclass_t ex_devclass; +devclass_t ex_devclass; DRIVER_MODULE(ex, isa, ex_driver, ex_devclass, 0, 0); diff --git a/sys/dev/ex/if_ex_pccard.c b/sys/dev/ex/if_ex_pccard.c new file mode 100644 index 000000000000..adb3d9635325 --- /dev/null +++ b/sys/dev/ex/if_ex_pccard.c @@ -0,0 +1,163 @@ +/*- + * Copyright (c) 2000 Mitsuru IWASAKI + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include + +#include + +/* Bus Front End Functions */ +static int ex_pccard_probe __P((device_t)); +static int ex_pccard_attach __P((device_t)); +static int ex_pccard_detach __P((device_t)); + +static device_method_t ex_pccard_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ex_pccard_probe), + DEVMETHOD(device_attach, ex_pccard_attach), + DEVMETHOD(device_detach, ex_pccard_detach), + + { 0, 0 } +}; + +static driver_t ex_pccard_driver = { + "ex", + ex_pccard_methods, + sizeof(struct ex_softc), +}; + +extern devclass_t ex_devclass; + +DRIVER_MODULE(ex, pccard, ex_pccard_driver, ex_devclass, 0, 0); + +static int +ex_pccard_probe(device_t dev) +{ + u_int iobase; + u_int irq; + + iobase = bus_get_resource_start(dev, SYS_RES_IOPORT, 0); + if (!iobase) { + printf("ex: no iobase?\n"); + return(ENXIO); + } + + if (bootverbose) + printf("ex: ex_pccard_probe() found card at 0x%03x\n", iobase); + + irq = bus_get_resource_start(dev, SYS_RES_IRQ, 0); + + if (irq == 0) { + printf("ex: invalid IRQ.\n"); + return(ENXIO); + } + + return(0); +} + +static int +ex_pccard_attach(device_t dev) +{ + struct ex_softc * sc = device_get_softc(dev); + int error = 0; + int i; + u_char sum; + u_char ether_addr[ETHER_ADDR_LEN]; + + sc->dev = dev; + sc->ioport_rid = 0; + sc->irq_rid = 0; + + if ((error = ex_alloc_resources(dev)) != 0) { + device_printf(dev, "ex_alloc_resources() failed!\n"); + goto bad; + } + + /* + * Fill in several fields of the softc structure: + * - I/O base address. + * - Hardware Ethernet address. + * - IRQ number. + */ + sc->iobase = rman_get_start(sc->ioport); + sc->irq_no = rman_get_start(sc->irq); + + pccard_get_ether(dev, ether_addr); + for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++) + sum |= ether_addr[i]; + if (sum) + bcopy(ether_addr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN); + + if ((error = ex_attach(dev)) != 0) { + device_printf(dev, "ex_attach() failed!\n"); + goto bad; + } + + error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET, + ex_intr, (void *)sc, &sc->ih); + if (error) { + device_printf(dev, "bus_setup_intr() failed!\n"); + goto bad; + } + + return(0); +bad: + ex_release_resources(dev); + return (error); +} + +static int +ex_pccard_detach(device_t dev) +{ + struct ex_softc *sc = device_get_softc(dev); + struct ifnet *ifp = &sc->arpcom.ac_if; + + ex_stop(sc); + ifp->if_flags &= ~IFF_RUNNING; + if_detach(ifp); + ex_release_resources(dev); + return (0); +}