From: <han.junyang@zte.com.cn>
To: <andrew+netdev@lunn.ch>, <davem@davemloft.net>,
<edumazet@google.com>, <kuba@kernel.org>, <pabeni@redhat.com>,
<horms@kernel.org>
Cc: <linux-kernel@vger.kernel.org>, <netdev@vger.kernel.org>,
<han.junyang@zte.com.cn>, <ran.ming@zte.com.cn>,
<han.chengfei@zte.com.cn>, <zhang.yanze@zte.com.cn>
Subject: [PATCH net-next v9 0/2] Add ZTE DingHai Ethernet PF driver
Date: Mon, 20 Jul 2026 18:06:51 +0800 (CST) [thread overview]
Message-ID: <20260720180651288d3b9DAp__Lfvo2x2PkMfC@zte.com.cn> (raw)
From: Junyang Han <han.junyang@zte.com.cn>
This series adds initial support for the ZTE DingHai Ethernet controller,
a high-performance PCIe Ethernet device supporting SR-IOV, hardware
offloading, and advanced virtualization features.
Changes from v8:
- Unify the three prefix variants (dh_core* / dh_pf* / zxdh_pf*)
on the vendor namespace zxdh_* .
- Address the _dev / _device suffix inconsistency: zxdh_pf_device
-> zxdh_pf_dev, matching zxdh_core_dev and the upstream
pci_dev / net_dev / usb_dev convention.
- Keep struct zxdh_core_dev and struct zxdh_pf_dev split, with
zxdh_pf_dev hung off zxdh_core_dev::priv via the container-of
pattern. The same zxdh_core_dev handle will be shared by the
SF (Sub-Function) driver queued for the next merge window,
and by MPF drivers further out. Each device type hangs its own
private struct off priv: PF -> zxdh_pf_dev, SF -> zxdh_sf_dev (planned).
Merging now would force a re-split when SF lands.
- Address v8 review comment "introduce functions yet you never use
them".
- Wire up zxdh_pf_modern_cfg_init() into the probe path and
zxdh_pf_modern_cfg_uninit() into the remove path.
- Drop the ZXDH_CONFIG_S_* and ZXDH_MSI_NO_VECTOR macros from
dh_queue.h.
Changes from v7:
- Remove the redundant depends on NET_VENDOR_ZTE
since it's already implied by the enclosing if NET_VENDOR_ZTE
block in the parent Kconfig.
- Check BAR 0 is an IORESOURCE_MEM resource before ioremap().
- Rework .shutdown to quiesce hardware only.
- Add NULL guards in zxdh_set_mac() and zxdh_get_mac().
- Zero the output buffer in zxdh_pf_get_vf_mac() up front.
- Two further AI-review points were investigated and require no
code change:
(1) *len is written before the bounds check inside
zxdh_pf_map_capability. The two fields written through
*len and *bar_off are pf_dev->notify_len and
pf_dev->dev_cfg_bar_off, both populated from this
function. pf_dev->notify_len is only consulted when
pf_dev->notify_base != NULL, which only happens when
the corresponding map_capability() call returned a
non-NULL pointer; pf_dev->dev_cfg_bar_off is only
consumed by zxdh_pf_get_vf_mac and
zxdh_pf_set_vf_mac_reg, both of which gate their
access on pf_dev->pf_sriov_cap_base. So the early
*len / *bar_off writes cannot produce values that
end up consumed.
(2) The expression off * notify_offset_multiplier is
u16 * u32; the overflow only triggers when
notify_offset_multiplier exceeds UINT_MAX / 65535
(≈ 65537), which is well beyond any value a PCI
config register would carry for this field. A
malformed multiplier of that magnitude would also
fail sane probing of the rest of the cap layout, so
it cannot reach this arithmetic. The boundaries in
practice are enforced by the 64-bit comparison at
the top of zxdh_pf_map_vq_notify's notify_base
branch, where off is promoted to u64 before the
multiply. The three subsequent 32-bit multiplies in
that function only feed pointer arithmetic against
pf_dev->notify_base; a wrong offset would resolve
to an address outside the mapped region and fail on
access rather than corrupt kernel state.
Changes from v6:
- Clean up PCI device ID table (drop `, 0`, use `{ }` sentinel)
- Move dh_core_alloc_priv/dh_core_free_priv from header to .c,
they don't need to be `static inline`
- Use `if (!x)` and drop the "%i, x" dev_err() messages in
common/notify cfg init.
Changes from v5:
- Drop dev_info() log spam.
- Propagate the real error code from dh_pf_pci_init() in
dh_pf_probe() instead of hard-coding -ENOMEM.
- Register devlink only after dh_pf_pci_init() succeeds, and
in dh_pf_remove()/dh_pf_shutdown() unregister devlink
before tearing down PCI/mutex/priv.
- Drop the "dh_dev->priv = NULL" assignment from
dh_core_free_priv().
Changes from v4:
- Fix sparse warning: add __iomem annotation to priv pointer
- Fix Clang format warning
- Use "dinghai:" as patch subject prefix
- Ensure proper patch threading
Note: Sent manually due to temporary git send-email unavailability
in our environment. Will use git send-email or b4 for future
submissions. Apologies for any inconvenience.
Changes from v3:
- Merged patches 1 and 2:
Combined initial framework with logging infrastructure
for better code organization and reduced patch count. This was done because
the logging infrastructure now uses Linux's built-in dev_err(), dev_info(),
dev_warn(), etc. macros instead of a custom logging system.
- Removed unnecessary variable initialization:
Fixed "don't initialise variables".
- Fixed variable declaration order:
Applied "Reverse Christmas tree" ordering with variables
declared from longest to shortest line length.
- Code quality improvements:
Fixed all checkpatch.pl issues (alignment, formatting, etc.).
Changes from v2:
- Address maintainer feedback from v2 review:
* Remove meaningless initialization
* Change dh_pf_pci_table to static const for better encapsulation
* Simplify MODULE_DESCRIPTION for brevity
- Coding style improvements:
* Ensure all lines are within 80-column limit
* Use kernel types (u32/u8) consistently throughout
* Improve code readability with better formatting
Changes from v1 (addressing feedback from AndrewLunn):
- Update copyright years to 2022-2026
- Remove DRV_VERSION, MODULE_VERSION and related boilerplate
- Fix MODULE_AUTHOR to use person with email address
- Use module_pci_driver() instead of manual init/exit
- Remove empty suspend/resume callbacks
- Replace char priv[] flexible array with void *priv + kzalloc
- Switch logging from printk wrappers to dev_*() based macros
- Remove dh_helper.h and dh_log.c, simplify to dh_log.h only
- Fix variable declaration ordering (reverse Christmas tree)
- Remove unnecessary NULL check in remove and pf_dev=NULL in probe
- Fix indentation and remove unnecessary type casts
- Use kernel idiomatic "if (ret)" style
This is the initial submission and only includes the PF (Physical Function)
driver. The VF (Virtual Function) driver will be submitted separately.
Junyang Han (2):
dinghai: add ZTE network driver support
dinghai: add hardware register access and PCI capability scanning
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 | 9 +
drivers/net/ethernet/zte/dinghai/dh_queue.h | 54 +++
drivers/net/ethernet/zte/dinghai/en_pf.c | 465 ++++++++++++++++++++
drivers/net/ethernet/zte/dinghai/en_pf.h | 101 +++++
10 files changed, 697 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/dh_queue.h
create mode 100644 drivers/net/ethernet/zte/dinghai/en_pf.c
create mode 100644 drivers/net/ethernet/zte/dinghai/en_pf.h
--
2.27.0
next reply other threads:[~2026-07-20 10:07 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-20 10:06 han.junyang [this message]
2026-07-20 10:10 ` [PATCH net-next v9 1/2] dinghai: add ZTE network driver support han.junyang
2026-07-20 10:14 ` [PATCH net-next v9 2/2] dinghai: add hardware register access and PCI capability scanning han.junyang
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=20260720180651288d3b9DAp__Lfvo2x2PkMfC@zte.com.cn \
--to=han.junyang@zte.com.cn \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=han.chengfei@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