scsi: qla2xxx: Add sysfs node for D-Port Diagnostics AEN data
authorJoe Carnuccio <joe.carnuccio@cavium.com>
Wed, 12 Feb 2020 21:44:14 +0000 (13:44 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 21 Feb 2020 23:31:00 +0000 (18:31 -0500)
This patch adds sysfs node to show D-Port diag data.

Link: https://lore.kernel.org/r/20200212214436.25532-4-hmadhani@marvell.com
Signed-off-by: Joe Carnuccio <joe.carnuccio@cavium.com>
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_isr.c

index d6a59c9..401b5ee 100644 (file)
@@ -2323,6 +2323,26 @@ qla2x00_port_no_show(struct device *dev, struct device_attribute *attr,
        return scnprintf(buf, PAGE_SIZE, "%u\n", vha->hw->port_no);
 }
 
+static ssize_t
+qla2x00_dport_diagnostics_show(struct device *dev,
+       struct device_attribute *attr, char *buf)
+{
+       scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
+
+       if (!IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw) &&
+           !IS_QLA28XX(vha->hw))
+               return scnprintf(buf, PAGE_SIZE, "\n");
+
+       if (!*vha->dport_data)
+               return scnprintf(buf, PAGE_SIZE, "\n");
+
+       return scnprintf(buf, PAGE_SIZE, "%04x %04x %04x %04x\n",
+           vha->dport_data[0], vha->dport_data[1],
+           vha->dport_data[2], vha->dport_data[3]);
+}
+static DEVICE_ATTR(dport_diagnostics, 0444,
+          qla2x00_dport_diagnostics_show, NULL);
+
 static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_driver_version_show, NULL);
 static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
 static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);
@@ -2431,6 +2451,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
        &dev_attr_port_speed,
        &dev_attr_port_no,
        &dev_attr_fw_attr,
+       &dev_attr_dport_diagnostics,
        NULL, /* reserve for qlini_mode */
        NULL, /* reserve for ql2xiniexchg */
        NULL, /* reserve for ql2xexchoffld */
index b596438..22f859b 100644 (file)
@@ -4541,6 +4541,7 @@ typedef struct scsi_qla_host {
        uint8_t n2n_node_name[WWN_SIZE];
        uint8_t n2n_port_name[WWN_SIZE];
        uint16_t        n2n_id;
+       __le16 dport_data[4];
        struct list_head gpnid_list;
        struct fab_scan scan;
 
index e40705d..73b6cfd 100644 (file)
@@ -1254,6 +1254,7 @@ global_port_update:
                ql_dbg(ql_dbg_async, vha, 0x5052,
                    "D-Port Diagnostics: %04x %04x %04x %04x\n",
                    mb[0], mb[1], mb[2], mb[3]);
+               memcpy(vha->dport_data, mb, sizeof(vha->dport_data));
                if (IS_QLA83XX(ha) || IS_QLA27XX(ha) || IS_QLA28XX(ha)) {
                        static char *results[] = {
                            "start", "done(pass)", "done(error)", "undefined" };