diff options
Diffstat (limited to 'drivers/s390/scsi/zfcp_scsi.c')
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 206 |
1 files changed, 1 insertions, 205 deletions
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index f8594a2e3f5c..e6d8ea8051af 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -520,209 +520,6 @@ struct fc_function_template zfcp_transport_functions = { | |||
520 | .disable_target_scan = 1, | 520 | .disable_target_scan = 1, |
521 | }; | 521 | }; |
522 | 522 | ||
523 | #define ZFCP_DEFINE_LATENCY_ATTR(_name) \ | ||
524 | static ssize_t \ | ||
525 | zfcp_sysfs_unit_##_name##_latency_show(struct device *dev, \ | ||
526 | struct device_attribute *attr, \ | ||
527 | char *buf) { \ | ||
528 | struct scsi_device *sdev = to_scsi_device(dev); \ | ||
529 | struct zfcp_unit *unit = sdev->hostdata; \ | ||
530 | struct zfcp_latencies *lat = &unit->latencies; \ | ||
531 | struct zfcp_adapter *adapter = unit->port->adapter; \ | ||
532 | unsigned long flags; \ | ||
533 | unsigned long long fsum, fmin, fmax, csum, cmin, cmax, cc; \ | ||
534 | \ | ||
535 | spin_lock_irqsave(&lat->lock, flags); \ | ||
536 | fsum = lat->_name.fabric.sum * adapter->timer_ticks; \ | ||
537 | fmin = lat->_name.fabric.min * adapter->timer_ticks; \ | ||
538 | fmax = lat->_name.fabric.max * adapter->timer_ticks; \ | ||
539 | csum = lat->_name.channel.sum * adapter->timer_ticks; \ | ||
540 | cmin = lat->_name.channel.min * adapter->timer_ticks; \ | ||
541 | cmax = lat->_name.channel.max * adapter->timer_ticks; \ | ||
542 | cc = lat->_name.counter; \ | ||
543 | spin_unlock_irqrestore(&lat->lock, flags); \ | ||
544 | \ | ||
545 | do_div(fsum, 1000); \ | ||
546 | do_div(fmin, 1000); \ | ||
547 | do_div(fmax, 1000); \ | ||
548 | do_div(csum, 1000); \ | ||
549 | do_div(cmin, 1000); \ | ||
550 | do_div(cmax, 1000); \ | ||
551 | \ | ||
552 | return sprintf(buf, "%llu %llu %llu %llu %llu %llu %llu\n", \ | ||
553 | fmin, fmax, fsum, cmin, cmax, csum, cc); \ | ||
554 | } \ | ||
555 | static ssize_t \ | ||
556 | zfcp_sysfs_unit_##_name##_latency_store(struct device *dev, \ | ||
557 | struct device_attribute *attr, \ | ||
558 | const char *buf, size_t count) \ | ||
559 | { \ | ||
560 | struct scsi_device *sdev = to_scsi_device(dev); \ | ||
561 | struct zfcp_unit *unit = sdev->hostdata; \ | ||
562 | struct zfcp_latencies *lat = &unit->latencies; \ | ||
563 | unsigned long flags; \ | ||
564 | \ | ||
565 | spin_lock_irqsave(&lat->lock, flags); \ | ||
566 | lat->_name.fabric.sum = 0; \ | ||
567 | lat->_name.fabric.min = 0xFFFFFFFF; \ | ||
568 | lat->_name.fabric.max = 0; \ | ||
569 | lat->_name.channel.sum = 0; \ | ||
570 | lat->_name.channel.min = 0xFFFFFFFF; \ | ||
571 | lat->_name.channel.max = 0; \ | ||
572 | lat->_name.counter = 0; \ | ||
573 | spin_unlock_irqrestore(&lat->lock, flags); \ | ||
574 | \ | ||
575 | return (ssize_t) count; \ | ||
576 | } \ | ||
577 | static DEVICE_ATTR(_name##_latency, S_IWUSR | S_IRUGO, \ | ||
578 | zfcp_sysfs_unit_##_name##_latency_show, \ | ||
579 | zfcp_sysfs_unit_##_name##_latency_store); | ||
580 | |||
581 | ZFCP_DEFINE_LATENCY_ATTR(read); | ||
582 | ZFCP_DEFINE_LATENCY_ATTR(write); | ||
583 | ZFCP_DEFINE_LATENCY_ATTR(cmd); | ||
584 | |||
585 | #define ZFCP_DEFINE_SCSI_ATTR(_name, _format, _value) \ | ||
586 | static ssize_t zfcp_sysfs_scsi_##_name##_show(struct device *dev, struct device_attribute *attr, \ | ||
587 | char *buf) \ | ||
588 | { \ | ||
589 | struct scsi_device *sdev; \ | ||
590 | struct zfcp_unit *unit; \ | ||
591 | \ | ||
592 | sdev = to_scsi_device(dev); \ | ||
593 | unit = sdev->hostdata; \ | ||
594 | return sprintf(buf, _format, _value); \ | ||
595 | } \ | ||
596 | \ | ||
597 | static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_scsi_##_name##_show, NULL); | ||
598 | |||
599 | ZFCP_DEFINE_SCSI_ATTR(hba_id, "%s\n", | ||
600 | unit->port->adapter->ccw_device->dev.bus_id); | ||
601 | ZFCP_DEFINE_SCSI_ATTR(wwpn, "0x%016llx\n", unit->port->wwpn); | ||
602 | ZFCP_DEFINE_SCSI_ATTR(fcp_lun, "0x%016llx\n", unit->fcp_lun); | ||
603 | |||
604 | static struct device_attribute *zfcp_sysfs_sdev_attrs[] = { | ||
605 | &dev_attr_fcp_lun, | ||
606 | &dev_attr_wwpn, | ||
607 | &dev_attr_hba_id, | ||
608 | &dev_attr_read_latency, | ||
609 | &dev_attr_write_latency, | ||
610 | &dev_attr_cmd_latency, | ||
611 | NULL | ||
612 | }; | ||
613 | |||
614 | static ssize_t zfcp_sysfs_adapter_util_show(struct device *dev, | ||
615 | struct device_attribute *attr, | ||
616 | char *buf) | ||
617 | { | ||
618 | struct Scsi_Host *scsi_host = dev_to_shost(dev); | ||
619 | struct fsf_qtcb_bottom_port *qtcb_port; | ||
620 | struct zfcp_adapter *adapter; | ||
621 | int retval; | ||
622 | |||
623 | adapter = (struct zfcp_adapter *) scsi_host->hostdata[0]; | ||
624 | if (!(adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA)) | ||
625 | return -EOPNOTSUPP; | ||
626 | |||
627 | qtcb_port = kzalloc(sizeof(struct fsf_qtcb_bottom_port), GFP_KERNEL); | ||
628 | if (!qtcb_port) | ||
629 | return -ENOMEM; | ||
630 | |||
631 | retval = zfcp_fsf_exchange_port_data_sync(adapter, qtcb_port); | ||
632 | if (!retval) | ||
633 | retval = sprintf(buf, "%u %u %u\n", qtcb_port->cp_util, | ||
634 | qtcb_port->cb_util, qtcb_port->a_util); | ||
635 | kfree(qtcb_port); | ||
636 | return retval; | ||
637 | } | ||
638 | |||
639 | static int zfcp_sysfs_adapter_ex_config(struct device *dev, | ||
640 | struct fsf_statistics_info *stat_inf) | ||
641 | { | ||
642 | struct Scsi_Host *scsi_host = dev_to_shost(dev); | ||
643 | struct fsf_qtcb_bottom_config *qtcb_config; | ||
644 | struct zfcp_adapter *adapter; | ||
645 | int retval; | ||
646 | |||
647 | adapter = (struct zfcp_adapter *) scsi_host->hostdata[0]; | ||
648 | if (!(adapter->adapter_features & FSF_FEATURE_MEASUREMENT_DATA)) | ||
649 | return -EOPNOTSUPP; | ||
650 | |||
651 | qtcb_config = kzalloc(sizeof(struct fsf_qtcb_bottom_config), | ||
652 | GFP_KERNEL); | ||
653 | if (!qtcb_config) | ||
654 | return -ENOMEM; | ||
655 | |||
656 | retval = zfcp_fsf_exchange_config_data_sync(adapter, qtcb_config); | ||
657 | if (!retval) | ||
658 | *stat_inf = qtcb_config->stat_info; | ||
659 | |||
660 | kfree(qtcb_config); | ||
661 | return retval; | ||
662 | } | ||
663 | |||
664 | static ssize_t zfcp_sysfs_adapter_request_show(struct device *dev, | ||
665 | struct device_attribute *attr, | ||
666 | char *buf) | ||
667 | { | ||
668 | struct fsf_statistics_info stat_info; | ||
669 | int retval; | ||
670 | |||
671 | retval = zfcp_sysfs_adapter_ex_config(dev, &stat_info); | ||
672 | if (retval) | ||
673 | return retval; | ||
674 | |||
675 | return sprintf(buf, "%llu %llu %llu\n", | ||
676 | (unsigned long long) stat_info.input_req, | ||
677 | (unsigned long long) stat_info.output_req, | ||
678 | (unsigned long long) stat_info.control_req); | ||
679 | } | ||
680 | |||
681 | static ssize_t zfcp_sysfs_adapter_mb_show(struct device *dev, | ||
682 | struct device_attribute *attr, | ||
683 | char *buf) | ||
684 | { | ||
685 | struct fsf_statistics_info stat_info; | ||
686 | int retval; | ||
687 | |||
688 | retval = zfcp_sysfs_adapter_ex_config(dev, &stat_info); | ||
689 | if (retval) | ||
690 | return retval; | ||
691 | |||
692 | return sprintf(buf, "%llu %llu\n", | ||
693 | (unsigned long long) stat_info.input_mb, | ||
694 | (unsigned long long) stat_info.output_mb); | ||
695 | } | ||
696 | |||
697 | static ssize_t zfcp_sysfs_adapter_sec_active_show(struct device *dev, | ||
698 | struct device_attribute *attr, | ||
699 | char *buf) | ||
700 | { | ||
701 | struct fsf_statistics_info stat_info; | ||
702 | int retval; | ||
703 | |||
704 | retval = zfcp_sysfs_adapter_ex_config(dev, &stat_info); | ||
705 | if (retval) | ||
706 | return retval; | ||
707 | |||
708 | return sprintf(buf, "%llu\n", | ||
709 | (unsigned long long) stat_info.seconds_act); | ||
710 | } | ||
711 | |||
712 | static DEVICE_ATTR(utilization, S_IRUGO, zfcp_sysfs_adapter_util_show, NULL); | ||
713 | static DEVICE_ATTR(requests, S_IRUGO, zfcp_sysfs_adapter_request_show, NULL); | ||
714 | static DEVICE_ATTR(megabytes, S_IRUGO, zfcp_sysfs_adapter_mb_show, NULL); | ||
715 | static DEVICE_ATTR(seconds_active, S_IRUGO, | ||
716 | zfcp_sysfs_adapter_sec_active_show, NULL); | ||
717 | |||
718 | static struct device_attribute *zfcp_a_stats_attrs[] = { | ||
719 | &dev_attr_utilization, | ||
720 | &dev_attr_requests, | ||
721 | &dev_attr_megabytes, | ||
722 | &dev_attr_seconds_active, | ||
723 | NULL | ||
724 | }; | ||
725 | |||
726 | struct zfcp_data zfcp_data = { | 523 | struct zfcp_data zfcp_data = { |
727 | .scsi_host_template = { | 524 | .scsi_host_template = { |
728 | .name = "zfcp", | 525 | .name = "zfcp", |
@@ -743,7 +540,6 @@ struct zfcp_data zfcp_data = { | |||
743 | .use_clustering = 1, | 540 | .use_clustering = 1, |
744 | .sdev_attrs = zfcp_sysfs_sdev_attrs, | 541 | .sdev_attrs = zfcp_sysfs_sdev_attrs, |
745 | .max_sectors = (ZFCP_MAX_SBALES_PER_REQ * 8), | 542 | .max_sectors = (ZFCP_MAX_SBALES_PER_REQ * 8), |
746 | .shost_attrs = zfcp_a_stats_attrs, | 543 | .shost_attrs = zfcp_sysfs_shost_attrs, |
747 | }, | 544 | }, |
748 | }; | 545 | }; |
749 | |||