Skip to content

Commit

Permalink
[S390] cio: make not operational handling consistent
Browse files Browse the repository at this point in the history
When a ccw device appears not operational, 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. This approach is consistent with no-path event
handling.

Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Peter Oberparleiter authored and Martin Schwidefsky committed Oct 6, 2009
1 parent 9a33211 commit 6afcc77
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 7 deletions.
4 changes: 2 additions & 2 deletions drivers/s390/cio/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -1609,7 +1609,7 @@ int ccw_purge_blacklisted(void)
return 0;
}

static void device_set_disconnected(struct ccw_device *cdev)
void ccw_device_set_disconnected(struct ccw_device *cdev)
{
if (!cdev)
return;
Expand Down Expand Up @@ -1705,7 +1705,7 @@ static int io_subchannel_sch_event(struct subchannel *sch, int slow)
ccw_device_trigger_reprobe(cdev);
break;
case DISC:
device_set_disconnected(cdev);
ccw_device_set_disconnected(cdev);
break;
default:
break;
Expand Down
1 change: 1 addition & 0 deletions drivers/s390/cio/device.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ int ccw_device_stlck(struct ccw_device *);
void ccw_device_trigger_reprobe(struct ccw_device *);
void ccw_device_kill_io(struct ccw_device *);
int ccw_device_notify(struct ccw_device *, int);
void ccw_device_set_disconnected(struct ccw_device *cdev);
void ccw_device_set_notoper(struct ccw_device *cdev);

/* qdio needs this. */
Expand Down
11 changes: 6 additions & 5 deletions drivers/s390/cio/device_fsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,8 @@ ccw_device_done(struct ccw_device *cdev, int state)
cdev->private->dev_id.devno, sch->schid.sch_no);
if (!ccw_device_notify(cdev, CIO_GONE))
ccw_device_schedule_sch_unregister(cdev);
else
ccw_device_set_disconnected(cdev);
cdev->private->flags.donotify = 0;
break;
case DEV_STATE_DISCONNECTED:
Expand Down Expand Up @@ -744,11 +746,10 @@ ccw_device_recog_notoper(struct ccw_device *cdev, enum dev_event dev_event)
static void ccw_device_generic_notoper(struct ccw_device *cdev,
enum dev_event dev_event)
{
struct subchannel *sch;

ccw_device_set_notoper(cdev);
sch = to_subchannel(cdev->dev.parent);
css_schedule_eval(sch->schid);
if (!ccw_device_notify(cdev, CIO_GONE))
ccw_device_schedule_sch_unregister(cdev);
else
ccw_device_set_disconnected(cdev);
}

/*
Expand Down

0 comments on commit 6afcc77

Please sign in to comment.