From: Jiri Pirko <jiri@resnulli.us>
To: han.junyang@zte.com.cn
Cc: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com,
kuba@kernel.org, pabeni@redhat.com, horms@kernel.org,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
ran.ming@zte.com.cn, han.chengfei@zte.com.cn,
zhang.yanze@zte.com.cn
Subject: Re: [PATCH net-next v8 1/2] dinghai: add ZTE network driver support
Date: Tue, 14 Jul 2026 15:06:01 +0200 [thread overview]
Message-ID: <alYzSz_X1Ft1Hegb@FV6GYCPJ69> (raw)
In-Reply-To: <20260713222420704lmwNL8xT8mgOhTKbqAfRX@zte.com.cn>
Mon, Jul 13, 2026 at 04:24:20PM +0200, han.junyang@zte.com.cn wrote:
>From: Junyang Han <han.junyang@zte.com.cn>
>
>Add basic framework for ZTE DingHai ethernet PF driver, including
>Kconfig/Makefile build support and PCIe device probe/remove skeleton.
>
>Signed-off-by: Junyang Han <han.junyang@zte.com.cn>
>---
> MAINTAINERS | 6 +
> drivers/net/ethernet/Kconfig | 1 +
> drivers/net/ethernet/Makefile | 1 +
> drivers/net/ethernet/zte/Kconfig | 20 +++
> drivers/net/ethernet/zte/Makefile | 6 +
> drivers/net/ethernet/zte/dinghai/Kconfig | 34 ++++
> drivers/net/ethernet/zte/dinghai/Makefile | 10 ++
> drivers/net/ethernet/zte/dinghai/en_pf.c | 195 ++++++++++++++++++++++
> drivers/net/ethernet/zte/dinghai/en_pf.h | 52 ++++++
> 9 files changed, 325 insertions(+)
> create mode 100644 drivers/net/ethernet/zte/Kconfig
> create mode 100644 drivers/net/ethernet/zte/Makefile
> create mode 100644 drivers/net/ethernet/zte/dinghai/Kconfig
> create mode 100644 drivers/net/ethernet/zte/dinghai/Makefile
> create mode 100644 drivers/net/ethernet/zte/dinghai/en_pf.c
> create mode 100644 drivers/net/ethernet/zte/dinghai/en_pf.h
>
>diff --git a/MAINTAINERS b/MAINTAINERS
>index 2fb1c75afd16..73692b09bf7b 100644
>--- a/MAINTAINERS
>+++ b/MAINTAINERS
>@@ -29440,6 +29440,12 @@ S: Maintained
> T: git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
> F: sound/hda/codecs/senarytech.c
>
>+ZTE DINGHAI ETHERNET DRIVER
>+M: Junyang Han <han.junyang@zte.com.cn>
>+L: netdev@vger.kernel.org
>+S: Maintained
>+F: drivers/net/ethernet/zte/
>+
> THE REST
> M: Linus Torvalds <torvalds@linux-foundation.org>
> L: linux-kernel@vger.kernel.org
>diff --git a/drivers/net/ethernet/Kconfig b/drivers/net/ethernet/Kconfig
>index b8f70e2a1763..c2b6996b0cfe 100644
>--- a/drivers/net/ethernet/Kconfig
>+++ b/drivers/net/ethernet/Kconfig
>@@ -188,5 +188,6 @@ source "drivers/net/ethernet/wangxun/Kconfig"
> source "drivers/net/ethernet/wiznet/Kconfig"
> source "drivers/net/ethernet/xilinx/Kconfig"
> source "drivers/net/ethernet/xircom/Kconfig"
>+source "drivers/net/ethernet/zte/Kconfig"
>
> endif # ETHERNET
>diff --git a/drivers/net/ethernet/Makefile b/drivers/net/ethernet/Makefile
>index 57344fec6ce0..a34bcbd4df4e 100644
>--- a/drivers/net/ethernet/Makefile
>+++ b/drivers/net/ethernet/Makefile
>@@ -104,3 +104,4 @@ obj-$(CONFIG_NET_VENDOR_XIRCOM) += xircom/
> obj-$(CONFIG_NET_VENDOR_SYNOPSYS) += synopsys/
> obj-$(CONFIG_NET_VENDOR_PENSANDO) += pensando/
> obj-$(CONFIG_OA_TC6) += oa_tc6.o
>+obj-$(CONFIG_NET_VENDOR_ZTE) += zte/
>diff --git a/drivers/net/ethernet/zte/Kconfig b/drivers/net/ethernet/zte/Kconfig
>new file mode 100644
>index 000000000000..b95c2fc7db77
>--- /dev/null
>+++ b/drivers/net/ethernet/zte/Kconfig
>@@ -0,0 +1,20 @@
>+# SPDX-License-Identifier: GPL-2.0-only
>+#
>+# ZTE driver configuration
>+#
>+
>+config NET_VENDOR_ZTE
>+ bool "ZTE devices"
>+ default y
>+ help
>+ If you have a network (Ethernet) card belonging to this class, say Y.
>+ Note that the answer to this question doesn't directly affect the
>+ kernel: saying N will just cause the configurator to skip all
>+ the questions about Zte cards. If you say Y, you will be asked
>+ for your specific card in the following questions.
>+
>+if NET_VENDOR_ZTE
>+
>+source "drivers/net/ethernet/zte/dinghai/Kconfig"
>+
>+endif # NET_VENDOR_ZTE
>diff --git a/drivers/net/ethernet/zte/Makefile b/drivers/net/ethernet/zte/Makefile
>new file mode 100644
>index 000000000000..cd9929b61559
>--- /dev/null
>+++ b/drivers/net/ethernet/zte/Makefile
>@@ -0,0 +1,6 @@
>+# SPDX-License-Identifier: GPL-2.0-only
>+#
>+# Makefile for the ZTE device drivers
>+#
>+
>+obj-$(CONFIG_DINGHAI) += dinghai/
>diff --git a/drivers/net/ethernet/zte/dinghai/Kconfig b/drivers/net/ethernet/zte/dinghai/Kconfig
>new file mode 100644
>index 000000000000..121be3bf7707
>--- /dev/null
>+++ b/drivers/net/ethernet/zte/dinghai/Kconfig
>@@ -0,0 +1,34 @@
>+# SPDX-License-Identifier: GPL-2.0-only
>+#
>+# ZTE DingHai Ethernet driver configuration
>+#
>+
>+config DINGHAI
>+ bool "ZTE DingHai Ethernet driver"
>+ depends on PCI
>+ select NET_DEVLINK
>+ help
>+ This driver supports ZTE DingHai Ethernet devices.
>+
>+ DingHai is a high-performance Ethernet controller that supports
>+ multiple features including hardware offloading, SR-IOV, and
>+ advanced virtualization capabilities.
>+
>+ If you say Y here, you can select specific driver variants below.
>+
>+ If unsure, say N.
>+
>+if DINGHAI
>+
>+config DINGHAI_PF
>+ tristate "ZTE DingHai PF (Physical Function) driver"
>+ help
>+ This driver supports ZTE DingHai PCI Express Ethernet
>+ adapters (PF).
>+
>+ To compile this driver as a module, choose M here. The module
>+ will be named dinghai10e.
>+
>+ If unsure, say N.
>+
>+endif # DINGHAI
>diff --git a/drivers/net/ethernet/zte/dinghai/Makefile b/drivers/net/ethernet/zte/dinghai/Makefile
>new file mode 100644
>index 000000000000..f55a8de518be
>--- /dev/null
>+++ b/drivers/net/ethernet/zte/dinghai/Makefile
>@@ -0,0 +1,10 @@
>+# SPDX-License-Identifier: GPL-2.0-only
>+#
>+# Makefile for ZTE DingHai Ethernet driver
>+#
>+
>+ccflags-y += -I$(src)
>+
>+obj-$(CONFIG_DINGHAI_PF) += dinghai10e.o
>+dinghai10e-y := en_pf.o
>+
>diff --git a/drivers/net/ethernet/zte/dinghai/en_pf.c b/drivers/net/ethernet/zte/dinghai/en_pf.c
>new file mode 100644
>index 000000000000..034b8519a71c
>--- /dev/null
>+++ b/drivers/net/ethernet/zte/dinghai/en_pf.c
>@@ -0,0 +1,195 @@
>+// SPDX-License-Identifier: GPL-2.0-only
>+/*
>+ * ZTE DingHai Ethernet driver
>+ * Copyright (c) 2022-2026, ZTE Corporation.
>+ */
>+
>+#include <linux/module.h>
>+#include <linux/pci.h>
>+#include <net/devlink.h>
>+#include <linux/dma-mapping.h>
>+#include "en_pf.h"
>+
>+MODULE_AUTHOR("Junyang Han <han.junyang@zte.com.cn>");
>+MODULE_DESCRIPTION("ZTE DingHai series Ethernet driver");
>+MODULE_LICENSE("GPL");
>+
>+static const struct devlink_ops dh_pf_devlink_ops = {};
>+
>+static const struct pci_device_id dh_pf_pci_table[] = {
>+ { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_PF_DEVICE_ID) },
>+ { PCI_DEVICE(ZXDH_PF_VENDOR_ID, ZXDH_VF_DEVICE_ID) },
>+ { }
>+};
>+
>+MODULE_DEVICE_TABLE(pci, dh_pf_pci_table);
>+
>+void *dh_core_alloc_priv(struct dh_core_dev *dh_dev, size_t size)
>+{
>+ void *priv = kzalloc(size, GFP_KERNEL);
>+
>+ if (priv)
>+ dh_dev->priv = priv;
>+ return priv;
>+}
>+
>+void dh_core_free_priv(struct dh_core_dev *dh_dev)
>+{
>+ kfree(dh_dev->priv);
>+}
>+
>+static int dh_pf_pci_init(struct dh_core_dev *dev)
>+{
>+ struct zxdh_pf_device *pf_dev = dev->priv;
>+ int ret;
>+
>+ pci_set_drvdata(dev->pdev, dev);
>+
>+ ret = pci_enable_device(dev->pdev);
>+ if (ret) {
>+ dev_err(dev->device, "pci_enable_device failed: %d\n", ret);
>+ return ret;
>+ }
>+
>+ 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) {
>+ dev_err(dev->device, "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) {
>+ dev_err(dev->device, "pci_request_selected_regions failed: %d\n", ret);
>+ goto err_pci;
>+ }
>+
>+ pci_set_master(dev->pdev);
>+ ret = pci_save_state(dev->pdev);
>+ if (ret) {
>+ dev_err(dev->device, "pci_save_state failed: %d\n", ret);
>+ goto err_pci_save_state;
>+ }
>+
>+ if (!(pci_resource_flags(dev->pdev, 0) & IORESOURCE_MEM)) {
>+ ret = -ENODEV;
>+ dev_err(dev->device, "BAR 0 is not an MMIO resource\n");
>+ goto err_pci_save_state;
>+ }
>+
>+ pf_dev->pci_ioremap_addr[0] =
>+ ioremap(pci_resource_start(dev->pdev, 0),
>+ pci_resource_len(dev->pdev, 0));
>+ if (!pf_dev->pci_ioremap_addr[0]) {
>+ ret = -ENOMEM;
>+ dev_err(dev->device, "dh pf pci ioremap failed\n");
>+ goto err_pci_save_state;
>+ }
>+
>+ return 0;
>+
>+err_pci_save_state:
>+ pci_release_selected_regions(dev->pdev,
>+ pci_select_bars(dev->pdev, IORESOURCE_MEM));
>+err_pci:
>+ pci_disable_device(dev->pdev);
>+ return ret;
>+}
>+
>+void dh_pf_pci_close(struct dh_core_dev *dev)
>+{
>+ struct zxdh_pf_device *pf_dev = dev->priv;
>+
>+ iounmap(pf_dev->pci_ioremap_addr[0]);
>+ pci_release_selected_regions(dev->pdev,
>+ pci_select_bars(dev->pdev, IORESOURCE_MEM));
>+ pci_disable_device(dev->pdev);
>+}
>+
>+static int dh_pf_probe(struct pci_dev *pdev, const struct pci_device_id *id)
>+{
>+ struct zxdh_pf_device *pf_dev;
>+ struct dh_core_dev *dh_dev;
>+ struct devlink *devlink;
>+ int ret;
>+
>+ devlink = devlink_alloc(&dh_pf_devlink_ops, sizeof(struct dh_core_dev),
>+ &pdev->dev);
>+ if (!devlink) {
>+ dev_err(&pdev->dev, "dh_pf devlink alloc failed\n");
>+ return -ENOMEM;
>+ }
>+
>+ dh_dev = devlink_priv(devlink);
>+ dh_dev->device = &pdev->dev;
>+ dh_dev->pdev = pdev;
>+ dh_dev->devlink = devlink;
>+
>+ pf_dev = dh_core_alloc_priv(dh_dev, sizeof(*pf_dev));
Does not make any sense to me. Why you don't just merge struct
dh_core_dev and zxdh_pf_device. Why dh_core_dev contains *priv pointer?
What puzzles me is the naming of funct structs:
dh_core*
dh_pf*
zxdh_pf*
Could they all be dh_pf* perhaps?
Then inconsistencies like "_dev", "_device" etc. Please try to be
consitent with names. Makes the code easier to follow.
>+ if (!pf_dev) {
>+ dev_err(&pdev->dev, "dh_pf_dev alloc failed\n");
>+ ret = -ENOMEM;
>+ goto err_pf_dev;
>+ }
>+
>+ pf_dev->bar_chan_valid = false;
>+ pf_dev->vepa = false;
>+ mutex_init(&dh_dev->lock);
>+ mutex_init(&pf_dev->irq_lock);
>+
>+ dh_dev->coredev_type = GET_COREDEV_TYPE(pdev);
>+
>+ ret = dh_pf_pci_init(dh_dev);
>+ if (ret) {
>+ dev_err(&pdev->dev, "dh_pf_pci_init failed: %d\n", ret);
>+ goto err_cfg_init;
>+ }
>+
>+ devlink_register(devlink);
>+
>+ return 0;
>+
>+err_cfg_init:
>+ mutex_destroy(&pf_dev->irq_lock);
>+ mutex_destroy(&dh_dev->lock);
>+ dh_core_free_priv(dh_dev);
>+err_pf_dev:
>+ devlink_free(devlink);
>+ return ret;
>+}
>+
>+static void dh_pf_remove(struct pci_dev *pdev)
>+{
>+ struct dh_core_dev *dh_dev = pci_get_drvdata(pdev);
>+ struct devlink *devlink = priv_to_devlink(dh_dev);
>+ struct zxdh_pf_device *pf_dev = dh_dev->priv;
>+
>+ devlink_unregister(devlink);
>+ dh_pf_pci_close(dh_dev);
>+ mutex_destroy(&pf_dev->irq_lock);
>+ mutex_destroy(&dh_dev->lock);
>+ dh_core_free_priv(dh_dev);
>+ devlink_free(devlink);
>+ pci_set_drvdata(pdev, NULL);
>+}
>+
>+static void dh_pf_shutdown(struct pci_dev *pdev)
>+{
>+ if (system_state == SYSTEM_POWER_OFF)
>+ pci_set_power_state(pdev, PCI_D3hot);
>+ pci_disable_device(pdev);
>+}
>+
>+static struct pci_driver dh_pf_driver = {
>+ .name = "dinghai10e",
>+ .id_table = dh_pf_pci_table,
>+ .probe = dh_pf_probe,
>+ .remove = dh_pf_remove,
>+ .shutdown = dh_pf_shutdown,
>+};
>+
>+module_pci_driver(dh_pf_driver);
>diff --git a/drivers/net/ethernet/zte/dinghai/en_pf.h b/drivers/net/ethernet/zte/dinghai/en_pf.h
>new file mode 100644
>index 000000000000..87fa29b2d13d
>--- /dev/null
>+++ b/drivers/net/ethernet/zte/dinghai/en_pf.h
>@@ -0,0 +1,52 @@
>+/* SPDX-License-Identifier: GPL-2.0-only */
>+/*
>+ * ZTE DingHai Ethernet driver - PF header
>+ * Copyright (c) 2022-2026, ZTE Corporation.
>+ */
>+
>+#ifndef __ZXDH_EN_PF_H__
>+#define __ZXDH_EN_PF_H__
>+
>+#include <linux/types.h>
>+#include <linux/pci.h>
>+#include <linux/mutex.h>
>+#include <linux/device.h>
>+#include <linux/slab.h>
>+
>+#define ZXDH_PF_VENDOR_ID 0x1cf2
>+#define ZXDH_PF_DEVICE_ID 0x8040
>+#define ZXDH_VF_DEVICE_ID 0x8041
>+
>+enum dh_coredev_type {
>+ DH_COREDEV_PF,
>+ DH_COREDEV_VF,
>+ DH_COREDEV_SF,
>+ DH_COREDEV_MPF
>+};
>+
>+struct devlink;
>+
>+struct dh_core_dev {
>+ struct device *device;
>+ enum dh_coredev_type coredev_type;
>+ struct pci_dev *pdev;
>+ struct devlink *devlink;
>+ struct mutex lock; /* Protects device configuration */
>+ void *priv;
>+};
>+
>+struct zxdh_pf_device {
>+ void __iomem *pci_ioremap_addr[6];
>+ bool bar_chan_valid;
>+ bool vepa;
>+ struct mutex irq_lock; /* Protects IRQ operations */
>+};
>+
>+#define GET_COREDEV_TYPE(pdev) \
>+ ((pdev)->device == ZXDH_VF_DEVICE_ID ? DH_COREDEV_VF : DH_COREDEV_PF)
>+
>+void *dh_core_alloc_priv(struct dh_core_dev *dh_dev, size_t size);
>+void dh_core_free_priv(struct dh_core_dev *dh_dev);
>+void dh_pf_pci_close(struct dh_core_dev *dev);
>+
>+#endif /* __ZXDH_EN_PF_H__ */
>--
>2.27.0
>
next prev parent reply other threads:[~2026-07-14 13:06 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-13 14:21 [PATCH net-next v8 0/2] Add ZTE DingHai Ethernet PF driver han.junyang
2026-07-13 14:24 ` [PATCH net-next v8 1/2] dinghai: add ZTE network driver support han.junyang
2026-07-14 13:06 ` Jiri Pirko [this message]
2026-07-13 14:28 ` [PATCH net-next v8 2/2] dinghai: add hardware register access and PCI capability scanning han.junyang
2026-07-14 13:10 ` [PATCH net-next v8 2/2] dinghai: add hardware register access and PCI? " Jiri Pirko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alYzSz_X1Ft1Hegb@FV6GYCPJ69 \
--to=jiri@resnulli.us \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=han.chengfei@zte.com.cn \
--cc=han.junyang@zte.com.cn \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=ran.ming@zte.com.cn \
--cc=zhang.yanze@zte.com.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox