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>
35 #include <linux/module.h>
38 #include "usnic_log.h"
39 #include "usnic_debugfs.h"
40 #include "usnic_ib_qp_grp.h"
41 #include "usnic_transport.h"
43 static struct dentry
*debugfs_root
;
44 static struct dentry
*flows_dentry
;
46 static ssize_t
usnic_debugfs_buildinfo_read(struct file
*f
, char __user
*data
,
47 size_t count
, loff_t
*ppos
)
55 res
= scnprintf(buf
, sizeof(buf
),
58 DRV_VERSION
, DRV_RELDATE
);
60 return simple_read_from_buffer(data
, count
, ppos
, buf
, res
);
63 static const struct file_operations usnic_debugfs_buildinfo_ops
= {
66 .read
= usnic_debugfs_buildinfo_read
69 static ssize_t
flowinfo_read(struct file
*f
, char __user
*data
,
70 size_t count
, loff_t
*ppos
)
72 struct usnic_ib_qp_grp_flow
*qp_flow
;
78 qp_flow
= f
->private_data
;
85 spin_lock(&qp_flow
->qp_grp
->lock
);
86 n
= scnprintf(ptr
, left
,
87 "QP Grp ID: %d Transport: %s ",
88 qp_flow
->qp_grp
->grp_id
,
89 usnic_transport_to_str(qp_flow
->trans_type
));
90 UPDATE_PTR_LEFT(n
, ptr
, left
);
91 if (qp_flow
->trans_type
== USNIC_TRANSPORT_ROCE_CUSTOM
) {
92 n
= scnprintf(ptr
, left
, "Port_Num:%hu\n",
93 qp_flow
->usnic_roce
.port_num
);
94 UPDATE_PTR_LEFT(n
, ptr
, left
);
95 } else if (qp_flow
->trans_type
== USNIC_TRANSPORT_IPV4_UDP
) {
96 n
= usnic_transport_sock_to_str(ptr
, left
,
98 UPDATE_PTR_LEFT(n
, ptr
, left
);
99 n
= scnprintf(ptr
, left
, "\n");
100 UPDATE_PTR_LEFT(n
, ptr
, left
);
102 spin_unlock(&qp_flow
->qp_grp
->lock
);
104 return simple_read_from_buffer(data
, count
, ppos
, buf
, ptr
- buf
);
107 static const struct file_operations flowinfo_ops
= {
108 .owner
= THIS_MODULE
,
110 .read
= flowinfo_read
,
113 void usnic_debugfs_init(void)
115 debugfs_root
= debugfs_create_dir(DRV_NAME
, NULL
);
117 flows_dentry
= debugfs_create_dir("flows", debugfs_root
);
119 debugfs_create_file("build-info", S_IRUGO
, debugfs_root
,
120 NULL
, &usnic_debugfs_buildinfo_ops
);
123 void usnic_debugfs_exit(void)
125 debugfs_remove_recursive(debugfs_root
);
129 void usnic_debugfs_flow_add(struct usnic_ib_qp_grp_flow
*qp_flow
)
131 scnprintf(qp_flow
->dentry_name
, sizeof(qp_flow
->dentry_name
),
132 "%u", qp_flow
->flow
->flow_id
);
133 qp_flow
->dbgfs_dentry
= debugfs_create_file(qp_flow
->dentry_name
,
140 void usnic_debugfs_flow_remove(struct usnic_ib_qp_grp_flow
*qp_flow
)
142 debugfs_remove(qp_flow
->dbgfs_dentry
);