]> xenbits.xensource.com Git - legacy/linux-2.6.18-xen.git/commitdiff
pciback: Fix invalid use of pci_match_id()
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 2 Mar 2009 10:57:56 +0000 (10:57 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 2 Mar 2009 10:57:56 +0000 (10:57 +0000)
We cannot use pci_match_id() because the first argument (tmp_quirk->devid)
is not an array of pci device ids. Instead this patch adds a utility
function to compare a pci_device_id and a pci_dev.

Signed-off-by: Yosuke Iwamatsu <y-iwamatsu@ab.jp.nec.com>
drivers/xen/pciback/conf_space_quirks.c

index 525ec95c6580fe11214b91b392de0f604cb6ab1e..244a4389fcfb266cd32fbe302542aec3145773dd 100644 (file)
 
 LIST_HEAD(pciback_quirks);
 
+static inline const struct pci_device_id *
+match_one_device(const struct pci_device_id *id, const struct pci_dev *dev)
+{
+       if ((id->vendor == PCI_ANY_ID || id->vendor == dev->vendor) &&
+           (id->device == PCI_ANY_ID || id->device == dev->device) &&
+           (id->subvendor == PCI_ANY_ID || id->subvendor == dev->subsystem_vendor) &&
+           (id->subdevice == PCI_ANY_ID || id->subdevice == dev->subsystem_device) &&
+           !((id->class ^ dev->class) & id->class_mask))
+               return id;
+       return NULL;
+}
+
 struct pciback_config_quirk *pciback_find_quirk(struct pci_dev *dev)
 {
        struct pciback_config_quirk *tmp_quirk;
 
        list_for_each_entry(tmp_quirk, &pciback_quirks, quirks_list)
-           if (pci_match_id(&tmp_quirk->devid, dev))
-               goto out;
+               if (match_one_device(&tmp_quirk->devid, dev) != NULL)
+                       goto out;
        tmp_quirk = NULL;
        printk(KERN_DEBUG
               "quirk didn't match any device pciback knows about\n");