scsi: qedf: Enable basic FDMI information.
authorChad Dupuis <chad.dupuis@cavium.com>
Wed, 31 May 2017 13:33:48 +0000 (06:33 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 Jun 2017 00:48:05 +0000 (20:48 -0400)
For libfc to register FDMI attributes we need to do two things:

- Set the appropriate fc_host attributes that libfc will use to form the
  FDMI registration commands
- Set lport->fdmi_enabled to 1

Signed-off-by: Chad Dupuis <chad.dupuis@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qedf/qedf_main.c

index a5c97342fd5d2bc5f9826d34974e8d7b7c285dd3..7313bda304e0413053c3697ef3d22f56b2f28926 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/if_vlan.h>
 #include <linux/cpu.h>
 #include "qedf.h"
+#include <uapi/linux/pci_regs.h>
 
 const struct qed_fcoe_ops *qed_ops;
 
@@ -1334,6 +1335,59 @@ static void qedf_fcoe_ctlr_setup(struct qedf_ctx *qedf)
        ether_addr_copy(qedf->ctlr.ctl_src_addr, qedf->mac);
 }
 
+static void qedf_setup_fdmi(struct qedf_ctx *qedf)
+{
+       struct fc_lport *lport = qedf->lport;
+       struct fc_host_attrs *fc_host = shost_to_fc_host(lport->host);
+       u8 buf[8];
+       int i, pos;
+
+       /*
+        * fdmi_enabled needs to be set for libfc to execute FDMI registration.
+        */
+       lport->fdmi_enabled = 1;
+
+       /*
+        * Setup the necessary fc_host attributes to that will be used to fill
+        * in the FDMI information.
+        */
+
+       /* Get the PCI-e Device Serial Number Capability */
+       pos = pci_find_ext_capability(qedf->pdev, PCI_EXT_CAP_ID_DSN);
+       if (pos) {
+               pos += 4;
+               for (i = 0; i < 8; i++)
+                       pci_read_config_byte(qedf->pdev, pos + i, &buf[i]);
+
+               snprintf(fc_host->serial_number,
+                   sizeof(fc_host->serial_number),
+                   "%02X%02X%02X%02X%02X%02X%02X%02X",
+                   buf[7], buf[6], buf[5], buf[4],
+                   buf[3], buf[2], buf[1], buf[0]);
+       } else
+               snprintf(fc_host->serial_number,
+                   sizeof(fc_host->serial_number), "Unknown");
+
+       snprintf(fc_host->manufacturer,
+           sizeof(fc_host->manufacturer), "%s", "Cavium Inc.");
+
+       snprintf(fc_host->model, sizeof(fc_host->model), "%s", "QL41000");
+
+       snprintf(fc_host->model_description, sizeof(fc_host->model_description),
+           "%s", "QLogic FastLinQ QL41000 Series 10/25/40/50GGbE Controller"
+           "(FCoE)");
+
+       snprintf(fc_host->hardware_version, sizeof(fc_host->hardware_version),
+           "Rev %d", qedf->pdev->revision);
+
+       snprintf(fc_host->driver_version, sizeof(fc_host->driver_version),
+           "%s", QEDF_VERSION);
+
+       snprintf(fc_host->firmware_version, sizeof(fc_host->firmware_version),
+           "%d.%d.%d.%d", FW_MAJOR_VERSION, FW_MINOR_VERSION,
+           FW_REVISION_VERSION, FW_ENGINEERING_VERSION);
+}
+
 static int qedf_lport_setup(struct qedf_ctx *qedf)
 {
        struct fc_lport *lport = qedf->lport;
@@ -1377,6 +1431,8 @@ static int qedf_lport_setup(struct qedf_ctx *qedf)
        snprintf(fc_host_symbolic_name(lport->host), 256,
            "QLogic %s v%s", QEDF_MODULE_NAME, QEDF_VERSION);
 
+       qedf_setup_fdmi(qedf);
+
        return 0;
 }