]> err.no Git - linux-2.6/blobdiff - drivers/s390/char/raw3270.c
Merge branch 'for-linus' of git://oss.sgi.com:8090/xfs/xfs-2.6
[linux-2.6] / drivers / s390 / char / raw3270.c
index e95b56f810dbb25e1e4aea8730e6fa271c1bbcd3..0d98f1ff2edd5db5ae4f79815de723f81d0241be 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/ccwdev.h>
 #include <asm/cio.h>
 #include <asm/ebcdic.h>
+#include <asm/diag.h>
 
 #include "raw3270.h"
 
@@ -29,7 +30,7 @@
 #include <linux/device.h>
 #include <linux/mutex.h>
 
-struct class *class3270;
+static struct class *class3270;
 
 /* The main 3270 data structure. */
 struct raw3270 {
@@ -47,8 +48,8 @@ struct raw3270 {
        struct timer_list timer;        /* Device timer. */
 
        unsigned char *ascebc;          /* ascii -> ebcdic table */
-       struct class_device *clttydev;  /* 3270-class tty device ptr */
-       struct class_device *cltubdev;  /* 3270-class tub device ptr */
+       struct device *clttydev;        /* 3270-class tty device ptr */
+       struct device *cltubdev;        /* 3270-class tub device ptr */
 
        struct raw3270_request init_request;
        unsigned char init_data[256];
@@ -65,7 +66,7 @@ struct raw3270 {
 static DEFINE_MUTEX(raw3270_mutex);
 
 /* List of 3270 devices. */
-static struct list_head raw3270_devices = LIST_HEAD_INIT(raw3270_devices);
+static LIST_HEAD(raw3270_devices);
 
 /*
  * Flag to indicate if the driver has been registered. Some operations
@@ -86,7 +87,7 @@ DECLARE_WAIT_QUEUE_HEAD(raw3270_wait_queue);
 /*
  * Encode array for 12 bit 3270 addresses.
  */
-unsigned char raw3270_ebcgraf[64] =    {
+static unsigned char raw3270_ebcgraf[64] =     {
        0x40, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
        0xc8, 0xc9, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
        0x50, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
@@ -147,8 +148,7 @@ raw3270_request_alloc(size_t size)
  * Allocate a new 3270 ccw request from bootmem. Only works very
  * early in the boot process. Only con3270.c should be using this.
  */
-struct raw3270_request *
-raw3270_request_alloc_bootmem(size_t size)
+struct raw3270_request __init *raw3270_request_alloc_bootmem(size_t size)
 {
        struct raw3270_request *rq;
 
@@ -487,7 +487,7 @@ struct raw3270_ua { /* Query Reply structure for Usable Area */
 } __attribute__ ((packed));
 
 static struct diag210 raw3270_init_diag210;
-static DECLARE_MUTEX(raw3270_init_sem);
+static DEFINE_MUTEX(raw3270_init_mutex);
 
 static int
 raw3270_init_irq(struct raw3270_view *view, struct raw3270_request *rq,
@@ -555,7 +555,7 @@ raw3270_start_init(struct raw3270 *rp, struct raw3270_view *view,
 #ifdef CONFIG_TN3270_CONSOLE
        if (raw3270_registered == 0) {
                spin_lock_irqsave(get_ccwdev_lock(view->dev->cdev), flags);
-               rq->callback = 0;
+               rq->callback = NULL;
                rc = __raw3270_start(rp, view, rq);
                if (rc == 0)
                        while (!raw3270_request_final(rq)) {
@@ -589,9 +589,10 @@ static int
 __raw3270_size_device_vm(struct raw3270 *rp)
 {
        int rc, model;
+       struct ccw_dev_id dev_id;
 
-       raw3270_init_diag210.vrdcdvno = 
-               _ccw_device_get_device_number(rp->cdev);
+       ccw_device_get_id(rp->cdev, &dev_id);
+       raw3270_init_diag210.vrdcdvno = dev_id.devno;
        raw3270_init_diag210.vrdclen = sizeof(struct diag210);
        rc = diag210(&raw3270_init_diag210);
        if (rc)
@@ -712,16 +713,16 @@ raw3270_size_device(struct raw3270 *rp)
 {
        int rc;
 
-       down(&raw3270_init_sem);
+       mutex_lock(&raw3270_init_mutex);
        rp->view = &raw3270_init_view;
        raw3270_init_view.dev = rp;
        if (MACHINE_IS_VM)
                rc = __raw3270_size_device_vm(rp);
        else
                rc = __raw3270_size_device(rp);
-       raw3270_init_view.dev = 0;
-       rp->view = 0;
-       up(&raw3270_init_sem);
+       raw3270_init_view.dev = NULL;
+       rp->view = NULL;
+       mutex_unlock(&raw3270_init_mutex);
        if (rc == 0) {  /* Found something. */
                /* Try to find a model. */
                rp->model = 0;
@@ -748,7 +749,7 @@ raw3270_reset_device(struct raw3270 *rp)
 {
        int rc;
 
-       down(&raw3270_init_sem);
+       mutex_lock(&raw3270_init_mutex);
        memset(&rp->init_request, 0, sizeof(rp->init_request));
        memset(&rp->init_data, 0, sizeof(rp->init_data));
        /* Store reset data stream to init_data/init_request */
@@ -761,9 +762,9 @@ raw3270_reset_device(struct raw3270 *rp)
        rp->view = &raw3270_init_view;
        raw3270_init_view.dev = rp;
        rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request);
-       raw3270_init_view.dev = 0;
-       rp->view = 0;
-       up(&raw3270_init_sem);
+       raw3270_init_view.dev = NULL;
+       rp->view = NULL;
+       mutex_unlock(&raw3270_init_mutex);
        return rc;
 }
 
@@ -847,8 +848,7 @@ raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp, char *ascebc)
 /*
  * Setup 3270 device configured as console.
  */
-struct raw3270 *
-raw3270_setup_console(struct ccw_device *cdev)
+struct raw3270 __init *raw3270_setup_console(struct ccw_device *cdev)
 {
        struct raw3270 *rp;
        char *ascebc;
@@ -934,7 +934,7 @@ raw3270_activate_view(struct raw3270_view *view)
        else if (!test_bit(RAW3270_FLAGS_READY, &rp->flags))
                rc = -ENODEV;
        else {
-               oldview = 0;
+               oldview = NULL;
                if (rp->view) {
                        oldview = rp->view;
                        oldview->fn->deactivate(oldview);
@@ -951,7 +951,7 @@ raw3270_activate_view(struct raw3270_view *view)
                                                rp->view = nv;
                                                if (nv->fn->activate(nv) == 0)
                                                        break;
-                                               rp->view = 0;
+                                               rp->view = NULL;
                                        }
                        }
                }
@@ -975,7 +975,7 @@ raw3270_deactivate_view(struct raw3270_view *view)
        spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
        if (rp->view == view) {
                view->fn->deactivate(view);
-               rp->view = 0;
+               rp->view = NULL;
                /* Move deactivated view to end of list. */
                list_del_init(&view->list);
                list_add_tail(&view->list, &rp->view_list);
@@ -985,7 +985,7 @@ raw3270_deactivate_view(struct raw3270_view *view)
                                rp->view = view;
                                if (view->fn->activate(view) == 0)
                                        break;
-                               rp->view = 0;
+                               rp->view = NULL;
                        }
                }
        }
@@ -1076,7 +1076,7 @@ raw3270_del_view(struct raw3270_view *view)
        spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags);
        if (rp->view == view) {
                view->fn->deactivate(view);
-               rp->view = 0;
+               rp->view = NULL;
        }
        list_del_init(&view->list);
        if (!rp->view && test_bit(RAW3270_FLAGS_READY, &rp->flags)) {
@@ -1106,20 +1106,18 @@ raw3270_delete_device(struct raw3270 *rp)
 
        /* Remove from device chain. */
        mutex_lock(&raw3270_mutex);
-       if (rp->clttydev)
-               class_device_destroy(class3270,
-                                    MKDEV(IBM_TTY3270_MAJOR, rp->minor));
-       if (rp->cltubdev)
-               class_device_destroy(class3270,
-                                    MKDEV(IBM_FS3270_MAJOR, rp->minor));
+       if (rp->clttydev && !IS_ERR(rp->clttydev))
+               device_destroy(class3270, MKDEV(IBM_TTY3270_MAJOR, rp->minor));
+       if (rp->cltubdev && !IS_ERR(rp->cltubdev))
+               device_destroy(class3270, MKDEV(IBM_FS3270_MAJOR, rp->minor));
        list_del_init(&rp->list);
        mutex_unlock(&raw3270_mutex);
 
        /* Disconnect from ccw_device. */
        cdev = rp->cdev;
-       rp->cdev = 0;
-       cdev->dev.driver_data = 0;
-       cdev->handler = 0;
+       rp->cdev = NULL;
+       cdev->dev.driver_data = NULL;
+       cdev->handler = NULL;
 
        /* Put ccw_device structure. */
        put_device(&cdev->dev);
@@ -1144,7 +1142,7 @@ raw3270_model_show(struct device *dev, struct device_attribute *attr, char *buf)
        return snprintf(buf, PAGE_SIZE, "%i\n",
                        ((struct raw3270 *) dev->driver_data)->model);
 }
-static DEVICE_ATTR(model, 0444, raw3270_model_show, 0);
+static DEVICE_ATTR(model, 0444, raw3270_model_show, NULL);
 
 static ssize_t
 raw3270_rows_show(struct device *dev, struct device_attribute *attr, char *buf)
@@ -1152,7 +1150,7 @@ raw3270_rows_show(struct device *dev, struct device_attribute *attr, char *buf)
        return snprintf(buf, PAGE_SIZE, "%i\n",
                        ((struct raw3270 *) dev->driver_data)->rows);
 }
-static DEVICE_ATTR(rows, 0444, raw3270_rows_show, 0);
+static DEVICE_ATTR(rows, 0444, raw3270_rows_show, NULL);
 
 static ssize_t
 raw3270_columns_show(struct device *dev, struct device_attribute *attr, char *buf)
@@ -1160,7 +1158,7 @@ raw3270_columns_show(struct device *dev, struct device_attribute *attr, char *bu
        return snprintf(buf, PAGE_SIZE, "%i\n",
                        ((struct raw3270 *) dev->driver_data)->cols);
 }
-static DEVICE_ATTR(columns, 0444, raw3270_columns_show, 0);
+static DEVICE_ATTR(columns, 0444, raw3270_columns_show, NULL);
 
 static struct attribute * raw3270_attrs[] = {
        &dev_attr_model.attr,
@@ -1173,21 +1171,35 @@ static struct attribute_group raw3270_attr_group = {
        .attrs = raw3270_attrs,
 };
 
-static void
-raw3270_create_attributes(struct raw3270 *rp)
+static int raw3270_create_attributes(struct raw3270 *rp)
 {
-       //FIXME: check return code
-       sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group);
-       rp->clttydev =
-               class_device_create(class3270, NULL,
-                                   MKDEV(IBM_TTY3270_MAJOR, rp->minor),
-                                   &rp->cdev->dev, "tty%s",
-                                   rp->cdev->dev.bus_id);
-       rp->cltubdev =
-               class_device_create(class3270, NULL,
-                                   MKDEV(IBM_FS3270_MAJOR, rp->minor),
-                                   &rp->cdev->dev, "tub%s",
-                                   rp->cdev->dev.bus_id);
+       int rc;
+
+       rc = sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group);
+       if (rc)
+               goto out;
+
+       rp->clttydev = device_create(class3270, &rp->cdev->dev,
+                                    MKDEV(IBM_TTY3270_MAJOR, rp->minor),
+                                    "tty%s", rp->cdev->dev.bus_id);
+       if (IS_ERR(rp->clttydev)) {
+               rc = PTR_ERR(rp->clttydev);
+               goto out_ttydev;
+       }
+
+       rp->cltubdev = device_create(class3270, &rp->cdev->dev,
+                                    MKDEV(IBM_FS3270_MAJOR, rp->minor),
+                                    "tub%s", rp->cdev->dev.bus_id);
+       if (!IS_ERR(rp->cltubdev))
+               goto out;
+
+       rc = PTR_ERR(rp->cltubdev);
+       device_destroy(class3270, MKDEV(IBM_TTY3270_MAJOR, rp->minor));
+
+out_ttydev:
+       sysfs_remove_group(&rp->cdev->dev.kobj, &raw3270_attr_group);
+out:
+       return rc;
 }
 
 /*
@@ -1198,7 +1210,7 @@ struct raw3270_notifier {
        void (*notifier)(int, int);
 };
 
-static struct list_head raw3270_notifier = LIST_HEAD_INIT(raw3270_notifier);
+static LIST_HEAD(raw3270_notifier);
 
 int raw3270_register_notifier(void (*notifier)(int, int))
 {
@@ -1255,7 +1267,9 @@ raw3270_set_online (struct ccw_device *cdev)
        rc = raw3270_reset_device(rp);
        if (rc)
                goto failure;
-       raw3270_create_attributes(rp);
+       rc = raw3270_create_attributes(rp);
+       if (rc)
+               goto failure;
        set_bit(RAW3270_FLAGS_READY, &rp->flags);
        mutex_lock(&raw3270_mutex);
        list_for_each_entry(np, &raw3270_notifier, list)
@@ -1296,7 +1310,7 @@ raw3270_remove (struct ccw_device *cdev)
        spin_lock_irqsave(get_ccwdev_lock(cdev), flags);
        if (rp->view) {
                rp->view->fn->deactivate(rp->view);
-               rp->view = 0;
+               rp->view = NULL;
        }
        while (!list_empty(&rp->view_list)) {
                v = list_entry(rp->view_list.next, struct raw3270_view, list);