mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-06 08:47:44 -04:00
net: hibmcge: Add debugfs supported in this module
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: Jijie Shao <shaojijie@huawei.com> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/20241216040532.1566229-2-shaojijie@huawei.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
95dcfdff8b
commit
86331b5102
@@ -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
drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.c
Normal file
94
drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.c
Normal file
@@ -0,0 +1,94 @@
|
||||
// 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
drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.h
Normal file
12
drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.h
Normal file
@@ -0,0 +1,12 @@
|
||||
/* 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
|
||||
@@ -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.");
|
||||
|
||||
Reference in New Issue
Block a user