There appears to be come inconsistency and/or confusion regarding the usage of the “locators” argument passed to the (*ca_rescan)() functions.
Background: drochner@ added this rescan mechanism back in 2004 to support driver modules providing cfdata, to facilitate correct device->driver matching when driver modules are loaded. It appears as though sys/dev/pci/pci.c uses it as intended: - pci_attach() creates “wildcard” locators and passes them to pcirescan(). - Takes passes these “wildcard” locators on to pci_enumerate_bus(), which uses them to filter which PCI device locations to enumerate. Eventually, pci_probe_device() is called. Note, the “locators” array is no longer passed through .. it was meant only to filter where on the bus to look. - pci_probe_device() looks for a device at the requested location, and if it finds one, it constructs a *new* locators array that indicates the actual location, and passes *that* to config_found() (in mainline, config_found_sm_loc()). The sub match routine pci uses is config_stdsubmatch(). - config_stdsubmatch() uses the locators in the cfdata it receives to check if that spec (i.e. the user-specified location) matches the data in the locators array passed by pci_probe_device(). This appears to be the original intended use. However, a bunch of the (*ca_rescan)() routines do not use it properly. “Since I’m here already (for other reasons), …” I’ll go ahead and audit these routines and fix them up. But I wanted to confirm that my understanding of “how it’s supposed to work” is correct. (It’s really amazing how fast copy-paste can propagate an anti-pattern…) Thx. -- thorpej