Commit e7dee22e authored by Jijie Shao's avatar Jijie Shao Committed by Hao Chen
Browse files

net: hibmcge: Add debugfs supported in this module

maillist inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IBM1QO
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=86331b510260



----------------------------------------------------------------------

This patch initializes debugfs and creates root directory
for each device. The tx_ring and rx_ring debugfs files
are implemented together.

Signed-off-by: default avatarJijie Shao <shaojijie@huawei.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20241216040532.1566229-2-shaojijie@huawei.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarHao Chen <chenhao418@huawei.com>
parent 7dbe3b37
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -5,4 +5,5 @@

obj-$(CONFIG_HIBMCGE) += hibmcge.o

hibmcge-objs = hbg_main.o hbg_hw.o hbg_mdio.o hbg_irq.o hbg_txrx.o hbg_ethtool.o
hibmcge-objs = hbg_main.o hbg_hw.o hbg_mdio.o hbg_irq.o hbg_txrx.o hbg_ethtool.o \
		hbg_debugfs.o
+94 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0+
// Copyright (c) 2024 Hisilicon Limited.

#include <linux/debugfs.h>
#include <linux/device.h>
#include <linux/etherdevice.h>
#include <linux/seq_file.h>
#include <linux/string_choices.h>
#include "hbg_common.h"
#include "hbg_debugfs.h"
#include "hbg_hw.h"
#include "hbg_irq.h"
#include "hbg_txrx.h"

static struct dentry *hbg_dbgfs_root;

struct hbg_dbg_info {
	const char *name;
	int (*read)(struct seq_file *seq, void *data);
};

static void hbg_dbg_ring(struct hbg_priv *priv, struct hbg_ring *ring,
			 struct seq_file *s)
{
	u32 irq_mask = ring->dir == HBG_DIR_TX ? HBG_INT_MSK_TX_B :
						 HBG_INT_MSK_RX_B;

	seq_printf(s, "ring used num: %u\n",
		   hbg_get_queue_used_num(ring));
	seq_printf(s, "ring max num: %u\n", ring->len);
	seq_printf(s, "ring head: %u, tail: %u\n", ring->head, ring->tail);
	seq_printf(s, "fifo used num: %u\n",
		   hbg_hw_get_fifo_used_num(priv, ring->dir));
	seq_printf(s, "fifo max num: %u\n",
		   hbg_get_spec_fifo_max_num(priv, ring->dir));
	seq_printf(s, "irq enabled: %s\n",
		   str_true_false(hbg_hw_irq_is_enabled(priv, irq_mask)));
}

static int hbg_dbg_tx_ring(struct seq_file *s, void *unused)
{
	struct net_device *netdev = dev_get_drvdata(s->private);
	struct hbg_priv *priv = netdev_priv(netdev);

	hbg_dbg_ring(priv, &priv->tx_ring, s);
	return 0;
}

static int hbg_dbg_rx_ring(struct seq_file *s, void *unused)
{
	struct net_device *netdev = dev_get_drvdata(s->private);
	struct hbg_priv *priv = netdev_priv(netdev);

	hbg_dbg_ring(priv, &priv->rx_ring, s);
	return 0;
}

static const struct hbg_dbg_info hbg_dbg_infos[] = {
	{ "tx_ring", hbg_dbg_tx_ring },
	{ "rx_ring", hbg_dbg_rx_ring },
};

static void hbg_debugfs_uninit(void *data)
{
	debugfs_remove_recursive((struct dentry *)data);
}

void hbg_debugfs_init(struct hbg_priv *priv)
{
	const char *name = pci_name(priv->pdev);
	struct device *dev = &priv->pdev->dev;
	struct dentry *root;
	u32 i;

	root = debugfs_create_dir(name, hbg_dbgfs_root);

	for (i = 0; i < ARRAY_SIZE(hbg_dbg_infos); i++)
		debugfs_create_devm_seqfile(dev, hbg_dbg_infos[i].name,
					    root, hbg_dbg_infos[i].read);

	/* Ignore the failure because debugfs is not a key feature. */
	devm_add_action_or_reset(dev, hbg_debugfs_uninit, root);
}

void hbg_debugfs_register(void)
{
	hbg_dbgfs_root = debugfs_create_dir("hibmcge", NULL);
}

void hbg_debugfs_unregister(void)
{
	debugfs_remove_recursive(hbg_dbgfs_root);
	hbg_dbgfs_root = NULL;
}
+12 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0+ */
/* Copyright (c) 2024 Hisilicon Limited. */

#ifndef __HBG_DEBUGFS_H
#define __HBG_DEBUGFS_H

void hbg_debugfs_register(void);
void hbg_debugfs_unregister(void);

void hbg_debugfs_init(struct hbg_priv *priv);

#endif
+27 −2
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#include "hbg_irq.h"
#include "hbg_mdio.h"
#include "hbg_txrx.h"
#include "hbg_debugfs.h"

static void hbg_change_mtu(struct hbg_priv *priv, int new_mtu);

@@ -160,7 +161,12 @@ static int hbg_init(struct hbg_priv *priv)
	if (ret)
		return ret;

	return hbg_mdio_init(priv);
	ret = hbg_mdio_init(priv);
	if (ret)
		return ret;

	hbg_debugfs_init(priv);
	return 0;
}

static int hbg_pci_init(struct pci_dev *pdev)
@@ -245,7 +251,26 @@ static struct pci_driver hbg_driver = {
	.id_table	= hbg_pci_tbl,
	.probe		= hbg_probe,
};
module_pci_driver(hbg_driver);

static int __init hbg_module_init(void)
{
	int ret;

	hbg_debugfs_register();
	ret = pci_register_driver(&hbg_driver);
	if (ret)
		hbg_debugfs_unregister();

	return ret;
}
module_init(hbg_module_init);

static void __exit hbg_module_exit(void)
{
	pci_unregister_driver(&hbg_driver);
	hbg_debugfs_unregister();
}
module_exit(hbg_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Huawei Tech. Co., Ltd.");