diff options
author | des <des@FreeBSD.org> | 2007-10-13 12:14:20 +0000 |
---|---|---|
committer | des <des@FreeBSD.org> | 2007-10-13 12:14:20 +0000 |
commit | 62062f6473cfe704363dfa1cd6afd36f8bca15f6 (patch) | |
tree | 5ba5821a423bc3bada293640d2a344bd27383d04 /sys/dev/puc | |
parent | 270e0a1e333630cb522d30b5876a6c45b6b49902 (diff) | |
download | FreeBSD-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.c | 33 |
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 |