Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5185b328 authored by Chad Dupuis's avatar Chad Dupuis Committed by Martin K. Petersen
Browse files

scsi: qedf: Enable basic FDMI information.



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: default avatarChad Dupuis <chad.dupuis@cavium.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 96e6c633
Loading
Loading
Loading
Loading
+56 −0
Original line number Diff line number Diff line
@@ -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;
}