svn commit: r189619 - head/sys/dev/cardbus
Warner Losh
imp at FreeBSD.org
Tue Mar 10 05:11:00 PDT 2009
Author: imp
Date: Tue Mar 10 12:10:50 2009
New Revision: 189619
URL: http://svn.freebsd.org/changeset/base/189619
Log:
When freeing all the resources of the card, it is better to turn off
the PORTEN and MEMEN bits in the command register than to zero the
bars.
Use pci_write_ivar directly instead of a one-line wrapper that adds no
value.
Track verbosity changes in pci.
Remove a stray blank line.
Modified:
head/sys/dev/cardbus/cardbus.c
Modified: head/sys/dev/cardbus/cardbus.c
==============================================================================
--- head/sys/dev/cardbus/cardbus.c Tue Mar 10 11:46:41 2009 (r189618)
+++ head/sys/dev/cardbus/cardbus.c Tue Mar 10 12:10:50 2009 (r189619)
@@ -221,7 +221,6 @@ cardbus_detach_card(device_t cbdev)
if (device_get_children(cbdev, &devlist, &numdevs) != 0)
return (ENOENT);
-
if (numdevs == 0) {
free(devlist, M_TEMP);
return (ENOENT);
@@ -269,13 +268,16 @@ cardbus_driver_added(device_t cbdev, dri
}
if (i > 0 && i == numdevs)
POWER_ENABLE_SOCKET(device_get_parent(cbdev), cbdev);
- /* XXX Should I wait for power to become good? */
for (i = 0; i < numdevs; i++) {
dev = devlist[i];
if (device_get_state(dev) != DS_NOTPRESENT)
continue;
dinfo = device_get_ivars(dev);
pci_print_verbose(&dinfo->pci);
+ if (bootverbose)
+ printf("pci%d:%d:%d:%d: reprobing on driver added\n",
+ dinfo->pci.cfg.domain, dinfo->pci.cfg.bus,
+ dinfo->pci.cfg.slot, dinfo->pci.cfg.func);
pci_cfg_restore(dinfo->pci.cfg.dev, &dinfo->pci);
if (device_probe_and_attach(dev) != 0)
pci_cfg_save(dev, &dinfo->pci, 1);
@@ -287,6 +289,7 @@ static void
cardbus_release_all_resources(device_t cbdev, struct cardbus_devinfo *dinfo)
{
struct resource_list_entry *rle;
+ device_t dev;
/* Free all allocated resources */
STAILQ_FOREACH(rle, &dinfo->pci.resources, link) {
@@ -294,15 +297,14 @@ cardbus_release_all_resources(device_t c
BUS_RELEASE_RESOURCE(device_get_parent(cbdev),
cbdev, rle->type, rle->rid, rle->res);
rle->res = NULL;
- /*
- * zero out config so the card won't acknowledge
- * access to the space anymore. XXX doesn't handle
- * 64-bit bars.
- */
- pci_write_config(dinfo->pci.cfg.dev, rle->rid, 0, 4);
}
}
resource_list_free(&dinfo->pci.resources);
+ /* turn off the card's decoding now that the resources are done */
+ dev = dinfo->pci.cfg.dev;
+ pci_write_config(dev, PCIR_COMMAND,
+ pci_read_config(dev, PCIR_COMMAND, 2) &
+ ~(PCIM_CMD_MEMEN | PCIM_CMD_PORTEN), 2);
}
/************************************************************************/
@@ -336,12 +338,6 @@ cardbus_read_ivar(device_t cbdev, device
return 0;
}
-static int
-cardbus_write_ivar(device_t cbdev, device_t child, int which, uintptr_t value)
-{
- return(pci_write_ivar(cbdev, child, which, value));
-}
-
static device_method_t cardbus_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, cardbus_probe),
@@ -352,7 +348,7 @@ static device_method_t cardbus_methods[]
/* Bus interface */
DEVMETHOD(bus_read_ivar, cardbus_read_ivar),
- DEVMETHOD(bus_write_ivar, cardbus_write_ivar),
+ DEVMETHOD(bus_write_ivar, pci_write_ivar),
DEVMETHOD(bus_driver_added, cardbus_driver_added),
/* Card Interface */
More information about the svn-src-all
mailing list