|
@@ -137,25 +137,60 @@ void *pci_epf_alloc_space(struct pci_epf *epf, size_t size, enum pci_barno bar)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(pci_epf_alloc_space);
|
|
|
|
|
|
-/**
|
|
|
- * pci_epf_unregister_driver() - unregister the PCI EPF driver
|
|
|
- * @driver: the PCI EPF driver that has to be unregistered
|
|
|
- *
|
|
|
- * Invoke to unregister the PCI EPF driver.
|
|
|
- */
|
|
|
-void pci_epf_unregister_driver(struct pci_epf_driver *driver)
|
|
|
+static void pci_epf_remove_cfs(struct pci_epf_driver *driver)
|
|
|
{
|
|
|
struct config_group *group, *tmp;
|
|
|
|
|
|
+ if (!IS_ENABLED(CONFIG_PCI_ENDPOINT_CONFIGFS))
|
|
|
+ return;
|
|
|
+
|
|
|
mutex_lock(&pci_epf_mutex);
|
|
|
list_for_each_entry_safe(group, tmp, &driver->epf_group, group_entry)
|
|
|
pci_ep_cfs_remove_epf_group(group);
|
|
|
list_del(&driver->epf_group);
|
|
|
mutex_unlock(&pci_epf_mutex);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * pci_epf_unregister_driver() - unregister the PCI EPF driver
|
|
|
+ * @driver: the PCI EPF driver that has to be unregistered
|
|
|
+ *
|
|
|
+ * Invoke to unregister the PCI EPF driver.
|
|
|
+ */
|
|
|
+void pci_epf_unregister_driver(struct pci_epf_driver *driver)
|
|
|
+{
|
|
|
+ pci_epf_remove_cfs(driver);
|
|
|
driver_unregister(&driver->driver);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(pci_epf_unregister_driver);
|
|
|
|
|
|
+static int pci_epf_add_cfs(struct pci_epf_driver *driver)
|
|
|
+{
|
|
|
+ struct config_group *group;
|
|
|
+ const struct pci_epf_device_id *id;
|
|
|
+
|
|
|
+ if (!IS_ENABLED(CONFIG_PCI_ENDPOINT_CONFIGFS))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ INIT_LIST_HEAD(&driver->epf_group);
|
|
|
+
|
|
|
+ id = driver->id_table;
|
|
|
+ while (id->name[0]) {
|
|
|
+ group = pci_ep_cfs_add_epf_group(id->name);
|
|
|
+ if (IS_ERR(group)) {
|
|
|
+ pci_epf_remove_cfs(driver);
|
|
|
+ return PTR_ERR(group);
|
|
|
+ }
|
|
|
+
|
|
|
+ mutex_lock(&pci_epf_mutex);
|
|
|
+ list_add_tail(&group->group_entry, &driver->epf_group);
|
|
|
+ mutex_unlock(&pci_epf_mutex);
|
|
|
+ id++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* __pci_epf_register_driver() - register a new PCI EPF driver
|
|
|
* @driver: structure representing PCI EPF driver
|
|
@@ -167,8 +202,6 @@ int __pci_epf_register_driver(struct pci_epf_driver *driver,
|
|
|
struct module *owner)
|
|
|
{
|
|
|
int ret;
|
|
|
- struct config_group *group;
|
|
|
- const struct pci_epf_device_id *id;
|
|
|
|
|
|
if (!driver->ops)
|
|
|
return -EINVAL;
|
|
@@ -183,16 +216,7 @@ int __pci_epf_register_driver(struct pci_epf_driver *driver,
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- INIT_LIST_HEAD(&driver->epf_group);
|
|
|
-
|
|
|
- id = driver->id_table;
|
|
|
- while (id->name[0]) {
|
|
|
- group = pci_ep_cfs_add_epf_group(id->name);
|
|
|
- mutex_lock(&pci_epf_mutex);
|
|
|
- list_add_tail(&group->group_entry, &driver->epf_group);
|
|
|
- mutex_unlock(&pci_epf_mutex);
|
|
|
- id++;
|
|
|
- }
|
|
|
+ pci_epf_add_cfs(driver);
|
|
|
|
|
|
return 0;
|
|
|
}
|