]> Pileus Git - ~andy/linux/blobdiff - drivers/s390/cio/ccwreq.c
[S390] cio: unit check handling during internal I/O
[~andy/linux] / drivers / s390 / cio / ccwreq.c
index 37df42af05ec604112871912cc58d57f47d19f19..7f206ed44fdf79b41d771a203a8700c3a6ba07b4 100644 (file)
@@ -159,6 +159,7 @@ static enum io_status ccwreq_status(struct ccw_device *cdev, struct irb *lcirb)
 {
        struct irb *irb = &cdev->private->irb;
        struct cmd_scsw *scsw = &irb->scsw.cmd;
+       enum uc_todo todo;
 
        /* Perform BASIC SENSE if needed. */
        if (ccw_device_accumulate_and_sense(cdev, lcirb))
@@ -178,6 +179,20 @@ static enum io_status ccwreq_status(struct ccw_device *cdev, struct irb *lcirb)
                /* Check for command reject. */
                if (irb->ecw[0] & SNS0_CMD_REJECT)
                        return IO_REJECTED;
+               /* Ask the driver what to do */
+               if (cdev->drv && cdev->drv->uc_handler) {
+                       todo = cdev->drv->uc_handler(cdev, lcirb);
+                       switch (todo) {
+                       case UC_TODO_RETRY:
+                               return IO_STATUS_ERROR;
+                       case UC_TODO_RETRY_ON_NEW_PATH:
+                               return IO_PATH_ERROR;
+                       case UC_TODO_STOP:
+                               return IO_REJECTED;
+                       default:
+                               return IO_STATUS_ERROR;
+                       }
+               }
                /* Assume that unexpected SENSE data implies an error. */
                return IO_STATUS_ERROR;
        }