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