| From e159f05e12cc1111a3103b99375ddf0dfd0e7d63 Mon Sep 17 00:00:00 2001 |
| From: Jiawen Wu <jiawenwu@trustnetic.com> |
| Date: Tue, 7 Apr 2026 17:40:41 +0800 |
| Subject: net: txgbe: fix RTNL assertion warning when remove module |
| |
| From: Jiawen Wu <jiawenwu@trustnetic.com> |
| |
| commit e159f05e12cc1111a3103b99375ddf0dfd0e7d63 upstream. |
| |
| For the copper NIC with external PHY, the driver called |
| phylink_connect_phy() during probe and phylink_disconnect_phy() during |
| remove. It caused an RTNL assertion warning in phylink_disconnect_phy() |
| upon module remove. |
| |
| To fix this, add rtnl_lock() and rtnl_unlock() around the |
| phylink_disconnect_phy() in remove function. |
| |
| ------------[ cut here ]------------ |
| RTNL: assertion failed at drivers/net/phy/phylink.c (2351) |
| WARNING: drivers/net/phy/phylink.c:2351 at |
| phylink_disconnect_phy+0xd8/0xf0 [phylink], CPU#0: rmmod/4464 |
| Modules linked in: ... |
| CPU: 0 UID: 0 PID: 4464 Comm: rmmod Kdump: loaded Not tainted 7.0.0-rc4+ |
| Hardware name: Micro-Star International Co., Ltd. MS-7E16/X670E GAMING |
| PLUS WIFI (MS-7E16), BIOS 1.90 12/31/2024 |
| RIP: 0010:phylink_disconnect_phy+0xe4/0xf0 [phylink] |
| Code: 5b 41 5c 41 5d 41 5e 41 5f 5d 31 c0 31 d2 31 f6 31 ff e9 3a 38 8f e7 |
| 48 8d 3d 48 87 e2 ff ba 2f 09 00 00 48 c7 c6 c1 22 24 c0 <67> 48 0f b9 3a |
| e9 34 ff ff ff 66 90 90 90 90 90 90 90 90 90 90 90 |
| RSP: 0018:ffffce7288363ac0 EFLAGS: 00010246 |
| RAX: 0000000000000000 RBX: ffff89654b2a1a00 RCX: 0000000000000000 |
| RDX: 000000000000092f RSI: ffffffffc02422c1 RDI: ffffffffc0239020 |
| RBP: ffffce7288363ae8 R08: 0000000000000000 R09: 0000000000000000 |
| R10: 0000000000000000 R11: 0000000000000000 R12: ffff8964c4022000 |
| R13: ffff89654fce3028 R14: ffff89654ebb4000 R15: ffffffffc0226348 |
| FS: 0000795e80d93780(0000) GS:ffff896c52857000(0000) |
| knlGS:0000000000000000 |
| CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 |
| CR2: 00005b528b592000 CR3: 0000000170d0f000 CR4: 0000000000f50ef0 |
| PKRU: 55555554 |
| Call Trace: |
| <TASK> |
| txgbe_remove_phy+0xbb/0xd0 [txgbe] |
| txgbe_remove+0x4c/0xb0 [txgbe] |
| pci_device_remove+0x41/0xb0 |
| device_remove+0x43/0x80 |
| device_release_driver_internal+0x206/0x270 |
| driver_detach+0x4a/0xa0 |
| bus_remove_driver+0x83/0x120 |
| driver_unregister+0x2f/0x60 |
| pci_unregister_driver+0x40/0x90 |
| txgbe_driver_exit+0x10/0x850 [txgbe] |
| __do_sys_delete_module.isra.0+0x1c3/0x2f0 |
| __x64_sys_delete_module+0x12/0x20 |
| x64_sys_call+0x20c3/0x2390 |
| do_syscall_64+0x11c/0x1500 |
| ? srso_alias_return_thunk+0x5/0xfbef5 |
| ? do_syscall_64+0x15a/0x1500 |
| ? srso_alias_return_thunk+0x5/0xfbef5 |
| ? do_fault+0x312/0x580 |
| ? srso_alias_return_thunk+0x5/0xfbef5 |
| ? __handle_mm_fault+0x9d5/0x1040 |
| ? srso_alias_return_thunk+0x5/0xfbef5 |
| ? count_memcg_events+0x101/0x1d0 |
| ? srso_alias_return_thunk+0x5/0xfbef5 |
| ? handle_mm_fault+0x1e8/0x2f0 |
| ? srso_alias_return_thunk+0x5/0xfbef5 |
| ? do_user_addr_fault+0x2f8/0x820 |
| ? srso_alias_return_thunk+0x5/0xfbef5 |
| ? irqentry_exit+0xb2/0x600 |
| ? srso_alias_return_thunk+0x5/0xfbef5 |
| ? exc_page_fault+0x92/0x1c0 |
| entry_SYSCALL_64_after_hwframe+0x76/0x7e |
| |
| Fixes: 02b2a6f91b90 ("net: txgbe: support copper NIC with external PHY") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com> |
| Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> |
| Link: https://patch.msgid.link/8B47A5872884147D+20260407094041.4646-1-jiawenwu@trustnetic.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c |
| +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_phy.c |
| @@ -657,7 +657,9 @@ void txgbe_remove_phy(struct txgbe *txgb |
| return; |
| case wx_mac_sp: |
| if (txgbe->wx->media_type == wx_media_copper) { |
| + rtnl_lock(); |
| phylink_disconnect_phy(txgbe->wx->phylink); |
| + rtnl_unlock(); |
| phylink_destroy(txgbe->wx->phylink); |
| return; |
| } |