|
@@ -642,8 +642,15 @@ static void virtio_ccw_int_handler(struct ccw_device *cdev,
|
|
|
(SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND))) {
|
|
|
/* OK */
|
|
|
}
|
|
|
- if (irb_is_error(irb))
|
|
|
- vcdev->err = -EIO; /* XXX - use real error */
|
|
|
+ if (irb_is_error(irb)) {
|
|
|
+ /* Command reject? */
|
|
|
+ if ((scsw_dstat(&irb->scsw) & DEV_STAT_UNIT_CHECK) &&
|
|
|
+ (irb->ecw[0] & SNS0_CMD_REJECT))
|
|
|
+ vcdev->err = -EOPNOTSUPP;
|
|
|
+ else
|
|
|
+ /* Map everything else to -EIO. */
|
|
|
+ vcdev->err = -EIO;
|
|
|
+ }
|
|
|
if (vcdev->curr_io & activity) {
|
|
|
switch (activity) {
|
|
|
case VIRTIO_CCW_DOING_READ_FEAT:
|