s390/pci: fix hotplug module init
Loading the pci hotplug module when no devices are present will fail
but unfortunately some hotplug callbacks stay registered to the pci
bus level. Fix this by not letting module loading fail when no pci
devices are present and provide proper {de}registration functions
for these callbacks.
Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
committed by
Martin Schwidefsky
parent
add09d61fe
commit
53923354d6
@@ -51,8 +51,7 @@ EXPORT_SYMBOL_GPL(zpci_list);
|
||||
DEFINE_MUTEX(zpci_list_lock);
|
||||
EXPORT_SYMBOL_GPL(zpci_list_lock);
|
||||
|
||||
struct pci_hp_callback_ops hotplug_ops;
|
||||
EXPORT_SYMBOL_GPL(hotplug_ops);
|
||||
static struct pci_hp_callback_ops *hotplug_ops;
|
||||
|
||||
static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
|
||||
static DEFINE_SPINLOCK(zpci_domain_lock);
|
||||
@@ -974,8 +973,8 @@ int zpci_create_device(struct zpci_dev *zdev)
|
||||
|
||||
mutex_lock(&zpci_list_lock);
|
||||
list_add_tail(&zdev->entry, &zpci_list);
|
||||
if (hotplug_ops.create_slot)
|
||||
hotplug_ops.create_slot(zdev);
|
||||
if (hotplug_ops)
|
||||
hotplug_ops->create_slot(zdev);
|
||||
mutex_unlock(&zpci_list_lock);
|
||||
|
||||
if (zdev->state == ZPCI_FN_STATE_STANDBY)
|
||||
@@ -989,8 +988,8 @@ int zpci_create_device(struct zpci_dev *zdev)
|
||||
out_start:
|
||||
mutex_lock(&zpci_list_lock);
|
||||
list_del(&zdev->entry);
|
||||
if (hotplug_ops.remove_slot)
|
||||
hotplug_ops.remove_slot(zdev);
|
||||
if (hotplug_ops)
|
||||
hotplug_ops->remove_slot(zdev);
|
||||
mutex_unlock(&zpci_list_lock);
|
||||
out_bus:
|
||||
zpci_free_domain(zdev);
|
||||
@@ -1072,6 +1071,22 @@ static void zpci_mem_exit(void)
|
||||
kmem_cache_destroy(zdev_fmb_cache);
|
||||
}
|
||||
|
||||
void zpci_register_hp_ops(struct pci_hp_callback_ops *ops)
|
||||
{
|
||||
mutex_lock(&zpci_list_lock);
|
||||
hotplug_ops = ops;
|
||||
mutex_unlock(&zpci_list_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(zpci_register_hp_ops);
|
||||
|
||||
void zpci_deregister_hp_ops(void)
|
||||
{
|
||||
mutex_lock(&zpci_list_lock);
|
||||
hotplug_ops = NULL;
|
||||
mutex_unlock(&zpci_list_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(zpci_deregister_hp_ops);
|
||||
|
||||
unsigned int s390_pci_probe = 1;
|
||||
EXPORT_SYMBOL_GPL(s390_pci_probe);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user