/* * Copyright (c) 1998,1999 Trans New Technology, Inc. and * Hiroki NAKANO * All rights reserved. * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that this notice is retained, * the conditions in the following notices 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 * Trans New Technology, Inc. (in Japan) * * * THIS SOFTWARE IS PROVIDED BY TRANS NEW TECHNOLOGY, INC. ``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 TRANS NEW TECHNOLOGY, INC. 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. * */ /* * ICOM UX-136 Wireless LAN Card * (AMD Am79C930 Firmware ver.2.0-Japan) * * glue module for FreeBSD2.2.x PAO * */ #include "ux.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef INET #include #include #include #include #include #endif #ifdef INET6 #ifndef INET #include #endif #ifdef __KAME__ #include #endif #endif #include #include #include #include "bpfilter.h" #if NBPFILTER > 0 #include #include #endif /* NBPFILTER > 0 */ #include #include #include #include #include #include #include #include "card.h" #include #if defined(UX_FREEBSD226) #include /* FreeBSD2.2.6 */ #else #include /* FreeBSD2.2.7 */ #endif #include #include #include #include #include #include struct ux_pcmcia_softc *ux_devs[NUX]; int ux_pcmcia_enable (struct pccard_devinfo *); void ux_pcmcia_disable (struct pccard_devinfo *); int ux_pcmcia_intr (struct pccard_devinfo *); void ux_pcmcia_start (struct ifnet *); int ux_pcmcia_ioctl (struct ifnet *, int, caddr_t); void ux_pcmcia_init (void *); /* no 'first' argument. where is that from? */ int ux_pcmcia_enable(struct pccard_devinfo *devi) { struct ux_pcmcia_softc *scp = ux_devs[devi->isahd.id_unit]; struct ux_softc *sc = &scp->ux_pcmcia_sc; struct ifnet *ifp = &sc->ux_if; if(scp == 0) { MALLOC(scp, struct ux_pcmcia_softc *, sizeof(*scp), M_DEVBUF, M_NOWAIT); if(scp == 0) return ENOMEM; /* fail to enable card */ bzero(scp, sizeof(*scp)); ux_devs[devi->isahd.id_unit] = scp; sc = &scp->ux_pcmcia_sc; ifp = &sc->ux_if; sc->ux_dev.dv_class = DV_IFNET; sc->ux_dev.dv_unit = devi->isahd.id_unit; sprintf(sc->ux_dev.dv_xname, "%s%d", UX_DEVNAME, sc->ux_dev.dv_unit); ifp->if_softc = scp; ifp->if_name = UX_DEVNAME; ifp->if_unit = sc->ux_dev.dv_unit; ifp->if_start = ux_pcmcia_start; ifp->if_ioctl = ux_pcmcia_ioctl; ifp->if_init = ux_pcmcia_init; ifp->if_output = ether_output; /* XXX */ ux_attach(sc); #if NBPFILTER > 0 bpfattach(ifp, DLT_EN10MB, sizeof(struct ether_header)); #endif } scp->ux_pcmcia_devi = devi; printf("%s: ux_pcmcia_enable()\n", sc->ux_devname); printf("%s:", sc->ux_devname); printf(" iobase=0x%04x", devi->isahd.id_iobase); printf(" irqmask=%d", devi->isahd.id_irq); printf(" maddr=0x%08x", devi->isahd.id_maddr); printf(" msize=0x%08x", devi->isahd.id_msize); printf("\n"); ux_enable(sc); bcopy(&sc->ux_macaddr, &sc->ux_arpcom.ac_enaddr, ETHER_ADDR_LEN); ether_ifattach(ifp); /* set MAC address into addrlist */ #if INET6 #ifdef __KAME__ in6_ifattach(ifp, IN6_IFT_802, (caddr_t)&sc->ux_macaddr, 0); /* XXX */ #endif #endif /* INET6 */ return 0; /* 0 means success */ } void ux_pcmcia_disable(struct pccard_devinfo *devi) { struct ux_pcmcia_softc *scp = ux_devs[devi->isahd.id_unit]; struct ux_softc *sc = &scp->ux_pcmcia_sc; struct ifnet *ifp = &sc->ux_if; printf("%s: ux_pcmcia_disable()\n", sc->ux_devname); ifp->if_flags &= ~IFF_RUNNING; ux_disable(sc); if_down(ifp); return; } int ux_pcmcia_intr(struct pccard_devinfo *devi) { struct ux_pcmcia_softc *scp = ux_devs[devi->isahd.id_unit]; struct ux_softc *sc = &scp->ux_pcmcia_sc; ux_intr(sc); return 1; } void ux_pcmcia_start(struct ifnet *ifp) { struct ux_pcmcia_softc *scp = ifp->if_softc; ux_start(&scp->ux_pcmcia_sc); } void ux_pcmcia_init(void *data) { struct ux_pcmcia_softc *scp = data; ux_init(&scp->ux_pcmcia_sc); } int ux_pcmcia_ioctl(struct ifnet *ifp, int cmd, caddr_t data) { struct ux_pcmcia_softc *scp = ifp->if_softc; return ux_ioctl(&scp->ux_pcmcia_sc, cmd, data); } struct pccard_device ux_info = { UX_DEVNAME, ux_pcmcia_enable, /* on insertion */ ux_pcmcia_disable, /* on removal */ ux_pcmcia_intr, 0, /* Attributes - presently unused */ &net_imask /* Interrupt mask for device */ }; int ux_isa_probe(struct isa_device *); int ux_isa_attach(struct isa_device *is); int uxintr(struct ux_pcmcia_softc *scp); struct isa_driver uxdriver = { ux_isa_probe, ux_isa_attach, UX_DEVNAME, 0 }; int ux_isa_probe(id) struct isa_device *id; { pccard_add_driver(&ux_info); return 0; } /* never called */ int ux_isa_attach(id) struct isa_device *id; { printf("ux: isa_attach!! shouldn't be called\n"); return 1; } /* who calls this handler? */ int uxintr(struct ux_pcmcia_softc *scp) { printf("ux: uxintr()\n"); return 1; } /* * call-back function from am79c930.c */ void ux_tap(struct ux_softc *sc, struct mbuf *m) { #if NBPFILTER > 0 if(sc->ux_if.if_bpf) bpf_mtap(&sc->ux_if, m); #endif return; } /* EOF */