diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2009-06-03 12:55:14 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-06-08 15:46:36 -0400 |
commit | 11bbc1d896637c1d83b11cc3b97ed3d6d2076c63 (patch) | |
tree | a3c9ac3bbf1b09a8ece52496ada28316f06ecd09 /drivers/scsi/qla2xxx/qla_attr.c | |
parent | ce0423f4a23317d0166addd7d6fcc4a0fa95e751 (diff) |
[SCSI] qla2xxx: Export TLV data on supported ISPs.
Firmware currently provides PB and PGF TLVs.
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_attr.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index e8c1c9e01a7b..9aa00f25aa6a 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -744,6 +744,57 @@ static struct bin_attribute sysfs_xgmac_stats_attr = { | |||
744 | .read = qla2x00_sysfs_read_xgmac_stats, | 744 | .read = qla2x00_sysfs_read_xgmac_stats, |
745 | }; | 745 | }; |
746 | 746 | ||
747 | static ssize_t | ||
748 | qla2x00_sysfs_read_dcbx_tlv(struct kobject *kobj, | ||
749 | struct bin_attribute *bin_attr, | ||
750 | char *buf, loff_t off, size_t count) | ||
751 | { | ||
752 | struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj, | ||
753 | struct device, kobj))); | ||
754 | struct qla_hw_data *ha = vha->hw; | ||
755 | int rval; | ||
756 | uint16_t actual_size; | ||
757 | |||
758 | if (!capable(CAP_SYS_ADMIN) || off != 0 || count > DCBX_TLV_DATA_SIZE) | ||
759 | return 0; | ||
760 | |||
761 | if (ha->dcbx_tlv) | ||
762 | goto do_read; | ||
763 | |||
764 | ha->dcbx_tlv = dma_alloc_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE, | ||
765 | &ha->dcbx_tlv_dma, GFP_KERNEL); | ||
766 | if (!ha->dcbx_tlv) { | ||
767 | qla_printk(KERN_WARNING, ha, | ||
768 | "Unable to allocate memory for DCBX TLV read-data.\n"); | ||
769 | return 0; | ||
770 | } | ||
771 | |||
772 | do_read: | ||
773 | actual_size = 0; | ||
774 | memset(ha->dcbx_tlv, 0, DCBX_TLV_DATA_SIZE); | ||
775 | |||
776 | rval = qla2x00_get_dcbx_params(vha, ha->dcbx_tlv_dma, | ||
777 | DCBX_TLV_DATA_SIZE); | ||
778 | if (rval != QLA_SUCCESS) { | ||
779 | qla_printk(KERN_WARNING, ha, | ||
780 | "Unable to read DCBX TLV data (%x).\n", rval); | ||
781 | count = 0; | ||
782 | } | ||
783 | |||
784 | memcpy(buf, ha->dcbx_tlv, count); | ||
785 | |||
786 | return count; | ||
787 | } | ||
788 | |||
789 | static struct bin_attribute sysfs_dcbx_tlv_attr = { | ||
790 | .attr = { | ||
791 | .name = "dcbx_tlv", | ||
792 | .mode = S_IRUSR, | ||
793 | }, | ||
794 | .size = 0, | ||
795 | .read = qla2x00_sysfs_read_dcbx_tlv, | ||
796 | }; | ||
797 | |||
747 | static struct sysfs_entry { | 798 | static struct sysfs_entry { |
748 | char *name; | 799 | char *name; |
749 | struct bin_attribute *attr; | 800 | struct bin_attribute *attr; |
@@ -759,6 +810,7 @@ static struct sysfs_entry { | |||
759 | { "edc", &sysfs_edc_attr, 2 }, | 810 | { "edc", &sysfs_edc_attr, 2 }, |
760 | { "edc_status", &sysfs_edc_status_attr, 2 }, | 811 | { "edc_status", &sysfs_edc_status_attr, 2 }, |
761 | { "xgmac_stats", &sysfs_xgmac_stats_attr, 3 }, | 812 | { "xgmac_stats", &sysfs_xgmac_stats_attr, 3 }, |
813 | { "dcbx_tlv", &sysfs_dcbx_tlv_attr, 3 }, | ||
762 | { NULL }, | 814 | { NULL }, |
763 | }; | 815 | }; |
764 | 816 | ||