|
@@ -270,7 +270,8 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb)
|
|
* We didn't get channel end / device end. Check if path
|
|
* We didn't get channel end / device end. Check if path
|
|
* verification has been started; we can retry after it has
|
|
* verification has been started; we can retry after it has
|
|
* finished. We also retry unit checks except for command reject
|
|
* finished. We also retry unit checks except for command reject
|
|
- * or intervention required.
|
|
|
|
|
|
+ * or intervention required. Also check for long busy
|
|
|
|
+ * conditions.
|
|
*/
|
|
*/
|
|
if (cdev->private->flags.doverify ||
|
|
if (cdev->private->flags.doverify ||
|
|
cdev->private->state == DEV_STATE_VERIFY)
|
|
cdev->private->state == DEV_STATE_VERIFY)
|
|
@@ -279,6 +280,10 @@ ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb)
|
|
!(irb->ecw[0] &
|
|
!(irb->ecw[0] &
|
|
(SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ)))
|
|
(SNS0_CMD_REJECT | SNS0_INTERVENTION_REQ)))
|
|
cdev->private->intparm = -EAGAIN;
|
|
cdev->private->intparm = -EAGAIN;
|
|
|
|
+ else if ((irb->scsw.dstat & DEV_STAT_ATTENTION) &&
|
|
|
|
+ (irb->scsw.dstat & DEV_STAT_DEV_END) &&
|
|
|
|
+ (irb->scsw.dstat & DEV_STAT_UNIT_EXCEP))
|
|
|
|
+ cdev->private->intparm = -EAGAIN;
|
|
else
|
|
else
|
|
cdev->private->intparm = -EIO;
|
|
cdev->private->intparm = -EIO;
|
|
|
|
|