X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fs390%2Fcio%2Fdevice_pgid.c;h=35ceeac214d4c0c6e0149f80cef7987fd7748e87;hb=f9296eb00ed30209424102d3c920e69617eea853;hp=7a808019956ea2133a1cb93372ee03c0cdd248ed;hpb=a91482bdcc2e0f6035702e46f1b99043a0893346;p=linux-2.6.git diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c index 7a8080199..35ceeac21 100644 --- a/drivers/s390/cio/device_pgid.c +++ b/drivers/s390/cio/device_pgid.c @@ -143,14 +143,15 @@ ccw_device_sense_pgid_irq(struct ccw_device *cdev, enum dev_event dev_event) int ret; irb = (struct irb *) __LC_IRB; - /* Retry sense pgid for cc=1. */ + /* + * Unsolicited interrupts may pertain to an earlier status pending or + * busy condition on the subchannel. Retry sense pgid. + */ if (irb->scsw.stctl == (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) { - if (irb->scsw.cc == 1) { - ret = __ccw_device_sense_pgid_start(cdev); - if (ret && ret != -EBUSY) - ccw_device_sense_pgid_done(cdev, ret); - } + ret = __ccw_device_sense_pgid_start(cdev); + if (ret && ret != -EBUSY) + ccw_device_sense_pgid_done(cdev, ret); return; } if (ccw_device_accumulate_and_sense(cdev, irb) != 0) @@ -309,11 +310,13 @@ ccw_device_verify_irq(struct ccw_device *cdev, enum dev_event dev_event) struct irb *irb; irb = (struct irb *) __LC_IRB; - /* Retry set pgid for cc=1. */ + /* + * Unsolicited interrupts may pertain to an earlier status pending or + * busy condition on the subchannel. Restart path verification. + */ if (irb->scsw.stctl == (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) { - if (irb->scsw.cc == 1) - __ccw_device_verify_start(cdev); + __ccw_device_verify_start(cdev); return; } if (ccw_device_accumulate_and_sense(cdev, irb) != 0) @@ -394,13 +397,10 @@ ccw_device_disband_irq(struct ccw_device *cdev, enum dev_event dev_event) int ret; irb = (struct irb *) __LC_IRB; - /* Retry set pgid for cc=1. */ + /* Ignore unsolicited interrupts. */ if (irb->scsw.stctl == - (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) { - if (irb->scsw.cc == 1) - __ccw_device_disband_start(cdev); + (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) return; - } if (ccw_device_accumulate_and_sense(cdev, irb) != 0) return; sch = to_subchannel(cdev->dev.parent);