]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: hibmcge: Add debugfs supported in this module
authorJijie Shao <shaojijie@huawei.com>
Mon, 16 Dec 2024 04:05:26 +0000 (12:05 +0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 18 Dec 2024 04:01:38 +0000 (20:01 -0800)
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>
drivers/net/ethernet/hisilicon/hibmcge/Makefile
drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.c [new file with mode: 0644]
drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.h [new file with mode: 0644]
drivers/net/ethernet/hisilicon/hibmcge/hbg_main.c

index ae58ac38c206ef684850f5d2116e04935f956513..1a0ec2fb8c24d7a461aabe2cb81fa1387e213fe1 100644 (file)
@@ -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
diff --git a/drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.c b/drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.c
new file mode 100644 (file)
index 0000000..773a643
--- /dev/null
@@ -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;
+}
diff --git a/drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.h b/drivers/net/ethernet/hisilicon/hibmcge/hbg_debugfs.h
new file mode 100644 (file)
index 0000000..80670d6
--- /dev/null
@@ -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
index 75505fb5cc4a57663c85794f753bd2fad77071dd..7a03fdfa32a75087897d6b95239da5abdd9e1365 100644 (file)
@@ -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.");