s390/cio: fix irq stats for early interrupts on ccw consoles
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Mon, 27 Jan 2014 12:29:15 +0000 (13:29 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 21 Feb 2014 07:50:13 +0000 (08:50 +0100)
Interrupts which happen on ccw consoles prior to their registration
with the driver core are not accounted to the respective device
driver. Fix this by setting the proper interrupt class during
initialization of ccw consoles.

Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/device.c

index da431992fd8e6ca7054bbf50c81dfa0bab6723a9..d8d9b5b5cc56f9508cd9bae511c592867775a3cc 100644 (file)
@@ -1571,6 +1571,18 @@ out:
        return rc;
 }
 
+static void ccw_device_set_int_class(struct ccw_device *cdev)
+{
+       struct ccw_driver *cdrv = cdev->drv;
+
+       /* Note: we interpret class 0 in this context as an uninitialized
+        * field since it translates to a non-I/O interrupt class. */
+       if (cdrv->int_class != 0)
+               cdev->private->int_class = cdrv->int_class;
+       else
+               cdev->private->int_class = IRQIO_CIO;
+}
+
 #ifdef CONFIG_CCW_CONSOLE
 int __init ccw_device_enable_console(struct ccw_device *cdev)
 {
@@ -1635,6 +1647,7 @@ struct ccw_device * __init ccw_device_create_console(struct ccw_driver *drv)
        }
        cdev->drv = drv;
        set_io_private(sch, io_priv);
+       ccw_device_set_int_class(cdev);
        return cdev;
 }
 
@@ -1732,15 +1745,8 @@ ccw_device_probe (struct device *dev)
        int ret;
 
        cdev->drv = cdrv; /* to let the driver call _set_online */
-       /* Note: we interpret class 0 in this context as an uninitialized
-        * field since it translates to a non-I/O interrupt class. */
-       if (cdrv->int_class != 0)
-               cdev->private->int_class = cdrv->int_class;
-       else
-               cdev->private->int_class = IRQIO_CIO;
-
+       ccw_device_set_int_class(cdev);
        ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV;
-
        if (ret) {
                cdev->drv = NULL;
                cdev->private->int_class = IRQIO_CIO;