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

qla2xxx: Add DebugFS node to display Port Database

Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: default avatarGiridhar Malavali <giridhar.malavali@cavium.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 15f30a57
...@@ -3300,6 +3300,8 @@ struct qlt_hw_data { ...@@ -3300,6 +3300,8 @@ struct qlt_hw_data {
uint8_t tgt_node_name[WWN_SIZE]; uint8_t tgt_node_name[WWN_SIZE];
struct dentry *dfs_tgt_sess; struct dentry *dfs_tgt_sess;
struct dentry *dfs_tgt_port_database;
struct list_head q_full_list; struct list_head q_full_list;
uint32_t num_pend_cmds; uint32_t num_pend_cmds;
uint32_t num_qfull_cmds_alloc; uint32_t num_qfull_cmds_alloc;
......
...@@ -19,11 +19,11 @@ qla2x00_dfs_tgt_sess_show(struct seq_file *s, void *unused) ...@@ -19,11 +19,11 @@ qla2x00_dfs_tgt_sess_show(struct seq_file *s, void *unused)
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
unsigned long flags; unsigned long flags;
struct fc_port *sess = NULL; struct fc_port *sess = NULL;
struct qla_tgt *tgt= vha->vha_tgt.qla_tgt; struct qla_tgt *tgt = vha->vha_tgt.qla_tgt;
seq_printf(s, "%s\n",vha->host_str); seq_printf(s, "%s\n", vha->host_str);
if (tgt) { 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); spin_lock_irqsave(&ha->tgt.sess_lock, flags);
list_for_each_entry(sess, &vha->vp_fcports, list) list_for_each_entry(sess, &vha->vp_fcports, list)
...@@ -44,7 +44,6 @@ qla2x00_dfs_tgt_sess_open(struct inode *inode, struct file *file) ...@@ -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); return single_open(file, qla2x00_dfs_tgt_sess_show, vha);
} }
static const struct file_operations dfs_tgt_sess_ops = { static const struct file_operations dfs_tgt_sess_ops = {
.open = qla2x00_dfs_tgt_sess_open, .open = qla2x00_dfs_tgt_sess_open,
.read = seq_read, .read = seq_read,
...@@ -52,6 +51,78 @@ static const struct file_operations dfs_tgt_sess_ops = { ...@@ -52,6 +51,78 @@ static const struct file_operations dfs_tgt_sess_ops = {
.release = single_release, .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 static int
qla_dfs_fw_resource_cnt_show(struct seq_file *s, void *unused) qla_dfs_fw_resource_cnt_show(struct seq_file *s, void *unused)
{ {
...@@ -296,6 +367,14 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha) ...@@ -296,6 +367,14 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha)
goto out; 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, ha->dfs_fce = debugfs_create_file("fce", S_IRUSR, ha->dfs_dir, vha,
&dfs_fce_ops); &dfs_fce_ops);
if (!ha->dfs_fce) { if (!ha->dfs_fce) {
...@@ -326,6 +405,11 @@ qla2x00_dfs_remove(scsi_qla_host_t *vha) ...@@ -326,6 +405,11 @@ qla2x00_dfs_remove(scsi_qla_host_t *vha)
ha->tgt.dfs_tgt_sess = NULL; 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) { if (ha->dfs_fw_resource_cnt) {
debugfs_remove(ha->dfs_fw_resource_cnt); debugfs_remove(ha->dfs_fw_resource_cnt);
ha->dfs_fw_resource_cnt = NULL; ha->dfs_fw_resource_cnt = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment