[S390] cio: Fix handling of interrupt for csch().
authorCornelia Huck <cornelia.huck@de.ibm.com>
Wed, 4 Apr 2007 12:37:11 +0000 (14:37 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 4 Apr 2007 12:37:39 +0000 (14:37 +0200)
Wipe internal irb if the clear function bit is set before accumulating
bits from the irb in order to follow hardware behaviour.

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/device_status.c

index 25d99bd2808959a89d5099e48d20b6d5b914c0e4..aa96e6752592355a06b5a4fb6c97f346e4c1066d 100644 (file)
@@ -221,6 +221,14 @@ ccw_device_accumulate_irb(struct ccw_device *cdev, struct irb *irb)
 
        cdev_irb = &cdev->private->irb;
 
+       /*
+        * If the clear function had been performed, all formerly pending
+        * status at the subchannel has been cleared and we must not pass
+        * intermediate accumulated status to the device driver.
+        */
+       if (irb->scsw.fctl & SCSW_FCTL_CLEAR_FUNC)
+               memset(&cdev->private->irb, 0, sizeof(struct irb));
+
        /* Copy bits which are valid only for the start function. */
        if (irb->scsw.fctl & SCSW_FCTL_START_FUNC) {
                /* Copy key. */