diff options
author | David S. Miller <davem@davemloft.net> | 2017-09-23 10:16:53 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-09-23 10:16:53 -0700 |
commit | 1f8d31d189cc6ce1e4b972959fda41e790bb92b8 (patch) | |
tree | fd3cca12a29319f073773ac55f7d41cc58e2c73f /drivers/s390/cio/device_fsm.c | |
parent | 3fb5ec06578e4c85d3486b6a73cbeb07960a51ce (diff) | |
parent | cd4175b11685b11c40e31a03e05084cc212b0649 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'drivers/s390/cio/device_fsm.c')
-rw-r--r-- | drivers/s390/cio/device_fsm.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 12016e32e519..f98ea674c3d8 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c @@ -476,6 +476,17 @@ static void create_fake_irb(struct irb *irb, int type) } } +static void ccw_device_handle_broken_paths(struct ccw_device *cdev) +{ + struct subchannel *sch = to_subchannel(cdev->dev.parent); + u8 broken_paths = (sch->schib.pmcw.pam & sch->opm) ^ sch->vpm; + + if (broken_paths && (cdev->private->path_broken_mask != broken_paths)) + ccw_device_schedule_recovery(); + + cdev->private->path_broken_mask = broken_paths; +} + void ccw_device_verify_done(struct ccw_device *cdev, int err) { struct subchannel *sch; @@ -508,6 +519,7 @@ callback: memset(&cdev->private->irb, 0, sizeof(struct irb)); } ccw_device_report_path_events(cdev); + ccw_device_handle_broken_paths(cdev); break; case -ETIME: case -EUSERS: |