diff options
Diffstat (limited to 'drivers/s390/cio/device.c')
-rw-r--r-- | drivers/s390/cio/device.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index ba9f7c11f63f..fa3e4c0a2536 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -535,7 +535,8 @@ ccw_device_register(struct ccw_device *cdev) | |||
535 | } | 535 | } |
536 | 536 | ||
537 | struct match_data { | 537 | struct match_data { |
538 | unsigned int devno; | 538 | unsigned int devno; |
539 | unsigned int ssid; | ||
539 | struct ccw_device * sibling; | 540 | struct ccw_device * sibling; |
540 | }; | 541 | }; |
541 | 542 | ||
@@ -548,6 +549,7 @@ match_devno(struct device * dev, void * data) | |||
548 | cdev = to_ccwdev(dev); | 549 | cdev = to_ccwdev(dev); |
549 | if ((cdev->private->state == DEV_STATE_DISCONNECTED) && | 550 | if ((cdev->private->state == DEV_STATE_DISCONNECTED) && |
550 | (cdev->private->devno == d->devno) && | 551 | (cdev->private->devno == d->devno) && |
552 | (cdev->private->ssid == d->ssid) && | ||
551 | (cdev != d->sibling)) { | 553 | (cdev != d->sibling)) { |
552 | cdev->private->state = DEV_STATE_NOT_OPER; | 554 | cdev->private->state = DEV_STATE_NOT_OPER; |
553 | return 1; | 555 | return 1; |
@@ -556,11 +558,13 @@ match_devno(struct device * dev, void * data) | |||
556 | } | 558 | } |
557 | 559 | ||
558 | static struct ccw_device * | 560 | static struct ccw_device * |
559 | get_disc_ccwdev_by_devno(unsigned int devno, struct ccw_device *sibling) | 561 | get_disc_ccwdev_by_devno(unsigned int devno, unsigned int ssid, |
562 | struct ccw_device *sibling) | ||
560 | { | 563 | { |
561 | struct device *dev; | 564 | struct device *dev; |
562 | struct match_data data = { | 565 | struct match_data data = { |
563 | .devno = devno, | 566 | .devno = devno, |
567 | .ssid = ssid, | ||
564 | .sibling = sibling, | 568 | .sibling = sibling, |
565 | }; | 569 | }; |
566 | 570 | ||
@@ -616,7 +620,7 @@ ccw_device_do_unreg_rereg(void *data) | |||
616 | 620 | ||
617 | need_rename = 1; | 621 | need_rename = 1; |
618 | other_cdev = get_disc_ccwdev_by_devno(sch->schib.pmcw.dev, | 622 | other_cdev = get_disc_ccwdev_by_devno(sch->schib.pmcw.dev, |
619 | cdev); | 623 | sch->schid.ssid, cdev); |
620 | if (other_cdev) { | 624 | if (other_cdev) { |
621 | struct subchannel *other_sch; | 625 | struct subchannel *other_sch; |
622 | 626 | ||
@@ -639,8 +643,8 @@ ccw_device_do_unreg_rereg(void *data) | |||
639 | if (test_and_clear_bit(1, &cdev->private->registered)) | 643 | if (test_and_clear_bit(1, &cdev->private->registered)) |
640 | device_del(&cdev->dev); | 644 | device_del(&cdev->dev); |
641 | if (need_rename) | 645 | if (need_rename) |
642 | snprintf (cdev->dev.bus_id, BUS_ID_SIZE, "0.0.%04x", | 646 | snprintf (cdev->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x", |
643 | sch->schib.pmcw.dev); | 647 | sch->schid.ssid, sch->schib.pmcw.dev); |
644 | PREPARE_WORK(&cdev->private->kick_work, | 648 | PREPARE_WORK(&cdev->private->kick_work, |
645 | ccw_device_add_changed, (void *)cdev); | 649 | ccw_device_add_changed, (void *)cdev); |
646 | queue_work(ccw_device_work, &cdev->private->kick_work); | 650 | queue_work(ccw_device_work, &cdev->private->kick_work); |
@@ -769,9 +773,11 @@ io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch) | |||
769 | sch->dev.driver_data = cdev; | 773 | sch->dev.driver_data = cdev; |
770 | sch->driver = &io_subchannel_driver; | 774 | sch->driver = &io_subchannel_driver; |
771 | cdev->ccwlock = &sch->lock; | 775 | cdev->ccwlock = &sch->lock; |
776 | |||
772 | /* Init private data. */ | 777 | /* Init private data. */ |
773 | priv = cdev->private; | 778 | priv = cdev->private; |
774 | priv->devno = sch->schib.pmcw.dev; | 779 | priv->devno = sch->schib.pmcw.dev; |
780 | priv->ssid = sch->schid.ssid; | ||
775 | priv->sch_no = sch->schid.sch_no; | 781 | priv->sch_no = sch->schid.sch_no; |
776 | priv->state = DEV_STATE_NOT_OPER; | 782 | priv->state = DEV_STATE_NOT_OPER; |
777 | INIT_LIST_HEAD(&priv->cmb_list); | 783 | INIT_LIST_HEAD(&priv->cmb_list); |
@@ -779,8 +785,8 @@ io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch) | |||
779 | init_timer(&priv->timer); | 785 | init_timer(&priv->timer); |
780 | 786 | ||
781 | /* Set an initial name for the device. */ | 787 | /* Set an initial name for the device. */ |
782 | snprintf (cdev->dev.bus_id, BUS_ID_SIZE, "0.0.%04x", | 788 | snprintf (cdev->dev.bus_id, BUS_ID_SIZE, "0.%x.%04x", |
783 | sch->schib.pmcw.dev); | 789 | sch->schid.ssid, sch->schib.pmcw.dev); |
784 | 790 | ||
785 | /* Increase counter of devices currently in recognition. */ | 791 | /* Increase counter of devices currently in recognition. */ |
786 | atomic_inc(&ccw_device_init_count); | 792 | atomic_inc(&ccw_device_init_count); |