+static int
+check_bus_filter(struct pci_filter *filter, struct bus *b);
+
+static int
+check_dev_filter(struct pci_filter *filter, struct device *d)
+{
+ struct bridge *br;
+ struct bus *b;
+
+ if (!filter)
+ return 1;
+
+ if (pci_filter_match(filter, d->dev))
+ return 1;
+
+ for (br = &host_bridge; br; br = br->chain)
+ if (br->br_dev == d)
+ {
+ for (b = br->first_bus; b; b = b->sibling)
+ if (check_bus_filter(filter, b))
+ return 1;
+ break;
+ }
+
+ return 0;
+}
+
+static int
+check_bus_filter(struct pci_filter *filter, struct bus *b)
+{
+ struct device *d;
+
+ if (!filter)
+ return 1;
+
+ for (d = b->first_dev; d; d = d->bus_next)
+ if (check_dev_filter(filter, d))
+ return 1;
+
+ return 0;
+}
+