Introduce logging macros (DH_LOG_EMERG/ALERT/CRIT/ERR/WARN/INFO/DBG)
and helper definitions for ZTE DingHai driver debugging.

Signed-off-by: Junyang Han <han.junyang@zte.com.cn>
---
 drivers/net/ethernet/zte/dinghai/Makefile    |  2 +-
 drivers/net/ethernet/zte/dinghai/dh_helper.h | 79 ++++++++++++++++++++
 drivers/net/ethernet/zte/dinghai/dh_log.c    | 10 +++
 drivers/net/ethernet/zte/dinghai/dh_log.h    | 64 ++++++++++++++++
 drivers/net/ethernet/zte/dinghai/en_pf.c     | 49 ++++++++++--
 5 files changed, 196 insertions(+), 8 deletions(-)
 create mode 100644 drivers/net/ethernet/zte/dinghai/dh_helper.h
 create mode 100644 drivers/net/ethernet/zte/dinghai/dh_log.c
 create mode 100644 drivers/net/ethernet/zte/dinghai/dh_log.h

diff --git a/drivers/net/ethernet/zte/dinghai/Makefile b/drivers/net/ethernet/zte/dinghai/Makefile
index f55a8de518be..c2a815427c24 100644
--- a/drivers/net/ethernet/zte/dinghai/Makefile
+++ b/drivers/net/ethernet/zte/dinghai/Makefile
@@ -6,5 +6,5 @@
 ccflags-y += -I$(src)
 
 obj-$(CONFIG_DINGHAI_PF) += dinghai10e.o
-dinghai10e-y := en_pf.o
+dinghai10e-y := en_pf.o dh_log.o
 
diff --git a/drivers/net/ethernet/zte/dinghai/dh_helper.h b/drivers/net/ethernet/zte/dinghai/dh_helper.h
new file mode 100644
index 000000000000..3933e6d79460
--- /dev/null
+++ b/drivers/net/ethernet/zte/dinghai/dh_helper.h
@@ -0,0 +1,79 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * ZTE DingHai Ethernet driver - device-level logging helpers
+ * Copyright (c) 2022-2024, ZTE Corporation.
+ */
+
+#ifndef __DH_HELPER_H__
+#define __DH_HELPER_H__
+
+#include <linux/dev_printk.h>
+#include <linux/types.h>
+#include "dh_log.h"
+#include "en_pf.h"
+
+extern u32 dh_debug_mask;
+
+#define dh_dbg(__dev, format, ...)                    \
+    dev_dbg((__dev)->device, "%s:%d:(pid %d): " format,        \
+         __func__, __LINE__, current->pid,            \
+         ##__VA_ARGS__)
+
+#define dh_dbg_once(__dev, format, ...)                \
+    dev_dbg_once((__dev)->device,                \
+             "%s:%d:(pid %d): " format,            \
+             __func__, __LINE__, current->pid,        \
+             ##__VA_ARGS__)
+
+#define dh_dbg_mask(__dev, mask, format, ...)            \
+do {                                \
+    if ((mask) & dh_debug_mask)                \
+        dh_dbg(__dev, format, ##__VA_ARGS__);        \
+} while (0)
+
+#define dh_err(__dev, format, ...)                    \
+    dev_err((__dev)->device, "%s:%d:(pid %d): " format,        \
+        __func__, __LINE__, current->pid,            \
+        ##__VA_ARGS__)
+
+#define dh_err_rl(__dev, format, ...)                    \
+    dev_err_ratelimited((__dev)->device,                \
+                "%s:%d:(pid %d): " format,            \
+                __func__, __LINE__, current->pid,        \
+                ##__VA_ARGS__)
+
+#define dh_warn(__dev, format, ...)                    \
+    dev_warn((__dev)->device, "%s:%d:(pid %d): " format,        \
+         __func__, __LINE__, current->pid,            \
+         ##__VA_ARGS__)
+
+#define dh_warn_once(__dev, format, ...)                \
+    dev_warn_once((__dev)->device, "%s:%d:(pid %d): " format,    \
+              __func__, __LINE__, current->pid,        \
+              ##__VA_ARGS__)
+
+#define dh_warn_rl(__dev, format, ...)                    \
+    dev_warn_ratelimited((__dev)->device,                \
+                 "%s:%d:(pid %d): " format,        \
+                 __func__, __LINE__, current->pid,        \
+                 ##__VA_ARGS__)
+
+#define dh_info(__dev, format, ...)                    \
+    dev_info((__dev)->device, format, ##__VA_ARGS__)
+
+#define dh_info_rl(__dev, format, ...)                    \
+    dev_info_ratelimited((__dev)->device,                \
+                 "%s:%d:(pid %d): " format,        \
+                 __func__, __LINE__, current->pid,        \
+                 ##__VA_ARGS__)
+
+enum {
+    ZXDH_PCI_DEV_IS_VF = 1 << 0,
+};
+
+static inline bool dh_core_is_sf(const struct dh_core_dev *dev)
+{
+    return dev->coredev_type == DH_COREDEV_SF;
+}
+
+#endif /* __DH_HELPER_H__ */
diff --git a/drivers/net/ethernet/zte/dinghai/dh_log.c b/drivers/net/ethernet/zte/dinghai/dh_log.c
new file mode 100644
index 000000000000..5e6e42175e37
--- /dev/null
+++ b/drivers/net/ethernet/zte/dinghai/dh_log.c
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * ZTE DingHai Ethernet driver - logging runtime control
+ * Copyright (c) 2022-2024, ZTE Corporation.
+ */
+
+#include <linux/module.h>
+
+int debug_print;
+module_param(debug_print, int, 0644);
diff --git a/drivers/net/ethernet/zte/dinghai/dh_log.h b/drivers/net/ethernet/zte/dinghai/dh_log.h
new file mode 100644
index 000000000000..295ee306fa0d
--- /dev/null
+++ b/drivers/net/ethernet/zte/dinghai/dh_log.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * ZTE DingHai Ethernet driver - logging infrastructure
+ * Copyright (c) 2022-2024, ZTE Corporation.
+ */
+
+#ifndef __DH_LOG_H__
+#define __DH_LOG_H__
+
+#include <linux/kernel.h>
+#include <linux/printk.h>
+
+#define MODULE_CMD        "zxdh_cmd"
+#define MODULE_NP        "zxdh_np"
+#define MODULE_PF        "zxdh_pf"
+#define MODULE_PTP        "zxdh_ptp"
+#define MODULE_TSN        "zxdh_tsn"
+#define MODULE_LAG        "zxdh_lag"
+#define MODULE_DHTOOLS        "zxdh_tool"
+#define MODULE_SEC        "zxdh_sec"
+#define MODULE_MPF        "zxdh_mpf"
+#define MODULE_FUC_HP        "zxdh_func_hp"
+#define MODULE_UACCE        "zxdh_uacce"
+#define MODULE_HEAL        "zxdh_health"
+
+extern int debug_print;
+
+#define DH_LOG_EMERG(module, fmt, arg...)                \
+    printk(KERN_EMERG "[%s][%s][%d] " fmt,            \
+           module, __func__, __LINE__, ##arg)
+
+#define DH_LOG_ALERT(module, fmt, arg...)                \
+    printk(KERN_ALERT "[%s][%s][%d] " fmt,            \
+           module, __func__, __LINE__, ##arg)
+
+#define DH_LOG_CRIT(module, fmt, arg...)                \
+    printk(KERN_CRIT "[%s][%s][%d] " fmt,            \
+           module, __func__, __LINE__, ##arg)
+
+#define DH_LOG_ERR(module, fmt, arg...)                \
+    printk(KERN_ERR "[%s][%s][%d] " fmt,            \
+           module, __func__, __LINE__, ##arg)
+
+#define DH_LOG_WARNING(module, fmt, arg...)                \
+    printk(KERN_WARNING "[%s][%s][%d] " fmt,            \
+           module, __func__, __LINE__, ##arg)
+
+#define DH_LOG_INFO(module, fmt, arg...)                \
+    printk(KERN_INFO "[%s][%s][%d] " fmt,            \
+           module, __func__, __LINE__, ##arg)
+
+#define DH_LOG_DEBUG(module, fmt, arg...)                \
+do {                                    \
+    if (debug_print)                        \
+        printk(KERN_DEBUG "[%s][%s][%d] " fmt,        \
+               module, __func__, __LINE__, ##arg);    \
+} while (0)
+
+#define LOG_ERR(fmt, arg...)        DH_LOG_ERR(MODULE_PF, fmt, ##arg)
+#define LOG_INFO(fmt, arg...)        DH_LOG_INFO(MODULE_PF, fmt, ##arg)
+#define LOG_DEBUG(fmt, arg...)        DH_LOG_DEBUG(MODULE_PF, fmt, ##arg)
+#define LOG_WARN(fmt, arg...)        DH_LOG_WARNING(MODULE_PF, fmt, ##arg)
+
+#endif /* __DH_LOG_H__ */
diff --git a/drivers/net/ethernet/zte/dinghai/en_pf.c b/drivers/net/ethernet/zte/dinghai/en_pf.c
index d3a4298fa927..2d2740223401 100644
--- a/drivers/net/ethernet/zte/dinghai/en_pf.c
+++ b/drivers/net/ethernet/zte/dinghai/en_pf.c
@@ -8,6 +8,7 @@
 #include <linux/pci.h>
 #include <net/devlink.h>
 #include "en_pf.h"
+#include "dh_log.h"
 
 #define DRV_VERSION "1.0-1"
 #define DRV_SUMMARY "ZTE(R) zxdh-net driver"
@@ -21,6 +22,13 @@ MODULE_DESCRIPTION(DRV_SUMMARY);
 MODULE_VERSION(DRV_VERSION);
 MODULE_LICENSE("GPL");
 
+u32 dh_debug_mask;
+module_param_named(debug_mask, dh_debug_mask, uint, 0644);
+MODULE_PARM_DESC(debug_mask, "debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0");
+static bool probe_vf = 1;
+module_param(probe_vf, bool, 0644);
+MODULE_PARM_DESC(probe_vf, "probe_vf: 0 = N, 1 = Y");
+
 static const struct devlink_ops dh_pf_devlink_ops = {};
 
 const struct pci_device_id dh_pf_pci_table[] = {
@@ -39,26 +47,34 @@ static int dh_pf_pci_init(struct dh_core_dev *dev)
     pci_set_drvdata(dev->pdev, dev);
 
     ret = pci_enable_device(dev->pdev);
-    if (ret)
+    if (ret) {
+        LOG_ERR("pci_enable_device failed: %d\n", ret);
         return -ENOMEM;
+    }
 
     ret = dma_set_mask_and_coherent(dev->device, DMA_BIT_MASK(64));
     if (ret) {
         ret = dma_set_mask_and_coherent(dev->device, DMA_BIT_MASK(32));
-        if (ret)
+        if (ret) {
+            LOG_ERR("dma_set_mask_and_coherent failed: %d\n", ret);
             goto err_pci;
+        }
     }
 
     ret = pci_request_selected_regions(dev->pdev,
                        pci_select_bars(dev->pdev, IORESOURCE_MEM),
                        "dh-pf");
-    if (ret)
+    if (ret) {
+        LOG_ERR("pci_request_selected_regions failed: %d\n", ret);
         goto err_pci;
+    }
 
     pci_set_master(dev->pdev);
     ret = pci_save_state(dev->pdev);
-    if (ret)
+    if (ret) {
+        LOG_ERR("pci_save_state failed: %d\n", ret);
         goto err_pci_save_state;
+    }
 
     pf_dev = dh_core_priv(dev);
     pf_dev->pci_ioremap_addr[0] =
@@ -66,6 +82,9 @@ static int dh_pf_pci_init(struct dh_core_dev *dev)
                   pci_resource_len(dev->pdev, 0));
     if (!pf_dev->pci_ioremap_addr[0]) {
         ret = -ENOMEM;
+        LOG_ERR("ioremap(0x%llx, 0x%llx) failed\n",
+            pci_resource_start(dev->pdev, 0),
+            pci_resource_len(dev->pdev, 0));
         goto err_pci_save_state;
     }
 
@@ -95,10 +114,13 @@ static int dh_pf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
     struct devlink *devlink = NULL;
     int ret = 0;
 
+    LOG_INFO("pf level start\n");
     devlink = devlink_alloc(&dh_pf_devlink_ops, sizeof(struct zxdh_pf_device),
                 &pdev->dev);
-    if (!devlink)
+    if (!devlink) {
+        LOG_ERR("devlink alloc failed\n");
         return -ENOMEM;
+    }
 
     dh_dev = devlink_priv(devlink);
     dh_dev->device = &pdev->dev;
@@ -112,10 +134,17 @@ static int dh_pf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
     mutex_init(&pf_dev->irq_lock);
 
     dh_dev->coredev_type = GET_COREDEV_TYPE(pdev);
+    LOG_DEBUG("%s device: %s\n",
+          (dh_dev->coredev_type == DH_COREDEV_PF) ? "PF" : "VF",
+          pci_name(pdev));
 
     ret = dh_pf_pci_init(dh_dev);
-    if (ret)
+    if (ret) {
+        LOG_ERR("dh_pf_pci_init failed: %d\n", ret);
         goto err_cfg_init;
+    }
+
+    LOG_INFO("pf level completed\n");
 
     return 0;
 
@@ -133,14 +162,17 @@ static void dh_pf_remove(struct pci_dev *pdev)
     struct devlink *devlink = priv_to_devlink(dh_dev);
     struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev);
 
-    if (!dh_dev)
+    if (!pf_dev)
         return;
 
+    LOG_INFO("pf level start\n");
+
     dh_pf_pci_close(dh_dev);
     mutex_destroy(&pf_dev->irq_lock);
     mutex_destroy(&dh_dev->lock);
     devlink_free(devlink);
     pci_set_drvdata(pdev, NULL);
+    LOG_INFO("pf level completed\n");
 }
 
 static void dh_pf_shutdown(struct pci_dev *pdev)
@@ -149,12 +181,15 @@ static void dh_pf_shutdown(struct pci_dev *pdev)
     struct devlink *devlink = priv_to_devlink(dh_dev);
     struct zxdh_pf_device *pf_dev = dh_core_priv(dh_dev);
 
+    LOG_INFO("pf level start\n");
+
     dh_pf_pci_close(dh_dev);
     mutex_destroy(&pf_dev->irq_lock);
     mutex_destroy(&dh_dev->lock);
     devlink_free(devlink);
 
     pci_set_drvdata(pdev, NULL);
+    LOG_INFO("pf level completed\n");
 }
 
 static int dh_pf_suspend(struct pci_dev *pdev, pm_message_t state)
-- 
2.43.0