From e3132c83736578cd59c6b9285101f5bb1080d5bf Mon Sep 17 00:00:00 2001 From: Warner Losh Date: Mon, 25 Oct 1999 02:55:14 +0000 Subject: [PATCH] Add pccard attachment. This won't work with memory mapped ed devices yet, but that should be resolved shortly. Non memory mapped ed devices should work, but I cannot test this since my only ed card is memory mapped. Submitted by: Matt Dodd --- sys/dev/ed/if_ed.c | 8 -- sys/dev/ed/if_ed_pccard.c | 161 ++++++++++++++++---------------------- 2 files changed, 68 insertions(+), 101 deletions(-) diff --git a/sys/dev/ed/if_ed.c b/sys/dev/ed/if_ed.c index 744ff73f03fa..e47f69eb4b60 100644 --- a/sys/dev/ed/if_ed.c +++ b/sys/dev/ed/if_ed.c @@ -37,12 +37,6 @@ * */ -#include "card.h" -#if NCARD > 0 -#include /* PCCARD version */ -#else - - #include #include #include @@ -3304,5 +3298,3 @@ ds_getmcaf(sc, mcaf) af[index >> 3] |= 1 << (index & 7); } } - -#endif /* NCARD */ diff --git a/sys/dev/ed/if_ed_pccard.c b/sys/dev/ed/if_ed_pccard.c index c832e35c795e..6e760fbe1178 100644 --- a/sys/dev/ed/if_ed_pccard.c +++ b/sys/dev/ed/if_ed_pccard.c @@ -27,22 +27,21 @@ * $FreeBSD$ */ -/* - * BROKEN - * There is no way to specify a softc struct - * for a PCCARD device. - */ - #include -#include #include -#include -#include #include -#include +#include + +#include +#include +#include + +#include +#include +#include +#include #include -#include #include #include @@ -51,49 +50,31 @@ /* * PC-Card (PCMCIA) specific code. */ -static int ed_pccard_init __P((struct pccard_devinfo *)); -static void ed_pccard_unload __P((struct pccard_devinfo *)); -static int ep_pccard_intr __P((struct pccard_devinfo *)); -static int ed_pccard_probe __P((struct isa_device *, u_char *)); -static int ed_pccard_attach __P((device_t)); +static int ed_pccard_probe(device_t); +static int ed_pccard_attach(device_t); +static void ed_pccard_detach(device_t); -PCCARD_MODULE(ed, ed_pccard_init, ed_pccard_unload, ed_pccard_intr, 0, net_imask); +static device_method_t ed_pccard_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ed_pccard_probe), + DEVMETHOD(device_attach, ed_pccard_attach), + DEVMETHOD(device_attach, ed_pccard_detach), + + { 0, 0 } +}; + +static driver_t ed_pccard_driver = { + "ed", + ed_pccard_methods, + sizeof(struct ed_softc) +}; + +static devclass_t ed_pccard_devclass; + +DRIVER_MODULE(ed, pccard, ed_pccard_driver, ed_pccard_devclass, 0, 0); /* - * Initialize the device - called from Slot manager. - */ -static int -ed_pccard_init(struct pccard_devinfo *devi) -{ - int i; - u_char e; - struct ed_softc *sc = device_get_softc(devi->isahd.id_device); - int error; - - /* validate unit number. */ - if (devi->isahd.id_unit >= NEDTOT) - return(ENODEV); - /* - * Probe the device. If a value is returned, the - * device was found at the location. - */ - sc->gone = 0; - if (error = ed_pccard_probe(&devi->isahd, devi->misc)) - return(error); - e = 0; - for (i = 0; i < ETHER_ADDR_LEN; ++i) - e |= devi->misc[i]; - if (e) - for (i = 0; i < ETHER_ADDR_LEN; ++i) - sc->arpcom.ac_enaddr[i] = devi->misc[i]; - if (ed_pccard_attach(devi->isahd.id_device) == 0) - return(ENXIO); - - return(0); -} - -/* - * edunload - unload the driver and clear the table. + * ed_pccard_detach - unload the driver and clear the table. * XXX TODO: * This is usually called when the card is ejected, but * can be caused by a modunload of a controller driver. @@ -102,33 +83,20 @@ ed_pccard_init(struct pccard_devinfo *devi) * read and write do not hang. */ static void -ed_pccard_unload(struct pccard_devinfo *devi) +ed_pccard_detach(device_t dev) { - struct ed_softc *sc = device_get_softc(devi->isahd.id_device); + struct ed_softc *sc = device_get_softc(dev); struct ifnet *ifp = &sc->arpcom.ac_if; if (sc->gone) { - printf("ed%d: already unloaded\n", devi->isahd.id_unit); + device_printf(dev, "already unloaded\n"); return; } ifp->if_flags &= ~IFF_RUNNING; if_down(ifp); + bus_teardown_intr(dev, sc->irq_res, &sc->irq_handle); sc->gone = 1; - printf("ed%d: unload\n", devi->isahd.id_unit); -} - -/* - * card_intr - Shared interrupt called from - * front end of PC-Card handler. - */ -static int -ed_pccard_intr(struct pccard_devinfo *devi) -{ - struct ed_softc *sc = device_get_softc(devi->isahd.id_device); - - edintr(sc); - - return(1); + device_printf(dev, "unload\n"); } /* @@ -137,18 +105,22 @@ ed_pccard_intr(struct pccard_devinfo *devi) * supplied (from the CIS), relying on the probe to find it instead. */ static int -ed_pccard_probe(isa_dev, ether) - struct isa_device *isa_dev; - u_char *ether; +ed_pccard_probe(device_t dev) { int error; + const char *name; + + name = pccard_get_name(dev); + printf("ed_pccard_probe: Does %s match?\n", name); + if (strcmp(name, "ed")) + return ENXIO; - error = ed_probe_WD80x3(isa_dev->id_device); + error = ed_probe_WD80x3(dev); if (error == 0) goto end; ed_release_resources(dev); - error = ed_probe_Novell(isa_dev->id_device); + error = ed_probe_Novell(dev); if (error == 0) goto end; ed_release_resources(dev); @@ -158,29 +130,32 @@ end: error = ed_alloc_irq(dev, 0, 0); ed_release_resources(dev); +printf("probe %d\n", error); return (error); } static int -ed_pccard_attach(dev) - device_t dev; +ed_pccard_attach(device_t dev) { - struct ed_softc *sc = device_get_softc(dev); - int flags = device_get_flags(dev); - int error; - - if (sc->port_used > 0) - ed_alloc_port(dev, sc->port_rid, 1); - if (sc->mem_used) - ed_alloc_memory(dev, sc->mem_rid, 1); - ed_alloc_irq(dev, sc->irq_rid, 0); - - error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET, - edintr, sc, &sc->irq_handle); - if (error) { - ed_release_resources(dev); - return (error); - } + struct ed_softc *sc = device_get_softc(dev); + int flags = device_get_flags(dev); + int error; + + if (sc->port_used > 0) + ed_alloc_port(dev, sc->port_rid, 1); + if (sc->mem_used) + ed_alloc_memory(dev, sc->mem_rid, 1); + ed_alloc_irq(dev, sc->irq_rid, 0); + + error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET, + edintr, sc, &sc->irq_handle); + if (error) { + printf("setup intr failed %d \n", error); + ed_release_resources(dev); + return (error); + } - return ed_attach(sc, device_get_unit(dev), flags); + error = ed_attach(sc, device_get_unit(dev), flags); + printf("attach failed %d\n", error); + return error; }