diff options
author | Sebastian Ott <sebott@linux.vnet.ibm.com> | 2011-01-05 06:47:56 -0500 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2011-01-05 06:47:28 -0500 |
commit | ce322ccd53f2505cf8b0ed204631d6ac054ac66a (patch) | |
tree | c3b9b9145d691b3c8a389be9299b96b574b8f69e /drivers/s390/cio/device_ops.c | |
parent | 37e8952174c6c239d1c86125e032fd6ad107a3e6 (diff) |
[S390] cio: obtain mdc value per channel path
Add support to accumulate the number of 64K-bytes blocks all paths
to a device at least support for a transport command.
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/cio/device_ops.c')
-rw-r--r-- | drivers/s390/cio/device_ops.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c index 6da84543dfe..651976b54af 100644 --- a/drivers/s390/cio/device_ops.c +++ b/drivers/s390/cio/device_ops.c | |||
@@ -687,6 +687,46 @@ int ccw_device_tm_start_timeout(struct ccw_device *cdev, struct tcw *tcw, | |||
687 | EXPORT_SYMBOL(ccw_device_tm_start_timeout); | 687 | EXPORT_SYMBOL(ccw_device_tm_start_timeout); |
688 | 688 | ||
689 | /** | 689 | /** |
690 | * ccw_device_get_mdc - accumulate max data count | ||
691 | * @cdev: ccw device for which the max data count is accumulated | ||
692 | * @mask: mask of paths to use | ||
693 | * | ||
694 | * Return the number of 64K-bytes blocks all paths at least support | ||
695 | * for a transport command. Return values <= 0 indicate failures. | ||
696 | */ | ||
697 | int ccw_device_get_mdc(struct ccw_device *cdev, u8 mask) | ||
698 | { | ||
699 | struct subchannel *sch = to_subchannel(cdev->dev.parent); | ||
700 | struct channel_path_desc_fmt1 desc; | ||
701 | struct chp_id chpid; | ||
702 | int mdc = 0, ret, i; | ||
703 | |||
704 | /* Adjust requested path mask to excluded varied off paths. */ | ||
705 | if (mask) | ||
706 | mask &= sch->lpm; | ||
707 | else | ||
708 | mask = sch->lpm; | ||
709 | |||
710 | chp_id_init(&chpid); | ||
711 | for (i = 0; i < 8; i++) { | ||
712 | if (!(mask & (0x80 >> i))) | ||
713 | continue; | ||
714 | chpid.id = sch->schib.pmcw.chpid[i]; | ||
715 | ret = chsc_determine_fmt1_channel_path_desc(chpid, &desc); | ||
716 | if (ret) | ||
717 | return ret; | ||
718 | if (!desc.f) | ||
719 | return 0; | ||
720 | if (!desc.r) | ||
721 | mdc = 1; | ||
722 | mdc = mdc ? min(mdc, (int)desc.mdc) : desc.mdc; | ||
723 | } | ||
724 | |||
725 | return mdc; | ||
726 | } | ||
727 | EXPORT_SYMBOL(ccw_device_get_mdc); | ||
728 | |||
729 | /** | ||
690 | * ccw_device_tm_intrg - perform interrogate function | 730 | * ccw_device_tm_intrg - perform interrogate function |
691 | * @cdev: ccw device on which to perform the interrogate function | 731 | * @cdev: ccw device on which to perform the interrogate function |
692 | * | 732 | * |