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