[S390] chsc: initialization fixes
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Mon, 25 Oct 2010 14:10:28 +0000 (16:10 +0200)
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>
Mon, 25 Oct 2010 14:10:18 +0000 (16:10 +0200)
This patch fixes:
 * kfree vs. free_page usage
 * structure definition for determine_css_characteristics
 * naming convention for the chsc init function
 * deregistration of crw handlers in the cleanup path

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/chsc.c
drivers/s390/cio/chsc.h
drivers/s390/cio/css.c

index 4cbb1a6ca33c809c6fd9366f891b7c6e44ac39d9..f26cc3e161811fced4964d598f9d846fa84303b4 100644 (file)
@@ -2,7 +2,7 @@
  *  drivers/s390/cio/chsc.c
  *   S/390 common I/O routines -- channel subsystem call
  *
- *    Copyright IBM Corp. 1999,2008
+ *    Copyright IBM Corp. 1999,2010
  *    Author(s): Ingo Adlung (adlung@de.ibm.com)
  *              Cornelia Huck (cornelia.huck@de.ibm.com)
  *              Arnd Bergmann (arndb@de.ibm.com)
@@ -813,7 +813,7 @@ out:
        return ret;
 }
 
-int __init chsc_alloc_sei_area(void)
+int __init chsc_init(void)
 {
        int ret;
 
@@ -825,14 +825,14 @@ int __init chsc_alloc_sei_area(void)
        }
        ret = crw_register_handler(CRW_RSC_CSS, chsc_process_crw);
        if (ret)
-               kfree(sei_page);
+               free_page((unsigned long)sei_page);
        return ret;
 }
 
-void __init chsc_free_sei_area(void)
+void __init chsc_init_cleanup(void)
 {
        crw_unregister_handler(CRW_RSC_CSS);
-       kfree(sei_page);
+       free_page((unsigned long)sei_page);
 }
 
 int chsc_enable_facility(int operation_code)
@@ -895,7 +895,7 @@ chsc_determine_css_characteristics(void)
                struct chsc_header response;
                u32 reserved4;
                u32 general_char[510];
-               u32 chsc_char[518];
+               u32 chsc_char[508];
        } __attribute__ ((packed)) *scsc_area;
 
        scsc_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
index 5453013f094b37b2106978812406e7183549742a..6d669dd0dd84f1fb154cdc5a487409a18776ef9d 100644 (file)
@@ -60,8 +60,8 @@ struct chsc_ssd_info {
 extern int chsc_get_ssd_info(struct subchannel_id schid,
                             struct chsc_ssd_info *ssd);
 extern int chsc_determine_css_characteristics(void);
-extern int chsc_alloc_sei_area(void);
-extern void chsc_free_sei_area(void);
+extern int chsc_init(void);
+extern void chsc_init_cleanup(void);
 
 extern int chsc_enable_facility(int);
 struct channel_subsystem;
index 064d3003ed20d2b19cfbaabf7c7d6967a9a91f24..fa1ad3aab66f436d495c16cffae0dd71bf9dfbe5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * driver for channel subsystem
  *
- * Copyright IBM Corp. 2002, 2009
+ * Copyright IBM Corp. 2002, 2010
  *
  * Author(s): Arnd Bergmann (arndb@de.ibm.com)
  *           Cornelia Huck (cornelia.huck@de.ibm.com)
@@ -863,14 +863,14 @@ static int __init css_bus_init(void)
 {
        int ret, i;
 
+       ret = chsc_init();
+       if (ret)
+               return ret;
+
        ret = chsc_determine_css_characteristics();
        if (ret == -ENOMEM)
                goto out;
 
-       ret = chsc_alloc_sei_area();
-       if (ret)
-               goto out;
-
        /* Try to enable MSS. */
        ret = chsc_enable_facility(CHSC_SDA_OC_MSS);
        if (ret)
@@ -956,9 +956,9 @@ out_unregister:
        }
        bus_unregister(&css_bus_type);
 out:
-       crw_unregister_handler(CRW_RSC_CSS);
-       chsc_free_sei_area();
+       crw_unregister_handler(CRW_RSC_SCH);
        idset_free(slow_subchannel_set);
+       chsc_init_cleanup();
        pr_alert("The CSS device driver initialization failed with "
                 "errno=%d\n", ret);
        return ret;
@@ -978,9 +978,9 @@ static void __init css_bus_cleanup(void)
                device_unregister(&css->device);
        }
        bus_unregister(&css_bus_type);
-       crw_unregister_handler(CRW_RSC_CSS);
-       chsc_free_sei_area();
+       crw_unregister_handler(CRW_RSC_SCH);
        idset_free(slow_subchannel_set);
+       chsc_init_cleanup();
        isc_unregister(IO_SCH_ISC);
 }