[PATCH net-next v12 0/5] Add Ethernet MAC support for SpacemiT K1

Vivian Wang posted 5 patches 2 weeks, 4 days ago
.../devicetree/bindings/net/spacemit,k1-emac.yaml  |   81 +
arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts    |   48 +
arch/riscv/boot/dts/spacemit/k1-milkv-jupiter.dts  |   48 +
arch/riscv/boot/dts/spacemit/k1-pinctrl.dtsi       |   48 +
arch/riscv/boot/dts/spacemit/k1.dtsi               |   22 +
drivers/net/ethernet/Kconfig                       |    1 +
drivers/net/ethernet/Makefile                      |    1 +
drivers/net/ethernet/spacemit/Kconfig              |   29 +
drivers/net/ethernet/spacemit/Makefile             |    6 +
drivers/net/ethernet/spacemit/k1_emac.c            | 2159 ++++++++++++++++++++
drivers/net/ethernet/spacemit/k1_emac.h            |  416 ++++
11 files changed, 2859 insertions(+)
[PATCH net-next v12 0/5] Add Ethernet MAC support for SpacemiT K1
Posted by Vivian Wang 2 weeks, 4 days ago
SpacemiT K1 has two gigabit Ethernet MACs with RGMII and RMII support.
Add devicetree bindings, driver, and DTS for it.

Tested primarily on BananaPi BPI-F3. Basic TX/RX functionality also
tested on Milk-V Jupiter.

I would like to note that even though some bit field names superficially
resemble that of DesignWare MAC, all other differences point to it in
fact being a custom design.

Based on SpacemiT drivers [1]. These patches are also available at:

https://github.com/dramforever/linux/tree/k1/ethernet/v12

[1]: https://github.com/spacemit-com/linux-k1x

---
Changes in v12:
- Add aliases ethernet{0,1} to DTS
- Minor changes
  - Use FIELD_MODIFY to set duplex mode in HW based on phydev->duplex
  - Use FIELD_GET in emac_mii_read() to extract bits from MAC_MDIO_DATA
- Link to v11: https://lore.kernel.org/r/20250912-net-k1-emac-v11-0-aa3e84f8043b@iscas.ac.cn

Changes in v11:
- Use NETDEV_PCPU_STAT_DSTATS for tx_dropped
- Use DECLARE_FLEX_ARRAY for emac_hw_{tx,rx}_stats instead of cast
- More bitfields stuff to simplify code:
  - Define EMAC_MAX_DELAY_UNIT with FIELD_MAX
  - Use FIELD_{PREP,GET} in emac_mii_{read,write}()
  - Use FIELD_MODIFY in emac_set_{tx,rx}_fc()
- Minor changes:
  - Use lower_32_bits and such instead of casts and shifts
  - Extract emac_ether_addr_hash() helper
  - In emac_mdio_init(), 0xffffffff -> ~0
  - Minor comment changes
- Link to v10: https://lore.kernel.org/r/20250908-net-k1-emac-v10-0-90d807ccd469@iscas.ac.cn

Changes in v10:
- Use FIELD_GET and FIELD_PREP, remove some unused constants
- Remove redundant software statistics
  - In particular, rx_dropped should have been and is already tracked in
    rx_errors.
- Track tx_dropped with a percpu field
- Minor changes
  - Simplified int emac_rx_frame_status() -> bool emac_rx_frame_good()
- Link to v9: https://lore.kernel.org/r/20250905-net-k1-emac-v9-0-f1649b98a19c@iscas.ac.cn

Changes in v9:
- Refactor to use phy_interface_mode_is_rgmii
- Minor changes
  - Use netdev_err in more places
  - Print phy-mode by name on unsupported phy-mode
- Link to v8: https://lore.kernel.org/r/20250828-net-k1-emac-v8-0-e9075dd2ca90@iscas.ac.cn

Changes in v8:
- Use devres to do of_phy_deregister_fixed_link on probe failure or
  remove
- Simplified control flow in a few places with early return or continue
- Minor changes
  - Removed some unneeded parens in emac_configure_{tx,rx}
- Link to v7: https://lore.kernel.org/r/20250826-net-k1-emac-v7-0-5bc158d086ae@iscas.ac.cn

Changes in v7:
- Removed scoped_guard usage
- Renamed error handling path labels after destinations
- Fix skb free error handling path in emac_start_xmit and emac_tx_mem_map
- Cancel tx_timeout_task to prevent schedule_work lifetime problems
- Minor changes:
  - Remove unnecessary timer_delete_sync in emac_down
  - Use dev_err_ratelimited in a few more places
  - Cosmetic fixes in error messages
- Link to v6: https://lore.kernel.org/r/20250820-net-k1-emac-v6-0-c1e28f2b8be5@iscas.ac.cn

Changes in v6:
- Implement pause frame support
- Minor changes:
  - Convert comment for emac_stats_update() into assert_spin_locked()
  - Cosmetic fixes for some comments and whitespace
  - emac_set_mac_addr() is now refactored
- Link to v5: https://lore.kernel.org/r/20250812-net-k1-emac-v5-0-dd17c4905f49@iscas.ac.cn

Changes in v5:
- Rebased on v6.17-rc1, add back DTS now that they apply cleanly
- Use standard statistics interface, handle 32-bit statistics overflow
- Minor changes:
  - Fix clock resource handling in emac_resume
  - Ratelimit the message in emac_rx_frame_status
  - Add ndo_validate_addr = eth_validate_addr
  - Remove unnecessary parens in emac_set_mac_addr
  - Change some functions that never fail to return void instead of int
  - Minor rewording
- Link to v4: https://lore.kernel.org/r/20250703-net-k1-emac-v4-0-686d09c4cfa8@iscas.ac.cn

Changes in v4:
- Resource handling on probe and remove: timer_delete_sync and
  of_phy_deregister_fixed_link
- Drop DTS changes and dependencies (will send through SpacemiT tree)
- Minor changes:
  - Remove redundant phy_stop() and setting of ndev->phydev
  - Fix error checking for emac_open in emac_resume
  - Fix one missed dev_err -> dev_err_probe
  - Fix type of emac_start_xmit
  - Fix one missed reverse xmas tree formatting
  - Rename some functions for consistency between emac_* and ndo_*
- Link to v3: https://lore.kernel.org/r/20250702-net-k1-emac-v3-0-882dc55404f3@iscas.ac.cn

Changes in v3:
- Refactored and simplified emac_tx_mem_map
- Addressed other minor v2 review comments
- Removed what was patch 3 in v2, depend on DMA buses instead
- DT nodes in alphabetical order where appropriate
- Link to v2: https://lore.kernel.org/r/20250618-net-k1-emac-v2-0-94f5f07227a8@iscas.ac.cn

Changes in v2:
- dts: Put eth0 and eth1 nodes under a bus with dma-ranges
- dts: Added Milk-V Jupiter
- Fix typo in emac_init_hw() that broke the driver (Oops!)
- Reformatted line lengths to under 80
- Addressed other v1 review comments
- Link to v1: https://lore.kernel.org/r/20250613-net-k1-emac-v1-0-cc6f9e510667@iscas.ac.cn

---
Vivian Wang (5):
      dt-bindings: net: Add support for SpacemiT K1
      net: spacemit: Add K1 Ethernet MAC
      riscv: dts: spacemit: Add Ethernet support for K1
      riscv: dts: spacemit: Add Ethernet support for BPI-F3
      riscv: dts: spacemit: Add Ethernet support for Jupiter

 .../devicetree/bindings/net/spacemit,k1-emac.yaml  |   81 +
 arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts    |   48 +
 arch/riscv/boot/dts/spacemit/k1-milkv-jupiter.dts  |   48 +
 arch/riscv/boot/dts/spacemit/k1-pinctrl.dtsi       |   48 +
 arch/riscv/boot/dts/spacemit/k1.dtsi               |   22 +
 drivers/net/ethernet/Kconfig                       |    1 +
 drivers/net/ethernet/Makefile                      |    1 +
 drivers/net/ethernet/spacemit/Kconfig              |   29 +
 drivers/net/ethernet/spacemit/Makefile             |    6 +
 drivers/net/ethernet/spacemit/k1_emac.c            | 2159 ++++++++++++++++++++
 drivers/net/ethernet/spacemit/k1_emac.h            |  416 ++++
 11 files changed, 2859 insertions(+)
---
base-commit: 062b3e4a1f880f104a8d4b90b767788786aa7b78
change-id: 20250606-net-k1-emac-3e181508ea64

Best regards,
-- 
Vivian "dramforever" Wang
Re: [PATCH net-next v12 0/5] Add Ethernet MAC support for SpacemiT K1
Posted by Yixun Lan 2 weeks, 4 days ago
Hi Andrew, Jakub

On 12:23 Sun 14 Sep     , Vivian Wang wrote:
> SpacemiT K1 has two gigabit Ethernet MACs with RGMII and RMII support.
> Add devicetree bindings, driver, and DTS for it.
> 
> Tested primarily on BananaPi BPI-F3. Basic TX/RX functionality also
> tested on Milk-V Jupiter.
> 
> I would like to note that even though some bit field names superficially
> resemble that of DesignWare MAC, all other differences point to it in
> fact being a custom design.
> 
> Based on SpacemiT drivers [1]. These patches are also available at:
> 

I know this series has been iterated several versions, and Vivian is working
hard on this.. but since it's quite close to rc6, I'd like to query if
there is any chance to take it in for v6.18? don't want to be pushy, so I'm
totally fine if it's too late and have to postpone to next merge window..

P.S. I'd just want to see emac/ethernet accepted since it's last bit for
a minimal headless system..

Thanks

-- 
Yixun Lan (dlan)
Re: [PATCH net-next v12 0/5] Add Ethernet MAC support for SpacemiT K1
Posted by Marek Szyprowski 1 week, 6 days ago
Hi All,

On 14.09.2025 06:23, Vivian Wang wrote:
> SpacemiT K1 has two gigabit Ethernet MACs with RGMII and RMII support.
> Add devicetree bindings, driver, and DTS for it.
>
> Tested primarily on BananaPi BPI-F3. Basic TX/RX functionality also
> tested on Milk-V Jupiter.
>
> I would like to note that even though some bit field names superficially
> resemble that of DesignWare MAC, all other differences point to it in
> fact being a custom design.
>
> Based on SpacemiT drivers [1]. These patches are also available at:
>
> https://github.com/dramforever/linux/tree/k1/ethernet/v12
>
> [1]: https://github.com/spacemit-com/linux-k1x

This driver recently landed in linux-next as commit bfec6d7f2001 ("net: 
spacemit: Add K1 Ethernet MAC"). In my tests I found that it 
triggers lock dep warnings related to stats_lock acquisition. In the 
current code it is being acquired with spin_lock(). For tests I've 
changed that to spin_lock_irqsave() and the warnings went away, but I'm 
not sure that this is the proper fix. I've also checked the driver 
history and 'irqsave' locking was used in pre-v7 version, but it was 
removed later on Jakub's request and described a bit misleading as 
"Removed scoped_guard usage".

Here are the lock dep warnings I got on my BananaPiF3 board:

================================
WARNING: inconsistent lock state
6.17.0-rc6-next-20250918 #11165 Not tainted
--------------------------------
inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
swapper/0/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
ffffffd60b1412a0 (&priv->stats_lock){+.?.}-{3:3}, at: 
emac_stats_timer+0x1c/0x3e [k1_emac]
{SOFTIRQ-ON-W} state was registered at:
   __lock_acquire+0x7f6/0x1f7c
   lock_acquire+0xe8/0x2b6
   _raw_spin_lock+0x2c/0x40
   emac_get_stats64+0xbc/0x188 [k1_emac]
   dev_get_stats+0x3e/0x292
   rtnl_fill_stats+0x32/0xec
   rtnl_fill_ifinfo.constprop.0+0x6d0/0x1448
   rtmsg_ifinfo_build_skb+0x92/0xea
   rtmsg_ifinfo+0x36/0x78
   register_netdevice+0x7a6/0x7d4
   register_netdev+0x20/0x36
   devm_register_netdev+0x58/0xb0
   emac_probe+0x3bc/0x5ce [k1_emac]
   platform_probe+0x46/0x84
   really_probe+0x108/0x2e0
   __driver_probe_device.part.0+0xaa/0xe0
   driver_probe_device+0x78/0xc4
   __driver_attach+0x54/0x162
   bus_for_each_dev+0x58/0xa4
   driver_attach+0x1a/0x22
   bus_add_driver+0xec/0x1ce
   driver_register+0x3e/0xd8
   __platform_driver_register+0x1c/0x24
   0xffffffff025bb020
   do_one_initcall+0x56/0x290
   do_init_module+0x52/0x1da
   load_module+0x1590/0x19d8
   init_module_from_file+0x76/0xae
   idempotent_init_module+0x186/0x1fc
   __riscv_sys_finit_module+0x54/0x84
   do_trap_ecall_u+0x2a0/0x4d0
   handle_exception+0x146/0x152
irq event stamp: 76398
hardirqs last  enabled at (76398): [<ffffffff80b8809c>] 
_raw_spin_unlock_irq+0x2a/0x42
hardirqs last disabled at (76397): [<ffffffff80b87e52>] 
_raw_spin_lock_irq+0x5a/0x60
softirqs last  enabled at (76376): [<ffffffff8002e8ca>] 
handle_softirqs+0x3ca/0x462
softirqs last disabled at (76389): [<ffffffff8002eaca>] 
__irq_exit_rcu+0xe2/0x10c

other info that might help us debug this:
  Possible unsafe locking scenario:

        CPU0
        ----
   lock(&priv->stats_lock);
   <Interrupt>
     lock(&priv->stats_lock);

  *** DEADLOCK ***

1 lock held by swapper/0/0:
  #0: ffffffc600003c30 ((&priv->stats_timer)){+.-.}-{0:0}, at: 
call_timer_fn+0x0/0x24e

stack backtrace:
CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 
6.17.0-rc6-next-20250918 #11165 NONE
Hardware name: Banana Pi BPI-F3 (DT)
Call Trace:
[<ffffffff800163a6>] dump_backtrace+0x1c/0x24
[<ffffffff80001482>] show_stack+0x28/0x34
[<ffffffff8000f7ca>] dump_stack_lvl+0x5e/0x86
[<ffffffff8000f806>] dump_stack+0x14/0x1c
[<ffffffff80090a80>] print_usage_bug.part.0+0x29a/0x302
[<ffffffff80091152>] mark_lock+0x66a/0x7ee
[<ffffffff80091cfe>] __lock_acquire+0x7cc/0x1f7c
[<ffffffff80093d0c>] lock_acquire+0xe8/0x2b6
[<ffffffff80b87d18>] _raw_spin_lock+0x2c/0x40
[<ffffffff025c61da>] emac_stats_timer+0x1c/0x3e [k1_emac]
[<ffffffff800d8de4>] call_timer_fn+0x90/0x24e
[<ffffffff800d91b0>] __run_timers+0x20e/0x2e8
[<ffffffff800d98ea>] timer_expire_remote+0x4a/0x5e
[<ffffffff800efe52>] tmigr_handle_remote_up+0x174/0x34a
[<ffffffff800ee5e0>] __walk_groups.isra.0+0x28/0x66
[<ffffffff800f0128>] tmigr_handle_remote+0x9e/0xc2
[<ffffffff800d931c>] run_timer_softirq+0x2a/0x32
[<ffffffff8002e662>] handle_softirqs+0x162/0x462
[<ffffffff8002eaca>] __irq_exit_rcu+0xe2/0x10c
[<ffffffff8002efac>] irq_exit_rcu+0xc/0x36
[<ffffffff80b7b248>] handle_riscv_irq+0x64/0x74
[<ffffffff80b898aa>] call_on_irq_stack+0x32/0x40



================================
WARNING: inconsistent lock state
6.17.0-rc6-next-20250918-dirty #11166 Not tainted
--------------------------------
inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
swapper/4/0 [HC0[0]:SC1[1]:HE1:SE0] takes:
ffffffd606ca92a0 (&priv->stats_lock){+.?.}-{3:3}, at: 
emac_stats_timer+0x1c/0x3e [k1_emac]
{SOFTIRQ-ON-W} state was registered at:
   __lock_acquire+0x7f6/0x1f7c
   lock_acquire+0xe8/0x2b6
   _raw_spin_lock+0x2c/0x40
   emac_open+0x820/0x9b0 [k1_emac]
   __dev_open+0xca/0x21c
   __dev_change_flags+0x18a/0x204
   netif_change_flags+0x1e/0x56
   do_setlink.constprop.0+0x268/0xb88
   rtnl_newlink+0x57a/0x788
   rtnetlink_rcv_msg+0x3ea/0x54c
   netlink_rcv_skb+0x44/0xec
   rtnetlink_rcv+0x14/0x1c
   netlink_unicast+0x1b6/0x218
   netlink_sendmsg+0x174/0x34e
   __sock_sendmsg+0x40/0x7c
   ____sys_sendmsg+0x19c/0x1ba
   ___sys_sendmsg+0x5c/0xa0
   __sys_sendmsg+0x5a/0xa2
   __riscv_sys_sendmsg+0x16/0x1e
   do_trap_ecall_u+0x2a0/0x4d0
   handle_exception+0x146/0x152
irq event stamp: 36278
hardirqs last  enabled at (36278): [<ffffffff80b8809c>] 
_raw_spin_unlock_irq+0x2a/0x42
hardirqs last disabled at (36277): [<ffffffff80b87e52>] 
_raw_spin_lock_irq+0x5a/0x60
softirqs last  enabled at (36256): [<ffffffff8002e8ca>] 
handle_softirqs+0x3ca/0x462
softirqs last disabled at (36269): [<ffffffff8002eaca>] 
__irq_exit_rcu+0xe2/0x10c

other info that might help us debug this:
  Possible unsafe locking scenario:

        CPU0
        ----
   lock(&priv->stats_lock);
   <Interrupt>
     lock(&priv->stats_lock);

  *** DEADLOCK ***

1 lock held by swapper/4/0:
  #0: ffffffc600023c30 ((&priv->stats_timer)){+.-.}-{0:0}, at: 
call_timer_fn+0x0/0x24e

stack backtrace:
CPU: 4 UID: 0 PID: 0 Comm: swapper/4 Not tainted 
6.17.0-rc6-next-20250918-dirty #11166 NONE
Hardware name: Banana Pi BPI-F3 (DT)
Call Trace:
[<ffffffff800163a6>] dump_backtrace+0x1c/0x24
[<ffffffff80001482>] show_stack+0x28/0x34
[<ffffffff8000f7ca>] dump_stack_lvl+0x5e/0x86
[<ffffffff8000f806>] dump_stack+0x14/0x1c
[<ffffffff80090a80>] print_usage_bug.part.0+0x29a/0x302
[<ffffffff80091152>] mark_lock+0x66a/0x7ee
[<ffffffff80091cfe>] __lock_acquire+0x7cc/0x1f7c
[<ffffffff80093d0c>] lock_acquire+0xe8/0x2b6
[<ffffffff80b87d18>] _raw_spin_lock+0x2c/0x40
[<ffffffff025b41da>] emac_stats_timer+0x1c/0x3e [k1_emac]
[<ffffffff800d8de4>] call_timer_fn+0x90/0x24e
[<ffffffff800d91b0>] __run_timers+0x20e/0x2e8
[<ffffffff800d98ea>] timer_expire_remote+0x4a/0x5e
[<ffffffff800efe52>] tmigr_handle_remote_up+0x174/0x34a
[<ffffffff800ee5e0>] __walk_groups.isra.0+0x28/0x66
[<ffffffff800f0128>] tmigr_handle_remote+0x9e/0xc2
[<ffffffff800d931c>] run_timer_softirq+0x2a/0x32
[<ffffffff8002e662>] handle_softirqs+0x162/0x462
[<ffffffff8002eaca>] __irq_exit_rcu+0xe2/0x10c
[<ffffffff8002efac>] irq_exit_rcu+0xc/0x36
[<ffffffff80b7b248>] handle_riscv_irq+0x64/0x74
[<ffffffff80b898aa>] call_on_irq_stack+0x32/0x40


> ---
> Changes in v12:
> - Add aliases ethernet{0,1} to DTS
> - Minor changes
>    - Use FIELD_MODIFY to set duplex mode in HW based on phydev->duplex
>    - Use FIELD_GET in emac_mii_read() to extract bits from MAC_MDIO_DATA
> - Link to v11: https://lore.kernel.org/r/20250912-net-k1-emac-v11-0-aa3e84f8043b@iscas.ac.cn
>
> Changes in v11:
> - Use NETDEV_PCPU_STAT_DSTATS for tx_dropped
> - Use DECLARE_FLEX_ARRAY for emac_hw_{tx,rx}_stats instead of cast
> - More bitfields stuff to simplify code:
>    - Define EMAC_MAX_DELAY_UNIT with FIELD_MAX
>    - Use FIELD_{PREP,GET} in emac_mii_{read,write}()
>    - Use FIELD_MODIFY in emac_set_{tx,rx}_fc()
> - Minor changes:
>    - Use lower_32_bits and such instead of casts and shifts
>    - Extract emac_ether_addr_hash() helper
>    - In emac_mdio_init(), 0xffffffff -> ~0
>    - Minor comment changes
> - Link to v10: https://lore.kernel.org/r/20250908-net-k1-emac-v10-0-90d807ccd469@iscas.ac.cn
>
> Changes in v10:
> - Use FIELD_GET and FIELD_PREP, remove some unused constants
> - Remove redundant software statistics
>    - In particular, rx_dropped should have been and is already tracked in
>      rx_errors.
> - Track tx_dropped with a percpu field
> - Minor changes
>    - Simplified int emac_rx_frame_status() -> bool emac_rx_frame_good()
> - Link to v9: https://lore.kernel.org/r/20250905-net-k1-emac-v9-0-f1649b98a19c@iscas.ac.cn
>
> Changes in v9:
> - Refactor to use phy_interface_mode_is_rgmii
> - Minor changes
>    - Use netdev_err in more places
>    - Print phy-mode by name on unsupported phy-mode
> - Link to v8: https://lore.kernel.org/r/20250828-net-k1-emac-v8-0-e9075dd2ca90@iscas.ac.cn
>
> Changes in v8:
> - Use devres to do of_phy_deregister_fixed_link on probe failure or
>    remove
> - Simplified control flow in a few places with early return or continue
> - Minor changes
>    - Removed some unneeded parens in emac_configure_{tx,rx}
> - Link to v7: https://lore.kernel.org/r/20250826-net-k1-emac-v7-0-5bc158d086ae@iscas.ac.cn
>
> Changes in v7:
> - Removed scoped_guard usage
> - Renamed error handling path labels after destinations
> - Fix skb free error handling path in emac_start_xmit and emac_tx_mem_map
> - Cancel tx_timeout_task to prevent schedule_work lifetime problems
> - Minor changes:
>    - Remove unnecessary timer_delete_sync in emac_down
>    - Use dev_err_ratelimited in a few more places
>    - Cosmetic fixes in error messages
> - Link to v6: https://lore.kernel.org/r/20250820-net-k1-emac-v6-0-c1e28f2b8be5@iscas.ac.cn
>
> Changes in v6:
> - Implement pause frame support
> - Minor changes:
>    - Convert comment for emac_stats_update() into assert_spin_locked()
>    - Cosmetic fixes for some comments and whitespace
>    - emac_set_mac_addr() is now refactored
> - Link to v5: https://lore.kernel.org/r/20250812-net-k1-emac-v5-0-dd17c4905f49@iscas.ac.cn
>
> Changes in v5:
> - Rebased on v6.17-rc1, add back DTS now that they apply cleanly
> - Use standard statistics interface, handle 32-bit statistics overflow
> - Minor changes:
>    - Fix clock resource handling in emac_resume
>    - Ratelimit the message in emac_rx_frame_status
>    - Add ndo_validate_addr = eth_validate_addr
>    - Remove unnecessary parens in emac_set_mac_addr
>    - Change some functions that never fail to return void instead of int
>    - Minor rewording
> - Link to v4: https://lore.kernel.org/r/20250703-net-k1-emac-v4-0-686d09c4cfa8@iscas.ac.cn
>
> Changes in v4:
> - Resource handling on probe and remove: timer_delete_sync and
>    of_phy_deregister_fixed_link
> - Drop DTS changes and dependencies (will send through SpacemiT tree)
> - Minor changes:
>    - Remove redundant phy_stop() and setting of ndev->phydev
>    - Fix error checking for emac_open in emac_resume
>    - Fix one missed dev_err -> dev_err_probe
>    - Fix type of emac_start_xmit
>    - Fix one missed reverse xmas tree formatting
>    - Rename some functions for consistency between emac_* and ndo_*
> - Link to v3: https://lore.kernel.org/r/20250702-net-k1-emac-v3-0-882dc55404f3@iscas.ac.cn
>
> Changes in v3:
> - Refactored and simplified emac_tx_mem_map
> - Addressed other minor v2 review comments
> - Removed what was patch 3 in v2, depend on DMA buses instead
> - DT nodes in alphabetical order where appropriate
> - Link to v2: https://lore.kernel.org/r/20250618-net-k1-emac-v2-0-94f5f07227a8@iscas.ac.cn
>
> Changes in v2:
> - dts: Put eth0 and eth1 nodes under a bus with dma-ranges
> - dts: Added Milk-V Jupiter
> - Fix typo in emac_init_hw() that broke the driver (Oops!)
> - Reformatted line lengths to under 80
> - Addressed other v1 review comments
> - Link to v1: https://lore.kernel.org/r/20250613-net-k1-emac-v1-0-cc6f9e510667@iscas.ac.cn
>
> ---
> Vivian Wang (5):
>        dt-bindings: net: Add support for SpacemiT K1
>        net: spacemit: Add K1 Ethernet MAC
>        riscv: dts: spacemit: Add Ethernet support for K1
>        riscv: dts: spacemit: Add Ethernet support for BPI-F3
>        riscv: dts: spacemit: Add Ethernet support for Jupiter
>
>   .../devicetree/bindings/net/spacemit,k1-emac.yaml  |   81 +
>   arch/riscv/boot/dts/spacemit/k1-bananapi-f3.dts    |   48 +
>   arch/riscv/boot/dts/spacemit/k1-milkv-jupiter.dts  |   48 +
>   arch/riscv/boot/dts/spacemit/k1-pinctrl.dtsi       |   48 +
>   arch/riscv/boot/dts/spacemit/k1.dtsi               |   22 +
>   drivers/net/ethernet/Kconfig                       |    1 +
>   drivers/net/ethernet/Makefile                      |    1 +
>   drivers/net/ethernet/spacemit/Kconfig              |   29 +
>   drivers/net/ethernet/spacemit/Makefile             |    6 +
>   drivers/net/ethernet/spacemit/k1_emac.c            | 2159 ++++++++++++++++++++
>   drivers/net/ethernet/spacemit/k1_emac.h            |  416 ++++
>   11 files changed, 2859 insertions(+)
> ---
> base-commit: 062b3e4a1f880f104a8d4b90b767788786aa7b78
> change-id: 20250606-net-k1-emac-3e181508ea64
>
> Best regards,

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland

Re: [PATCH net-next v12 0/5] Add Ethernet MAC support for SpacemiT K1
Posted by Vivian Wang 1 week, 6 days ago
Hi Marek,

Thanks for the testing.

On 9/19/25 16:27, Marek Szyprowski wrote:
> Hi All,
>
> On 14.09.2025 06:23, Vivian Wang wrote:
>> SpacemiT K1 has two gigabit Ethernet MACs with RGMII and RMII support.
>> Add devicetree bindings, driver, and DTS for it.
>>
>> Tested primarily on BananaPi BPI-F3. Basic TX/RX functionality also
>> tested on Milk-V Jupiter.
>>
>> I would like to note that even though some bit field names superficially
>> resemble that of DesignWare MAC, all other differences point to it in
>> fact being a custom design.
>>
>> Based on SpacemiT drivers [1]. These patches are also available at:
>>
>> https://github.com/dramforever/linux/tree/k1/ethernet/v12
>>
>> [1]: https://github.com/spacemit-com/linux-k1x
> This driver recently landed in linux-next as commit bfec6d7f2001 ("net: 
> spacemit: Add K1 Ethernet MAC"). In my tests I found that it 
> triggers lock dep warnings related to stats_lock acquisition. In the 
> current code it is being acquired with spin_lock(). For tests I've 
> changed that to spin_lock_irqsave() and the warnings went away, but I'm 
> not sure that this is the proper fix. I've also checked the driver 
> history and 'irqsave' locking was used in pre-v7 version, but it was 
> removed later on Jakub's request and described a bit misleading as 
> "Removed scoped_guard usage".

Oops, I had assumed that irqsave was unnecessary and missed that the
statistics functions are called with softirq enabled during
register_netdev. The ones called at probe time should be changed to
_irqsave or some other variant.

I'll take a look at the details myself and send a fix.

Thanks,
Vivian "dramforever" Wang