mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 15:54:15 +08:00
PCI: Move pci_match_device() ahead of new_id_store()
Move pci_match_device() and its dependencies (pci_match_id() and pci_device_id_any) ahead of new_id_store(). This is preparation work for calling pci_match_device() in new_id_store(). No functional changes. [bhelgaas: update function comments] Link: https://lore.kernel.org/r/20201117054409.3428-2-zhenzhong.duan@gmail.com Signed-off-by: Zhenzhong Duan <zhenzhong.duan@gmail.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
341917490d
commit
1f40704bb0
@ -89,6 +89,79 @@ static void pci_free_dynids(struct pci_driver *drv)
|
||||
spin_unlock(&drv->dynids.lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_match_id - See if a PCI device matches a given pci_id table
|
||||
* @ids: array of PCI device ID structures to search in
|
||||
* @dev: the PCI device structure to match against.
|
||||
*
|
||||
* Used by a driver to check whether a PCI device is in its list of
|
||||
* supported devices. Returns the matching pci_device_id structure or
|
||||
* %NULL if there is no match.
|
||||
*
|
||||
* Deprecated; don't use this as it will not catch any dynamic IDs
|
||||
* that a driver might want to check for.
|
||||
*/
|
||||
const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
|
||||
struct pci_dev *dev)
|
||||
{
|
||||
if (ids) {
|
||||
while (ids->vendor || ids->subvendor || ids->class_mask) {
|
||||
if (pci_match_one_device(ids, dev))
|
||||
return ids;
|
||||
ids++;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_match_id);
|
||||
|
||||
static const struct pci_device_id pci_device_id_any = {
|
||||
.vendor = PCI_ANY_ID,
|
||||
.device = PCI_ANY_ID,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
};
|
||||
|
||||
/**
|
||||
* pci_match_device - See if a device matches a driver's list of IDs
|
||||
* @drv: the PCI driver to match against
|
||||
* @dev: the PCI device structure to match against
|
||||
*
|
||||
* Used by a driver to check whether a PCI device is in its list of
|
||||
* supported devices or in the dynids list, which may have been augmented
|
||||
* via the sysfs "new_id" file. Returns the matching pci_device_id
|
||||
* structure or %NULL if there is no match.
|
||||
*/
|
||||
static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
|
||||
struct pci_dev *dev)
|
||||
{
|
||||
struct pci_dynid *dynid;
|
||||
const struct pci_device_id *found_id = NULL;
|
||||
|
||||
/* When driver_override is set, only bind to the matching driver */
|
||||
if (dev->driver_override && strcmp(dev->driver_override, drv->name))
|
||||
return NULL;
|
||||
|
||||
/* Look at the dynamic ids first, before the static ones */
|
||||
spin_lock(&drv->dynids.lock);
|
||||
list_for_each_entry(dynid, &drv->dynids.list, node) {
|
||||
if (pci_match_one_device(&dynid->id, dev)) {
|
||||
found_id = &dynid->id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock(&drv->dynids.lock);
|
||||
|
||||
if (!found_id)
|
||||
found_id = pci_match_id(drv->id_table, dev);
|
||||
|
||||
/* driver_override will always match, send a dummy id */
|
||||
if (!found_id && dev->driver_override)
|
||||
found_id = &pci_device_id_any;
|
||||
|
||||
return found_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* store_new_id - sysfs frontend to pci_add_dynid()
|
||||
* @driver: target device driver
|
||||
@ -208,78 +281,6 @@ static struct attribute *pci_drv_attrs[] = {
|
||||
};
|
||||
ATTRIBUTE_GROUPS(pci_drv);
|
||||
|
||||
/**
|
||||
* pci_match_id - See if a pci device matches a given pci_id table
|
||||
* @ids: array of PCI device id structures to search in
|
||||
* @dev: the PCI device structure to match against.
|
||||
*
|
||||
* Used by a driver to check whether a PCI device present in the
|
||||
* system is in its list of supported devices. Returns the matching
|
||||
* pci_device_id structure or %NULL if there is no match.
|
||||
*
|
||||
* Deprecated, don't use this as it will not catch any dynamic ids
|
||||
* that a driver might want to check for.
|
||||
*/
|
||||
const struct pci_device_id *pci_match_id(const struct pci_device_id *ids,
|
||||
struct pci_dev *dev)
|
||||
{
|
||||
if (ids) {
|
||||
while (ids->vendor || ids->subvendor || ids->class_mask) {
|
||||
if (pci_match_one_device(ids, dev))
|
||||
return ids;
|
||||
ids++;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_match_id);
|
||||
|
||||
static const struct pci_device_id pci_device_id_any = {
|
||||
.vendor = PCI_ANY_ID,
|
||||
.device = PCI_ANY_ID,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
};
|
||||
|
||||
/**
|
||||
* pci_match_device - Tell if a PCI device structure has a matching PCI device id structure
|
||||
* @drv: the PCI driver to match against
|
||||
* @dev: the PCI device structure to match against
|
||||
*
|
||||
* Used by a driver to check whether a PCI device present in the
|
||||
* system is in its list of supported devices. Returns the matching
|
||||
* pci_device_id structure or %NULL if there is no match.
|
||||
*/
|
||||
static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
|
||||
struct pci_dev *dev)
|
||||
{
|
||||
struct pci_dynid *dynid;
|
||||
const struct pci_device_id *found_id = NULL;
|
||||
|
||||
/* When driver_override is set, only bind to the matching driver */
|
||||
if (dev->driver_override && strcmp(dev->driver_override, drv->name))
|
||||
return NULL;
|
||||
|
||||
/* Look at the dynamic ids first, before the static ones */
|
||||
spin_lock(&drv->dynids.lock);
|
||||
list_for_each_entry(dynid, &drv->dynids.list, node) {
|
||||
if (pci_match_one_device(&dynid->id, dev)) {
|
||||
found_id = &dynid->id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock(&drv->dynids.lock);
|
||||
|
||||
if (!found_id)
|
||||
found_id = pci_match_id(drv->id_table, dev);
|
||||
|
||||
/* driver_override will always match, send a dummy id */
|
||||
if (!found_id && dev->driver_override)
|
||||
found_id = &pci_device_id_any;
|
||||
|
||||
return found_id;
|
||||
}
|
||||
|
||||
struct drv_dev_and_id {
|
||||
struct pci_driver *drv;
|
||||
struct pci_dev *dev;
|
||||
|
Loading…
Reference in New Issue
Block a user