1/* $NetBSD: if_bah_zbus.c,v 1.6 2000/01/23 21:06:12 aymeric Exp $ */ 2 3#include <sys/cdefs.h> 4__FBSDID("$FreeBSD: stable/11/sys/dev/cm/if_cm_isa.c 331882 2018-04-02 16:11:49Z brooks $"); 5 6/*- 7 * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc. 8 * All rights reserved. 9 * 10 * This code is derived from software contributed to The NetBSD Foundation 11 * by Ignatios Souvatzis. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 23 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 26 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 * POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35#include <sys/param.h> 36#include <sys/systm.h> 37#include <sys/socket.h> 38#include <sys/kernel.h> 39#include <sys/malloc.h> 40 41#include <sys/module.h> 42#include <sys/bus.h> 43 44#include <machine/bus.h> 45#include <sys/rman.h> 46#include <machine/resource.h> 47 48#include <net/if.h> 49#include <net/if_var.h> 50#include <net/if_arc.h> 51 52#include <dev/cm/smc90cx6reg.h> 53#include <dev/cm/smc90cx6var.h> 54 55static int cm_isa_probe (device_t); 56static int cm_isa_attach (device_t); 57 58static int 59cm_isa_probe(dev) 60 device_t dev; 61{ 62 struct cm_softc *sc = device_get_softc(dev); 63 int rid; 64 65 rid = 0; 66 sc->port_res = bus_alloc_resource_anywhere( 67 dev, SYS_RES_IOPORT, &rid, CM_IO_PORTS, RF_ACTIVE); 68 if (sc->port_res == NULL) 69 return (ENOENT); 70 71 if (GETREG(CMSTAT) == 0xff) { 72 cm_release_resources(dev); 73 return (ENXIO); 74 } 75 76 rid = 0; 77 sc->mem_res = bus_alloc_resource_anywhere( 78 dev, SYS_RES_MEMORY, &rid, CM_MEM_SIZE, RF_ACTIVE); 79 if (sc->mem_res == NULL) { 80 cm_release_resources(dev); 81 return (ENOENT); 82 } 83 84 rid = 0; 85 sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); 86 if (sc->irq_res == NULL) { 87 cm_release_resources(dev); 88 return (ENOENT); 89 } 90 91 return (0); 92} 93 94static int 95cm_isa_attach(dev) 96 device_t dev; 97{ 98 struct cm_softc *sc = device_get_softc(dev); 99 int error; 100 101 /* init mtx and setup interrupt */ 102 mtx_init(&sc->sc_mtx, device_get_nameunit(dev), 103 MTX_NETWORK_LOCK, MTX_DEF); 104 error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, 105 NULL, cmintr, sc, &sc->irq_handle); 106 if (error) 107 goto err; 108 109 /* attach */ 110 error = cm_attach(dev); 111 if (error) 112 goto err; 113 114 gone_in_dev(dev, 12, "cm(4) driver"); 115 return 0; 116 117err: 118 mtx_destroy(&sc->sc_mtx); 119 cm_release_resources(dev); 120 return (error); 121} 122 123static int 124cm_isa_detach(device_t dev) 125{ 126 struct cm_softc *sc = device_get_softc(dev); 127 struct ifnet *ifp = sc->sc_ifp; 128 129 /* stop and detach */ 130 CM_LOCK(sc); 131 cm_stop_locked(sc); 132 ifp->if_drv_flags &= ~IFF_DRV_RUNNING; 133 CM_UNLOCK(sc); 134 135 callout_drain(&sc->sc_recon_ch); 136 arc_ifdetach(ifp); 137 138 /* teardown interrupt, destroy mtx and release resources */ 139 bus_teardown_intr(dev, sc->irq_res, sc->irq_handle); 140 mtx_destroy(&sc->sc_mtx); 141 if_free(ifp); 142 cm_release_resources(dev); 143 144 bus_generic_detach(dev); 145 return (0); 146} 147 148static device_method_t cm_isa_methods[] = { 149 /* Device interface */ 150 DEVMETHOD(device_probe, cm_isa_probe), 151 DEVMETHOD(device_attach, cm_isa_attach), 152 DEVMETHOD(device_detach, cm_isa_detach), 153 154 { 0, 0 } 155}; 156 157static driver_t cm_isa_driver = { 158 "cm", 159 cm_isa_methods, 160 sizeof(struct cm_softc) 161}; 162 163DRIVER_MODULE(cm, isa, cm_isa_driver, cm_devclass, 0, 0); 164MODULE_DEPEND(cm, isa, 1, 1, 1); 165