|
@@ -1608,13 +1608,10 @@ static int __init iucv_init(void)
|
|
rc = register_external_interrupt(0x4000, iucv_external_interrupt);
|
|
rc = register_external_interrupt(0x4000, iucv_external_interrupt);
|
|
if (rc)
|
|
if (rc)
|
|
goto out;
|
|
goto out;
|
|
- rc = bus_register(&iucv_bus);
|
|
|
|
- if (rc)
|
|
|
|
- goto out_int;
|
|
|
|
iucv_root = s390_root_dev_register("iucv");
|
|
iucv_root = s390_root_dev_register("iucv");
|
|
if (IS_ERR(iucv_root)) {
|
|
if (IS_ERR(iucv_root)) {
|
|
rc = PTR_ERR(iucv_root);
|
|
rc = PTR_ERR(iucv_root);
|
|
- goto out_bus;
|
|
|
|
|
|
+ goto out_int;
|
|
}
|
|
}
|
|
|
|
|
|
for_each_online_cpu(cpu) {
|
|
for_each_online_cpu(cpu) {
|
|
@@ -1634,13 +1631,20 @@ static int __init iucv_init(void)
|
|
goto out_free;
|
|
goto out_free;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- register_hotcpu_notifier(&iucv_cpu_notifier);
|
|
|
|
|
|
+ rc = register_hotcpu_notifier(&iucv_cpu_notifier);
|
|
|
|
+ if (rc)
|
|
|
|
+ goto out_free;
|
|
ASCEBC(iucv_error_no_listener, 16);
|
|
ASCEBC(iucv_error_no_listener, 16);
|
|
ASCEBC(iucv_error_no_memory, 16);
|
|
ASCEBC(iucv_error_no_memory, 16);
|
|
ASCEBC(iucv_error_pathid, 16);
|
|
ASCEBC(iucv_error_pathid, 16);
|
|
iucv_available = 1;
|
|
iucv_available = 1;
|
|
|
|
+ rc = bus_register(&iucv_bus);
|
|
|
|
+ if (rc)
|
|
|
|
+ goto out_cpu;
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+out_cpu:
|
|
|
|
+ unregister_hotcpu_notifier(&iucv_cpu_notifier);
|
|
out_free:
|
|
out_free:
|
|
for_each_possible_cpu(cpu) {
|
|
for_each_possible_cpu(cpu) {
|
|
kfree(iucv_param[cpu]);
|
|
kfree(iucv_param[cpu]);
|
|
@@ -1649,8 +1653,6 @@ out_free:
|
|
iucv_irq_data[cpu] = NULL;
|
|
iucv_irq_data[cpu] = NULL;
|
|
}
|
|
}
|
|
s390_root_dev_unregister(iucv_root);
|
|
s390_root_dev_unregister(iucv_root);
|
|
-out_bus:
|
|
|
|
- bus_unregister(&iucv_bus);
|
|
|
|
out_int:
|
|
out_int:
|
|
unregister_external_interrupt(0x4000, iucv_external_interrupt);
|
|
unregister_external_interrupt(0x4000, iucv_external_interrupt);
|
|
out:
|
|
out:
|