Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20572ee1 authored by Logan Gunthorpe's avatar Logan Gunthorpe Committed by Jon Mason
Browse files

ntb_pingpong: Add a debugfs file to get the ping count



This commit adds a debugfs 'count' file to ntb_pingpong. This is so
testing with ntb_pingpong can be automated beyond just checking the
logs for pong messages.

The count file returns a number which increments every pong. The
counter can be cleared by writing a zero.

Signed-off-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Acked-by: default avatarAllen Hubbe <Allen.Hubbe@emc.com>
Signed-off-by: default avatarJon Mason <jdmason@kudzu.us>
parent bfcaa396
Loading
Loading
Loading
Loading
+61 −1
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@
#include <linux/pci.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/debugfs.h>

#include <linux/ntb.h>

@@ -96,8 +97,13 @@ struct pp_ctx {
	spinlock_t			db_lock;
	struct timer_list		db_timer;
	unsigned long			db_delay;
	struct dentry			*debugfs_node_dir;
	struct dentry			*debugfs_count;
	atomic_t			count;
};

static struct dentry *pp_debugfs_dir;

static void pp_ping(unsigned long ctx)
{
	struct pp_ctx *pp = (void *)ctx;
@@ -171,10 +177,32 @@ static void pp_db_event(void *ctx, int vec)
		dev_dbg(&pp->ntb->dev,
			"Pong vec %d bits %#llx\n",
			vec, db_bits);
		atomic_inc(&pp->count);
	}
	spin_unlock_irqrestore(&pp->db_lock, irqflags);
}

static int pp_debugfs_setup(struct pp_ctx *pp)
{
	struct pci_dev *pdev = pp->ntb->pdev;

	if (!pp_debugfs_dir)
		return -ENODEV;

	pp->debugfs_node_dir = debugfs_create_dir(pci_name(pdev),
						  pp_debugfs_dir);
	if (!pp->debugfs_node_dir)
		return -ENODEV;

	pp->debugfs_count = debugfs_create_atomic_t("count", S_IRUSR | S_IWUSR,
						    pp->debugfs_node_dir,
						    &pp->count);
	if (!pp->debugfs_count)
		return -ENODEV;

	return 0;
}

static const struct ntb_ctx_ops pp_ops = {
	.link_event = pp_link_event,
	.db_event = pp_db_event,
@@ -210,6 +238,7 @@ static int pp_probe(struct ntb_client *client,

	pp->ntb = ntb;
	pp->db_bits = 0;
	atomic_set(&pp->count, 0);
	spin_lock_init(&pp->db_lock);
	setup_timer(&pp->db_timer, pp_ping, (unsigned long)pp);
	pp->db_delay = msecs_to_jiffies(delay_ms);
@@ -218,6 +247,10 @@ static int pp_probe(struct ntb_client *client,
	if (rc)
		goto err_ctx;

	rc = pp_debugfs_setup(pp);
	if (rc)
		goto err_ctx;

	ntb_link_enable(ntb, NTB_SPEED_AUTO, NTB_WIDTH_AUTO);
	ntb_link_event(ntb);

@@ -234,6 +267,8 @@ static void pp_remove(struct ntb_client *client,
{
	struct pp_ctx *pp = ntb->ctx;

	debugfs_remove_recursive(pp->debugfs_node_dir);

	ntb_clear_ctx(ntb);
	del_timer_sync(&pp->db_timer);
	ntb_link_disable(ntb);
@@ -247,4 +282,29 @@ static struct ntb_client pp_client = {
		.remove = pp_remove,
	},
};
module_ntb_client(pp_client);

static int __init pp_init(void)
{
	int rc;

	if (debugfs_initialized())
		pp_debugfs_dir = debugfs_create_dir(KBUILD_MODNAME, NULL);

	rc = ntb_register_client(&pp_client);
	if (rc)
		goto err_client;

	return 0;

err_client:
	debugfs_remove_recursive(pp_debugfs_dir);
	return rc;
}
module_init(pp_init);

static void __exit pp_exit(void)
{
	ntb_unregister_client(&pp_client);
	debugfs_remove_recursive(pp_debugfs_dir);
}
module_exit(pp_exit);