if_cs_pccard.c revision 71316
171316Simp/* 271316Simp * Copyright (c) 1999 M. Warner Losh <imp@village.org> 371316Simp * All rights reserved. 471316Simp * 571316Simp * Redistribution and use in source and binary forms, with or without 671316Simp * modification, are permitted provided that the following conditions 771316Simp * are met: 871316Simp * 1. Redistributions of source code must retain the above copyright 971316Simp * notice, this list of conditions and the following disclaimer. 1071316Simp * 2. Redistributions in binary form must reproduce the above copyright 1171316Simp * notice, this list of conditions and the following disclaimer in the 1271316Simp * documentation and/or other materials provided with the distribution. 1371316Simp * 1471316Simp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1571316Simp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1671316Simp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1771316Simp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1871316Simp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 1971316Simp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2071316Simp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2171316Simp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2271316Simp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2371316Simp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2471316Simp * 2571316Simp * $FreeBSD: head/sys/dev/cs/if_cs_pccard.c 71316 2001-01-21 04:56:12Z imp $ 2671316Simp */ 2771316Simp 2871316Simp#include <sys/param.h> 2971316Simp#include <sys/systm.h> 3071316Simp#include <sys/kernel.h> 3171316Simp#include <sys/socket.h> 3271316Simp 3371316Simp#include <sys/module.h> 3471316Simp#include <sys/bus.h> 3571316Simp 3671316Simp#include <machine/bus.h> 3771316Simp#include <machine/resource.h> 3871316Simp 3971316Simp#include <net/ethernet.h> 4071316Simp#include <net/if.h> 4171316Simp#include <net/if_arp.h> 4271316Simp 4371316Simp#include <dev/cs/if_csvar.h> 4471316Simp#include <dev/pccard/pccardvar.h> 4571316Simp#include <dev/pccard/pccarddevs.h> 4671316Simp 4771316Simp#include "card_if.h" 4871316Simp 4971316Simpstatic const struct pccard_product cs_pccard_products[] = { 5071316Simp { NULL } 5171316Simp}; 5271316Simpstatic int 5371316Simpcs_pccard_match(device_t dev) 5471316Simp{ 5571316Simp const struct pccard_product *pp; 5671316Simp 5771316Simp if ((pp = pccard_product_lookup(dev, cs_pccard_products, 5871316Simp sizeof(cs_pccard_products[0]), NULL)) != NULL) { 5971316Simp device_set_desc(dev, pp->pp_name); 6071316Simp return 0; 6171316Simp } 6271316Simp return EIO; 6371316Simp} 6471316Simp 6571316Simpstatic int 6671316Simpcs_pccard_probe(device_t dev) 6771316Simp{ 6871316Simp int error; 6971316Simp 7071316Simp error = cs_cs89x0_probe(dev); 7171316Simp cs_release_resources(dev); 7271316Simp return (error); 7371316Simp} 7471316Simp 7571316Simpstatic int 7671316Simpcs_pccard_attach(device_t dev) 7771316Simp{ 7871316Simp struct cs_softc *sc = device_get_softc(dev); 7971316Simp int flags = device_get_flags(dev); 8071316Simp int error; 8171316Simp 8271316Simp if (sc->port_used > 0) 8371316Simp cs_alloc_port(dev, sc->port_rid, sc->port_used); 8471316Simp if (sc->mem_used) 8571316Simp cs_alloc_memory(dev, sc->mem_rid, sc->mem_used); 8671316Simp error = cs_alloc_irq(dev, sc->irq_rid, 0); 8771316Simp if (error != 0) 8871316Simp goto bad; 8971316Simp 9071316Simp error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET, 9171316Simp csintr, sc, &sc->irq_handle); 9271316Simp if (error != 0) 9371316Simp goto bad; 9471316Simp 9571316Simp return (cs_attach(sc, device_get_unit(dev), flags)); 9671316Simpbad: 9771316Simp cs_release_resources(dev); 9871316Simp return (error); 9971316Simp} 10071316Simp 10171316Simpstatic device_method_t cs_pccard_methods[] = { 10271316Simp /* Device interface */ 10371316Simp DEVMETHOD(device_probe, pccard_compat_probe), 10471316Simp DEVMETHOD(device_attach, pccard_compat_attach), 10571316Simp#ifdef CS_HAS_DETACH 10671316Simp DEVMETHOD(device_detach, cs_detach), 10771316Simp#endif 10871316Simp 10971316Simp /* Card interface */ 11071316Simp DEVMETHOD(card_compat_match, cs_pccard_match), 11171316Simp DEVMETHOD(card_compat_probe, cs_pccard_probe), 11271316Simp DEVMETHOD(card_compat_attach, cs_pccard_attach), 11371316Simp 11471316Simp { 0, 0 } 11571316Simp}; 11671316Simp 11771316Simpstatic driver_t cs_pccard_driver = { 11871316Simp "cs", 11971316Simp cs_pccard_methods, 12071316Simp sizeof(struct cs_softc), 12171316Simp}; 12271316Simp 12371316Simpextern devclass_t cs_devclass; 12471316Simp 12571316SimpDRIVER_MODULE(if_cs, pccard, cs_pccard_driver, cs_devclass, 0, 0); 12671316SimpMODULE_DEPEND(if_cs, pccard, 1, 1, 1); 127