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.
This commit is contained in:
Warner Losh 2009-03-10 12:10:50 +00:00
parent 5643f3fc50
commit 161832a1cf
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=189619

View File

@ -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, driver_t *driver)
}
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 cbdev, struct cardbus_devinfo *dinfo)
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_t child, int which, uintptr_t *result)
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 */