Module Name: src
Committed By: dyoung
Date: Wed Aug 19 21:36:47 UTC 2009
Modified Files:
src/sys/dev/pci: pci.c
Log Message:
Since the intention in capturing a device's PCI Configuration Space
in pci_probe_device() is for pcidevdetached() to restore the device's
original PCI Configuration Space after it is detached, let's capture
a device's PCI configuration before attaching a driver to it instead
of after. Capturing the configuration after attaching is too late,
because a driver such as ath(4) may put a device to sleep promptly
after attaching it, and putting a PCI device to sleep often entails
changing PCI configuration from defaults.
To generate a diff of this commit:
cvs rdiff -u -r1.123 -r1.124 src/sys/dev/pci/pci.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/pci.c
diff -u src/sys/dev/pci/pci.c:1.123 src/sys/dev/pci/pci.c:1.124
--- src/sys/dev/pci/pci.c:1.123 Sat Jul 4 21:01:10 2009
+++ src/sys/dev/pci/pci.c Wed Aug 19 21:36:47 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pci.c,v 1.123 2009/07/04 21:01:10 cegger Exp $ */
+/* $NetBSD: pci.c,v 1.124 2009/08/19 21:36:47 dyoung Exp $ */
/*
* Copyright (c) 1995, 1996, 1997, 1998
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci.c,v 1.123 2009/07/04 21:01:10 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci.c,v 1.124 2009/08/19 21:36:47 dyoung Exp $");
#include "opt_pci.h"
@@ -276,7 +276,6 @@
pcireg_t id, csr, class, intr, bhlcr;
int ret, pin, bus, device, function;
int locs[PCICF_NLOCS];
- device_t subdev;
pci_decompose_tag(pc, tag, &bus, &device, &function);
@@ -363,17 +362,17 @@
locs[PCICF_DEV] = device;
locs[PCICF_FUNCTION] = function;
- subdev = config_found_sm_loc(sc->sc_dev, "pci", locs, &pa,
- pciprint, config_stdsubmatch);
-
c = &sc->PCI_SC_DEVICESC(device, function);
- c->c_dev = subdev;
pci_conf_capture(pc, tag, &c->c_conf);
if (pci_get_powerstate(pc, tag, &c->c_powerstate) == 0)
c->c_psok = true;
else
c->c_psok = false;
- ret = (subdev != NULL);
+
+ c->c_dev = config_found_sm_loc(sc->sc_dev, "pci", locs, &pa,
+ pciprint, config_stdsubmatch);
+
+ ret = (c->c_dev != NULL);
}
return ret;