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

Commit c423437e authored by Himanshu Madhani's avatar Himanshu Madhani Committed by Nicholas Bellinger
Browse files

qla2xxx: Add DebugFS node to display Port Database

parent 15f30a57
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3300,6 +3300,8 @@ struct qlt_hw_data {
	uint8_t tgt_node_name[WWN_SIZE];

	struct dentry *dfs_tgt_sess;
	struct dentry *dfs_tgt_port_database;

	struct list_head q_full_list;
	uint32_t num_pend_cmds;
	uint32_t num_qfull_cmds_alloc;
+88 −4
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ qla2x00_dfs_tgt_sess_show(struct seq_file *s, void *unused)

	seq_printf(s, "%s\n", vha->host_str);
	if (tgt) {
		seq_printf(s, "Port ID   Port Name                Handle\n");
		seq_puts(s, "Port ID   Port Name                Handle\n");

		spin_lock_irqsave(&ha->tgt.sess_lock, flags);
		list_for_each_entry(sess, &vha->vp_fcports, list)
@@ -44,7 +44,6 @@ qla2x00_dfs_tgt_sess_open(struct inode *inode, struct file *file)
	return single_open(file, qla2x00_dfs_tgt_sess_show, vha);
}


static const struct file_operations dfs_tgt_sess_ops = {
	.open		= qla2x00_dfs_tgt_sess_open,
	.read		= seq_read,
@@ -52,6 +51,78 @@ static const struct file_operations dfs_tgt_sess_ops = {
	.release	= single_release,
};

static int
qla2x00_dfs_tgt_port_database_show(struct seq_file *s, void *unused)
{
	scsi_qla_host_t *vha = s->private;
	struct qla_hw_data *ha = vha->hw;
	struct gid_list_info *gid_list;
	dma_addr_t gid_list_dma;
	fc_port_t fc_port;
	char *id_iter;
	int rc, i;
	uint16_t entries, loop_id;
	struct qla_tgt *tgt = vha->vha_tgt.qla_tgt;

	seq_printf(s, "%s\n", vha->host_str);
	if (tgt) {
		gid_list = dma_alloc_coherent(&ha->pdev->dev,
		    qla2x00_gid_list_size(ha),
		    &gid_list_dma, GFP_KERNEL);
		if (!gid_list) {
			ql_dbg(ql_dbg_user, vha, 0x705c,
			    "DMA allocation failed for %u\n",
			     qla2x00_gid_list_size(ha));
			return 0;
		}

		rc = qla24xx_gidlist_wait(vha, gid_list, gid_list_dma,
		    &entries);
		if (rc != QLA_SUCCESS)
			goto out_free_id_list;

		id_iter = (char *)gid_list;

		seq_puts(s, "Port Name	Port ID 	Loop ID\n");

		for (i = 0; i < entries; i++) {
			struct gid_list_info *gid =
			    (struct gid_list_info *)id_iter;
			loop_id = le16_to_cpu(gid->loop_id);
			memset(&fc_port, 0, sizeof(fc_port_t));

			fc_port.loop_id = loop_id;

			rc = qla24xx_gpdb_wait(vha, &fc_port, 0);
			seq_printf(s, "%8phC  %02x%02x%02x  %d\n",
				fc_port.port_name, fc_port.d_id.b.domain,
				fc_port.d_id.b.area, fc_port.d_id.b.al_pa,
				fc_port.loop_id);
			id_iter += ha->gid_list_info_size;
		}
out_free_id_list:
		dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
		    gid_list, gid_list_dma);
	}

	return 0;
}

static int
qla2x00_dfs_tgt_port_database_open(struct inode *inode, struct file *file)
{
	scsi_qla_host_t *vha = inode->i_private;

	return single_open(file, qla2x00_dfs_tgt_port_database_show, vha);
}

static const struct file_operations dfs_tgt_port_database_ops = {
	.open		= qla2x00_dfs_tgt_port_database_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

static int
qla_dfs_fw_resource_cnt_show(struct seq_file *s, void *unused)
{
@@ -296,6 +367,14 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha)
		goto out;
	}

	ha->tgt.dfs_tgt_port_database = debugfs_create_file("tgt_port_database",
	    S_IRUSR,  ha->dfs_dir, vha, &dfs_tgt_port_database_ops);
	if (!ha->tgt.dfs_tgt_port_database) {
		ql_log(ql_log_warn, vha, 0xffff,
		    "Unable to create debugFS tgt_port_database node.\n");
		goto out;
	}

	ha->dfs_fce = debugfs_create_file("fce", S_IRUSR, ha->dfs_dir, vha,
	    &dfs_fce_ops);
	if (!ha->dfs_fce) {
@@ -326,6 +405,11 @@ qla2x00_dfs_remove(scsi_qla_host_t *vha)
		ha->tgt.dfs_tgt_sess = NULL;
	}

	if (ha->tgt.dfs_tgt_port_database) {
		debugfs_remove(ha->tgt.dfs_tgt_port_database);
		ha->tgt.dfs_tgt_port_database = NULL;
	}

	if (ha->dfs_fw_resource_cnt) {
		debugfs_remove(ha->dfs_fw_resource_cnt);
		ha->dfs_fw_resource_cnt = NULL;