2 * QLogic Fibre Channel HBA Driver
3 * Copyright (c) 2003-2005 QLogic Corporation
5 * See LICENSE.qla2xxx for copyright and licensing details.
9 #include <linux/debugfs.h>
10 #include <linux/seq_file.h>
12 static struct dentry
*qla2x00_dfs_root
;
13 static atomic_t qla2x00_dfs_root_count
;
16 qla2x00_dfs_fce_show(struct seq_file
*s
, void *unused
)
18 scsi_qla_host_t
*ha
= s
->private;
23 mutex_lock(&ha
->fce_mutex
);
25 seq_printf(s
, "FCE Trace Buffer\n");
26 <<<<<<< HEAD
:drivers
/scsi
/qla2xxx
/qla_dfs
.c
27 seq_printf(s
, "In Pointer = %llx\n\n", ha
->fce_wr
);
29 seq_printf(s
, "In Pointer = %llx\n\n", (unsigned long long)ha
->fce_wr
);
30 >>>>>>> 264e3e889d86e552b4191d69bb60f4f3b383135a
:drivers
/scsi
/qla2xxx
/qla_dfs
.c
31 seq_printf(s
, "Base = %llx\n\n", (unsigned long long) ha
->fce_dma
);
32 seq_printf(s
, "FCE Enable Registers\n");
33 seq_printf(s
, "%08x %08x %08x %08x %08x %08x\n",
34 ha
->fce_mb
[0], ha
->fce_mb
[2], ha
->fce_mb
[3], ha
->fce_mb
[4],
35 ha
->fce_mb
[5], ha
->fce_mb
[6]);
37 fce
= (uint32_t *) ha
->fce
;
38 fce_start
= (unsigned long long) ha
->fce_dma
;
39 for (cnt
= 0; cnt
< fce_calc_size(ha
->fce_bufs
) / 4; cnt
++) {
41 seq_printf(s
, "\n%llx: ",
42 (unsigned long long)((cnt
* 4) + fce_start
));
45 seq_printf(s
, "%08x", *fce
++);
48 seq_printf(s
, "\nEnd\n");
50 mutex_unlock(&ha
->fce_mutex
);
56 qla2x00_dfs_fce_open(struct inode
*inode
, struct file
*file
)
58 scsi_qla_host_t
*ha
= inode
->i_private
;
61 if (!ha
->flags
.fce_enabled
)
64 mutex_lock(&ha
->fce_mutex
);
66 /* Pause tracing to flush FCE buffers. */
67 rval
= qla2x00_disable_fce_trace(ha
, &ha
->fce_wr
, &ha
->fce_rd
);
69 qla_printk(KERN_WARNING
, ha
,
70 "DebugFS: Unable to disable FCE (%d).\n", rval
);
72 ha
->flags
.fce_enabled
= 0;
74 mutex_unlock(&ha
->fce_mutex
);
76 return single_open(file
, qla2x00_dfs_fce_show
, ha
);
80 qla2x00_dfs_fce_release(struct inode
*inode
, struct file
*file
)
82 scsi_qla_host_t
*ha
= inode
->i_private
;
85 if (ha
->flags
.fce_enabled
)
88 mutex_lock(&ha
->fce_mutex
);
90 /* Re-enable FCE tracing. */
91 ha
->flags
.fce_enabled
= 1;
92 memset(ha
->fce
, 0, fce_calc_size(ha
->fce_bufs
));
93 rval
= qla2x00_enable_fce_trace(ha
, ha
->fce_dma
, ha
->fce_bufs
,
94 ha
->fce_mb
, &ha
->fce_bufs
);
96 qla_printk(KERN_WARNING
, ha
,
97 "DebugFS: Unable to reinitialize FCE (%d).\n", rval
);
98 ha
->flags
.fce_enabled
= 0;
101 mutex_unlock(&ha
->fce_mutex
);
103 return single_release(inode
, file
);
106 static const struct file_operations dfs_fce_ops
= {
107 .open
= qla2x00_dfs_fce_open
,
110 .release
= qla2x00_dfs_fce_release
,
114 qla2x00_dfs_setup(scsi_qla_host_t
*ha
)
121 if (qla2x00_dfs_root
)
124 atomic_set(&qla2x00_dfs_root_count
, 0);
125 qla2x00_dfs_root
= debugfs_create_dir(QLA2XXX_DRIVER_NAME
, NULL
);
126 if (!qla2x00_dfs_root
) {
127 qla_printk(KERN_NOTICE
, ha
,
128 "DebugFS: Unable to create root directory.\n");
136 mutex_init(&ha
->fce_mutex
);
137 ha
->dfs_dir
= debugfs_create_dir(ha
->host_str
, qla2x00_dfs_root
);
139 qla_printk(KERN_NOTICE
, ha
,
140 "DebugFS: Unable to create ha directory.\n");
144 atomic_inc(&qla2x00_dfs_root_count
);
147 ha
->dfs_fce
= debugfs_create_file("fce", S_IRUSR
, ha
->dfs_dir
, ha
,
150 qla_printk(KERN_NOTICE
, ha
,
151 "DebugFS: Unable to fce node.\n");
159 qla2x00_dfs_remove(scsi_qla_host_t
*ha
)
162 debugfs_remove(ha
->dfs_fce
);
167 debugfs_remove(ha
->dfs_dir
);
169 atomic_dec(&qla2x00_dfs_root_count
);
172 if (atomic_read(&qla2x00_dfs_root_count
) == 0 &&
174 debugfs_remove(qla2x00_dfs_root
);
175 qla2x00_dfs_root
= NULL
;