[S390] cio: make disconnected handling consistent
When there is no path left to a ccw device, inform the associated device driver and act according to the response: if the driver wants to keep the device, put it into the disconnected state. If not, or if there is no driver or if the device is not online, unregister it. Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Родитель
05d419b11f
Коммит
9a33211694
|
@ -387,19 +387,33 @@ ccw_device_done(struct ccw_device *cdev, int state)
|
||||||
|
|
||||||
cdev->private->state = state;
|
cdev->private->state = state;
|
||||||
|
|
||||||
if (state == DEV_STATE_BOXED) {
|
switch (state) {
|
||||||
|
case DEV_STATE_BOXED:
|
||||||
CIO_MSG_EVENT(0, "Boxed device %04x on subchannel %04x\n",
|
CIO_MSG_EVENT(0, "Boxed device %04x on subchannel %04x\n",
|
||||||
cdev->private->dev_id.devno, sch->schid.sch_no);
|
cdev->private->dev_id.devno, sch->schid.sch_no);
|
||||||
if (cdev->online && !ccw_device_notify(cdev, CIO_BOXED))
|
if (cdev->online && !ccw_device_notify(cdev, CIO_BOXED))
|
||||||
ccw_device_schedule_sch_unregister(cdev);
|
ccw_device_schedule_sch_unregister(cdev);
|
||||||
cdev->private->flags.donotify = 0;
|
cdev->private->flags.donotify = 0;
|
||||||
}
|
break;
|
||||||
if (state == DEV_STATE_NOT_OPER) {
|
case DEV_STATE_NOT_OPER:
|
||||||
CIO_MSG_EVENT(0, "Device %04x gone on subchannel %04x\n",
|
CIO_MSG_EVENT(0, "Device %04x gone on subchannel %04x\n",
|
||||||
cdev->private->dev_id.devno, sch->schid.sch_no);
|
cdev->private->dev_id.devno, sch->schid.sch_no);
|
||||||
if (!ccw_device_notify(cdev, CIO_GONE))
|
if (!ccw_device_notify(cdev, CIO_GONE))
|
||||||
ccw_device_schedule_sch_unregister(cdev);
|
ccw_device_schedule_sch_unregister(cdev);
|
||||||
cdev->private->flags.donotify = 0;
|
cdev->private->flags.donotify = 0;
|
||||||
|
break;
|
||||||
|
case DEV_STATE_DISCONNECTED:
|
||||||
|
CIO_MSG_EVENT(0, "Disconnected device %04x on subchannel "
|
||||||
|
"%04x\n", cdev->private->dev_id.devno,
|
||||||
|
sch->schid.sch_no);
|
||||||
|
if (!ccw_device_notify(cdev, CIO_NO_PATH))
|
||||||
|
ccw_device_schedule_sch_unregister(cdev);
|
||||||
|
else
|
||||||
|
ccw_device_set_disconnected(cdev);
|
||||||
|
cdev->private->flags.donotify = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cdev->private->flags.donotify) {
|
if (cdev->private->flags.donotify) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче