From b20d4649f97a40a8c68397bded7ad401fb3c4343 Mon Sep 17 00:00:00 2001 From: "Matthew N. Dodd" Date: Mon, 3 Jun 2002 09:16:52 +0000 Subject: Quick and dirty convert to newbus. (Eventually 'eni.c' should go away.) Module loads and unloads properly. Thanks to Richard Hodges for donating the hardware to allow me to work on this driver. --- sys/dev/hea/eni.c | 39 +++-- sys/dev/hea/eni.h | 4 +- sys/dev/hea/eni_buffer.c | 5 +- sys/dev/hea/hea_freebsd.c | 357 ++++++++++++++++++++++++++++++++++++++++++++++ sys/dev/hea/hea_freebsd.h | 59 ++++++++ sys/dev/hea/hea_pci.c | 224 +++++++++++++++++++++++++++++ 6 files changed, 670 insertions(+), 18 deletions(-) create mode 100644 sys/dev/hea/hea_freebsd.c create mode 100644 sys/dev/hea/hea_freebsd.h create mode 100644 sys/dev/hea/hea_pci.c (limited to 'sys/dev') diff --git a/sys/dev/hea/eni.c b/sys/dev/hea/eni.c index 804eca3ed238..d1b2ef316ab3 100644 --- a/sys/dev/hea/eni.c +++ b/sys/dev/hea/eni.c @@ -47,6 +47,10 @@ #include #include #include + +#include +#include + #include #include #include @@ -58,6 +62,9 @@ #include #include +#include +#include + #include #include #include @@ -66,25 +73,26 @@ __RCSID("@(#) $FreeBSD$"); #endif -#ifndef COMPAT_OLDPCI -#error "The eni device requires the old pci compatibility shims" -#endif - /* * Typedef local functions */ +#if 0 static const char *eni_pci_probe(pcici_t, pcidi_t); static void eni_pci_attach(pcici_t, int); +#endif static int eni_get_ack(Eni_unit *); static int eni_get_sebyte(Eni_unit *); -static void eni_read_seeprom(Eni_unit *); +void eni_read_seeprom(Eni_unit *); +#if 0 #if BSD < 199506 static int eni_pci_shutdown(struct kern_devconf *, int); #else static void eni_pci_shutdown(void *, int); #endif static void eni_pci_reset(Eni_unit *); +#endif +#if 0 /* * Used by kernel to return number of claimed devices */ @@ -134,6 +142,7 @@ eni_pci_probe ( pcici_t config_id, pcidi_t device_id ) return ( NULL ); } +#endif /* * The ENI-155p adapter uses an ATMEL AT24C01 serial EEPROM to store @@ -149,8 +158,8 @@ eni_pci_probe ( pcici_t config_id, pcidi_t device_id ) */ #define WRITE_SEEPROM() ( \ { \ - (void) pci_conf_write ( eup->eu_pcitag, SEEPROM, \ - eup->eu_sevar ); \ + (void) pci_write_config(eup->eu_pcitag, SEEPROM, \ + eup->eu_sevar, 4); \ DELAY(SEPROM_DELAY); \ } \ ) @@ -216,7 +225,7 @@ eni_pci_probe ( pcici_t config_id, pcidi_t device_id ) * */ static int -eni_get_ack ( eup ) +eni_get_ack (eup) Eni_unit *eup; { int ack; @@ -225,14 +234,14 @@ eni_get_ack ( eup ) /* * Read DATA line from SEPROM */ - eup->eu_sevar = pci_conf_read ( eup->eu_pcitag, SEEPROM ); + eup->eu_sevar = pci_read_config(eup->eu_pcitag, SEEPROM, 4); DELAY ( SEPROM_DELAY ); ack = eup->eu_sevar & SEPROM_DATA; eup->eu_sevar &= ~SEPROM_CLK; - WRITE_SEEPROM (); + WRITE_SEEPROM(); eup->eu_sevar |= SEPROM_DATA; - WRITE_SEEPROM (); + WRITE_SEEPROM(); return ( ack ); } @@ -255,7 +264,7 @@ eni_get_ack ( eup ) * */ static int -eni_get_sebyte( eup ) +eni_get_sebyte(eup) Eni_unit *eup; { int i; @@ -273,7 +282,7 @@ eni_get_sebyte( eup ) /* * Read DATA line from SEPROM */ - data = pci_conf_read ( eup->eu_pcitag, SEEPROM ); + data = pci_read_config(eup->eu_pcitag, SEEPROM, 4); DELAY ( SEPROM_DELAY ); /* (Possibly) mask bit into accumulating value */ if ( data & SEPROM_DATA ) @@ -298,7 +307,7 @@ eni_get_sebyte( eup ) * none * */ -static void +void eni_read_seeprom ( eup ) Eni_unit *eup; { @@ -352,6 +361,7 @@ eni_read_seeprom ( eup ) return; } +#if 0 /* * The kernel has found a device which we are willing to support. * We are now being called to do any necessary work to make the @@ -687,3 +697,4 @@ eni_pci_shutdown ( eup, howto ) } #endif /* BSD < 199506 */ #endif +#endif diff --git a/sys/dev/hea/eni.h b/sys/dev/hea/eni.h index 76b4c9cc8c05..54bb04fd24fd 100644 --- a/sys/dev/hea/eni.h +++ b/sys/dev/hea/eni.h @@ -442,9 +442,7 @@ struct mbd { */ struct eni_unit { Cmn_unit eu_cmn; /* Common unit stuff */ -#ifdef COMPAT_OLDPCI - pcici_t eu_pcitag; /* PCI tag */ -#endif + void * eu_pcitag; /* PCI tag */ Eni_mem eu_base; /* Adapter memory base */ Eni_mem eu_ram; /* Adapter RAM */ u_long eu_ramsize; diff --git a/sys/dev/hea/eni_buffer.c b/sys/dev/hea/eni_buffer.c index d1946f00dd95..026ce5dc58e3 100644 --- a/sys/dev/hea/eni_buffer.c +++ b/sys/dev/hea/eni_buffer.c @@ -38,7 +38,10 @@ #include #include #include +#include + #include + #include #include #include @@ -316,7 +319,7 @@ eni_allocate_buffer ( eup, size ) Mbd *etmp; /* larger then we need - split it */ - etmp = (Mbd *)KM_ALLOC(sizeof(Mbd), M_DEVBUF, M_NOWAIT ); + etmp = (Mbd *)malloc(sizeof(Mbd), M_DEVBUF, M_NOWAIT); if ( etmp == (Mbd *)NULL ) { /* * Couldn't allocate new descriptor. Indicate diff --git a/sys/dev/hea/hea_freebsd.c b/sys/dev/hea/hea_freebsd.c new file mode 100644 index 000000000000..c8b0f833bf88 --- /dev/null +++ b/sys/dev/hea/hea_freebsd.c @@ -0,0 +1,357 @@ +/*- + * Copyright (c) 2002 Matthew N. Dodd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 THE AUTHOR OR CONTRIBUTORS 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. + * + * $FreeBSD$ + */ + +/* + * + * =================================== + * HARP | Host ATM Research Platform + * =================================== + * + * + * This Host ATM Research Platform ("HARP") file (the "Software") is + * made available by Network Computing Services, Inc. ("NetworkCS") + * "AS IS". NetworkCS does not provide maintenance, improvements or + * support of any kind. + * + * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, + * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE + * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. + * In no event shall NetworkCS be responsible for any damages, including + * but not limited to consequential damages, arising from or relating to + * any use of the Software or related support. + * + * Copyright 1994-1998 Network Computing Services, Inc. + * + * Copies of this Software may be made, however, the above copyright + * notice must be reproduced on all copies. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +devclass_t hea_devclass; + +int +hea_alloc (device_t dev) +{ + struct hea_softc *sc; + int error; + + sc = (struct hea_softc *)device_get_softc(dev); + error = 0; + + sc->mem = bus_alloc_resource(dev, sc->mem_type, &sc->mem_rid, + 0, ~0, 1, RF_ACTIVE); + if (sc->mem == NULL) { + device_printf(dev, "Unable to allocate memory resource.\n"); + error = ENXIO; + goto fail; + } + + sc->irq = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irq_rid, + 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE); + if (sc->irq == NULL) { + device_printf(dev, "Unable to allocate interrupt resource.\n"); + error = ENXIO; + goto fail; + } + + mtx_init(&sc->mtx, device_get_nameunit(dev), "Interrupt lock", MTX_DEF|MTX_RECURSE); + +fail: + return (error); +} + +int +hea_free (device_t dev) +{ + struct hea_softc *sc; + + sc = (struct hea_softc *)device_get_softc(dev); + if (sc->mem) + bus_release_resource(dev, sc->mem_type, sc->mem_rid, sc->mem); + if (sc->irq_ih) + bus_teardown_intr(dev, sc->irq, sc->irq_ih); + if (sc->irq) + bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq); + + /* + * Destroy the mutex. + */ + if (mtx_initialized(&sc->mtx) != 0) + mtx_destroy(&sc->mtx); + + return (0); +} + +int +hea_attach (device_t dev) +{ + struct hea_softc *sc; + Eni_unit *eup; + int error; + long val; + + sc = (struct hea_softc *)device_get_softc(dev); + eup = &sc->eup; + error = 0; + + /* + * Start initializing it + */ + eup->eu_unit = device_get_unit(dev); + eup->eu_mtu = ENI_IFF_MTU; + eup->eu_pcitag = dev; + eup->eu_ioctl = eni_atm_ioctl; + eup->eu_instvcc = eni_instvcc; + eup->eu_openvcc = eni_openvcc; + eup->eu_closevcc = eni_closevcc; + eup->eu_output = eni_output; + eup->eu_vcc_pool = &eni_vcc_pool; + eup->eu_nif_pool = &eni_nif_pool; + + /* + * Map memory structures into adapter space + */ + eup->eu_suni = (Eni_mem)(eup->eu_base + SUNI_OFFSET); + eup->eu_midway = (Eni_mem)(eup->eu_base + MIDWAY_OFFSET); + eup->eu_vcitbl = (VCI_Table *)(eup->eu_base + VCITBL_OFFSET); + eup->eu_rxdma = (Eni_mem)(eup->eu_base + RXQUEUE_OFFSET); + eup->eu_txdma = (Eni_mem)(eup->eu_base + TXQUEUE_OFFSET); + eup->eu_svclist = (Eni_mem)(eup->eu_base + SVCLIST_OFFSET); + eup->eu_servread = 0; + + /* + * Reset the midway chip + */ + eup->eu_midway[MIDWAY_ID] = MIDWAY_RESET; + + /* + * Size and test adapter memory. Initialize our adapter memory + * allocater. + */ + if (eni_init_memory(eup) < 0) { + /* + * Adapter memory test failed. Clean up and + * return. + */ + device_printf(dev, "memory test failed.\n"); + error = ENXIO; + goto fail; + } + + /* + * Read the contents of the SEEPROM + */ + eni_read_seeprom(eup); + /* + * Copy MAC address to PIF and config structures + */ + bcopy((caddr_t)&eup->eu_seeprom[SEPROM_MAC_OFF], + (caddr_t)&eup->eu_pif.pif_macaddr, + sizeof(struct mac_addr)); + eup->eu_config.ac_macaddr = eup->eu_pif.pif_macaddr; + + /* + * Copy serial number into config space + */ + eup->eu_config.ac_serial = + ntohl(*(u_long *)&eup->eu_seeprom[SEPROM_SN_OFF]); + + /* + * Setup some of the adapter configuration + */ + /* + * Get MIDWAY ID + */ + val = eup->eu_midway[MIDWAY_ID]; + eup->eu_config.ac_vendor = VENDOR_ENI; + eup->eu_config.ac_vendapi = VENDAPI_ENI_1; + eup->eu_config.ac_device = DEV_ENI_155P; + eup->eu_config.ac_media = val & MEDIA_MASK ? MEDIA_UTP155 : MEDIA_OC3C; + eup->eu_pif.pif_pcr = ATM_PCR_OC3C; + + /* + * Make a hw version number from the ID register values. + * Format: {Midway ID}.{Mother board ID}.{Daughter board ID} + */ + snprintf(eup->eu_config.ac_hard_vers, + sizeof(eup->eu_config.ac_hard_vers), + "%ld/%ld/%ld", + (val >> ID_SHIFT) & ID_MASK, + (val >> MID_SHIFT) & MID_MASK, + (val >> DID_SHIFT) & DID_MASK ); + + /* + * There is no software version number + */ + eup->eu_config.ac_firm_vers[0] = '\0'; + + /* + * Save device ram info for user-level programs + * NOTE: This really points to start of EEPROM + * and includes all the device registers in the + * lower 2 Megabytes. + */ + eup->eu_config.ac_ram = (long)eup->eu_base; + eup->eu_config.ac_ramsize = eup->eu_ramsize + ENI_REG_SIZE; + + /* + * Setup max VPI/VCI values + */ + eup->eu_pif.pif_maxvpi = ENI_MAX_VPI; + eup->eu_pif.pif_maxvci = ENI_MAX_VCI; + + /* + * Register this interface with ATM core services + */ + error = atm_physif_register((Cmn_unit *)eup, ENI_DEV_NAME, eni_services); + if (error) + goto fail; + + eni_units[device_get_unit(dev)] = eup; + + /* + * Initialize driver processing + */ + error = eni_init(eup); + if (error) { + device_printf(dev, "adapter init failed.\n"); + goto fail; + } + +fail: + return (error); +} + +int +hea_detach (device_t dev) +{ + struct hea_softc *sc; + Eni_unit *eup; + int error; + + sc = (struct hea_softc *)device_get_softc(dev); + eup = &sc->eup; + error = 0; + + /* + * De-Register this interface with ATM core services + */ + error = atm_physif_deregister((Cmn_unit *)eup); + + /* + * Reset the board. + */ + hea_reset(dev); + + hea_free(dev); + + return (error); +} + +void +hea_intr (void * arg) +{ + struct hea_softc *sc; + + sc = (struct hea_softc *)arg; + + HEA_LOCK(sc); + eni_intr(&sc->eup); + HEA_UNLOCK(sc); + + return; +} + +void +hea_reset (device_t dev) +{ + struct hea_softc *sc; + Eni_unit *eup; + + sc = (struct hea_softc *)device_get_softc(dev); + eup = &sc->eup; + + /* + * We should really close down any open VCI's and + * release all memory (TX and RX) buffers. For now, + * we assume we're shutting the card down for good. + */ + + if (eup->eu_midway) { + /* + * Issue RESET command to Midway chip + */ + eup->eu_midway[MIDWAY_ID] = MIDWAY_RESET; + + /* + * Delay to allow everything to terminate + */ + DELAY(MIDWAY_DELAY); + } + + return; +} diff --git a/sys/dev/hea/hea_freebsd.h b/sys/dev/hea/hea_freebsd.h new file mode 100644 index 000000000000..42e24ffad1f7 --- /dev/null +++ b/sys/dev/hea/hea_freebsd.h @@ -0,0 +1,59 @@ +/*- + * Copyright (c) 2002 Matthew N. Dodd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 THE AUTHOR OR CONTRIBUTORS 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. + * + * $FreeBSD$ + */ + +struct hea_softc { + device_t dev; + + struct resource * mem; + int mem_rid; + int mem_type; + + struct resource * irq; + int irq_rid; + void * irq_ih; + + struct mtx mtx; + + Eni_unit eup; +}; + +#define HEA_LOCK(_sc) mtx_lock(&(_sc)->mtx) +#define HEA_UNLOCK(_sc) mtx_unlock(&(_sc)->mtx) + +extern devclass_t hea_devclass; + +int hea_alloc (device_t); +int hea_free (device_t); + +int hea_attach (device_t); +int hea_detach (device_t); + +void hea_intr (void *); +void hea_reset (device_t); + +void eni_read_seeprom(Eni_unit *); diff --git a/sys/dev/hea/hea_pci.c b/sys/dev/hea/hea_pci.c new file mode 100644 index 000000000000..391db8b1167f --- /dev/null +++ b/sys/dev/hea/hea_pci.c @@ -0,0 +1,224 @@ +/*- + * Copyright (c) 2002 Matthew N. Dodd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 THE AUTHOR OR CONTRIBUTORS 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. + * + * $FreeBSD$ + */ + +/* + * + * =================================== + * HARP | Host ATM Research Platform + * =================================== + * + * + * This Host ATM Research Platform ("HARP") file (the "Software") is + * made available by Network Computing Services, Inc. ("NetworkCS") + * "AS IS". NetworkCS does not provide maintenance, improvements or + * support of any kind. + * + * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, + * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE + * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. + * In no event shall NetworkCS be responsible for any damages, including + * but not limited to consequential damages, arising from or relating to + * any use of the Software or related support. + * + * Copyright 1994-1998 Network Computing Services, Inc. + * + * Copies of this Software may be made, however, the above copyright + * notice must be reproduced on all copies. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include + +static int hea_pci_probe(device_t); +static int hea_pci_attach(device_t); + +#define ENI_VENDORID 0x111A +#define ENI_DEVICEID 0x0002 + +struct hea_pci_type { + u_int16_t vid; + u_int16_t did; + char * name; +} hea_pci_devs[] = { + { ENI_VENDORID, ENI_DEVICEID, "Efficent Networks ENI ATM Adapter" }, + { 0, 0, NULL }, +}; + +static int +hea_pci_probe (dev) + device_t dev; +{ + struct hea_pci_type * t = hea_pci_devs; + + while (t->name != NULL) { + if ((pci_get_vendor(dev) == t->vid) && + (pci_get_device(dev) == t->did)) { + device_set_desc(dev, t->name); + return(0); + } + t++; + } + + return(ENXIO); +} + +static int +hea_pci_attach (dev) + device_t dev; +{ + struct hea_softc *sc; + Eni_unit *eup; + u_int32_t command; + vm_offset_t va; + int error; + + sc = device_get_softc(dev); + eup = &sc->eup; + error = 0; + + pci_enable_busmaster(dev); + pci_enable_io(dev, SYS_RES_MEMORY); + + command = pci_read_config(dev, PCIR_COMMAND, 2); + if ((command & PCIM_CMD_BUSMASTEREN) == 0) { + device_printf(dev, "Unable to enable PCI busmastering.\n"); + error = ENXIO; + goto fail; + } + if ((command & PCIM_CMD_MEMEN) == 0) { + device_printf(dev, "Unable to enable PCI memory resources.\n"); + error = ENXIO; + goto fail; + } + + sc->mem_rid = PCIR_MAPS; + sc->mem_type = SYS_RES_MEMORY; + sc->irq_rid = 0; + + error = hea_alloc(dev); + if (error) { + device_printf(dev, "hea_alloc() failed.\n"); + goto fail; + } + + va = (vm_offset_t) rman_get_virtual(sc->mem); + + eup->eu_base = (Eni_mem)va; + eup->eu_ram = (Eni_mem)(eup->eu_base + RAM_OFFSET); + + /* + * Convert Endianess on DMA + */ + command = pci_read_config(dev, PCI_CONTROL_REG, 4); + command |= ENDIAN_SWAP_DMA; + pci_write_config(dev, PCI_CONTROL_REG, command, 4); + + /* + * Map interrupt in + */ + error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET, + hea_intr, sc, &sc->irq_ih); + if (error) { + device_printf(dev, "Interrupt handler setup failed.\n"); + goto fail; + } + + eup->eu_config.ac_bustype = BUS_PCI; + eup->eu_config.ac_busslot = (pci_get_bus(dev) << 8)| pci_get_slot(dev); + + error = hea_attach(dev); + if (error) { + device_printf(dev, "hea_attach() failed.\n"); + goto fail; + } + + return (0); +fail: + + hea_detach(dev); + + return (error); +} + +static device_method_t hea_pci_methods[] = { + DEVMETHOD(device_probe, hea_pci_probe), + DEVMETHOD(device_attach, hea_pci_attach), + + DEVMETHOD(device_detach, hea_detach), + + { 0, 0 } +}; + +static driver_t hea_pci_driver = { + "hea", + hea_pci_methods, + sizeof(struct hea_softc) +}; + +DRIVER_MODULE(hea, pci, hea_pci_driver, hea_devclass, 0, 0); +MODULE_DEPEND(hea, pci, 1, 1, 1); -- cgit v1.3