1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/kernel.h>
17#include <linux/types.h>
18#include <linux/pci.h>
19#include <linux/interrupt.h>
20#include <linux/compat.h>
21#include <linux/uio.h>
22
23#include <scsi/scsi.h>
24#include <scsi/scsi_device.h>
25#include <scsi/scsi_host.h>
26#include "mpt3sas_base.h"
27#include <linux/debugfs.h>
28
29static struct dentry *mpt3sas_debugfs_root;
30
31
32
33
34
35
36
37
38
39static ssize_t
40_debugfs_iocdump_read(struct file *filp, char __user *ubuf, size_t cnt,
41 loff_t *ppos)
42
43{
44 struct mpt3sas_debugfs_buffer *debug = filp->private_data;
45
46 if (!debug || !debug->buf)
47 return 0;
48
49 return simple_read_from_buffer(ubuf, cnt, ppos, debug->buf, debug->len);
50}
51
52
53
54
55static int
56_debugfs_iocdump_open(struct inode *inode, struct file *file)
57{
58 struct MPT3SAS_ADAPTER *ioc = inode->i_private;
59 struct mpt3sas_debugfs_buffer *debug;
60
61 debug = kzalloc(sizeof(struct mpt3sas_debugfs_buffer), GFP_KERNEL);
62 if (!debug)
63 return -ENOMEM;
64
65 debug->buf = (void *)ioc;
66 debug->len = sizeof(struct MPT3SAS_ADAPTER);
67 file->private_data = debug;
68 return 0;
69}
70
71
72
73
74
75
76static int
77_debugfs_iocdump_release(struct inode *inode, struct file *file)
78{
79 struct mpt3sas_debugfs_buffer *debug = file->private_data;
80
81 if (!debug)
82 return 0;
83
84 file->private_data = NULL;
85 kfree(debug);
86 return 0;
87}
88
89static const struct file_operations mpt3sas_debugfs_iocdump_fops = {
90 .owner = THIS_MODULE,
91 .open = _debugfs_iocdump_open,
92 .read = _debugfs_iocdump_read,
93 .release = _debugfs_iocdump_release,
94};
95
96
97
98
99void mpt3sas_init_debugfs(void)
100{
101 mpt3sas_debugfs_root = debugfs_create_dir("mpt3sas", NULL);
102 if (!mpt3sas_debugfs_root)
103 pr_info("mpt3sas: Cannot create debugfs root\n");
104}
105
106
107
108
109void mpt3sas_exit_debugfs(void)
110{
111 debugfs_remove_recursive(mpt3sas_debugfs_root);
112}
113
114
115
116
117
118void
119mpt3sas_setup_debugfs(struct MPT3SAS_ADAPTER *ioc)
120{
121 char name[64];
122
123 snprintf(name, sizeof(name), "scsi_host%d", ioc->shost->host_no);
124 if (!ioc->debugfs_root) {
125 ioc->debugfs_root =
126 debugfs_create_dir(name, mpt3sas_debugfs_root);
127 if (!ioc->debugfs_root) {
128 dev_err(&ioc->pdev->dev,
129 "Cannot create per adapter debugfs directory\n");
130 return;
131 }
132 }
133
134 snprintf(name, sizeof(name), "ioc_dump");
135 ioc->ioc_dump = debugfs_create_file(name, 0444,
136 ioc->debugfs_root, ioc, &mpt3sas_debugfs_iocdump_fops);
137 if (!ioc->ioc_dump) {
138 dev_err(&ioc->pdev->dev,
139 "Cannot create ioc_dump debugfs file\n");
140 debugfs_remove(ioc->debugfs_root);
141 return;
142 }
143
144 snprintf(name, sizeof(name), "host_recovery");
145 debugfs_create_u8(name, 0444, ioc->debugfs_root, &ioc->shost_recovery);
146
147}
148
149
150
151
152
153void mpt3sas_destroy_debugfs(struct MPT3SAS_ADAPTER *ioc)
154{
155 debugfs_remove_recursive(ioc->debugfs_root);
156}
157
158