[PATCH net-next v2 0/9] net: sparx5: clean up probe/remove init and deinit paths
From: Daniel Machon
Date: Fri Feb 27 2026 - 10:02:38 EST
This series refactors the sparx5 init and deinit code out of
sparx5_start() and into probe(), adding proper per-subsystem cleanup
labels and deinit functions.
Currently, the sparx5 driver initializes most subsystems inside
sparx5_start(), which is called from probe(). This includes registering
netdevs, starting worker threads for stats and MAC table polling,
requesting PTP IRQs, and initializing VCAP. The function has grown to
handle many unrelated subsystems, and has no granular error handling —
it either succeeds entirely or returns an error, leaving cleanup to a
single catch-all label in probe().
The remove() path has a similar problem: teardown is not structured as
the reverse of initialization, and several subsystems lack proper deinit
functions. For example, the stats workqueue has no corresponding
cleanup, and the mact workqueue is destroyed without first cancelling
its delayed work.
Refactor this by moving each init function out of sparx5_start() and
into probe(), with a corresponding goto-based cleanup label. Add deinit
functions for subsystems that allocate resources, to properly cancel
work and destroy workqueues. Ensure that cleanup order in both error
paths and remove() follows the reverse of initialization order.
sparx5_start() is eliminated entirely — its hardware register setup
is renamed to sparx5_forwarding_init() and its FDMA/XTR setup is
extracted to sparx5_frame_io_init().
Before this series, most init functions live inside sparx5_start() with
no individual cleanup:
probe():
sparx5_start(): <- no granular error handling
sparx5_mact_init()
sparx_stats_init() <- starts worker, no cleanup
mact_queue setup <- no cancel on teardown
sparx5_register_netdevs()
sparx5_register_notifier_blocks()
sparx5_vcap_init()
sparx5_ptp_init()
probe() error path:
cleanup_ports:
sparx5_cleanup_ports()
destroy_workqueue(mact_queue)
After this series, probe() initializes subsystems in order with
matching cleanup labels, and remove() tears down in reverse:
probe():
sparx5_pgid_init()
sparx5_vlan_init()
sparx5_board_init()
sparx5_forwarding_init()
sparx5_calendar_init() -> cleanup_ports
sparx5_qos_init() -> cleanup_ports
sparx5_vcap_init() -> cleanup_ports
sparx5_mact_init() -> cleanup_vcap
sparx5_stats_init() -> cleanup_mact
sparx5_frame_io_init() -> cleanup_stats
sparx5_ptp_init() -> cleanup_frame_io
sparx5_register_netdevs() -> cleanup_ptp
sparx5_register_notifier_blocks() -> cleanup_netdevs
remove():
sparx5_unregister_notifier_blocks()
sparx5_unregister_netdevs()
sparx5_ptp_deinit()
sparx5_frame_io_deinit()
sparx5_stats_deinit()
sparx5_mact_deinit()
sparx5_vcap_deinit()
sparx5_destroy_netdevs()
Signed-off-by: Daniel Machon <daniel.machon@xxxxxxxxxxxxx>
---
Changes in v2:
v2 mainly addresses the comment from Russell on v1, saying that a
minimal initialization should be done after netdev publication. This is
now done by moving initialization in sparx5_start out to proper init
functions. This also means that no initialization is done after netdev
publication in v2.
- Drop v1 patch 1 ("call sparx5_start() last in probe()"); PTP IRQ
handling is now a separate commit and sparx5_start() is eliminated
in the final patch.
- Add patch to move PTP IRQ handling out of sparx5_start() into its
own init/deinit with cleanup label.
- Add patch to extract FDMA/XTR initialization from sparx5_start()
into sparx5_frame_io_init() with cleanup label.
- Add patch to rename sparx5_start() to sparx5_forwarding_init() and
change return type to void, eliminating sparx5_start() entirely.
Link to v1: https://lore.kernel.org/r/20260225-sparx5-init-deinit-v1-0-97036580b9f0@xxxxxxxxxxxxx
---
Daniel Machon (9):
net: sparx5: move netdev and notifier block registration to probe
net: sparx5: move VCAP initialization to probe
net: sparx5: move MAC table initialization and add deinit function
net: sparx5: move stats initialization and add deinit function
net: sparx5: move calendar initialization to probe
net: sparx5: move remaining init functions from start() to probe()
net: sparx5: move PTP IRQ handling out of sparx5_start()
net: sparx5: move FDMA/XTR initialization out of sparx5_start()
net: sparx5: replace sparx5_start() with sparx5_forwarding_init()
.../ethernet/microchip/sparx5/sparx5_calendar.c | 15 +-
.../net/ethernet/microchip/sparx5/sparx5_ethtool.c | 9 +-
.../ethernet/microchip/sparx5/sparx5_mactable.c | 34 ++-
.../net/ethernet/microchip/sparx5/sparx5_main.c | 253 ++++++++++-----------
.../net/ethernet/microchip/sparx5/sparx5_main.h | 12 +-
drivers/net/ethernet/microchip/sparx5/sparx5_ptp.c | 18 ++
.../ethernet/microchip/sparx5/sparx5_vcap_impl.c | 2 +-
7 files changed, 196 insertions(+), 147 deletions(-)
---
base-commit: 17d0056f71b13050317a662a505b1a36fb7009e5
change-id: 20260216-sparx5-init-deinit-037cf165c62e
Best regards,
--
Daniel Machon <daniel.machon@xxxxxxxxxxxxx>