2 * Copyright (c) 2013, Cisco Systems, Inc. All rights reserved.
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34 #include <linux/debugfs.h>
37 #include "usnic_log.h"
38 #include "usnic_debugfs.h"
39 #include "usnic_ib_qp_grp.h"
40 #include "usnic_transport.h"
42 static struct dentry
*debugfs_root
;
43 static struct dentry
*flows_dentry
;
45 static ssize_t
usnic_debugfs_buildinfo_read(struct file
*f
, char __user
*data
,
46 size_t count
, loff_t
*ppos
)
54 res
= scnprintf(buf
, sizeof(buf
),
57 DRV_VERSION
, DRV_RELDATE
);
59 return simple_read_from_buffer(data
, count
, ppos
, buf
, res
);
62 static const struct file_operations usnic_debugfs_buildinfo_ops
= {
65 .read
= usnic_debugfs_buildinfo_read
68 static ssize_t
flowinfo_read(struct file
*f
, char __user
*data
,
69 size_t count
, loff_t
*ppos
)
71 struct usnic_ib_qp_grp_flow
*qp_flow
;
77 qp_flow
= f
->private_data
;
84 spin_lock(&qp_flow
->qp_grp
->lock
);
85 n
= scnprintf(ptr
, left
,
86 "QP Grp ID: %d Transport: %s ",
87 qp_flow
->qp_grp
->grp_id
,
88 usnic_transport_to_str(qp_flow
->trans_type
));
89 UPDATE_PTR_LEFT(n
, ptr
, left
);
90 if (qp_flow
->trans_type
== USNIC_TRANSPORT_ROCE_CUSTOM
) {
91 n
= scnprintf(ptr
, left
, "Port_Num:%hu\n",
92 qp_flow
->usnic_roce
.port_num
);
93 UPDATE_PTR_LEFT(n
, ptr
, left
);
94 } else if (qp_flow
->trans_type
== USNIC_TRANSPORT_IPV4_UDP
) {
95 n
= usnic_transport_sock_to_str(ptr
, left
,
97 UPDATE_PTR_LEFT(n
, ptr
, left
);
98 n
= scnprintf(ptr
, left
, "\n");
99 UPDATE_PTR_LEFT(n
, ptr
, left
);
101 spin_unlock(&qp_flow
->qp_grp
->lock
);
103 return simple_read_from_buffer(data
, count
, ppos
, buf
, ptr
- buf
);
106 static const struct file_operations flowinfo_ops
= {
107 .owner
= THIS_MODULE
,
109 .read
= flowinfo_read
,
112 void usnic_debugfs_init(void)
114 debugfs_root
= debugfs_create_dir(DRV_NAME
, NULL
);
116 flows_dentry
= debugfs_create_dir("flows", debugfs_root
);
118 debugfs_create_file("build-info", S_IRUGO
, debugfs_root
,
119 NULL
, &usnic_debugfs_buildinfo_ops
);
122 void usnic_debugfs_exit(void)
124 debugfs_remove_recursive(debugfs_root
);
128 void usnic_debugfs_flow_add(struct usnic_ib_qp_grp_flow
*qp_flow
)
130 scnprintf(qp_flow
->dentry_name
, sizeof(qp_flow
->dentry_name
),
131 "%u", qp_flow
->flow
->flow_id
);
132 qp_flow
->dbgfs_dentry
= debugfs_create_file(qp_flow
->dentry_name
,
139 void usnic_debugfs_flow_remove(struct usnic_ib_qp_grp_flow
*qp_flow
)
141 debugfs_remove(qp_flow
->dbgfs_dentry
);