diff options
Diffstat (limited to 'drivers/s390/cio/css.c')
-rw-r--r-- | drivers/s390/cio/css.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index ac5ceb933896..1c27a5a06b49 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -377,8 +377,6 @@ static int __init slow_subchannel_init(void) | |||
377 | return 0; | 377 | return 0; |
378 | } | 378 | } |
379 | 379 | ||
380 | subsys_initcall(slow_subchannel_init); | ||
381 | |||
382 | static void css_slow_path_func(struct work_struct *unused) | 380 | static void css_slow_path_func(struct work_struct *unused) |
383 | { | 381 | { |
384 | struct subchannel_id schid; | 382 | struct subchannel_id schid; |
@@ -641,9 +639,20 @@ init_channel_subsystem (void) | |||
641 | { | 639 | { |
642 | int ret, i; | 640 | int ret, i; |
643 | 641 | ||
644 | if (chsc_determine_css_characteristics() == 0) | 642 | ret = chsc_determine_css_characteristics(); |
643 | if (ret == -ENOMEM) | ||
644 | goto out; /* No need to continue. */ | ||
645 | if (ret == 0) | ||
645 | css_characteristics_avail = 1; | 646 | css_characteristics_avail = 1; |
646 | 647 | ||
648 | ret = chsc_alloc_sei_area(); | ||
649 | if (ret) | ||
650 | goto out; | ||
651 | |||
652 | ret = slow_subchannel_init(); | ||
653 | if (ret) | ||
654 | goto out; | ||
655 | |||
647 | if ((ret = bus_register(&css_bus_type))) | 656 | if ((ret = bus_register(&css_bus_type))) |
648 | goto out; | 657 | goto out; |
649 | 658 | ||
@@ -709,6 +718,10 @@ out_unregister: | |||
709 | out_bus: | 718 | out_bus: |
710 | bus_unregister(&css_bus_type); | 719 | bus_unregister(&css_bus_type); |
711 | out: | 720 | out: |
721 | chsc_free_sei_area(); | ||
722 | kfree(slow_subchannel_set); | ||
723 | printk(KERN_WARNING"cio: failed to initialize css driver (%d)!\n", | ||
724 | ret); | ||
712 | return ret; | 725 | return ret; |
713 | } | 726 | } |
714 | 727 | ||