summaryrefslogtreecommitdiffstats
path: root/sys/dev/puc
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2007-10-13 12:14:20 +0000
committerdes <des@FreeBSD.org>2007-10-13 12:14:20 +0000
commit62062f6473cfe704363dfa1cd6afd36f8bca15f6 (patch)
tree5ba5821a423bc3bada293640d2a344bd27383d04 /sys/dev/puc
parent270e0a1e333630cb522d30b5876a6c45b6b49902 (diff)
downloadFreeBSD-src-62062f6473cfe704363dfa1cd6afd36f8bca15f6.zip
FreeBSD-src-62062f6473cfe704363dfa1cd6afd36f8bca15f6.tar.gz
Rewrite puc_pci_match() to handle non-trivial cases correctly.
MFC after: 1 week
Diffstat (limited to 'sys/dev/puc')
-rw-r--r--sys/dev/puc/puc_pci.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/sys/dev/puc/puc_pci.c b/sys/dev/puc/puc_pci.c
index 669761e..a846b74 100644
--- a/sys/dev/puc/puc_pci.c
+++ b/sys/dev/puc/puc_pci.c
@@ -81,24 +81,29 @@ __FBSDID("$FreeBSD$");
static const struct puc_cfg *
puc_pci_match(device_t dev, const struct puc_cfg *desc)
{
- uint16_t device, subdev, subven, vendor;
+ uint16_t vendor, device;
+ uint16_t subvendor, subdevice;
vendor = pci_get_vendor(dev);
device = pci_get_device(dev);
- while (desc->vendor != 0xffff &&
- (desc->vendor != vendor || desc->device != device))
+ subvendor = pci_get_subvendor(dev);
+ subdevice = pci_get_subdevice(dev);
+
+ while (desc->vendor != 0xffff) {
+ if (desc->vendor == vendor && desc->device == device) {
+ /* exact match */
+ if (desc->subvendor == subvendor &&
+ desc->subdevice == subdevice)
+ return (desc);
+ /* wildcard match */
+ if (desc->subvendor == 0xffff)
+ return (desc);
+ }
desc++;
- if (desc->vendor == 0xffff)
- return (NULL);
- if (desc->subvendor == 0xffff)
- return (desc);
- subven = pci_get_subvendor(dev);
- subdev = pci_get_subdevice(dev);
- while (desc->vendor == vendor && desc->device == device &&
- (desc->subvendor != subven || desc->subdevice != subdev))
- desc++;
- return ((desc->vendor == vendor && desc->device == device)
- ? desc : NULL);
+ }
+
+ /* no match */
+ return (NULL);
}
static int
OpenPOWER on IntegriCloud