diff options
Diffstat (limited to 'stubs.h')
-rw-r--r-- | stubs.h | 80 |
1 files changed, 80 insertions, 0 deletions
@@ -0,0 +1,80 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | ||
2 | /* | ||
3 | * Helpful private functions copied from elsewhere in the kernel tree | ||
4 | * DO NOT MODIFY | ||
5 | */ | ||
6 | #include <linux/version.h> | ||
7 | |||
8 | // Functions from drivers/pci/pci.h | ||
9 | /** | ||
10 | * pci_match_one_device - Tell if a PCI device structure has a matching | ||
11 | * PCI device id structure | ||
12 | * @id: single PCI device id structure to match | ||
13 | * @dev: the PCI device structure to match against | ||
14 | * | ||
15 | * Returns the matching pci_device_id structure or %NULL if there is no match. | ||
16 | */ | ||
17 | static inline const struct pci_device_id * | ||
18 | pci_match_one_device(const struct pci_device_id *id, const struct pci_dev *dev) | ||
19 | { | ||
20 | if ((id->vendor == PCI_ANY_ID || id->vendor == dev->vendor) && | ||
21 | (id->device == PCI_ANY_ID || id->device == dev->device) && | ||
22 | (id->subvendor == PCI_ANY_ID || id->subvendor == dev->subsystem_vendor) && | ||
23 | (id->subdevice == PCI_ANY_ID || id->subdevice == dev->subsystem_device) && | ||
24 | !((id->class ^ dev->class) & id->class_mask)) | ||
25 | return id; | ||
26 | return NULL; | ||
27 | } | ||
28 | |||
29 | // Functions from drivers/pci/search.h | ||
30 | #include <linux/device.h> | ||
31 | #include <linux/pci.h> | ||
32 | extern struct bus_type pci_bus_type; | ||
33 | |||
34 | #if LINUX_VERSION_CODE < KERNEL_VERSION(5,3,0) | ||
35 | static int match_pci_dev_by_id(struct device *dev, void *data) | ||
36 | #else | ||
37 | static int match_pci_dev_by_id(struct device *dev, const void *data) | ||
38 | #endif | ||
39 | { | ||
40 | struct pci_dev *pdev = to_pci_dev(dev); | ||
41 | const struct pci_device_id *id = data; | ||
42 | |||
43 | if (pci_match_one_device(id, pdev)) | ||
44 | return 1; | ||
45 | return 0; | ||
46 | } | ||
47 | |||
48 | /* | ||
49 | * pci_get_dev_by_id - begin or continue searching for a PCI device by id | ||
50 | * @id: pointer to struct pci_device_id to match for the device | ||
51 | * @from: Previous PCI device found in search, or %NULL for new search. | ||
52 | * | ||
53 | * Iterates through the list of known PCI devices. If a PCI device is found | ||
54 | * with a matching id a pointer to its device structure is returned, and the | ||
55 | * reference count to the device is incremented. Otherwise, %NULL is returned. | ||
56 | * A new search is initiated by passing %NULL as the @from argument. Otherwise | ||
57 | * if @from is not %NULL, searches continue from next device on the global | ||
58 | * list. The reference count for @from is always decremented if it is not | ||
59 | * %NULL. | ||
60 | * | ||
61 | * This is an internal function for use by the other search functions in | ||
62 | * this file. | ||
63 | */ | ||
64 | static struct pci_dev *pci_get_dev_by_id(const struct pci_device_id *id, | ||
65 | struct pci_dev *from) | ||
66 | { | ||
67 | struct device *dev; | ||
68 | struct device *dev_start = NULL; | ||
69 | struct pci_dev *pdev = NULL; | ||
70 | |||
71 | if (from) | ||
72 | dev_start = &from->dev; | ||
73 | dev = bus_find_device(&pci_bus_type, dev_start, (void *)id, | ||
74 | match_pci_dev_by_id); | ||
75 | if (dev) | ||
76 | pdev = to_pci_dev(dev); | ||
77 | pci_dev_put(from); | ||
78 | return pdev; | ||
79 | } | ||
80 | |||