xref: /dragonfly/sys/dev/pccard/cardbus/cardbus.c (revision b40e316c)
1 /*
2  * Copyright (c) 2000,2001 Jonathan Chen.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions, and the following disclaimer,
10  *    without modification, immediately at the beginning of the file.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  *
28  * $FreeBSD: src/sys/dev/cardbus/cardbus.c,v 1.28 2002/11/27 17:30:41 imp Exp $
29  * $DragonFly: src/sys/dev/pccard/cardbus/cardbus.c,v 1.2 2004/02/21 06:37:06 dillon Exp $
30  */
31 
32 /*
33  * Cardbus Bus Driver
34  *
35  * much of the bus code was stolen directly from sys/pci/pci.c
36  *   (Copyright (c) 1997, Stefan Esser <se@freebsd.org>)
37  *
38  * Written by Jonathan Chen <jon@freebsd.org>
39  */
40 
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/malloc.h>
44 #include <sys/kernel.h>
45 #include <sys/sysctl.h>
46 
47 #include <sys/bus.h>
48 #include <machine/bus.h>
49 #include <sys/rman.h>
50 #include <machine/resource.h>
51 
52 #include <sys/pciio.h>
53 #include <bus/pci/pcivar.h>
54 #include <bus/pci/pcireg.h>
55 
56 #include <dev/pccard/cardbus/cardbusreg.h>
57 #include <dev/pccard/cardbus/cardbusvar.h>
58 #include <dev/pccard/cardbus/cardbus_cis.h>
59 #include <bus/pccard/pccardvar.h>
60 
61 #include "power_if.h"
62 #include "pcib_if.h"
63 
64 /* sysctl vars */
65 SYSCTL_NODE(_hw, OID_AUTO, cardbus, CTLFLAG_RD, 0, "CardBus parameters");
66 
67 int    cardbus_debug = 0;
68 TUNABLE_INT("hw.cardbus.debug", &cardbus_debug);
69 SYSCTL_INT(_hw_cardbus, OID_AUTO, debug, CTLFLAG_RW,
70     &cardbus_debug, 0,
71   "CardBus debug");
72 
73 int    cardbus_cis_debug = 0;
74 TUNABLE_INT("hw.cardbus.cis_debug", &cardbus_cis_debug);
75 SYSCTL_INT(_hw_cardbus, OID_AUTO, cis_debug, CTLFLAG_RW,
76     &cardbus_cis_debug, 0,
77   "CardBus CIS debug");
78 
79 #define	DPRINTF(a) if (cardbus_debug) printf a
80 #define	DEVPRINTF(x) if (cardbus_debug) device_printf x
81 
82 
83 static struct resource	*cardbus_alloc_resource(device_t cbdev, device_t child,
84 		    int type, int *rid, u_long start, u_long end, u_long count,
85 		    u_int flags);
86 static int	cardbus_attach(device_t cbdev);
87 static int	cardbus_attach_card(device_t cbdev);
88 static int	cardbus_child_location_str(device_t cbdev, device_t child,
89 		    char *, size_t len);
90 static int	cardbus_child_pnpinfo_str(device_t cbdev, device_t child,
91 		    char *, size_t len);
92 static __inline void cardbus_clear_command_bit(device_t cbdev, device_t child,
93 		    u_int16_t bit);
94 static void	cardbus_delete_resource(device_t cbdev, device_t child,
95 		    int type, int rid);
96 static void	cardbus_delete_resource_method(device_t cbdev, device_t child,
97 		    int type, int rid);
98 static int	cardbus_detach(device_t cbdev);
99 static int	cardbus_detach_card(device_t cbdev);
100 static void	cardbus_device_setup_regs(device_t brdev, int b, int s, int f,
101 		    pcicfgregs *cfg);
102 static void	cardbus_disable_busmaster_method(device_t cbdev, device_t child);
103 static void	cardbus_disable_io_method(device_t cbdev, device_t child,
104 		    int space);
105 static void	cardbus_driver_added(device_t cbdev, driver_t *driver);
106 static void	cardbus_enable_busmaster_method(device_t cbdev, device_t child);
107 static void	cardbus_enable_io_method(device_t cbdev, device_t child,
108 		    int space);
109 static int	cardbus_freecfg(struct cardbus_devinfo *dinfo);
110 static int	cardbus_get_powerstate_method(device_t cbdev, device_t child);
111 static int	cardbus_get_resource(device_t cbdev, device_t child, int type,
112 		    int rid, u_long *startp, u_long *countp);
113 static int	cardbus_get_resource_method(device_t cbdev, device_t child,
114 		    int type, int rid, u_long *startp, u_long *countp);
115 static void	cardbus_hdrtypedata(device_t brdev, int b, int s, int f,
116 		    pcicfgregs *cfg);
117 static int	cardbus_print_child(device_t cbdev, device_t child);
118 static int	cardbus_print_resources(struct resource_list *rl,
119 		    const char *name, int type, const char *format);
120 static void	cardbus_print_verbose(struct cardbus_devinfo *dinfo);
121 static int	cardbus_probe(device_t cbdev);
122 static void	cardbus_probe_nomatch(device_t cbdev, device_t child);
123 static struct cardbus_devinfo	*cardbus_read_device(device_t brdev, int b,
124 		    int s, int f);
125 static void	cardbus_read_extcap(device_t cbdev, pcicfgregs *cfg);
126 static u_int32_t cardbus_read_config_method(device_t cbdev,
127 		    device_t child, int reg, int width);
128 static int	cardbus_read_ivar(device_t cbdev, device_t child, int which,
129 		    u_long *result);
130 static void	cardbus_release_all_resources(device_t cbdev,
131 		    struct cardbus_devinfo *dinfo);
132 static int	cardbus_release_resource(device_t cbdev, device_t child,
133 		    int type, int rid, struct resource *r);
134 static __inline void cardbus_set_command_bit(device_t cbdev, device_t child,
135 		    u_int16_t bit);
136 static int	cardbus_set_powerstate_method(device_t cbdev, device_t child,
137 		    int state);
138 static int	cardbus_set_resource(device_t cbdev, device_t child, int type,
139 		    int rid, u_long start, u_long count, struct resource *res);
140 static int	cardbus_set_resource_method(device_t cbdev, device_t child,
141 		    int type, int rid, u_long start, u_long count);
142 static int	cardbus_setup_intr(device_t cbdev, device_t child,
143 		    struct resource *irq, int flags, driver_intr_t *intr,
144 		    void *arg, void **cookiep);
145 static int	cardbus_teardown_intr(device_t cbdev, device_t child,
146 		    struct resource *irq, void *cookie);
147 static void	cardbus_write_config_method(device_t cbdev, device_t child,
148 		    int reg, u_int32_t val, int width);
149 static int	cardbus_write_ivar(device_t cbdev, device_t child, int which,
150 		    uintptr_t value);
151 
152 /************************************************************************/
153 /* Probe/Attach								*/
154 /************************************************************************/
155 
156 static int
157 cardbus_probe(device_t cbdev)
158 {
159 	device_set_desc(cbdev, "CardBus bus");
160 	return 0;
161 }
162 
163 static int
164 cardbus_attach(device_t cbdev)
165 {
166 	return 0;
167 }
168 
169 static int
170 cardbus_detach(device_t cbdev)
171 {
172 	cardbus_detach_card(cbdev);
173 	return 0;
174 }
175 
176 static int
177 cardbus_suspend(device_t self)
178 {
179 	cardbus_detach_card(self);
180 	return (0);
181 }
182 
183 static int
184 cardbus_resume(device_t self)
185 {
186 	return (0);
187 }
188 
189 /************************************************************************/
190 /* Attach/Detach card							*/
191 /************************************************************************/
192 
193 static void
194 cardbus_device_setup_regs(device_t brdev, int b, int s, int f, pcicfgregs *cfg)
195 {
196 	PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_INTLINE,
197 	    pci_get_irq(device_get_parent(brdev)), 1);
198 	cfg->intline = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_INTLINE, 1);
199 
200 	PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_CACHELNSZ, 0x08, 1);
201 	cfg->cachelnsz = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_CACHELNSZ, 1);
202 
203 	PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_LATTIMER, 0xa8, 1);
204 	cfg->lattimer = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_LATTIMER, 1);
205 
206 	PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_MINGNT, 0x14, 1);
207 	cfg->mingnt = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_MINGNT, 1);
208 
209 	PCIB_WRITE_CONFIG(brdev, b, s, f, PCIR_MAXLAT, 0x14, 1);
210 	cfg->maxlat = PCIB_READ_CONFIG(brdev, b, s, f, PCIR_MAXLAT, 1);
211 }
212 
213 static int
214 cardbus_attach_card(device_t cbdev)
215 {
216 	device_t brdev = device_get_parent(cbdev);
217 	int cardattached = 0;
218 	static int curr_bus_number = 2; /* XXX EVILE BAD (see below) */
219 	int bus, slot, func;
220 
221 	cardbus_detach_card(cbdev); /* detach existing cards */
222 
223 	POWER_ENABLE_SOCKET(brdev, cbdev);
224 	bus = pcib_get_bus(cbdev);
225 	if (bus == 0) {
226 		/*
227 		 * XXX EVILE BAD XXX
228 		 * Not all BIOSes initialize the secondary bus number properly,
229 		 * so if the default is bad, we just put one in and hope it
230 		 * works.
231 		 */
232 		bus = curr_bus_number;
233 		pci_write_config(brdev, PCIR_SECBUS_2, curr_bus_number, 1);
234 		pci_write_config(brdev, PCIR_SUBBUS_2, curr_bus_number + 2, 1);
235 		curr_bus_number += 3;
236 	}
237 	/* For each function, set it up and try to attach a driver to it */
238 	for (slot = 0; slot <= CARDBUS_SLOTMAX; slot++) {
239 		int cardbusfunchigh = 0;
240 		for (func = 0; func <= cardbusfunchigh; func++) {
241 			struct cardbus_devinfo *dinfo =
242 			    cardbus_read_device(brdev, bus, slot, func);
243 
244 			if (dinfo == NULL)
245 				continue;
246 			if (dinfo->pci.cfg.mfdev)
247 				cardbusfunchigh = CARDBUS_FUNCMAX;
248 
249 			cardbus_device_setup_regs(brdev, bus, slot, func,
250 			    &dinfo->pci.cfg);
251 			cardbus_print_verbose(dinfo);
252 			dinfo->pci.cfg.dev = device_add_child(cbdev, NULL, -1);
253 			if (!dinfo->pci.cfg.dev) {
254 				DEVPRINTF((cbdev, "Cannot add child!\n"));
255 				cardbus_freecfg(dinfo);
256 				continue;
257 			}
258 			resource_list_init(&dinfo->pci.resources);
259 			device_set_ivars(dinfo->pci.cfg.dev, dinfo);
260 			cardbus_do_cis(cbdev, dinfo->pci.cfg.dev);
261 			if (device_probe_and_attach(dinfo->pci.cfg.dev) != 0)
262 				cardbus_release_all_resources(cbdev, dinfo);
263 			else
264 				cardattached++;
265 		}
266 	}
267 
268 	if (cardattached > 0)
269 		return (0);
270 	POWER_DISABLE_SOCKET(brdev, cbdev);
271 	return (ENOENT);
272 }
273 
274 static int
275 cardbus_detach_card(device_t cbdev)
276 {
277 	int numdevs;
278 	device_t *devlist;
279 	int tmp;
280 	int err = 0;
281 
282 	device_get_children(cbdev, &devlist, &numdevs);
283 
284 	if (numdevs == 0) {
285 		free(devlist, M_TEMP);
286 		return (ENOENT);
287 	}
288 
289 	for (tmp = 0; tmp < numdevs; tmp++) {
290 		struct cardbus_devinfo *dinfo = device_get_ivars(devlist[tmp]);
291 		int status = device_get_state(devlist[tmp]);
292 
293 		if (dinfo->pci.cfg.dev != devlist[tmp])
294 			device_printf(cbdev, "devinfo dev mismatch\n");
295 		if (status == DS_ATTACHED || status == DS_BUSY)
296 			device_detach(devlist[tmp]);
297 		cardbus_release_all_resources(cbdev, dinfo);
298 		device_delete_child(cbdev, devlist[tmp]);
299 		cardbus_freecfg(dinfo);
300 	}
301 	POWER_DISABLE_SOCKET(device_get_parent(cbdev), cbdev);
302 	free(devlist, M_TEMP);
303 	return (err);
304 }
305 
306 static void
307 cardbus_driver_added(device_t cbdev, driver_t *driver)
308 {
309 	int numdevs;
310 	device_t *devlist;
311 	int tmp;
312 	struct cardbus_devinfo *dinfo;
313 
314 	device_get_children(cbdev, &devlist, &numdevs);
315 
316 	DEVICE_IDENTIFY(driver, cbdev);
317 	POWER_ENABLE_SOCKET(device_get_parent(cbdev), cbdev);
318 	for (tmp = 0; tmp < numdevs; tmp++) {
319 		if (device_get_state(devlist[tmp]) == DS_NOTPRESENT) {
320 			dinfo = device_get_ivars(devlist[tmp]);
321 #ifdef notyet
322 			cardbus_device_setup_regs(brdev, bus, slot, func,
323 			    &dinfo->pci.cfg);
324 #endif
325 			cardbus_print_verbose(dinfo);
326 			resource_list_init(&dinfo->pci.resources);
327 			cardbus_do_cis(cbdev, dinfo->pci.cfg.dev);
328 			if (device_probe_and_attach(dinfo->pci.cfg.dev) != 0) {
329 				cardbus_release_all_resources(cbdev, dinfo);
330 			}
331 		}
332 	}
333 
334 	free(devlist, M_TEMP);
335 }
336 
337 /************************************************************************/
338 /* PCI-Like config reading (copied from pci.c				*/
339 /************************************************************************/
340 
341 /* read configuration header into pcicfgrect structure */
342 
343 static void
344 cardbus_read_extcap(device_t cbdev, pcicfgregs *cfg)
345 {
346 #define	REG(n, w) PCIB_READ_CONFIG(cbdev, cfg->bus, cfg->slot, cfg->func, n, w)
347 	int ptr, nextptr, ptrptr;
348 
349 	switch (cfg->hdrtype) {
350 	case 0:
351 		ptrptr = 0x34;
352 		break;
353 	case 2:
354 		ptrptr = 0x14;
355 		break;
356 	default:
357 		return;		/* no extended capabilities support */
358 	}
359 	nextptr = REG(ptrptr, 1);	/* sanity check? */
360 
361 	/*
362 	 * Read capability entries.
363 	 */
364 	while (nextptr != 0) {
365 		/* Sanity check */
366 		if (nextptr > 255) {
367 			printf("illegal PCI extended capability offset %d\n",
368 			    nextptr);
369 			return;
370 		}
371 		/* Find the next entry */
372 		ptr = nextptr;
373 		nextptr = REG(ptr + 1, 1);
374 
375 		/* Process this entry */
376 		switch (REG(ptr, 1)) {
377 		case 0x01:		/* PCI power management */
378 			if (cfg->pp_cap == 0) {
379 				cfg->pp_cap = REG(ptr + PCIR_POWER_CAP, 2);
380 				cfg->pp_status = ptr + PCIR_POWER_STATUS;
381 				cfg->pp_pmcsr = ptr + PCIR_POWER_PMCSR;
382 				if ((nextptr - ptr) > PCIR_POWER_DATA)
383 					cfg->pp_data = ptr + PCIR_POWER_DATA;
384 			}
385 			break;
386 		default:
387 			break;
388 		}
389 	}
390 #undef	REG
391 }
392 
393 /* extract header type specific config data */
394 
395 static void
396 cardbus_hdrtypedata(device_t brdev, int b, int s, int f, pcicfgregs *cfg)
397 {
398 #define	REG(n, w)	PCIB_READ_CONFIG(brdev, b, s, f, n, w)
399 	switch (cfg->hdrtype) {
400 	case 0:
401 		cfg->subvendor	= REG(PCIR_SUBVEND_0, 2);
402 		cfg->subdevice	= REG(PCIR_SUBDEV_0, 2);
403 		cfg->nummaps	= PCI_MAXMAPS_0;
404 		break;
405 	case 1:
406 		cfg->subvendor	= REG(PCIR_SUBVEND_1, 2);
407 		cfg->subdevice	= REG(PCIR_SUBDEV_1, 2);
408 		cfg->nummaps	= PCI_MAXMAPS_1;
409 		break;
410 	case 2:
411 		cfg->subvendor	= REG(PCIR_SUBVEND_2, 2);
412 		cfg->subdevice	= REG(PCIR_SUBDEV_2, 2);
413 		cfg->nummaps	= PCI_MAXMAPS_2;
414 		break;
415 	}
416 #undef	REG
417 }
418 
419 static struct cardbus_devinfo *
420 cardbus_read_device(device_t brdev, int b, int s, int f)
421 {
422 #define	REG(n, w)	PCIB_READ_CONFIG(brdev, b, s, f, n, w)
423 	pcicfgregs *cfg = NULL;
424 	struct cardbus_devinfo *devlist_entry = NULL;
425 
426 	if (REG(PCIR_DEVVENDOR, 4) != 0xffffffff) {
427 		devlist_entry = malloc(sizeof(struct cardbus_devinfo),
428 		    M_DEVBUF, M_WAITOK | M_ZERO);
429 		if (devlist_entry == NULL)
430 			return (NULL);
431 
432 		cfg = &devlist_entry->pci.cfg;
433 
434 		cfg->bus		= b;
435 		cfg->slot		= s;
436 		cfg->func		= f;
437 		cfg->vendor		= REG(PCIR_VENDOR, 2);
438 		cfg->device		= REG(PCIR_DEVICE, 2);
439 		cfg->cmdreg		= REG(PCIR_COMMAND, 2);
440 		cfg->statreg		= REG(PCIR_STATUS, 2);
441 		cfg->baseclass		= REG(PCIR_CLASS, 1);
442 		cfg->subclass		= REG(PCIR_SUBCLASS, 1);
443 		cfg->progif		= REG(PCIR_PROGIF, 1);
444 		cfg->revid		= REG(PCIR_REVID, 1);
445 		cfg->hdrtype		= REG(PCIR_HDRTYPE, 1);
446 		cfg->cachelnsz		= REG(PCIR_CACHELNSZ, 1);
447 		cfg->lattimer		= REG(PCIR_LATTIMER, 1);
448 		cfg->intpin		= REG(PCIR_INTPIN, 1);
449 		cfg->intline		= REG(PCIR_INTLINE, 1);
450 
451 		cfg->mingnt		= REG(PCIR_MINGNT, 1);
452 		cfg->maxlat		= REG(PCIR_MAXLAT, 1);
453 
454 		cfg->mfdev		= (cfg->hdrtype & PCIM_MFDEV) != 0;
455 		cfg->hdrtype		&= ~PCIM_MFDEV;
456 
457 		cardbus_hdrtypedata(brdev, b, s, f, cfg);
458 
459 		if (REG(PCIR_STATUS, 2) & PCIM_STATUS_CAPPRESENT)
460 			cardbus_read_extcap(brdev, cfg);
461 
462 		devlist_entry->pci.conf.pc_sel.pc_bus = cfg->bus;
463 		devlist_entry->pci.conf.pc_sel.pc_dev = cfg->slot;
464 		devlist_entry->pci.conf.pc_sel.pc_func = cfg->func;
465 		devlist_entry->pci.conf.pc_hdr = cfg->hdrtype;
466 
467 		devlist_entry->pci.conf.pc_subvendor = cfg->subvendor;
468 		devlist_entry->pci.conf.pc_subdevice = cfg->subdevice;
469 		devlist_entry->pci.conf.pc_vendor = cfg->vendor;
470 		devlist_entry->pci.conf.pc_device = cfg->device;
471 
472 		devlist_entry->pci.conf.pc_class = cfg->baseclass;
473 		devlist_entry->pci.conf.pc_subclass = cfg->subclass;
474 		devlist_entry->pci.conf.pc_progif = cfg->progif;
475 		devlist_entry->pci.conf.pc_revid = cfg->revid;
476 	}
477 	return (devlist_entry);
478 #undef	REG
479 }
480 
481 /* free pcicfgregs structure and all depending data structures */
482 
483 static int
484 cardbus_freecfg(struct cardbus_devinfo *dinfo)
485 {
486 	free(dinfo, M_DEVBUF);
487 
488 	return (0);
489 }
490 
491 static void
492 cardbus_print_verbose(struct cardbus_devinfo *dinfo)
493 {
494 	if (bootverbose || cardbus_debug > 0)
495 	{
496 		pcicfgregs *cfg = &dinfo->pci.cfg;
497 
498 		printf("found->\tvendor=0x%04x, dev=0x%04x, revid=0x%02x\n",
499 		    cfg->vendor, cfg->device, cfg->revid);
500 		printf("\tclass=%02x-%02x-%02x, hdrtype=0x%02x, mfdev=%d\n",
501 		    cfg->baseclass, cfg->subclass, cfg->progif,
502 		    cfg->hdrtype, cfg->mfdev);
503 		printf("\tcmdreg=0x%04x, statreg=0x%04x, "
504 		    "cachelnsz=%d (dwords)\n",
505 		    cfg->cmdreg, cfg->statreg, cfg->cachelnsz);
506 		printf("\tlattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), "
507 		    "maxlat=0x%02x (%d ns)\n",
508 		    cfg->lattimer, cfg->lattimer * 30,
509 		    cfg->mingnt, cfg->mingnt * 250, cfg->maxlat,
510 		    cfg->maxlat * 250);
511 		if (cfg->intpin > 0)
512 			printf("\tintpin=%c, irq=%d\n",
513 			    cfg->intpin + 'a' - 1, cfg->intline);
514 	}
515 }
516 
517 /************************************************************************/
518 /* Resources								*/
519 /************************************************************************/
520 
521 static int
522 cardbus_set_resource(device_t cbdev, device_t child, int type, int rid,
523     u_long start, u_long count, struct resource *res)
524 {
525 	struct cardbus_devinfo *dinfo;
526 	struct resource_list *rl;
527 	struct resource_list_entry *rle;
528 
529 	if (device_get_parent(child) != cbdev)
530 		return ENOENT;
531 
532 	dinfo = device_get_ivars(child);
533 	rl = &dinfo->pci.resources;
534 	rle = resource_list_find(rl, type, rid);
535 	if (rle == NULL) {
536 		resource_list_add(rl, type, rid, start, start + count - 1,
537 		    count);
538 		if (res != NULL) {
539 			rle = resource_list_find(rl, type, rid);
540 			rle->res = res;
541 		}
542 	} else {
543 		if (rle->res == NULL) {
544 		} else if (rle->res->r_dev == cbdev &&
545 		    (!(rman_get_flags(rle->res) & RF_ACTIVE))) {
546 			int f;
547 			f = rman_get_flags(rle->res);
548 			bus_release_resource(cbdev, type, rid, res);
549 			rle->res = bus_alloc_resource(cbdev, type, &rid,
550 			    start, start + count - 1,
551 			    count, f);
552 		} else {
553 			device_printf(cbdev, "set_resource: resource busy\n");
554 			return EBUSY;
555 		}
556 		rle->start = start;
557 		rle->end = start + count - 1;
558 		rle->count = count;
559 		if (res != NULL)
560 			rle->res = res;
561 	}
562 	if (device_get_parent(child) == cbdev)
563 		pci_write_config(child, rid, start, 4);
564 	return 0;
565 }
566 
567 static int
568 cardbus_get_resource(device_t cbdev, device_t child, int type, int rid,
569     u_long *startp, u_long *countp)
570 {
571 	struct cardbus_devinfo *dinfo;
572 	struct resource_list *rl;
573 	struct resource_list_entry *rle;
574 
575 	if (device_get_parent(child) != cbdev)
576 		return ENOENT;
577 
578 	dinfo = device_get_ivars(child);
579 	rl = &dinfo->pci.resources;
580 	rle = resource_list_find(rl, type, rid);
581 	if (!rle)
582 		return ENOENT;
583 	if (startp)
584 		*startp = rle->start;
585 	if (countp)
586 		*countp = rle->count;
587 	return 0;
588 }
589 
590 static void
591 cardbus_delete_resource(device_t cbdev, device_t child, int type, int rid)
592 {
593 	struct cardbus_devinfo *dinfo;
594 	struct resource_list *rl;
595 	struct resource_list_entry *rle;
596 
597 	if (device_get_parent(child) != cbdev)
598 		return;
599 
600 	dinfo = device_get_ivars(child);
601 	rl = &dinfo->pci.resources;
602 	rle = resource_list_find(rl, type, rid);
603 	if (rle) {
604 		if (rle->res) {
605 			if (rle->res->r_dev != cbdev ||
606 			    rman_get_flags(rle->res) & RF_ACTIVE) {
607 				device_printf(cbdev, "delete_resource: "
608 				    "Resource still owned by child, oops. "
609 				    "(type=%d, rid=%d, addr=%lx)\n",
610 				    rle->type, rle->rid,
611 				    rman_get_start(rle->res));
612 				return;
613 			}
614 			bus_release_resource(cbdev, type, rid, rle->res);
615 		}
616 		resource_list_delete(rl, type, rid);
617 	}
618 	if (device_get_parent(child) == cbdev)
619 		pci_write_config(child, rid, 0, 4);
620 }
621 
622 static int
623 cardbus_set_resource_method(device_t cbdev, device_t child, int type, int rid,
624     u_long start, u_long count)
625 {
626 	int ret;
627 	ret = cardbus_set_resource(cbdev, child, type, rid, start, count, NULL);
628 	if (ret != 0)
629 		return ret;
630 	return BUS_SET_RESOURCE(device_get_parent(cbdev), child, type, rid,
631 	    start, count);
632 }
633 
634 static int
635 cardbus_get_resource_method(device_t cbdev, device_t child, int type, int rid,
636     u_long *startp, u_long *countp)
637 {
638 	int ret;
639 	ret = cardbus_get_resource(cbdev, child, type, rid, startp, countp);
640 	if (ret != 0)
641 		return ret;
642 	return BUS_GET_RESOURCE(device_get_parent(cbdev), child, type, rid,
643 	    startp, countp);
644 }
645 
646 static void
647 cardbus_delete_resource_method(device_t cbdev, device_t child,
648     int type, int rid)
649 {
650 	cardbus_delete_resource(cbdev, child, type, rid);
651 	BUS_DELETE_RESOURCE(device_get_parent(cbdev), child, type, rid);
652 }
653 
654 static void
655 cardbus_release_all_resources(device_t cbdev, struct cardbus_devinfo *dinfo)
656 {
657 	struct resource_list_entry *rle;
658 
659 	/* Free all allocated resources */
660 	SLIST_FOREACH(rle, &dinfo->pci.resources, link) {
661 		if (rle->res) {
662 			if (rle->res->r_dev != cbdev)
663 				device_printf(cbdev, "release_all_resource: "
664 				    "Resource still owned by child, oops. "
665 				    "(type=%d, rid=%d, addr=%lx)\n",
666 				    rle->type, rle->rid,
667 				    rman_get_start(rle->res));
668 			BUS_RELEASE_RESOURCE(device_get_parent(cbdev),
669 			    rle->res->r_dev,
670 			    rle->type, rle->rid,
671 			    rle->res);
672 			rle->res = NULL;
673 			/*
674 			 * zero out config so the card won't acknowledge
675 			 * access to the space anymore
676 			 */
677 			pci_write_config(dinfo->pci.cfg.dev, rle->rid, 0, 4);
678 		}
679 	}
680 	resource_list_free(&dinfo->pci.resources);
681 }
682 
683 static struct resource *
684 cardbus_alloc_resource(device_t cbdev, device_t child, int type,
685     int *rid, u_long start, u_long end, u_long count, u_int flags)
686 {
687 	struct cardbus_devinfo *dinfo;
688 	struct resource_list_entry *rle = 0;
689 	int passthrough = (device_get_parent(child) != cbdev);
690 
691 	if (passthrough) {
692 		return (BUS_ALLOC_RESOURCE(device_get_parent(cbdev), child,
693 		    type, rid, start, end, count, flags));
694 	}
695 
696 	dinfo = device_get_ivars(child);
697 	rle = resource_list_find(&dinfo->pci.resources, type, *rid);
698 
699 	if (!rle)
700 		return NULL;		/* no resource of that type/rid */
701 
702 	if (!rle->res) {
703 		device_printf(cbdev, "WARNING: Resource not reserved by bus\n");
704 		return NULL;
705 	} else {
706 		/* Release the cardbus hold on the resource */
707 		if (rle->res->r_dev != cbdev)
708 			return NULL;
709 		bus_release_resource(cbdev, type, *rid, rle->res);
710 		rle->res = NULL;
711 		switch (type) {
712 		case SYS_RES_IOPORT:
713 		case SYS_RES_MEMORY:
714 			if (!(flags & RF_ALIGNMENT_MASK))
715 				flags |= rman_make_alignment_flags(rle->count);
716 			break;
717 		case SYS_RES_IRQ:
718 			flags |= RF_SHAREABLE;
719 			break;
720 		}
721 		/* Allocate the resource to the child */
722 		return resource_list_alloc(&dinfo->pci.resources, cbdev, child,
723 		    type, rid, rle->start, rle->end, rle->count, flags);
724 	}
725 }
726 
727 static int
728 cardbus_release_resource(device_t cbdev, device_t child, int type, int rid,
729     struct resource *r)
730 {
731 	struct cardbus_devinfo *dinfo;
732 	int passthrough = (device_get_parent(child) != cbdev);
733 	struct resource_list_entry *rle = 0;
734 	int flags;
735 	int ret;
736 
737 	if (passthrough) {
738 		return BUS_RELEASE_RESOURCE(device_get_parent(cbdev), child,
739 		    type, rid, r);
740 	}
741 
742 	dinfo = device_get_ivars(child);
743 	/*
744 	 * According to the PCI 2.2 spec, devices may share an address
745 	 * decoder between memory mapped ROM access and memory
746 	 * mapped register access.  To be safe, disable ROM access
747 	 * whenever it is released.
748 	 */
749 	if (rid == CARDBUS_ROM_REG) {
750 		uint32_t rom_reg;
751 
752 		rom_reg = pci_read_config(child, rid, 4);
753 		rom_reg &= ~CARDBUS_ROM_ENABLE;
754 		pci_write_config(child, rid, rom_reg, 4);
755 	}
756 
757 	rle = resource_list_find(&dinfo->pci.resources, type, rid);
758 
759 	if (!rle) {
760 		device_printf(cbdev, "Allocated resource not found\n");
761 		return ENOENT;
762 	}
763 	if (!rle->res) {
764 		device_printf(cbdev, "Allocated resource not recorded\n");
765 		return ENOENT;
766 	}
767 
768 	ret = BUS_RELEASE_RESOURCE(device_get_parent(cbdev), child,
769 	    type, rid, r);
770 	switch (type) {
771 	case SYS_RES_IOPORT:
772 	case SYS_RES_MEMORY:
773 		flags = rman_make_alignment_flags(rle->count);
774 		break;
775 	case SYS_RES_IRQ:
776 		flags = RF_SHAREABLE;
777 		break;
778 	default:
779 		flags = 0;
780 	}
781 	/* Restore cardbus hold on the resource */
782 	rle->res = bus_alloc_resource(cbdev, type, &rid,
783 	    rle->start, rle->end, rle->count, flags);
784 	if (rle->res == NULL)
785 		device_printf(cbdev, "release_resource: "
786 		    "unable to reacquire resource\n");
787 	return ret;
788 }
789 
790 static int
791 cardbus_setup_intr(device_t cbdev, device_t child, struct resource *irq,
792     int flags, driver_intr_t *intr, void *arg, void **cookiep)
793 {
794 	int ret;
795 	device_t cdev;
796 	struct cardbus_devinfo *dinfo;
797 
798 	ret = bus_generic_setup_intr(cbdev, child, irq, flags, intr, arg,
799 	    cookiep);
800 	if (ret != 0)
801 		return ret;
802 
803 	for (cdev = child; cbdev != device_get_parent(cdev);
804 	    cdev = device_get_parent(cdev))
805 		/* NOTHING */;
806 	dinfo = device_get_ivars(cdev);
807 
808 	return 0;
809 }
810 
811 static int
812 cardbus_teardown_intr(device_t cbdev, device_t child, struct resource *irq,
813     void *cookie)
814 {
815 	int ret;
816 	device_t cdev;
817 	struct cardbus_devinfo *dinfo;
818 
819 	ret = bus_generic_teardown_intr(cbdev, child, irq, cookie);
820 	if (ret != 0)
821 		return ret;
822 
823 	for (cdev = child; cbdev != device_get_parent(cdev);
824 	    cdev = device_get_parent(cdev))
825 		/* NOTHING */;
826 	dinfo = device_get_ivars(cdev);
827 
828 	return (0);
829 }
830 
831 
832 /************************************************************************/
833 /* Other Bus Methods							*/
834 /************************************************************************/
835 
836 static int
837 cardbus_print_resources(struct resource_list *rl, const char *name,
838     int type, const char *format)
839 {
840 	struct resource_list_entry *rle;
841 	int printed, retval;
842 
843 	printed = 0;
844 	retval = 0;
845 	/* Yes, this is kinda cheating */
846 	SLIST_FOREACH(rle, rl, link) {
847 		if (rle->type == type) {
848 			if (printed == 0)
849 				retval += printf(" %s ", name);
850 			else if (printed > 0)
851 				retval += printf(",");
852 			printed++;
853 			retval += printf(format, rle->start);
854 			if (rle->count > 1) {
855 				retval += printf("-");
856 				retval += printf(format, rle->start +
857 				    rle->count - 1);
858 			}
859 		}
860 	}
861 	return retval;
862 }
863 
864 static int
865 cardbus_print_child(device_t cbdev, device_t child)
866 {
867 	struct cardbus_devinfo *dinfo;
868 	struct resource_list *rl;
869 	pcicfgregs *cfg;
870 	int retval = 0;
871 
872 	dinfo = device_get_ivars(child);
873 	cfg = &dinfo->pci.cfg;
874 	rl = &dinfo->pci.resources;
875 
876 	retval += bus_print_child_header(cbdev, child);
877 
878 	retval += cardbus_print_resources(rl, "port", SYS_RES_IOPORT, "%#lx");
879 	retval += cardbus_print_resources(rl, "mem", SYS_RES_MEMORY, "%#lx");
880 	retval += cardbus_print_resources(rl, "irq", SYS_RES_IRQ, "%ld");
881 	if (device_get_flags(cbdev))
882 		retval += printf(" flags %#x", device_get_flags(cbdev));
883 
884 	retval += printf(" at device %d.%d", pci_get_slot(child),
885 	    pci_get_function(child));
886 
887 	retval += bus_print_child_footer(cbdev, child);
888 
889 	return (retval);
890 }
891 
892 static void
893 cardbus_probe_nomatch(device_t cbdev, device_t child)
894 {
895 	struct cardbus_devinfo *dinfo;
896 	pcicfgregs *cfg;
897 
898 	dinfo = device_get_ivars(child);
899 	cfg = &dinfo->pci.cfg;
900 	device_printf(cbdev, "<unknown card>");
901 	printf(" (vendor=0x%04x, dev=0x%04x)", cfg->vendor, cfg->device);
902 	printf(" at %d.%d", pci_get_slot(child), pci_get_function(child));
903 	if (cfg->intpin > 0 && cfg->intline != 255) {
904 		printf(" irq %d", cfg->intline);
905 	}
906 	printf("\n");
907 
908 	return;
909 }
910 
911 static int
912 cardbus_child_location_str(device_t cbdev, device_t child, char *buf,
913     size_t buflen)
914 {
915 	struct cardbus_devinfo *dinfo;
916 	pcicfgregs *cfg;
917 
918 	dinfo = device_get_ivars(child);
919 	cfg = &dinfo->pci.cfg;
920 	snprintf(buf, buflen, "slot=%d function=%d", pci_get_slot(child),
921 	    pci_get_function(child));
922 	return (0);
923 }
924 
925 static int
926 cardbus_child_pnpinfo_str(device_t cbdev, device_t child, char *buf,
927     size_t buflen)
928 {
929 	struct cardbus_devinfo *dinfo;
930 	pcicfgregs *cfg;
931 
932 	dinfo = device_get_ivars(child);
933 	cfg = &dinfo->pci.cfg;
934 	snprintf(buf, buflen, "vendor=0x%04x device=0x%04x subvendor=0x%04x "
935 	    "subdevice=0x%04x", cfg->vendor, cfg->device, cfg->subvendor,
936 	    cfg->subdevice);
937 	return (0);
938 }
939 
940 static int
941 cardbus_read_ivar(device_t cbdev, device_t child, int which, u_long *result)
942 {
943 	struct cardbus_devinfo *dinfo;
944 	pcicfgregs *cfg;
945 
946 	dinfo = device_get_ivars(child);
947 	cfg = &dinfo->pci.cfg;
948 
949 	switch (which) {
950 	case PCI_IVAR_ETHADDR:
951 		/*
952 		 * The generic accessor doesn't deal with failure, so
953 		 * we set the return value, then return an error.
954 		 */
955 		if ((dinfo->fepresent & (1 << TPL_FUNCE_LAN_NID)) == 0) {
956 			*((u_int8_t **) result) = NULL;
957 			return (EINVAL);
958 		}
959 		*((u_int8_t **) result) = dinfo->funce.lan.nid;
960 		break;
961 	case PCI_IVAR_SUBVENDOR:
962 		*result = cfg->subvendor;
963 		break;
964 	case PCI_IVAR_SUBDEVICE:
965 		*result = cfg->subdevice;
966 		break;
967 	case PCI_IVAR_VENDOR:
968 		*result = cfg->vendor;
969 		break;
970 	case PCI_IVAR_DEVICE:
971 		*result = cfg->device;
972 		break;
973 	case PCI_IVAR_DEVID:
974 		*result = (cfg->device << 16) | cfg->vendor;
975 		break;
976 	case PCI_IVAR_CLASS:
977 		*result = cfg->baseclass;
978 		break;
979 	case PCI_IVAR_SUBCLASS:
980 		*result = cfg->subclass;
981 		break;
982 	case PCI_IVAR_PROGIF:
983 		*result = cfg->progif;
984 		break;
985 	case PCI_IVAR_REVID:
986 		*result = cfg->revid;
987 		break;
988 	case PCI_IVAR_INTPIN:
989 		*result = cfg->intpin;
990 		break;
991 	case PCI_IVAR_IRQ:
992 		*result = cfg->intline;
993 		break;
994 	case PCI_IVAR_BUS:
995 		*result = cfg->bus;
996 		break;
997 	case PCI_IVAR_SLOT:
998 		*result = cfg->slot;
999 		break;
1000 	case PCI_IVAR_FUNCTION:
1001 		*result = cfg->func;
1002 		break;
1003 	default:
1004 		return ENOENT;
1005 	}
1006 	return 0;
1007 }
1008 
1009 static int
1010 cardbus_write_ivar(device_t cbdev, device_t child, int which, uintptr_t value)
1011 {
1012 	struct cardbus_devinfo *dinfo;
1013 	pcicfgregs *cfg;
1014 
1015 	dinfo = device_get_ivars(child);
1016 	cfg = &dinfo->pci.cfg;
1017 
1018 	switch (which) {
1019 	case PCI_IVAR_ETHADDR:
1020 	case PCI_IVAR_SUBVENDOR:
1021 	case PCI_IVAR_SUBDEVICE:
1022 	case PCI_IVAR_VENDOR:
1023 	case PCI_IVAR_DEVICE:
1024 	case PCI_IVAR_DEVID:
1025 	case PCI_IVAR_CLASS:
1026 	case PCI_IVAR_SUBCLASS:
1027 	case PCI_IVAR_PROGIF:
1028 	case PCI_IVAR_REVID:
1029 	case PCI_IVAR_INTPIN:
1030 	case PCI_IVAR_IRQ:
1031 	case PCI_IVAR_BUS:
1032 	case PCI_IVAR_SLOT:
1033 	case PCI_IVAR_FUNCTION:
1034 		return EINVAL;	/* disallow for now */
1035 	default:
1036 		return ENOENT;
1037 	}
1038 	return 0;
1039 }
1040 
1041 /************************************************************************/
1042 /* Compatibility with PCI bus (XXX: Do we need this?)			*/
1043 /************************************************************************/
1044 
1045 /*
1046  * PCI power manangement
1047  */
1048 static int
1049 cardbus_set_powerstate_method(device_t cbdev, device_t child, int state)
1050 {
1051 	struct cardbus_devinfo *dinfo = device_get_ivars(child);
1052 	pcicfgregs *cfg = &dinfo->pci.cfg;
1053 	u_int16_t status;
1054 	int result;
1055 
1056 	if (cfg->pp_cap != 0) {
1057 		status = PCI_READ_CONFIG(cbdev, child, cfg->pp_status, 2)
1058 		    & ~PCIM_PSTAT_DMASK;
1059 		result = 0;
1060 		switch (state) {
1061 		case PCI_POWERSTATE_D0:
1062 			status |= PCIM_PSTAT_D0;
1063 			break;
1064 		case PCI_POWERSTATE_D1:
1065 			if (cfg->pp_cap & PCIM_PCAP_D1SUPP) {
1066 				status |= PCIM_PSTAT_D1;
1067 			} else {
1068 				result = EOPNOTSUPP;
1069 			}
1070 			break;
1071 		case PCI_POWERSTATE_D2:
1072 			if (cfg->pp_cap & PCIM_PCAP_D2SUPP) {
1073 				status |= PCIM_PSTAT_D2;
1074 			} else {
1075 				result = EOPNOTSUPP;
1076 			}
1077 			break;
1078 		case PCI_POWERSTATE_D3:
1079 			status |= PCIM_PSTAT_D3;
1080 			break;
1081 		default:
1082 			result = EINVAL;
1083 		}
1084 		if (result == 0)
1085 			PCI_WRITE_CONFIG(cbdev, child, cfg->pp_status,
1086 			    status, 2);
1087 	} else {
1088 		result = ENXIO;
1089 	}
1090 	return (result);
1091 }
1092 
1093 static int
1094 cardbus_get_powerstate_method(device_t cbdev, device_t child)
1095 {
1096 	struct cardbus_devinfo *dinfo = device_get_ivars(child);
1097 	pcicfgregs *cfg = &dinfo->pci.cfg;
1098 	u_int16_t status;
1099 	int result;
1100 
1101 	if (cfg->pp_cap != 0) {
1102 		status = PCI_READ_CONFIG(cbdev, child, cfg->pp_status, 2);
1103 		switch (status & PCIM_PSTAT_DMASK) {
1104 		case PCIM_PSTAT_D0:
1105 			result = PCI_POWERSTATE_D0;
1106 			break;
1107 		case PCIM_PSTAT_D1:
1108 			result = PCI_POWERSTATE_D1;
1109 			break;
1110 		case PCIM_PSTAT_D2:
1111 			result = PCI_POWERSTATE_D2;
1112 			break;
1113 		case PCIM_PSTAT_D3:
1114 			result = PCI_POWERSTATE_D3;
1115 			break;
1116 		default:
1117 			result = PCI_POWERSTATE_UNKNOWN;
1118 			break;
1119 		}
1120 	} else {
1121 		/* No support, device is always at D0 */
1122 		result = PCI_POWERSTATE_D0;
1123 	}
1124 	return (result);
1125 }
1126 
1127 static u_int32_t
1128 cardbus_read_config_method(device_t cbdev, device_t child, int reg, int width)
1129 {
1130 	struct cardbus_devinfo *dinfo = device_get_ivars(child);
1131 	pcicfgregs *cfg = &dinfo->pci.cfg;
1132 
1133 	return PCIB_READ_CONFIG(device_get_parent(cbdev),
1134 	    cfg->bus, cfg->slot, cfg->func, reg, width);
1135 }
1136 
1137 static void
1138 cardbus_write_config_method(device_t cbdev, device_t child, int reg,
1139     u_int32_t val, int width)
1140 {
1141 	struct cardbus_devinfo *dinfo = device_get_ivars(child);
1142 	pcicfgregs *cfg = &dinfo->pci.cfg;
1143 
1144 	PCIB_WRITE_CONFIG(device_get_parent(cbdev),
1145 	    cfg->bus, cfg->slot, cfg->func, reg, val, width);
1146 }
1147 
1148 static __inline void
1149 cardbus_set_command_bit(device_t cbdev, device_t child, u_int16_t bit)
1150 {
1151 	u_int16_t command;
1152 
1153 	command = PCI_READ_CONFIG(cbdev, child, PCIR_COMMAND, 2);
1154 	command |= bit;
1155 	PCI_WRITE_CONFIG(cbdev, child, PCIR_COMMAND, command, 2);
1156 }
1157 
1158 static __inline void
1159 cardbus_clear_command_bit(device_t cbdev, device_t child, u_int16_t bit)
1160 {
1161 	u_int16_t command;
1162 
1163 	command = PCI_READ_CONFIG(cbdev, child, PCIR_COMMAND, 2);
1164 	command &= ~bit;
1165 	PCI_WRITE_CONFIG(cbdev, child, PCIR_COMMAND, command, 2);
1166 }
1167 
1168 static void
1169 cardbus_enable_busmaster_method(device_t cbdev, device_t child)
1170 {
1171 	cardbus_set_command_bit(cbdev, child, PCIM_CMD_BUSMASTEREN);
1172 }
1173 
1174 static void
1175 cardbus_disable_busmaster_method(device_t cbdev, device_t child)
1176 {
1177 	cardbus_clear_command_bit(cbdev, child, PCIM_CMD_BUSMASTEREN);
1178 }
1179 
1180 static void
1181 cardbus_enable_io_method(device_t cbdev, device_t child, int space)
1182 {
1183 	switch (space) {
1184 	case SYS_RES_IOPORT:
1185 		cardbus_set_command_bit(cbdev, child, PCIM_CMD_PORTEN);
1186 		break;
1187 	case SYS_RES_MEMORY:
1188 		cardbus_set_command_bit(cbdev, child, PCIM_CMD_MEMEN);
1189 		break;
1190 	}
1191 }
1192 
1193 static void
1194 cardbus_disable_io_method(device_t cbdev, device_t child, int space)
1195 {
1196 	switch (space) {
1197 	case SYS_RES_IOPORT:
1198 		cardbus_clear_command_bit(cbdev, child, PCIM_CMD_PORTEN);
1199 		break;
1200 	case SYS_RES_MEMORY:
1201 		cardbus_clear_command_bit(cbdev, child, PCIM_CMD_MEMEN);
1202 		break;
1203 	}
1204 }
1205 
1206 static device_method_t cardbus_methods[] = {
1207 	/* Device interface */
1208 	DEVMETHOD(device_probe,		cardbus_probe),
1209 	DEVMETHOD(device_attach,	cardbus_attach),
1210 	DEVMETHOD(device_detach,	cardbus_detach),
1211 	DEVMETHOD(device_shutdown,	bus_generic_shutdown),
1212 	DEVMETHOD(device_suspend,	cardbus_suspend),
1213 	DEVMETHOD(device_resume,	cardbus_resume),
1214 
1215 	/* Bus interface */
1216 	DEVMETHOD(bus_print_child,	cardbus_print_child),
1217 	DEVMETHOD(bus_probe_nomatch,	cardbus_probe_nomatch),
1218 	DEVMETHOD(bus_read_ivar,	cardbus_read_ivar),
1219 	DEVMETHOD(bus_write_ivar,	cardbus_write_ivar),
1220 	DEVMETHOD(bus_driver_added,	cardbus_driver_added),
1221 	DEVMETHOD(bus_alloc_resource,	cardbus_alloc_resource),
1222 	DEVMETHOD(bus_release_resource,	cardbus_release_resource),
1223 	DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
1224 	DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
1225 	DEVMETHOD(bus_setup_intr,	cardbus_setup_intr),
1226 	DEVMETHOD(bus_teardown_intr,	cardbus_teardown_intr),
1227 
1228 	DEVMETHOD(bus_set_resource,	cardbus_set_resource_method),
1229 	DEVMETHOD(bus_get_resource,	cardbus_get_resource_method),
1230 	DEVMETHOD(bus_delete_resource,	cardbus_delete_resource_method),
1231 	DEVMETHOD(bus_child_pnpinfo_str, cardbus_child_pnpinfo_str),
1232 	DEVMETHOD(bus_child_location_str, cardbus_child_location_str),
1233 
1234 	/* Card Interface */
1235 	DEVMETHOD(card_attach_card,	cardbus_attach_card),
1236 	DEVMETHOD(card_detach_card,	cardbus_detach_card),
1237 	DEVMETHOD(card_cis_read,	cardbus_cis_read),
1238 	DEVMETHOD(card_cis_free,	cardbus_cis_free),
1239 
1240 	/* Cardbus/PCI interface */
1241 	DEVMETHOD(pci_read_config,	cardbus_read_config_method),
1242 	DEVMETHOD(pci_write_config,	cardbus_write_config_method),
1243 	DEVMETHOD(pci_enable_busmaster,	cardbus_enable_busmaster_method),
1244 	DEVMETHOD(pci_disable_busmaster, cardbus_disable_busmaster_method),
1245 	DEVMETHOD(pci_enable_io,	cardbus_enable_io_method),
1246 	DEVMETHOD(pci_disable_io,	cardbus_disable_io_method),
1247 	DEVMETHOD(pci_get_powerstate,	cardbus_get_powerstate_method),
1248 	DEVMETHOD(pci_set_powerstate,	cardbus_set_powerstate_method),
1249 
1250 	{0,0}
1251 };
1252 
1253 static driver_t cardbus_driver = {
1254 	"cardbus",
1255 	cardbus_methods,
1256 	0 /* no softc */
1257 };
1258 
1259 static devclass_t cardbus_devclass;
1260 
1261 DRIVER_MODULE(cardbus, cbb, cardbus_driver, cardbus_devclass, 0, 0);
1262 MODULE_VERSION(cardbus, 1);
1263 MODULE_DEPEND(cardbus, exca, 1, 1, 1);
1264 /*
1265 MODULE_DEPEND(cardbus, pccbb, 1, 1, 1);
1266 */
1267