1158712Smarius/*- 2158712Smarius * Copyright (c) 1994-2000 3158712Smarius * Paul Richards. All rights reserved. 4158712Smarius * 5158712Smarius * PC-98 port by Chiharu Shibata & FreeBSD(98) porting team. 6158712Smarius * 7158712Smarius * Redistribution and use in source and binary forms, with or without 8158712Smarius * modification, are permitted provided that the following conditions 9158712Smarius * are met: 10158712Smarius * 1. Redistributions of source code must retain the above copyright 11158712Smarius * notice, this list of conditions and the following disclaimer, 12158712Smarius * verbatim and that no modifications are made prior to this 13158712Smarius * point in the file. 14158712Smarius * 2. Redistributions in binary form must reproduce the above copyright 15158712Smarius * notice, this list of conditions and the following disclaimer in the 16158712Smarius * documentation and/or other materials provided with the distribution. 17158712Smarius * 3. The name Paul Richards may not be used to endorse or promote products 18158712Smarius * derived from this software without specific prior written permission. 19158712Smarius * 20158712Smarius * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND 21158712Smarius * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22158712Smarius * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23158712Smarius * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE 24158712Smarius * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25158712Smarius * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26158712Smarius * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27158712Smarius * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28158712Smarius * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29158712Smarius * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30158712Smarius * SUCH DAMAGE. 31158712Smarius * 32158712Smarius * from: FreeBSD: src/sys/dev/lnc/if_lnc_cbus.c,v 1.12 2005/11/12 19:14:21 33158712Smarius */ 34158712Smarius 35158712Smarius#include <sys/cdefs.h> 36158712Smarius__FBSDID("$FreeBSD$"); 37158712Smarius 38158712Smarius#include <sys/param.h> 39158712Smarius#include <sys/systm.h> 40158712Smarius#include <sys/bus.h> 41158712Smarius#include <sys/endian.h> 42158712Smarius#include <sys/kernel.h> 43158712Smarius#include <sys/lock.h> 44158712Smarius#include <sys/module.h> 45158712Smarius#include <sys/mutex.h> 46158712Smarius#include <sys/resource.h> 47158712Smarius#include <sys/rman.h> 48158712Smarius#include <sys/socket.h> 49158712Smarius 50158712Smarius#include <net/ethernet.h> 51158712Smarius#include <net/if.h> 52158712Smarius#include <net/if_media.h> 53158712Smarius 54158712Smarius#include <machine/bus.h> 55158712Smarius#include <machine/resource.h> 56158712Smarius 57158712Smarius#include <isa/isavar.h> 58158712Smarius 59158712Smarius#include <dev/le/lancereg.h> 60158712Smarius#include <dev/le/lancevar.h> 61158712Smarius#include <dev/le/am7990var.h> 62158712Smarius 63158712Smarius#define LE_CBUS_MEMSIZE (16*1024) 64158712Smarius#define CNET98S_IOSIZE 32 65158712Smarius#define CNET98S_RDP 0x10 66158712Smarius#define CNET98S_RAP 0x12 67158712Smarius#define CNET98S_RESET 0x14 68158712Smarius#define CNET98S_BDP 0x16 69158712Smarius 70158712Smariusstruct le_cbus_softc { 71158712Smarius struct am7990_softc sc_am7990; /* glue to MI code */ 72158712Smarius 73158712Smarius struct resource *sc_rres; 74158712Smarius 75158712Smarius struct resource *sc_ires; 76158712Smarius void *sc_ih; 77158712Smarius 78158712Smarius bus_dma_tag_t sc_pdmat; 79158712Smarius bus_dma_tag_t sc_dmat; 80158712Smarius bus_dmamap_t sc_dmam; 81158712Smarius}; 82158712Smarius 83158712Smariusstatic device_probe_t le_cbus_probe; 84158712Smariusstatic device_attach_t le_cbus_attach; 85158712Smariusstatic device_detach_t le_cbus_detach; 86158712Smariusstatic device_resume_t le_cbus_resume; 87158712Smariusstatic device_suspend_t le_cbus_suspend; 88158712Smarius 89158712Smariusstatic device_method_t le_cbus_methods[] = { 90158712Smarius /* Device interface */ 91158712Smarius DEVMETHOD(device_probe, le_cbus_probe), 92158712Smarius DEVMETHOD(device_attach, le_cbus_attach), 93158712Smarius DEVMETHOD(device_detach, le_cbus_detach), 94158712Smarius /* We can just use the suspend method here. */ 95158712Smarius DEVMETHOD(device_shutdown, le_cbus_suspend), 96158712Smarius DEVMETHOD(device_suspend, le_cbus_suspend), 97158712Smarius DEVMETHOD(device_resume, le_cbus_resume), 98158712Smarius 99158712Smarius { 0, 0 } 100158712Smarius}; 101158712Smarius 102158712SmariusDEFINE_CLASS_0(le, le_cbus_driver, le_cbus_methods, sizeof(struct le_cbus_softc)); 103158829SnyanDRIVER_MODULE(le, isa, le_cbus_driver, le_devclass, 0, 0); 104158712SmariusMODULE_DEPEND(le, ether, 1, 1, 1); 105158712Smarius 106158712Smariusstatic bus_addr_t le_ioaddr_cnet98s[CNET98S_IOSIZE] = { 107158712Smarius 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 108158712Smarius 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, 109158712Smarius 0x400, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 110158712Smarius 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0x40d, 0x40e, 0x40f, 111158712Smarius}; 112158712Smarius 113158712Smariusstatic void le_cbus_wrbcr(struct lance_softc *, uint16_t, uint16_t); 114158712Smarius#ifdef LEDEBUG 115158712Smariusstatic uint16_t le_cbus_rdbcr(struct lance_softc *, uint16_t); 116158712Smarius#endif 117158712Smariusstatic void le_cbus_wrcsr(struct lance_softc *, uint16_t, uint16_t); 118158712Smariusstatic uint16_t le_cbus_rdcsr(struct lance_softc *, uint16_t); 119158712Smariusstatic void le_cbus_hwreset(struct lance_softc *); 120158712Smariusstatic bus_dmamap_callback_t le_cbus_dma_callback; 121158712Smarius 122158712Smariusstatic void 123158712Smariusle_cbus_wrbcr(struct lance_softc *sc, uint16_t port, uint16_t val) 124158712Smarius{ 125158712Smarius struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; 126158712Smarius 127183337Smarius bus_write_2(lesc->sc_rres, CNET98S_RAP, port); 128183337Smarius bus_barrier(lesc->sc_rres, CNET98S_RAP, 2, BUS_SPACE_BARRIER_WRITE); 129183337Smarius bus_write_2(lesc->sc_rres, CNET98S_BDP, val); 130158712Smarius} 131158712Smarius 132158712Smarius#ifdef LEDEBUG 133158712Smariusstatic uint16_t 134158712Smariusle_cbus_rdbcr(struct lance_softc *sc, uint16_t port) 135158712Smarius{ 136158712Smarius struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; 137158712Smarius 138183337Smarius bus_write_2(lesc->sc_rres, CNET98S_RAP, port); 139183337Smarius bus_barrier(lesc->sc_rres, CNET98S_RAP, 2, BUS_SPACE_BARRIER_WRITE); 140183337Smarius return (bus_read_2(lesc->sc_rres, CNET98S_BDP)); 141158712Smarius} 142158712Smarius#endif 143158712Smarius 144158712Smariusstatic void 145158712Smariusle_cbus_wrcsr(struct lance_softc *sc, uint16_t port, uint16_t val) 146158712Smarius{ 147158712Smarius struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; 148158712Smarius 149183337Smarius bus_write_2(lesc->sc_rres, CNET98S_RAP, port); 150183337Smarius bus_barrier(lesc->sc_rres, CNET98S_RAP, 2, BUS_SPACE_BARRIER_WRITE); 151183337Smarius bus_write_2(lesc->sc_rres, CNET98S_RDP, val); 152158712Smarius} 153158712Smarius 154158712Smariusstatic uint16_t 155158712Smariusle_cbus_rdcsr(struct lance_softc *sc, uint16_t port) 156158712Smarius{ 157158712Smarius struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; 158158712Smarius 159183337Smarius bus_write_2(lesc->sc_rres, CNET98S_RAP, port); 160183337Smarius bus_barrier(lesc->sc_rres, CNET98S_RAP, 2, BUS_SPACE_BARRIER_WRITE); 161183337Smarius return (bus_read_2(lesc->sc_rres, CNET98S_RDP)); 162158712Smarius} 163158712Smarius 164158712Smariusstatic void 165158712Smariusle_cbus_hwreset(struct lance_softc *sc) 166158712Smarius{ 167158712Smarius struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; 168158712Smarius 169158712Smarius /* 170158712Smarius * NB: These are Contec C-NET(98)S only. 171158712Smarius */ 172158712Smarius 173158712Smarius /* Reset the chip. */ 174183337Smarius bus_write_2(lesc->sc_rres, CNET98S_RESET, 175183337Smarius bus_read_2(lesc->sc_rres, CNET98S_RESET)); 176158712Smarius DELAY(500); 177158712Smarius 178158712Smarius /* ISA bus configuration */ 179158712Smarius /* ISACSR0 - set Master Mode Read Active time to 300ns. */ 180183337Smarius le_cbus_wrbcr(sc, LE_BCR0, 0x0006); 181158712Smarius /* ISACSR1 - set Master Mode Write Active time to 300ns. */ 182183337Smarius le_cbus_wrbcr(sc, LE_BCR1, 0x0006); 183183337Smarius#ifdef LEDEBUG 184158712Smarius device_printf(dev, "ISACSR2=0x%x\n", le_cbus_rdbcr(sc, LE_BCR2)); 185158712Smarius#endif 186158712Smarius /* ISACSR5 - LED1 */ 187158712Smarius le_cbus_wrbcr(sc, LE_BCR5, LE_B4_PSE | LE_B4_XMTE); 188158712Smarius /* ISACSR6 - LED2 */ 189158712Smarius le_cbus_wrbcr(sc, LE_BCR6, LE_B4_PSE | LE_B4_RCVE); 190158712Smarius /* ISACSR7 - LED3 */ 191158712Smarius le_cbus_wrbcr(sc, LE_BCR7, LE_B4_PSE | LE_B4_COLE); 192158712Smarius} 193158712Smarius 194158712Smariusstatic void 195158712Smariusle_cbus_dma_callback(void *xsc, bus_dma_segment_t *segs, int nsegs, int error) 196158712Smarius{ 197158712Smarius struct lance_softc *sc = (struct lance_softc *)xsc; 198158712Smarius 199158712Smarius if (error != 0) 200158712Smarius return; 201158712Smarius KASSERT(nsegs == 1, ("%s: bad DMA segment count", __func__)); 202158712Smarius sc->sc_addr = segs[0].ds_addr; 203158712Smarius} 204158712Smarius 205158712Smariusstatic int 206158712Smariusle_cbus_probe(device_t dev) 207158712Smarius{ 208158712Smarius struct le_cbus_softc *lesc; 209158712Smarius struct lance_softc *sc; 210183337Smarius int error, i; 211158712Smarius 212158829Snyan /* 213158829Snyan * Skip PnP devices as some wedge when trying to probe them as 214158829Snyan * C-NET(98)S. 215158829Snyan */ 216158829Snyan if (isa_get_vendorid(dev)) 217158829Snyan return (ENXIO); 218158829Snyan 219158712Smarius lesc = device_get_softc(dev); 220158712Smarius sc = &lesc->sc_am7990.lsc; 221158712Smarius 222183337Smarius i = 0; 223183337Smarius lesc->sc_rres = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &i, 224158712Smarius le_ioaddr_cnet98s, CNET98S_IOSIZE, RF_ACTIVE); 225158712Smarius if (lesc->sc_rres == NULL) 226158712Smarius return (ENXIO); 227158712Smarius isa_load_resourcev(lesc->sc_rres, le_ioaddr_cnet98s, CNET98S_IOSIZE); 228158712Smarius 229158712Smarius /* Reset the chip. */ 230183337Smarius bus_write_2(lesc->sc_rres, CNET98S_RESET, 231183337Smarius bus_read_2(lesc->sc_rres, CNET98S_RESET)); 232158712Smarius DELAY(500); 233158712Smarius 234158712Smarius /* Stop the chip and put it in a known state. */ 235158712Smarius le_cbus_wrcsr(sc, LE_CSR0, LE_C0_STOP); 236158712Smarius DELAY(100); 237158712Smarius if (le_cbus_rdcsr(sc, LE_CSR0) != LE_C0_STOP) { 238158712Smarius error = ENXIO; 239158712Smarius goto fail; 240158712Smarius } 241158712Smarius le_cbus_wrcsr(sc, LE_CSR3, 0); 242158712Smarius device_set_desc(dev, "C-NET(98)S"); 243158712Smarius error = BUS_PROBE_DEFAULT; 244158712Smarius 245158712Smarius fail: 246183337Smarius bus_release_resource(dev, SYS_RES_IOPORT, 247183337Smarius rman_get_rid(lesc->sc_rres), lesc->sc_rres); 248158712Smarius return (error); 249158712Smarius} 250158712Smarius 251158712Smariusstatic int 252158712Smariusle_cbus_attach(device_t dev) 253158712Smarius{ 254158712Smarius struct le_cbus_softc *lesc; 255158712Smarius struct lance_softc *sc; 256158712Smarius int error, i; 257158712Smarius 258158712Smarius lesc = device_get_softc(dev); 259158712Smarius sc = &lesc->sc_am7990.lsc; 260158712Smarius 261158712Smarius LE_LOCK_INIT(sc, device_get_nameunit(dev)); 262158712Smarius 263183337Smarius i = 0; 264183337Smarius lesc->sc_rres = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &i, 265158712Smarius le_ioaddr_cnet98s, CNET98S_IOSIZE, RF_ACTIVE); 266158712Smarius if (lesc->sc_rres == NULL) { 267158712Smarius device_printf(dev, "cannot allocate registers\n"); 268158712Smarius error = ENXIO; 269158712Smarius goto fail_mtx; 270158712Smarius } 271158712Smarius isa_load_resourcev(lesc->sc_rres, le_ioaddr_cnet98s, CNET98S_IOSIZE); 272158712Smarius 273183337Smarius i = 0; 274158712Smarius if ((lesc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, 275183337Smarius &i, RF_SHAREABLE | RF_ACTIVE)) == NULL) { 276158712Smarius device_printf(dev, "cannot allocate interrupt\n"); 277158712Smarius error = ENXIO; 278158712Smarius goto fail_rres; 279158712Smarius } 280158712Smarius 281158712Smarius error = bus_dma_tag_create( 282166138Smarius bus_get_dma_tag(dev), /* parent */ 283158712Smarius 1, 0, /* alignment, boundary */ 284158712Smarius BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ 285158712Smarius BUS_SPACE_MAXADDR, /* highaddr */ 286158712Smarius NULL, NULL, /* filter, filterarg */ 287158712Smarius BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ 288158712Smarius 0, /* nsegments */ 289158712Smarius BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ 290166148Smarius 0, /* flags */ 291158712Smarius NULL, NULL, /* lockfunc, lockarg */ 292158712Smarius &lesc->sc_pdmat); 293158712Smarius if (error != 0) { 294158712Smarius device_printf(dev, "cannot allocate parent DMA tag\n"); 295158712Smarius goto fail_ires; 296158712Smarius } 297158712Smarius 298158712Smarius sc->sc_memsize = LE_CBUS_MEMSIZE; 299158712Smarius /* 300158712Smarius * For Am79C90, Am79C961 and Am79C961A the init block must be 2-byte 301158712Smarius * aligned and the ring descriptors must be 8-byte aligned. 302158712Smarius */ 303158712Smarius error = bus_dma_tag_create( 304158712Smarius lesc->sc_pdmat, /* parent */ 305158712Smarius 8, 0, /* alignment, boundary */ 306158712Smarius BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ 307158712Smarius BUS_SPACE_MAXADDR, /* highaddr */ 308158712Smarius NULL, NULL, /* filter, filterarg */ 309158712Smarius sc->sc_memsize, /* maxsize */ 310158712Smarius 1, /* nsegments */ 311158712Smarius sc->sc_memsize, /* maxsegsize */ 312166148Smarius 0, /* flags */ 313158712Smarius NULL, NULL, /* lockfunc, lockarg */ 314158712Smarius &lesc->sc_dmat); 315158712Smarius if (error != 0) { 316158712Smarius device_printf(dev, "cannot allocate buffer DMA tag\n"); 317158712Smarius goto fail_pdtag; 318158712Smarius } 319158712Smarius 320158712Smarius error = bus_dmamem_alloc(lesc->sc_dmat, (void **)&sc->sc_mem, 321158712Smarius BUS_DMA_WAITOK | BUS_DMA_COHERENT, &lesc->sc_dmam); 322158712Smarius if (error != 0) { 323158712Smarius device_printf(dev, "cannot allocate DMA buffer memory\n"); 324158712Smarius goto fail_dtag; 325158712Smarius } 326158712Smarius 327158712Smarius sc->sc_addr = 0; 328158712Smarius error = bus_dmamap_load(lesc->sc_dmat, lesc->sc_dmam, sc->sc_mem, 329158712Smarius sc->sc_memsize, le_cbus_dma_callback, sc, 0); 330158712Smarius if (error != 0 || sc->sc_addr == 0) { 331183337Smarius device_printf(dev, "cannot load DMA buffer map\n"); 332158712Smarius goto fail_dmem; 333158712Smarius } 334158712Smarius 335158712Smarius sc->sc_flags = 0; 336158712Smarius sc->sc_conf3 = 0; 337158712Smarius 338158712Smarius /* 339158712Smarius * Extract the physical MAC address from the ROM. 340158712Smarius */ 341158712Smarius for (i = 0; i < sizeof(sc->sc_enaddr); i++) 342183337Smarius sc->sc_enaddr[i] = bus_read_1(lesc->sc_rres, i * 2); 343158712Smarius 344158712Smarius sc->sc_copytodesc = lance_copytobuf_contig; 345158712Smarius sc->sc_copyfromdesc = lance_copyfrombuf_contig; 346158712Smarius sc->sc_copytobuf = lance_copytobuf_contig; 347158712Smarius sc->sc_copyfrombuf = lance_copyfrombuf_contig; 348158712Smarius sc->sc_zerobuf = lance_zerobuf_contig; 349158712Smarius 350158712Smarius sc->sc_rdcsr = le_cbus_rdcsr; 351158712Smarius sc->sc_wrcsr = le_cbus_wrcsr; 352158712Smarius sc->sc_hwreset = le_cbus_hwreset; 353158712Smarius sc->sc_hwinit = NULL; 354158712Smarius sc->sc_hwintr = NULL; 355158712Smarius sc->sc_nocarrier = NULL; 356158712Smarius sc->sc_mediachange = NULL; 357158712Smarius sc->sc_mediastatus = NULL; 358158712Smarius sc->sc_supmedia = NULL; 359158712Smarius 360158712Smarius error = am7990_config(&lesc->sc_am7990, device_get_name(dev), 361158712Smarius device_get_unit(dev)); 362158712Smarius if (error != 0) { 363158712Smarius device_printf(dev, "cannot attach Am7990\n"); 364158712Smarius goto fail_dmap; 365158712Smarius } 366158712Smarius 367158712Smarius error = bus_setup_intr(dev, lesc->sc_ires, INTR_TYPE_NET | INTR_MPSAFE, 368166901Spiso NULL, am7990_intr, sc, &lesc->sc_ih); 369158712Smarius if (error != 0) { 370158712Smarius device_printf(dev, "cannot set up interrupt\n"); 371158712Smarius goto fail_am7990; 372158712Smarius } 373158712Smarius 374158712Smarius return (0); 375158712Smarius 376158712Smarius fail_am7990: 377158712Smarius am7990_detach(&lesc->sc_am7990); 378158712Smarius fail_dmap: 379158712Smarius bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); 380158712Smarius fail_dmem: 381158712Smarius bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); 382158712Smarius fail_dtag: 383158712Smarius bus_dma_tag_destroy(lesc->sc_dmat); 384158712Smarius fail_pdtag: 385158712Smarius bus_dma_tag_destroy(lesc->sc_pdmat); 386158712Smarius fail_ires: 387183337Smarius bus_release_resource(dev, SYS_RES_IRQ, 388183337Smarius rman_get_rid(lesc->sc_ires), lesc->sc_ires); 389158712Smarius fail_rres: 390183337Smarius bus_release_resource(dev, SYS_RES_IOPORT, 391183337Smarius rman_get_rid(lesc->sc_rres), lesc->sc_rres); 392158712Smarius fail_mtx: 393158712Smarius LE_LOCK_DESTROY(sc); 394158712Smarius return (error); 395158712Smarius} 396158712Smarius 397158712Smariusstatic int 398158712Smariusle_cbus_detach(device_t dev) 399158712Smarius{ 400158712Smarius struct le_cbus_softc *lesc; 401158712Smarius struct lance_softc *sc; 402158712Smarius 403158712Smarius lesc = device_get_softc(dev); 404158712Smarius sc = &lesc->sc_am7990.lsc; 405158712Smarius 406158712Smarius bus_teardown_intr(dev, lesc->sc_ires, lesc->sc_ih); 407158712Smarius am7990_detach(&lesc->sc_am7990); 408158712Smarius bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); 409158712Smarius bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); 410158712Smarius bus_dma_tag_destroy(lesc->sc_dmat); 411158712Smarius bus_dma_tag_destroy(lesc->sc_pdmat); 412183337Smarius bus_release_resource(dev, SYS_RES_IRQ, 413183337Smarius rman_get_rid(lesc->sc_ires), lesc->sc_ires); 414183337Smarius bus_release_resource(dev, SYS_RES_IOPORT, 415183337Smarius rman_get_rid(lesc->sc_rres), lesc->sc_rres); 416158712Smarius LE_LOCK_DESTROY(sc); 417158712Smarius 418158712Smarius return (0); 419158712Smarius} 420158712Smarius 421158712Smariusstatic int 422158712Smariusle_cbus_suspend(device_t dev) 423158712Smarius{ 424158712Smarius struct le_cbus_softc *lesc; 425158712Smarius 426158712Smarius lesc = device_get_softc(dev); 427158712Smarius 428158712Smarius lance_suspend(&lesc->sc_am7990.lsc); 429158712Smarius 430158712Smarius return (0); 431158712Smarius} 432158712Smarius 433158712Smariusstatic int 434158712Smariusle_cbus_resume(device_t dev) 435158712Smarius{ 436158712Smarius struct le_cbus_softc *lesc; 437158712Smarius 438158712Smarius lesc = device_get_softc(dev); 439158712Smarius 440158712Smarius lance_resume(&lesc->sc_am7990.lsc); 441158712Smarius 442158712Smarius return (0); 443158712Smarius} 444