aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/cio/device_fsm.c
diff options
context:
space:
mode:
authorPeter Oberparleiter <peter.oberparleiter@de.ibm.com>2009-12-07 06:51:31 -0500
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2009-12-07 06:51:31 -0500
commit52ef0608e3ee4a511725e443c4b572fece22b353 (patch)
tree08a2d1f3a3015ec4026f229a1994a31d1b7d50e2 /drivers/s390/cio/device_fsm.c
parent454e1fa1ebae7cff707b2e3f12b775c263c8408b (diff)
[S390] cio: use sense-pgid operation for path verification
Set-pgid operations fail for some device types under z/VM for which the hypervisor has already set the pgid. Also reserved devices or changed pgids are not correctly recognized. Fix these problems by using a combination of sense-pgid and set-pgid and by also accepting pre-defined pgid settings. Signed-off-by: Peter Oberparleiter <peter.oberparleiter@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/cio/device_fsm.c')
-rw-r--r--drivers/s390/cio/device_fsm.c41
1 files changed, 4 insertions, 37 deletions
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index d6e315dc0f98..8d565ff85e43 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -395,33 +395,6 @@ ccw_device_done(struct ccw_device *cdev, int state)
395} 395}
396 396
397/* 397/*
398 * Function called from device_pgid.c after sense path ground has completed.
399 */
400void
401ccw_device_sense_pgid_done(struct ccw_device *cdev, int err)
402{
403 struct subchannel *sch;
404
405 sch = to_subchannel(cdev->dev.parent);
406 switch (err) {
407 case -EOPNOTSUPP: /* path grouping not supported, use nop instead. */
408 case 0: /* success */
409 case -EACCES: /* partial success, some paths not operational */
410 break;
411 case -ETIME: /* Sense path group id stopped by timeout. */
412 case -EUSERS: /* device is reserved for someone else. */
413 ccw_device_done(cdev, DEV_STATE_BOXED);
414 return;
415 default:
416 ccw_device_done(cdev, DEV_STATE_NOT_OPER);
417 return;
418 }
419 /* Start Path Group verification. */
420 cdev->private->state = DEV_STATE_VERIFY;
421 ccw_device_verify_start(cdev);
422}
423
424/*
425 * Start device recognition. 398 * Start device recognition.
426 */ 399 */
427void ccw_device_recognition(struct ccw_device *cdev) 400void ccw_device_recognition(struct ccw_device *cdev)
@@ -503,6 +476,7 @@ callback:
503 } 476 }
504 break; 477 break;
505 case -ETIME: 478 case -ETIME:
479 case -EUSERS:
506 /* Reset oper notify indication after verify error. */ 480 /* Reset oper notify indication after verify error. */
507 cdev->private->flags.donotify = 0; 481 cdev->private->flags.donotify = 0;
508 ccw_device_done(cdev, DEV_STATE_BOXED); 482 ccw_device_done(cdev, DEV_STATE_BOXED);
@@ -540,16 +514,9 @@ ccw_device_online(struct ccw_device *cdev)
540 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); 514 dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
541 return ret; 515 return ret;
542 } 516 }
543 /* Do we want to do path grouping? */ 517 /* Start initial path verification. */
544 if (!cdev->private->options.pgroup) { 518 cdev->private->state = DEV_STATE_VERIFY;
545 /* Start initial path verification. */ 519 ccw_device_verify_start(cdev);
546 cdev->private->state = DEV_STATE_VERIFY;
547 ccw_device_verify_start(cdev);
548 return 0;
549 }
550 /* Do a SensePGID first. */
551 cdev->private->state = DEV_STATE_SENSE_PGID;
552 ccw_device_sense_pgid_start(cdev);
553 return 0; 520 return 0;
554} 521}
555 522