aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/s390/cio/device.c4
-rw-r--r--drivers/s390/cio/device.h1
-rw-r--r--drivers/s390/cio/device_fsm.c11
3 files changed, 9 insertions, 7 deletions
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
index f780bdd3a04e..2ee093ec86e4 100644
--- a/drivers/s390/cio/device.c
+++ b/drivers/s390/cio/device.c
@@ -1609,7 +1609,7 @@ int ccw_purge_blacklisted(void)
1609 return 0; 1609 return 0;
1610} 1610}
1611 1611
1612static void device_set_disconnected(struct ccw_device *cdev) 1612void ccw_device_set_disconnected(struct ccw_device *cdev)
1613{ 1613{
1614 if (!cdev) 1614 if (!cdev)
1615 return; 1615 return;
@@ -1705,7 +1705,7 @@ static int io_subchannel_sch_event(struct subchannel *sch, int slow)
1705 ccw_device_trigger_reprobe(cdev); 1705 ccw_device_trigger_reprobe(cdev);
1706 break; 1706 break;
1707 case DISC: 1707 case DISC:
1708 device_set_disconnected(cdev); 1708 ccw_device_set_disconnected(cdev);
1709 break; 1709 break;
1710 default: 1710 default:
1711 break; 1711 break;
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h
index ed39a2caaf47..246c6482842c 100644
--- a/drivers/s390/cio/device.h
+++ b/drivers/s390/cio/device.h
@@ -125,6 +125,7 @@ int ccw_device_stlck(struct ccw_device *);
125void ccw_device_trigger_reprobe(struct ccw_device *); 125void ccw_device_trigger_reprobe(struct ccw_device *);
126void ccw_device_kill_io(struct ccw_device *); 126void ccw_device_kill_io(struct ccw_device *);
127int ccw_device_notify(struct ccw_device *, int); 127int ccw_device_notify(struct ccw_device *, int);
128void ccw_device_set_disconnected(struct ccw_device *cdev);
128void ccw_device_set_notoper(struct ccw_device *cdev); 129void ccw_device_set_notoper(struct ccw_device *cdev);
129 130
130/* qdio needs this. */ 131/* qdio needs this. */
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index 3db3847ee137..3b0f408a896c 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -400,6 +400,8 @@ ccw_device_done(struct ccw_device *cdev, int state)
400 cdev->private->dev_id.devno, sch->schid.sch_no); 400 cdev->private->dev_id.devno, sch->schid.sch_no);
401 if (!ccw_device_notify(cdev, CIO_GONE)) 401 if (!ccw_device_notify(cdev, CIO_GONE))
402 ccw_device_schedule_sch_unregister(cdev); 402 ccw_device_schedule_sch_unregister(cdev);
403 else
404 ccw_device_set_disconnected(cdev);
403 cdev->private->flags.donotify = 0; 405 cdev->private->flags.donotify = 0;
404 break; 406 break;
405 case DEV_STATE_DISCONNECTED: 407 case DEV_STATE_DISCONNECTED:
@@ -744,11 +746,10 @@ ccw_device_recog_notoper(struct ccw_device *cdev, enum dev_event dev_event)
744static void ccw_device_generic_notoper(struct ccw_device *cdev, 746static void ccw_device_generic_notoper(struct ccw_device *cdev,
745 enum dev_event dev_event) 747 enum dev_event dev_event)
746{ 748{
747 struct subchannel *sch; 749 if (!ccw_device_notify(cdev, CIO_GONE))
748 750 ccw_device_schedule_sch_unregister(cdev);
749 ccw_device_set_notoper(cdev); 751 else
750 sch = to_subchannel(cdev->dev.parent); 752 ccw_device_set_disconnected(cdev);
751 css_schedule_eval(sch->schid);
752} 753}
753 754
754/* 755/*