PCI: Move pci_match_device() ahead of new_id_store()
authorZhenzhong Duan <zhenzhong.duan@gmail.com>
Tue, 17 Nov 2020 05:44:08 +0000 (13:44 +0800)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 20 Nov 2020 21:51:35 +0000 (15:51 -0600)
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>
drivers/pci/pci-driver.c

index 8b587fc..965b3d7 100644 (file)
@@ -89,6 +89,79 @@ static void pci_free_dynids(struct pci_driver *drv)
        spin_unlock(&drv->dynids.lock);
 }
 
        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
 /**
  * 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);
 
 };
 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;
 struct drv_dev_and_id {
        struct pci_driver *drv;
        struct pci_dev *dev;