if_ed_pccard.c revision 53978
1223897Snwhitehorn/* 2223897Snwhitehorn * Copyright (c) 1995, David Greenman 3223897Snwhitehorn * All rights reserved. 4287687Sdteske * 5223897Snwhitehorn * Redistribution and use in source and binary forms, with or without 6223897Snwhitehorn * modification, are permitted provided that the following conditions 7223897Snwhitehorn * are met: 8223897Snwhitehorn * 1. Redistributions of source code must retain the above copyright 9223897Snwhitehorn * notice unmodified, this list of conditions, and the following 10223897Snwhitehorn * disclaimer. 11223897Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright 12223897Snwhitehorn * notice, this list of conditions and the following disclaimer in the 13223897Snwhitehorn * documentation and/or other materials provided with the distribution. 14223897Snwhitehorn * 15223897Snwhitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16223897Snwhitehorn * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17223897Snwhitehorn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18223897Snwhitehorn * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19223897Snwhitehorn * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20223897Snwhitehorn * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21223897Snwhitehorn * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22223897Snwhitehorn * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23223897Snwhitehorn * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24223897Snwhitehorn * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25223897Snwhitehorn * SUCH DAMAGE. 26223897Snwhitehorn * 27223897Snwhitehorn * $FreeBSD: head/sys/dev/ed/if_ed_pccard.c 53978 1999-12-01 07:38:54Z imp $ 28223897Snwhitehorn */ 29257842Sdteske 30257842Sdteske#include <sys/param.h> 31223897Snwhitehorn#include <sys/systm.h> 32257842Sdteske#include <sys/socket.h> 33257842Sdteske#include <sys/kernel.h> 34257842Sdteske 35257842Sdteske#include <sys/module.h> 36257842Sdteske#include <sys/bus.h> 37257842Sdteske#include <machine/bus.h> 38223897Snwhitehorn 39257842Sdteske#include <net/ethernet.h> 40223897Snwhitehorn#include <net/if.h> 41257842Sdteske#include <net/if_arp.h> 42257842Sdteske#include <net/if_mib.h> 43257842Sdteske 44257842Sdteske#include <dev/ed/if_edvar.h> 45257842Sdteske 46257842Sdteske/* 47224972Snwhitehorn * PC-Card (PCMCIA) specific code. 48257842Sdteske */ 49257842Sdteskestatic int ed_pccard_probe(device_t); 50257842Sdteskestatic int ed_pccard_attach(device_t); 51257842Sdteskestatic int ed_pccard_detach(device_t); 52257842Sdteske 53257842Sdteskestatic device_method_t ed_pccard_methods[] = { 54257842Sdteske /* Device interface */ 55257842Sdteske DEVMETHOD(device_probe, ed_pccard_probe), 56257842Sdteske DEVMETHOD(device_attach, ed_pccard_attach), 57257842Sdteske DEVMETHOD(device_detach, ed_pccard_detach), 58257842Sdteske 59257842Sdteske { 0, 0 } 60257842Sdteske}; 61257842Sdteske 62257842Sdteskestatic driver_t ed_pccard_driver = { 63257842Sdteske "ed", 64257842Sdteske ed_pccard_methods, 65257842Sdteske sizeof(struct ed_softc) 66257842Sdteske}; 67257842Sdteske 68257842Sdteskestatic devclass_t ed_pccard_devclass; 69257842Sdteske 70257842SdteskeDRIVER_MODULE(ed, pccard, ed_pccard_driver, ed_pccard_devclass, 0, 0); 71257842Sdteske 72257842Sdteske/* 73257842Sdteske * ed_pccard_detach - unload the driver and clear the table. 74257842Sdteske * XXX TODO: 75257842Sdteske * This is usually called when the card is ejected, but 76257842Sdteske * can be caused by a modunload of a controller driver. 77257842Sdteske * The idea is to reset the driver's view of the device 78257842Sdteske * and ensure that any driver entry points such as 79257842Sdteske * read and write do not hang. 80257842Sdteske */ 81257842Sdteskestatic int 82257842Sdteskeed_pccard_detach(device_t dev) 83257842Sdteske{ 84257842Sdteske struct ed_softc *sc = device_get_softc(dev); 85257842Sdteske struct ifnet *ifp = &sc->arpcom.ac_if; 86257842Sdteske 87257842Sdteske if (sc->gone) { 88257842Sdteske device_printf(dev, "already unloaded\n"); 89257842Sdteske return (0); 90257842Sdteske } 91257842Sdteske ifp->if_flags &= ~IFF_RUNNING; 92257842Sdteske if_detach(ifp); 93257842Sdteske bus_teardown_intr(dev, sc->irq_res, &sc->irq_handle); 94257842Sdteske sc->gone = 1; 95257842Sdteske device_printf(dev, "unload\n"); 96257842Sdteske return (0); 97257842Sdteske} 98257842Sdteske 99257842Sdteske/* 100257842Sdteske * Probe framework for pccards. Replicates the standard framework, 101257842Sdteske * minus the pccard driver registration and ignores the ether address 102257842Sdteske * supplied (from the CIS), relying on the probe to find it instead. 103257842Sdteske */ 104257842Sdteskestatic int 105257842Sdteskeed_pccard_probe(device_t dev) 106257842Sdteske{ 107257842Sdteske int error; 108257842Sdteske 109257842Sdteske error = ed_probe_WD80x3(dev); 110257842Sdteske if (error == 0) 111257842Sdteske goto end; 112257842Sdteske ed_release_resources(dev); 113257842Sdteske 114257842Sdteske error = ed_probe_Novell(dev); 115257842Sdteske if (error == 0) 116257842Sdteske goto end; 117257842Sdteske ed_release_resources(dev); 118257842Sdteske 119257842Sdteskeend: 120257842Sdteske if (error == 0) 121257842Sdteske error = ed_alloc_irq(dev, 0, 0); 122264488Sdteske 123257842Sdteske ed_release_resources(dev); 124257842Sdteske return (error); 125257842Sdteske} 126257842Sdteske 127257842Sdteskestatic int 128257842Sdteskeed_pccard_attach(device_t dev) 129257842Sdteske{ 130257842Sdteske struct ed_softc *sc = device_get_softc(dev); 131257842Sdteske int flags = device_get_flags(dev); 132257842Sdteske int error; 133257842Sdteske 134224972Snwhitehorn if (sc->port_used > 0) 135224972Snwhitehorn ed_alloc_port(dev, sc->port_rid, sc->port_used); 136257842Sdteske if (sc->mem_used) 137224972Snwhitehorn ed_alloc_memory(dev, sc->mem_rid, sc->mem_used); 138257842Sdteske ed_alloc_irq(dev, sc->irq_rid, 0); 139257842Sdteske 140257842Sdteske error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET, 141257842Sdteske edintr, sc, &sc->irq_handle); 142257842Sdteske if (error) { 143257842Sdteske printf("setup intr failed %d \n", error); 144223897Snwhitehorn ed_release_resources(dev); 145257842Sdteske return (error); 146257842Sdteske } 147257842Sdteske 148257842Sdteske error = ed_attach(sc, device_get_unit(dev), flags); 149257842Sdteske return (error); 150257749Sgjb} 151257842Sdteske