[openwrt/openwrt] generic: 6.6: backport upstream r8169 patches

LEDE Commits lede-commits at lists.infradead.org
Mon Aug 19 15:48:26 PDT 2024


noltari pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/27b816d5451f1885e80918a2bb687c8aa1258cbf

commit 27b816d5451f1885e80918a2bb687c8aa1258cbf
Author: Álvaro Fernández Rojas <noltari at gmail.com>
AuthorDate: Mon Aug 19 17:55:00 2024 +0200

    generic: 6.6: backport upstream r8169 patches
    
    - improve RTL8411b phy-down fixup
    - remove not needed check in rtl_fw_write_firmware
    - remove multicast filter limit
    - improve handling task scheduling
    - simplify EEE handling
    - simplify code by using core-provided pcpu stats allocation
    - add generic rtl_set_eee_txidle_timer function
    - support setting the EEE tx idle timer on RTL8168h
    - add support for returning tx_lpi_timer in ethtool get_eee
    - annotate writes on dev->mtu from ndo_change_mtu()
    - disable interrupt source RxOverflow
    - remove detection of chip version 11 (early RTL8168b)
    
    Signed-off-by: Álvaro Fernández Rojas <noltari at gmail.com>
---
 ...6.8-r8169-improve-RTL8411b-phy-down-fixup.patch | 173 +++++++++++++++++++++
 ...e-not-needed-check-in-rtl_fw_write_firmwa.patch |  27 ++++
 ...-v6.8-r8169-remove-multicast-filter-limit.patch |  47 ++++++
 ....8-r8169-improve-handling-task-scheduling.patch |  41 +++++
 ...add-support-for-LED-s-on-RTL8168-RTL8101.patch} |  10 +-
 ...69-fix-building-with-CONFIG_LEDS_CLASS-m.patch} |   2 +-
 .../780-07-v6.9-r8169-simplify-EEE-handling.patch  |  96 ++++++++++++
 ...0-08-v6.9-r8169-add-support-for-RTL8126A.patch} |  54 +++----
 ...169-improve-checking-for-valid-LED-modes.patch} |   0
 ...ify-code-by-using-core-provided-pcpu-stat.patch |  39 +++++
 ...8169-add-LED-support-for-RTL8125-RTL8126.patch} |   6 +-
 ...generic-rtl_set_eee_txidle_timer-function.patch |  91 +++++++++++
 ...rt-setting-the-EEE-tx-idle-timer-on-RTL81.patch |  30 ++++
 ...upport-for-returning-tx_lpi_timer-in-etht.patch |  55 +++++++
 ...9-add-MODULE_FIRMWARE-entry-for-RTL8126A.patch} |   2 +-
 ...x-LED-related-deadlock-on-module-removal.patch} |   6 +-
 ...ssing-conditional-compiling-for-call-to-.patch} |   2 +-
 ...-18-v6.10-r8169-add-support-for-RTL8168M.patch} |   2 +-
 ...ate-writes-on-dev-mtu-from-ndo_change_mtu.patch |  60 +++++++
 ...r8169-disable-interrupt-source-RxOverflow.patch |  34 ++++
 ...e-detection-of-chip-version-11-early-RTL8.patch |  32 ++++
 21 files changed, 767 insertions(+), 42 deletions(-)

diff --git a/target/linux/generic/backport-6.6/780-01-v6.8-r8169-improve-RTL8411b-phy-down-fixup.patch b/target/linux/generic/backport-6.6/780-01-v6.8-r8169-improve-RTL8411b-phy-down-fixup.patch
new file mode 100644
index 0000000000..9a17fe4f78
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-01-v6.8-r8169-improve-RTL8411b-phy-down-fixup.patch
@@ -0,0 +1,173 @@
+From 055dd7511f675d26fa283b35bb3dadfc7f77ed97 Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Mon, 13 Nov 2023 20:13:26 +0100
+Subject: [PATCH] r8169: improve RTL8411b phy-down fixup
+
+Mirsad proposed a patch to reduce the number of spinlock lock/unlock
+operations and the function code size. This can be further improved
+because the function sets a consecutive register block.
+
+Suggested-by: Mirsad Todorovac <mirsad.todorovac at alu.unizg.hr>
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Reviewed-by: Simon Horman <horms at kernel.org>
+Reviewed-by: Mirsad Todorovac <mirsad.todorovac at alu.unizg.hr>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 139 +++++-----------------
+ 1 file changed, 28 insertions(+), 111 deletions(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -3129,6 +3129,33 @@ static void rtl_hw_start_8168g_2(struct
+ 	rtl_ephy_init(tp, e_info_8168g_2);
+ }
+ 
++static void rtl8411b_fix_phy_down(struct rtl8169_private *tp)
++{
++	static const u16 fix_data[] = {
++/* 0xf800 */ 0xe008, 0xe00a, 0xe00c, 0xe00e, 0xe027, 0xe04f, 0xe05e, 0xe065,
++/* 0xf810 */ 0xc602, 0xbe00, 0x0000, 0xc502, 0xbd00, 0x074c, 0xc302, 0xbb00,
++/* 0xf820 */ 0x080a, 0x6420, 0x48c2, 0x8c20, 0xc516, 0x64a4, 0x49c0, 0xf009,
++/* 0xf830 */ 0x74a2, 0x8ca5, 0x74a0, 0xc50e, 0x9ca2, 0x1c11, 0x9ca0, 0xe006,
++/* 0xf840 */ 0x74f8, 0x48c4, 0x8cf8, 0xc404, 0xbc00, 0xc403, 0xbc00, 0x0bf2,
++/* 0xf850 */ 0x0c0a, 0xe434, 0xd3c0, 0x49d9, 0xf01f, 0xc526, 0x64a5, 0x1400,
++/* 0xf860 */ 0xf007, 0x0c01, 0x8ca5, 0x1c15, 0xc51b, 0x9ca0, 0xe013, 0xc519,
++/* 0xf870 */ 0x74a0, 0x48c4, 0x8ca0, 0xc516, 0x74a4, 0x48c8, 0x48ca, 0x9ca4,
++/* 0xf880 */ 0xc512, 0x1b00, 0x9ba0, 0x1b1c, 0x483f, 0x9ba2, 0x1b04, 0xc508,
++/* 0xf890 */ 0x9ba0, 0xc505, 0xbd00, 0xc502, 0xbd00, 0x0300, 0x051e, 0xe434,
++/* 0xf8a0 */ 0xe018, 0xe092, 0xde20, 0xd3c0, 0xc50f, 0x76a4, 0x49e3, 0xf007,
++/* 0xf8b0 */ 0x49c0, 0xf103, 0xc607, 0xbe00, 0xc606, 0xbe00, 0xc602, 0xbe00,
++/* 0xf8c0 */ 0x0c4c, 0x0c28, 0x0c2c, 0xdc00, 0xc707, 0x1d00, 0x8de2, 0x48c1,
++/* 0xf8d0 */ 0xc502, 0xbd00, 0x00aa, 0xe0c0, 0xc502, 0xbd00, 0x0132
++	};
++	unsigned long flags;
++	int i;
++
++	raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
++	for (i = 0; i < ARRAY_SIZE(fix_data); i++)
++		__r8168_mac_ocp_write(tp, 0xf800 + 2 * i, fix_data[i]);
++	raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
++}
++
+ static void rtl_hw_start_8411_2(struct rtl8169_private *tp)
+ {
+ 	static const struct ephy_info e_info_8411_2[] = {
+@@ -3162,117 +3189,7 @@ static void rtl_hw_start_8411_2(struct r
+ 	mdelay(3);
+ 	r8168_mac_ocp_write(tp, 0xFC26, 0x0000);
+ 
+-	r8168_mac_ocp_write(tp, 0xF800, 0xE008);
+-	r8168_mac_ocp_write(tp, 0xF802, 0xE00A);
+-	r8168_mac_ocp_write(tp, 0xF804, 0xE00C);
+-	r8168_mac_ocp_write(tp, 0xF806, 0xE00E);
+-	r8168_mac_ocp_write(tp, 0xF808, 0xE027);
+-	r8168_mac_ocp_write(tp, 0xF80A, 0xE04F);
+-	r8168_mac_ocp_write(tp, 0xF80C, 0xE05E);
+-	r8168_mac_ocp_write(tp, 0xF80E, 0xE065);
+-	r8168_mac_ocp_write(tp, 0xF810, 0xC602);
+-	r8168_mac_ocp_write(tp, 0xF812, 0xBE00);
+-	r8168_mac_ocp_write(tp, 0xF814, 0x0000);
+-	r8168_mac_ocp_write(tp, 0xF816, 0xC502);
+-	r8168_mac_ocp_write(tp, 0xF818, 0xBD00);
+-	r8168_mac_ocp_write(tp, 0xF81A, 0x074C);
+-	r8168_mac_ocp_write(tp, 0xF81C, 0xC302);
+-	r8168_mac_ocp_write(tp, 0xF81E, 0xBB00);
+-	r8168_mac_ocp_write(tp, 0xF820, 0x080A);
+-	r8168_mac_ocp_write(tp, 0xF822, 0x6420);
+-	r8168_mac_ocp_write(tp, 0xF824, 0x48C2);
+-	r8168_mac_ocp_write(tp, 0xF826, 0x8C20);
+-	r8168_mac_ocp_write(tp, 0xF828, 0xC516);
+-	r8168_mac_ocp_write(tp, 0xF82A, 0x64A4);
+-	r8168_mac_ocp_write(tp, 0xF82C, 0x49C0);
+-	r8168_mac_ocp_write(tp, 0xF82E, 0xF009);
+-	r8168_mac_ocp_write(tp, 0xF830, 0x74A2);
+-	r8168_mac_ocp_write(tp, 0xF832, 0x8CA5);
+-	r8168_mac_ocp_write(tp, 0xF834, 0x74A0);
+-	r8168_mac_ocp_write(tp, 0xF836, 0xC50E);
+-	r8168_mac_ocp_write(tp, 0xF838, 0x9CA2);
+-	r8168_mac_ocp_write(tp, 0xF83A, 0x1C11);
+-	r8168_mac_ocp_write(tp, 0xF83C, 0x9CA0);
+-	r8168_mac_ocp_write(tp, 0xF83E, 0xE006);
+-	r8168_mac_ocp_write(tp, 0xF840, 0x74F8);
+-	r8168_mac_ocp_write(tp, 0xF842, 0x48C4);
+-	r8168_mac_ocp_write(tp, 0xF844, 0x8CF8);
+-	r8168_mac_ocp_write(tp, 0xF846, 0xC404);
+-	r8168_mac_ocp_write(tp, 0xF848, 0xBC00);
+-	r8168_mac_ocp_write(tp, 0xF84A, 0xC403);
+-	r8168_mac_ocp_write(tp, 0xF84C, 0xBC00);
+-	r8168_mac_ocp_write(tp, 0xF84E, 0x0BF2);
+-	r8168_mac_ocp_write(tp, 0xF850, 0x0C0A);
+-	r8168_mac_ocp_write(tp, 0xF852, 0xE434);
+-	r8168_mac_ocp_write(tp, 0xF854, 0xD3C0);
+-	r8168_mac_ocp_write(tp, 0xF856, 0x49D9);
+-	r8168_mac_ocp_write(tp, 0xF858, 0xF01F);
+-	r8168_mac_ocp_write(tp, 0xF85A, 0xC526);
+-	r8168_mac_ocp_write(tp, 0xF85C, 0x64A5);
+-	r8168_mac_ocp_write(tp, 0xF85E, 0x1400);
+-	r8168_mac_ocp_write(tp, 0xF860, 0xF007);
+-	r8168_mac_ocp_write(tp, 0xF862, 0x0C01);
+-	r8168_mac_ocp_write(tp, 0xF864, 0x8CA5);
+-	r8168_mac_ocp_write(tp, 0xF866, 0x1C15);
+-	r8168_mac_ocp_write(tp, 0xF868, 0xC51B);
+-	r8168_mac_ocp_write(tp, 0xF86A, 0x9CA0);
+-	r8168_mac_ocp_write(tp, 0xF86C, 0xE013);
+-	r8168_mac_ocp_write(tp, 0xF86E, 0xC519);
+-	r8168_mac_ocp_write(tp, 0xF870, 0x74A0);
+-	r8168_mac_ocp_write(tp, 0xF872, 0x48C4);
+-	r8168_mac_ocp_write(tp, 0xF874, 0x8CA0);
+-	r8168_mac_ocp_write(tp, 0xF876, 0xC516);
+-	r8168_mac_ocp_write(tp, 0xF878, 0x74A4);
+-	r8168_mac_ocp_write(tp, 0xF87A, 0x48C8);
+-	r8168_mac_ocp_write(tp, 0xF87C, 0x48CA);
+-	r8168_mac_ocp_write(tp, 0xF87E, 0x9CA4);
+-	r8168_mac_ocp_write(tp, 0xF880, 0xC512);
+-	r8168_mac_ocp_write(tp, 0xF882, 0x1B00);
+-	r8168_mac_ocp_write(tp, 0xF884, 0x9BA0);
+-	r8168_mac_ocp_write(tp, 0xF886, 0x1B1C);
+-	r8168_mac_ocp_write(tp, 0xF888, 0x483F);
+-	r8168_mac_ocp_write(tp, 0xF88A, 0x9BA2);
+-	r8168_mac_ocp_write(tp, 0xF88C, 0x1B04);
+-	r8168_mac_ocp_write(tp, 0xF88E, 0xC508);
+-	r8168_mac_ocp_write(tp, 0xF890, 0x9BA0);
+-	r8168_mac_ocp_write(tp, 0xF892, 0xC505);
+-	r8168_mac_ocp_write(tp, 0xF894, 0xBD00);
+-	r8168_mac_ocp_write(tp, 0xF896, 0xC502);
+-	r8168_mac_ocp_write(tp, 0xF898, 0xBD00);
+-	r8168_mac_ocp_write(tp, 0xF89A, 0x0300);
+-	r8168_mac_ocp_write(tp, 0xF89C, 0x051E);
+-	r8168_mac_ocp_write(tp, 0xF89E, 0xE434);
+-	r8168_mac_ocp_write(tp, 0xF8A0, 0xE018);
+-	r8168_mac_ocp_write(tp, 0xF8A2, 0xE092);
+-	r8168_mac_ocp_write(tp, 0xF8A4, 0xDE20);
+-	r8168_mac_ocp_write(tp, 0xF8A6, 0xD3C0);
+-	r8168_mac_ocp_write(tp, 0xF8A8, 0xC50F);
+-	r8168_mac_ocp_write(tp, 0xF8AA, 0x76A4);
+-	r8168_mac_ocp_write(tp, 0xF8AC, 0x49E3);
+-	r8168_mac_ocp_write(tp, 0xF8AE, 0xF007);
+-	r8168_mac_ocp_write(tp, 0xF8B0, 0x49C0);
+-	r8168_mac_ocp_write(tp, 0xF8B2, 0xF103);
+-	r8168_mac_ocp_write(tp, 0xF8B4, 0xC607);
+-	r8168_mac_ocp_write(tp, 0xF8B6, 0xBE00);
+-	r8168_mac_ocp_write(tp, 0xF8B8, 0xC606);
+-	r8168_mac_ocp_write(tp, 0xF8BA, 0xBE00);
+-	r8168_mac_ocp_write(tp, 0xF8BC, 0xC602);
+-	r8168_mac_ocp_write(tp, 0xF8BE, 0xBE00);
+-	r8168_mac_ocp_write(tp, 0xF8C0, 0x0C4C);
+-	r8168_mac_ocp_write(tp, 0xF8C2, 0x0C28);
+-	r8168_mac_ocp_write(tp, 0xF8C4, 0x0C2C);
+-	r8168_mac_ocp_write(tp, 0xF8C6, 0xDC00);
+-	r8168_mac_ocp_write(tp, 0xF8C8, 0xC707);
+-	r8168_mac_ocp_write(tp, 0xF8CA, 0x1D00);
+-	r8168_mac_ocp_write(tp, 0xF8CC, 0x8DE2);
+-	r8168_mac_ocp_write(tp, 0xF8CE, 0x48C1);
+-	r8168_mac_ocp_write(tp, 0xF8D0, 0xC502);
+-	r8168_mac_ocp_write(tp, 0xF8D2, 0xBD00);
+-	r8168_mac_ocp_write(tp, 0xF8D4, 0x00AA);
+-	r8168_mac_ocp_write(tp, 0xF8D6, 0xE0C0);
+-	r8168_mac_ocp_write(tp, 0xF8D8, 0xC502);
+-	r8168_mac_ocp_write(tp, 0xF8DA, 0xBD00);
+-	r8168_mac_ocp_write(tp, 0xF8DC, 0x0132);
++	rtl8411b_fix_phy_down(tp);
+ 
+ 	r8168_mac_ocp_write(tp, 0xFC26, 0x8000);
+ 
diff --git a/target/linux/generic/backport-6.6/780-02-v6.8-r8169-remove-not-needed-check-in-rtl_fw_write_firmwa.patch b/target/linux/generic/backport-6.6/780-02-v6.8-r8169-remove-not-needed-check-in-rtl_fw_write_firmwa.patch
new file mode 100644
index 0000000000..de10d30e83
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-02-v6.8-r8169-remove-not-needed-check-in-rtl_fw_write_firmwa.patch
@@ -0,0 +1,27 @@
+From 3a767b482cacd9bfeac786837fcac419af315995 Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Thu, 23 Nov 2023 10:53:26 +0100
+Subject: [PATCH] r8169: remove not needed check in rtl_fw_write_firmware
+
+This check can never be true for a firmware file with a correct format.
+Existing checks in rtl_fw_data_ok() are sufficient, no problems with
+invalid firmware files are known.
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/realtek/r8169_firmware.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_firmware.c
++++ b/drivers/net/ethernet/realtek/r8169_firmware.c
+@@ -151,9 +151,6 @@ void rtl_fw_write_firmware(struct rtl816
+ 		u32 regno = (action & 0x0fff0000) >> 16;
+ 		enum rtl_fw_opcode opcode = action >> 28;
+ 
+-		if (!action)
+-			break;
+-
+ 		switch (opcode) {
+ 		case PHY_READ:
+ 			predata = fw_read(tp, regno);
diff --git a/target/linux/generic/backport-6.6/780-03-v6.8-r8169-remove-multicast-filter-limit.patch b/target/linux/generic/backport-6.6/780-03-v6.8-r8169-remove-multicast-filter-limit.patch
new file mode 100644
index 0000000000..4186e14e17
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-03-v6.8-r8169-remove-multicast-filter-limit.patch
@@ -0,0 +1,47 @@
+From cd04b44bf055c4cd6bcee2ebfa6932fb20ef369d Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Mon, 27 Nov 2023 21:16:10 +0100
+Subject: [PATCH] r8169: remove multicast filter limit
+
+Once upon a time, when r8169 was new, the multicast filter limit code
+was copied from RTL8139 driver. There the filter limit is even
+user-configurable.
+The filtering is hash-based and we don't have perfect filtering.
+Actually the mc filtering on RTL8125 still seems to be the same
+as used on 8390/NE2000. So it's not clear to me which benefit it
+should bring when switching to all-multi mode once a certain number
+of filter bits is set. More the opposite: Filtering out at least
+some unwanted mc traffic is better than no filtering.
+Also the available chip documentation doesn't mention any restriction.
+Therefore remove the filter limit.
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Link: https://lore.kernel.org/r/57076c05-3730-40d1-ab9a-5334b263e41a@gmail.com
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -56,10 +56,6 @@
+ #define FIRMWARE_8125A_3	"rtl_nic/rtl8125a-3.fw"
+ #define FIRMWARE_8125B_2	"rtl_nic/rtl8125b-2.fw"
+ 
+-/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
+-   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
+-#define	MC_FILTER_LIMIT	32
+-
+ #define TX_DMA_BURST	7	/* Maximum PCI burst, '7' is unlimited */
+ #define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
+ 
+@@ -2626,8 +2622,7 @@ static void rtl_set_rx_mode(struct net_d
+ 		rx_mode |= AcceptAllPhys;
+ 	} else if (!(dev->flags & IFF_MULTICAST)) {
+ 		rx_mode &= ~AcceptMulticast;
+-	} else if (netdev_mc_count(dev) > MC_FILTER_LIMIT ||
+-		   dev->flags & IFF_ALLMULTI ||
++	} else if (dev->flags & IFF_ALLMULTI ||
+ 		   tp->mac_version == RTL_GIGA_MAC_VER_35) {
+ 		/* accept all multicasts */
+ 	} else if (netdev_mc_empty(dev)) {
diff --git a/target/linux/generic/backport-6.6/780-04-v6.8-r8169-improve-handling-task-scheduling.patch b/target/linux/generic/backport-6.6/780-04-v6.8-r8169-improve-handling-task-scheduling.patch
new file mode 100644
index 0000000000..a809e8213a
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-04-v6.8-r8169-improve-handling-task-scheduling.patch
@@ -0,0 +1,41 @@
+From 127532cd0f060ebc3c4cbca81b6438728ad5896e Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Mon, 27 Nov 2023 18:20:11 +0100
+Subject: [PATCH] r8169: improve handling task scheduling
+
+If we know that the task is going to be a no-op, don't even schedule it.
+And remove the check for netif_running() in the worker function, the
+check for flag RTL_FLAG_TASK_ENABLED is sufficient. Note that we can't
+remove the check for flag RTL_FLAG_TASK_ENABLED in the worker function
+because we have no guarantee when it will be executed.
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Reviewed-by: Przemek Kitszel <przemyslaw.kitszel at intel.com>
+Link: https://lore.kernel.org/r/c65873a3-7394-4107-99a7-83f20030779c@gmail.com
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -2252,6 +2252,9 @@ u16 rtl8168h_2_get_adc_bias_ioffset(stru
+ 
+ static void rtl_schedule_task(struct rtl8169_private *tp, enum rtl_flag flag)
+ {
++	if (!test_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags))
++		return;
++
+ 	set_bit(flag, tp->wk.flags);
+ 	schedule_work(&tp->wk.work);
+ }
+@@ -4491,8 +4494,7 @@ static void rtl_task(struct work_struct
+ 
+ 	rtnl_lock();
+ 
+-	if (!netif_running(tp->dev) ||
+-	    !test_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags))
++	if (!test_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags))
+ 		goto out_unlock;
+ 
+ 	if (test_and_clear_bit(RTL_FLAG_TASK_TX_TIMEOUT, tp->wk.flags)) {
diff --git a/target/linux/generic/backport-6.6/780-01-v6.8-r8169-add-support-for-LED-s-on-RTL8168-RTL8101.patch b/target/linux/generic/backport-6.6/780-05-v6.8-r8169-add-support-for-LED-s-on-RTL8168-RTL8101.patch
similarity index 97%
rename from target/linux/generic/backport-6.6/780-01-v6.8-r8169-add-support-for-LED-s-on-RTL8168-RTL8101.patch
rename to target/linux/generic/backport-6.6/780-05-v6.8-r8169-add-support-for-LED-s-on-RTL8168-RTL8101.patch
index fe75a4e3f8..7a5d5a66a1 100644
--- a/target/linux/generic/backport-6.6/780-01-v6.8-r8169-add-support-for-LED-s-on-RTL8168-RTL8101.patch
+++ b/target/linux/generic/backport-6.6/780-05-v6.8-r8169-add-support-for-LED-s-on-RTL8168-RTL8101.patch
@@ -217,7 +217,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
 +}
 --- a/drivers/net/ethernet/realtek/r8169_main.c
 +++ b/drivers/net/ethernet/realtek/r8169_main.c
-@@ -289,6 +289,7 @@ enum rtl8168_8101_registers {
+@@ -285,6 +285,7 @@ enum rtl8168_8101_registers {
  };
  
  enum rtl8168_registers {
@@ -225,7 +225,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  	LED_FREQ		= 0x1a,
  	EEE_LED			= 0x1b,
  	ERIDR			= 0x70,
-@@ -620,6 +621,7 @@ struct rtl8169_private {
+@@ -616,6 +617,7 @@ struct rtl8169_private {
  
  	raw_spinlock_t config25_lock;
  	raw_spinlock_t mac_ocp_lock;
@@ -233,7 +233,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  
  	raw_spinlock_t cfg9346_usage_lock;
  	int cfg9346_usage_count;
-@@ -792,6 +794,62 @@ static const struct rtl_cond name = {
+@@ -788,6 +790,62 @@ static const struct rtl_cond name = {
  							\
  static bool name ## _check(struct rtl8169_private *tp)
  
@@ -296,7 +296,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  static void r8168fp_adjust_ocp_cmd(struct rtl8169_private *tp, u32 *cmd, int type)
  {
  	/* based on RTL8168FP_OOBMAC_BASE in vendor driver */
-@@ -5254,6 +5312,7 @@ static int rtl_init_one(struct pci_dev *
+@@ -5168,6 +5226,7 @@ static int rtl_init_one(struct pci_dev *
  	raw_spin_lock_init(&tp->cfg9346_usage_lock);
  	raw_spin_lock_init(&tp->config25_lock);
  	raw_spin_lock_init(&tp->mac_ocp_lock);
@@ -304,7 +304,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  
  	dev->tstats = devm_netdev_alloc_pcpu_stats(&pdev->dev,
  						   struct pcpu_sw_netstats);
-@@ -5410,6 +5469,12 @@ static int rtl_init_one(struct pci_dev *
+@@ -5324,6 +5383,12 @@ static int rtl_init_one(struct pci_dev *
  	if (rc)
  		return rc;
  
diff --git a/target/linux/generic/backport-6.6/780-02-v6.8-r8169-fix-building-with-CONFIG_LEDS_CLASS-m.patch b/target/linux/generic/backport-6.6/780-06-v6.8-r8169-fix-building-with-CONFIG_LEDS_CLASS-m.patch
similarity index 97%
rename from target/linux/generic/backport-6.6/780-02-v6.8-r8169-fix-building-with-CONFIG_LEDS_CLASS-m.patch
rename to target/linux/generic/backport-6.6/780-06-v6.8-r8169-fix-building-with-CONFIG_LEDS_CLASS-m.patch
index 1b83cf4cda..67f215cadf 100644
--- a/target/linux/generic/backport-6.6/780-02-v6.8-r8169-fix-building-with-CONFIG_LEDS_CLASS-m.patch
+++ b/target/linux/generic/backport-6.6/780-06-v6.8-r8169-fix-building-with-CONFIG_LEDS_CLASS-m.patch
@@ -59,7 +59,7 @@ Signed-off-by: Jakub Kicinski <kuba at kernel.org>
  obj-$(CONFIG_R8169) += r8169.o
 --- a/drivers/net/ethernet/realtek/r8169_main.c
 +++ b/drivers/net/ethernet/realtek/r8169_main.c
-@@ -5469,11 +5469,10 @@ static int rtl_init_one(struct pci_dev *
+@@ -5383,11 +5383,10 @@ static int rtl_init_one(struct pci_dev *
  	if (rc)
  		return rc;
  
diff --git a/target/linux/generic/backport-6.6/780-07-v6.9-r8169-simplify-EEE-handling.patch b/target/linux/generic/backport-6.6/780-07-v6.9-r8169-simplify-EEE-handling.patch
new file mode 100644
index 0000000000..bdd3330580
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-07-v6.9-r8169-simplify-EEE-handling.patch
@@ -0,0 +1,96 @@
+From f5d59230ec26aa5e8b59e9f4a4d288703a737479 Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Wed, 31 Jan 2024 21:31:01 +0100
+Subject: [PATCH] r8169: simplify EEE handling
+
+We don't have to store the EEE modes to be advertised in the driver,
+phylib does this for us and stores it in phydev->advertising_eee.
+phylib also takes care of properly handling the EEE advertisement.
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Link: https://lore.kernel.org/r/27c336a8-ea47-483d-815b-02c45ae41da2@gmail.com
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 32 +++--------------------
+ 1 file changed, 4 insertions(+), 28 deletions(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -629,7 +629,6 @@ struct rtl8169_private {
+ 	struct rtl8169_counters *counters;
+ 	struct rtl8169_tc_offsets tc_offset;
+ 	u32 saved_wolopts;
+-	int eee_adv;
+ 
+ 	const char *fw_name;
+ 	struct rtl_fw *rtl_fw;
+@@ -2010,17 +2009,11 @@ static int rtl8169_get_eee(struct net_de
+ static int rtl8169_set_eee(struct net_device *dev, struct ethtool_eee *data)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+-	int ret;
+ 
+ 	if (!rtl_supports_eee(tp))
+ 		return -EOPNOTSUPP;
+ 
+-	ret = phy_ethtool_set_eee(tp->phydev, data);
+-
+-	if (!ret)
+-		tp->eee_adv = phy_read_mmd(dev->phydev, MDIO_MMD_AN,
+-					   MDIO_AN_EEE_ADV);
+-	return ret;
++	return phy_ethtool_set_eee(tp->phydev, data);
+ }
+ 
+ static void rtl8169_get_ringparam(struct net_device *dev,
+@@ -2085,21 +2078,6 @@ static const struct ethtool_ops rtl8169_
+ 	.set_pauseparam		= rtl8169_set_pauseparam,
+ };
+ 
+-static void rtl_enable_eee(struct rtl8169_private *tp)
+-{
+-	struct phy_device *phydev = tp->phydev;
+-	int adv;
+-
+-	/* respect EEE advertisement the user may have set */
+-	if (tp->eee_adv >= 0)
+-		adv = tp->eee_adv;
+-	else
+-		adv = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE);
+-
+-	if (adv >= 0)
+-		phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv);
+-}
+-
+ static enum mac_version rtl8169_get_mac_version(u16 xid, bool gmii)
+ {
+ 	/*
+@@ -2336,9 +2314,6 @@ static void rtl8169_init_phy(struct rtl8
+ 	/* We may have called phy_speed_down before */
+ 	phy_speed_up(tp->phydev);
+ 
+-	if (rtl_supports_eee(tp))
+-		rtl_enable_eee(tp);
+-
+ 	genphy_soft_reset(tp->phydev);
+ }
+ 
+@@ -5085,7 +5060,9 @@ static int r8169_mdio_register(struct rt
+ 	}
+ 
+ 	tp->phydev->mac_managed_pm = true;
+-
++	if (rtl_supports_eee(tp))
++		linkmode_copy(tp->phydev->advertising_eee,
++			      tp->phydev->supported_eee);
+ 	phy_support_asym_pause(tp->phydev);
+ 
+ 	/* PHY will be woken up in rtl_open() */
+@@ -5220,7 +5197,6 @@ static int rtl_init_one(struct pci_dev *
+ 	tp->dev = dev;
+ 	tp->pci_dev = pdev;
+ 	tp->supports_gmii = ent->driver_data == RTL_CFG_NO_GBIT ? 0 : 1;
+-	tp->eee_adv = -1;
+ 	tp->ocp_base = OCP_STD_PHY_BASE;
+ 
+ 	raw_spin_lock_init(&tp->cfg9346_usage_lock);
diff --git a/target/linux/generic/backport-6.6/780-03-v6.9-r8169-add-support-for-RTL8126A.patch b/target/linux/generic/backport-6.6/780-08-v6.9-r8169-add-support-for-RTL8126A.patch
similarity index 85%
rename from target/linux/generic/backport-6.6/780-03-v6.9-r8169-add-support-for-RTL8126A.patch
rename to target/linux/generic/backport-6.6/780-08-v6.9-r8169-add-support-for-RTL8126A.patch
index ab38b0cfb9..65aa5449ec 100644
--- a/target/linux/generic/backport-6.6/780-03-v6.9-r8169-add-support-for-RTL8126A.patch
+++ b/target/linux/generic/backport-6.6/780-08-v6.9-r8169-add-support-for-RTL8126A.patch
@@ -34,9 +34,9 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  #define FIRMWARE_8125B_2	"rtl_nic/rtl8125b-2.fw"
 +#define FIRMWARE_8126A_2	"rtl_nic/rtl8126a-2.fw"
  
- /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
-    The RTL chips use a 64 element hash table based on the Ethernet CRC. */
-@@ -140,6 +141,7 @@ static const struct {
+ #define TX_DMA_BURST	7	/* Maximum PCI burst, '7' is unlimited */
+ #define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
+@@ -136,6 +137,7 @@ static const struct {
  	[RTL_GIGA_MAC_VER_61] = {"RTL8125A",		FIRMWARE_8125A_3},
  	/* reserve 62 for CFG_METHOD_4 in the vendor driver */
  	[RTL_GIGA_MAC_VER_63] = {"RTL8125B",		FIRMWARE_8125B_2},
@@ -44,7 +44,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  };
  
  static const struct pci_device_id rtl8169_pci_tbl[] = {
-@@ -162,6 +164,7 @@ static const struct pci_device_id rtl816
+@@ -158,6 +160,7 @@ static const struct pci_device_id rtl816
  	{ PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, 0x0024 },
  	{ 0x0001, 0x8168, PCI_ANY_ID, 0x2410 },
  	{ PCI_VDEVICE(REALTEK,	0x8125) },
@@ -52,7 +52,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  	{ PCI_VDEVICE(REALTEK,	0x3000) },
  	{}
  };
-@@ -331,8 +334,12 @@ enum rtl8168_registers {
+@@ -327,8 +330,12 @@ enum rtl8168_registers {
  };
  
  enum rtl8125_registers {
@@ -65,7 +65,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  	TxPoll_8125		= 0x90,
  	MAC0_BKP		= 0x19e0,
  	EEE_TXIDLE_TIMER_8125	= 0x6048,
-@@ -1144,7 +1151,7 @@ static void rtl_writephy(struct rtl8169_
+@@ -1139,7 +1146,7 @@ static void rtl_writephy(struct rtl8169_
  	case RTL_GIGA_MAC_VER_31:
  		r8168dp_2_mdio_write(tp, location, val);
  		break;
@@ -74,7 +74,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		r8168g_mdio_write(tp, location, val);
  		break;
  	default:
-@@ -1159,7 +1166,7 @@ static int rtl_readphy(struct rtl8169_pr
+@@ -1154,7 +1161,7 @@ static int rtl_readphy(struct rtl8169_pr
  	case RTL_GIGA_MAC_VER_28:
  	case RTL_GIGA_MAC_VER_31:
  		return r8168dp_2_mdio_read(tp, location);
@@ -83,7 +83,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		return r8168g_mdio_read(tp, location);
  	default:
  		return r8169_mdio_read(tp, location);
-@@ -1368,7 +1375,7 @@ static void rtl_set_d3_pll_down(struct r
+@@ -1363,7 +1370,7 @@ static void rtl_set_d3_pll_down(struct r
  	case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_26:
  	case RTL_GIGA_MAC_VER_29 ... RTL_GIGA_MAC_VER_30:
  	case RTL_GIGA_MAC_VER_32 ... RTL_GIGA_MAC_VER_37:
@@ -92,7 +92,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		if (enable)
  			RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~D3_NO_PLL_DOWN);
  		else
-@@ -1535,7 +1542,7 @@ static void __rtl8169_set_wol(struct rtl
+@@ -1530,7 +1537,7 @@ static void __rtl8169_set_wol(struct rtl
  		break;
  	case RTL_GIGA_MAC_VER_34:
  	case RTL_GIGA_MAC_VER_37:
@@ -101,7 +101,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		if (wolopts)
  			rtl_mod_config2(tp, 0, PME_SIGNAL);
  		else
-@@ -2122,6 +2129,9 @@ static enum mac_version rtl8169_get_mac_
+@@ -2096,6 +2103,9 @@ static enum mac_version rtl8169_get_mac_
  		u16 val;
  		enum mac_version ver;
  	} mac_info[] = {
@@ -111,7 +111,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		/* 8125B family. */
  		{ 0x7cf, 0x641,	RTL_GIGA_MAC_VER_63 },
  
-@@ -2392,6 +2402,7 @@ static void rtl_init_rxcfg(struct rtl816
+@@ -2366,6 +2376,7 @@ static void rtl_init_rxcfg(struct rtl816
  		RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST);
  		break;
  	case RTL_GIGA_MAC_VER_63:
@@ -119,7 +119,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		RTL_W32(tp, RxConfig, RX_FETCH_DFLT_8125 | RX_DMA_BURST |
  			RX_PAUSE_SLOT_ON);
  		break;
-@@ -2578,7 +2589,7 @@ static void rtl_wait_txrx_fifo_empty(str
+@@ -2552,7 +2563,7 @@ static void rtl_wait_txrx_fifo_empty(str
  	case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_61:
  		rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42);
  		break;
@@ -128,7 +128,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
  		rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42);
  		rtl_loop_wait_high(tp, &rtl_rxtx_empty_cond_2, 100, 42);
-@@ -2822,7 +2833,7 @@ static void rtl_enable_exit_l1(struct rt
+@@ -2795,7 +2806,7 @@ static void rtl_enable_exit_l1(struct rt
  	case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_38:
  		rtl_eri_set_bits(tp, 0xd4, 0x0c00);
  		break;
@@ -137,7 +137,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		r8168_mac_ocp_modify(tp, 0xc0ac, 0, 0x1f80);
  		break;
  	default:
-@@ -2836,7 +2847,7 @@ static void rtl_disable_exit_l1(struct r
+@@ -2809,7 +2820,7 @@ static void rtl_disable_exit_l1(struct r
  	case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38:
  		rtl_eri_clear_bits(tp, 0xd4, 0x1f00);
  		break;
@@ -146,7 +146,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		r8168_mac_ocp_modify(tp, 0xc0ac, 0x1f80, 0);
  		break;
  	default:
-@@ -2846,6 +2857,8 @@ static void rtl_disable_exit_l1(struct r
+@@ -2819,6 +2830,8 @@ static void rtl_disable_exit_l1(struct r
  
  static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
  {
@@ -155,7 +155,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  	if (tp->mac_version < RTL_GIGA_MAC_VER_32)
  		return;
  
-@@ -2859,11 +2872,19 @@ static void rtl_hw_aspm_clkreq_enable(st
+@@ -2832,11 +2845,19 @@ static void rtl_hw_aspm_clkreq_enable(st
  			return;
  
  		rtl_mod_config5(tp, 0, ASPM_en);
@@ -177,7 +177,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  			/* reset ephy tx/rx disable timer */
  			r8168_mac_ocp_modify(tp, 0xe094, 0xff00, 0);
  			/* chip can trigger L1.2 */
-@@ -2875,14 +2896,22 @@ static void rtl_hw_aspm_clkreq_enable(st
+@@ -2848,14 +2869,22 @@ static void rtl_hw_aspm_clkreq_enable(st
  	} else {
  		switch (tp->mac_version) {
  		case RTL_GIGA_MAC_VER_46 ... RTL_GIGA_MAC_VER_48:
@@ -202,7 +202,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		rtl_mod_config5(tp, ASPM_en, 0);
  	}
  }
-@@ -3678,10 +3707,15 @@ static void rtl_hw_start_8125_common(str
+@@ -3568,10 +3597,15 @@ static void rtl_hw_start_8125_common(str
  	/* disable new tx descriptor format */
  	r8168_mac_ocp_modify(tp, 0xeb58, 0x0001, 0x0000);
  
@@ -220,7 +220,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  
  	if (tp->mac_version == RTL_GIGA_MAC_VER_63)
  		r8168_mac_ocp_modify(tp, 0xe63e, 0x0c30, 0x0000);
-@@ -3694,6 +3728,10 @@ static void rtl_hw_start_8125_common(str
+@@ -3584,6 +3618,10 @@ static void rtl_hw_start_8125_common(str
  	r8168_mac_ocp_modify(tp, 0xe056, 0x00f0, 0x0030);
  	r8168_mac_ocp_modify(tp, 0xe040, 0x1000, 0x0000);
  	r8168_mac_ocp_modify(tp, 0xea1c, 0x0003, 0x0001);
@@ -231,7 +231,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  	r8168_mac_ocp_modify(tp, 0xe0c0, 0x4f0f, 0x4403);
  	r8168_mac_ocp_modify(tp, 0xe052, 0x0080, 0x0068);
  	r8168_mac_ocp_modify(tp, 0xd430, 0x0fff, 0x047f);
-@@ -3708,10 +3746,10 @@ static void rtl_hw_start_8125_common(str
+@@ -3598,10 +3636,10 @@ static void rtl_hw_start_8125_common(str
  
  	rtl_loop_wait_low(tp, &rtl_mac_ocp_e00e_cond, 1000, 10);
  
@@ -245,7 +245,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  
  	rtl_disable_rxdvgate(tp);
  }
-@@ -3755,6 +3793,12 @@ static void rtl_hw_start_8125b(struct rt
+@@ -3645,6 +3683,12 @@ static void rtl_hw_start_8125b(struct rt
  	rtl_hw_start_8125_common(tp);
  }
  
@@ -258,7 +258,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  static void rtl_hw_config(struct rtl8169_private *tp)
  {
  	static const rtl_generic_fct hw_configs[] = {
-@@ -3797,6 +3841,7 @@ static void rtl_hw_config(struct rtl8169
+@@ -3687,6 +3731,7 @@ static void rtl_hw_config(struct rtl8169
  		[RTL_GIGA_MAC_VER_53] = rtl_hw_start_8117,
  		[RTL_GIGA_MAC_VER_61] = rtl_hw_start_8125a_2,
  		[RTL_GIGA_MAC_VER_63] = rtl_hw_start_8125b,
@@ -266,7 +266,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  	};
  
  	if (hw_configs[tp->mac_version])
-@@ -3807,9 +3852,23 @@ static void rtl_hw_start_8125(struct rtl
+@@ -3697,9 +3742,23 @@ static void rtl_hw_start_8125(struct rtl
  {
  	int i;
  
@@ -292,7 +292,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  
  	rtl_hw_config(tp);
  }
-@@ -3887,8 +3946,7 @@ static int rtl8169_change_mtu(struct net
+@@ -3777,8 +3836,7 @@ static int rtl8169_change_mtu(struct net
  	rtl_jumbo_config(tp);
  
  	switch (tp->mac_version) {
@@ -302,7 +302,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		rtl8125_set_eee_txidle_timer(tp);
  		break;
  	default:
-@@ -4037,7 +4095,7 @@ static void rtl8169_cleanup(struct rtl81
+@@ -3927,7 +3985,7 @@ static void rtl8169_cleanup(struct rtl81
  		RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
  		rtl_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666);
  		break;
@@ -311,7 +311,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		rtl_enable_rxdvgate(tp);
  		fsleep(2000);
  		break;
-@@ -4188,8 +4246,7 @@ static unsigned int rtl_quirk_packet_pad
+@@ -4078,8 +4136,7 @@ static unsigned int rtl_quirk_packet_pad
  
  	switch (tp->mac_version) {
  	case RTL_GIGA_MAC_VER_34:
@@ -321,7 +321,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  		padto = max_t(unsigned int, padto, ETH_ZLEN);
  		break;
  	default:
-@@ -5221,7 +5278,7 @@ static void rtl_hw_initialize(struct rtl
+@@ -5112,7 +5169,7 @@ static void rtl_hw_initialize(struct rtl
  	case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_48:
  		rtl_hw_init_8168g(tp);
  		break;
diff --git a/target/linux/generic/backport-6.6/780-04-v6.9-r8169-improve-checking-for-valid-LED-modes.patch b/target/linux/generic/backport-6.6/780-09-v6.9-r8169-improve-checking-for-valid-LED-modes.patch
similarity index 100%
rename from target/linux/generic/backport-6.6/780-04-v6.9-r8169-improve-checking-for-valid-LED-modes.patch
rename to target/linux/generic/backport-6.6/780-09-v6.9-r8169-improve-checking-for-valid-LED-modes.patch
diff --git a/target/linux/generic/backport-6.6/780-10-v6.9-r8169-simplify-code-by-using-core-provided-pcpu-stat.patch b/target/linux/generic/backport-6.6/780-10-v6.9-r8169-simplify-code-by-using-core-provided-pcpu-stat.patch
new file mode 100644
index 0000000000..510123767a
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-10-v6.9-r8169-simplify-code-by-using-core-provided-pcpu-stat.patch
@@ -0,0 +1,39 @@
+From 400909df6e6543cb5cce3db9bbcd413d59125327 Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Sat, 10 Feb 2024 17:58:29 +0100
+Subject: [PATCH] r8169: simplify code by using core-provided pcpu stats
+ allocation
+
+Use core-provided pcpu stats allocation instead of open-coding it in
+the driver.
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Link: https://lore.kernel.org/r/03f5bb3b-d7f4-48be-ae8a-54862ec4566c@gmail.com
+Signed-off-by: Paolo Abeni <pabeni at redhat.com>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -5261,11 +5261,6 @@ static int rtl_init_one(struct pci_dev *
+ 	raw_spin_lock_init(&tp->mac_ocp_lock);
+ 	mutex_init(&tp->led_lock);
+ 
+-	dev->tstats = devm_netdev_alloc_pcpu_stats(&pdev->dev,
+-						   struct pcpu_sw_netstats);
+-	if (!dev->tstats)
+-		return -ENOMEM;
+-
+ 	/* Get the *optional* external "ether_clk" used on some boards */
+ 	tp->clk = devm_clk_get_optional_enabled(&pdev->dev, "ether_clk");
+ 	if (IS_ERR(tp->clk))
+@@ -5380,6 +5375,8 @@ static int rtl_init_one(struct pci_dev *
+ 	dev->hw_features |= NETIF_F_RXALL;
+ 	dev->hw_features |= NETIF_F_RXFCS;
+ 
++	dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
++
+ 	netdev_sw_irq_coalesce_default_on(dev);
+ 
+ 	/* configure chip for default features */
diff --git a/target/linux/generic/backport-6.6/780-05-v6.9-r8169-add-LED-support-for-RTL8125-RTL8126.patch b/target/linux/generic/backport-6.6/780-11-v6.9-r8169-add-LED-support-for-RTL8125-RTL8126.patch
similarity index 97%
rename from target/linux/generic/backport-6.6/780-05-v6.9-r8169-add-LED-support-for-RTL8125-RTL8126.patch
rename to target/linux/generic/backport-6.6/780-11-v6.9-r8169-add-LED-support-for-RTL8125-RTL8126.patch
index b897e04de9..2059551b50 100644
--- a/target/linux/generic/backport-6.6/780-05-v6.9-r8169-add-LED-support-for-RTL8125-RTL8126.patch
+++ b/target/linux/generic/backport-6.6/780-11-v6.9-r8169-add-LED-support-for-RTL8125-RTL8126.patch
@@ -149,7 +149,7 @@ Signed-off-by: Jakub Kicinski <kuba at kernel.org>
 +}
 --- a/drivers/net/ethernet/realtek/r8169_main.c
 +++ b/drivers/net/ethernet/realtek/r8169_main.c
-@@ -334,17 +334,23 @@ enum rtl8168_registers {
+@@ -330,17 +330,23 @@ enum rtl8168_registers {
  };
  
  enum rtl8125_registers {
@@ -173,7 +173,7 @@ Signed-off-by: Jakub Kicinski <kuba at kernel.org>
  #define RX_VLAN_INNER_8125	BIT(22)
  #define RX_VLAN_OUTER_8125	BIT(23)
  #define RX_VLAN_8125		(RX_VLAN_INNER_8125 | RX_VLAN_OUTER_8125)
-@@ -835,6 +841,51 @@ int rtl8168_get_led_mode(struct rtl8169_
+@@ -830,6 +836,51 @@ int rtl8168_get_led_mode(struct rtl8169_
  	return ret;
  }
  
@@ -225,7 +225,7 @@ Signed-off-by: Jakub Kicinski <kuba at kernel.org>
  void r8169_get_led_name(struct rtl8169_private *tp, int idx,
  			char *buf, int buf_len)
  {
-@@ -5526,10 +5577,12 @@ static int rtl_init_one(struct pci_dev *
+@@ -5413,10 +5464,12 @@ static int rtl_init_one(struct pci_dev *
  	if (rc)
  		return rc;
  
diff --git a/target/linux/generic/backport-6.6/780-12-v6.9-r8169-add-generic-rtl_set_eee_txidle_timer-function.patch b/target/linux/generic/backport-6.6/780-12-v6.9-r8169-add-generic-rtl_set_eee_txidle_timer-function.patch
new file mode 100644
index 0000000000..1a7eed191f
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-12-v6.9-r8169-add-generic-rtl_set_eee_txidle_timer-function.patch
@@ -0,0 +1,91 @@
+From 2ce30993831041b9dcd31eb12896be6611e8b7e2 Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Mon, 12 Feb 2024 19:57:46 +0100
+Subject: [PATCH] r8169: add generic rtl_set_eee_txidle_timer function
+
+Add a generic setter for the EEE tx idle timer and use it with all
+RTL8125/RTL8126 chip versions, in line with the vendor driver.
+This prepares for adding EEE tx idle timer support for additional
+chip versions.
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Reviewed-by: Andrew Lunn <andrew at lunn.ch>
+Link: https://lore.kernel.org/r/39beed72-0dc4-4c45-8899-b72c43ab62a7@gmail.com
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 34 +++++++++++++----------
+ 1 file changed, 20 insertions(+), 14 deletions(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -619,6 +619,7 @@ struct rtl8169_private {
+ 	struct page *Rx_databuff[NUM_RX_DESC];	/* Rx data buffers */
+ 	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
+ 	u16 cp_cmd;
++	u16 tx_lpi_timer;
+ 	u32 irq_mask;
+ 	int irq;
+ 	struct clk *clk;
+@@ -2054,6 +2055,22 @@ static int rtl_set_coalesce(struct net_d
+ 	return 0;
+ }
+ 
++static void rtl_set_eee_txidle_timer(struct rtl8169_private *tp)
++{
++	unsigned int timer_val = READ_ONCE(tp->dev->mtu) + ETH_HLEN + 0x20;
++
++	switch (tp->mac_version) {
++	case RTL_GIGA_MAC_VER_61:
++	case RTL_GIGA_MAC_VER_63:
++	case RTL_GIGA_MAC_VER_65:
++		tp->tx_lpi_timer = timer_val;
++		RTL_W16(tp, EEE_TXIDLE_TIMER_8125, timer_val);
++		break;
++	default:
++		break;
++	}
++}
++
+ static int rtl8169_get_eee(struct net_device *dev, struct ethtool_eee *data)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+@@ -2312,14 +2329,8 @@ static void rtl8125a_config_eee_mac(stru
+ 	r8168_mac_ocp_modify(tp, 0xeb62, 0, BIT(2) | BIT(1));
+ }
+ 
+-static void rtl8125_set_eee_txidle_timer(struct rtl8169_private *tp)
+-{
+-	RTL_W16(tp, EEE_TXIDLE_TIMER_8125, tp->dev->mtu + ETH_HLEN + 0x20);
+-}
+-
+ static void rtl8125b_config_eee_mac(struct rtl8169_private *tp)
+ {
+-	rtl8125_set_eee_txidle_timer(tp);
+ 	r8168_mac_ocp_modify(tp, 0xe040, 0, BIT(1) | BIT(0));
+ }
+ 
+@@ -3852,6 +3863,8 @@ static void rtl_hw_start(struct  rtl8169
+ 	rtl_hw_aspm_clkreq_enable(tp, false);
+ 	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
+ 
++	rtl_set_eee_txidle_timer(tp);
++
+ 	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
+ 		rtl_hw_start_8169(tp);
+ 	else if (rtl_is_8125(tp))
+@@ -3885,14 +3898,7 @@ static int rtl8169_change_mtu(struct net
+ 	dev->mtu = new_mtu;
+ 	netdev_update_features(dev);
+ 	rtl_jumbo_config(tp);
+-
+-	switch (tp->mac_version) {
+-	case RTL_GIGA_MAC_VER_61 ... RTL_GIGA_MAC_VER_65:
+-		rtl8125_set_eee_txidle_timer(tp);
+-		break;
+-	default:
+-		break;
+-	}
++	rtl_set_eee_txidle_timer(tp);
+ 
+ 	return 0;
+ }
diff --git a/target/linux/generic/backport-6.6/780-13-v6.9-r8169-support-setting-the-EEE-tx-idle-timer-on-RTL81.patch b/target/linux/generic/backport-6.6/780-13-v6.9-r8169-support-setting-the-EEE-tx-idle-timer-on-RTL81.patch
new file mode 100644
index 0000000000..917c7c194f
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-13-v6.9-r8169-support-setting-the-EEE-tx-idle-timer-on-RTL81.patch
@@ -0,0 +1,30 @@
+From 57d2d2c8f132c830565058a5cdd8138350e068ec Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Mon, 12 Feb 2024 19:58:47 +0100
+Subject: [PATCH] r8169: support setting the EEE tx idle timer on
+ RTL8168h
+
+Support setting the EEE tx idle timer also on RTL8168h.
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Reviewed-by: Andrew Lunn <andrew at lunn.ch>
+Link: https://lore.kernel.org/r/cfb69ec9-24c4-4aad-9909-fdae3088add4@gmail.com
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -2060,6 +2060,11 @@ static void rtl_set_eee_txidle_timer(str
+ 	unsigned int timer_val = READ_ONCE(tp->dev->mtu) + ETH_HLEN + 0x20;
+ 
+ 	switch (tp->mac_version) {
++	case RTL_GIGA_MAC_VER_46:
++	case RTL_GIGA_MAC_VER_48:
++		tp->tx_lpi_timer = timer_val;
++		r8168_mac_ocp_write(tp, 0xe048, timer_val);
++		break;
+ 	case RTL_GIGA_MAC_VER_61:
+ 	case RTL_GIGA_MAC_VER_63:
+ 	case RTL_GIGA_MAC_VER_65:
diff --git a/target/linux/generic/backport-6.6/780-14-v6.9-r8169-add-support-for-returning-tx_lpi_timer-in-etht.patch b/target/linux/generic/backport-6.6/780-14-v6.9-r8169-add-support-for-returning-tx_lpi_timer-in-etht.patch
new file mode 100644
index 0000000000..51477d0142
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-14-v6.9-r8169-add-support-for-returning-tx_lpi_timer-in-etht.patch
@@ -0,0 +1,55 @@
+From 9c50139727265c088f936e496777bf588850e9f1 Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Mon, 12 Feb 2024 19:59:26 +0100
+Subject: [PATCH] r8169: add support for returning tx_lpi_timer in
+ ethtool get_eee
+
+Add support for returning the tx_lpi_timer value to userspace.
+This is supported by few chip versions only: RTL8168h/RTL8125/RTL8126
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Reviewed-by: Andrew Lunn <andrew at lunn.ch>
+Link: https://lore.kernel.org/r/4eee9c34-c5d6-4c96-9b05-455896dea59a@gmail.com
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -2076,14 +2076,34 @@ static void rtl_set_eee_txidle_timer(str
+ 	}
+ }
+ 
++static unsigned int r8169_get_tx_lpi_timer_us(struct rtl8169_private *tp)
++{
++	unsigned int speed = tp->phydev->speed;
++	unsigned int timer = tp->tx_lpi_timer;
++
++	if (!timer || speed == SPEED_UNKNOWN)
++		return 0;
++
++	/* tx_lpi_timer value is in bytes */
++	return DIV_ROUND_CLOSEST(timer * BITS_PER_BYTE, speed);
++}
++
+ static int rtl8169_get_eee(struct net_device *dev, struct ethtool_eee *data)
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
++	int ret;
+ 
+ 	if (!rtl_supports_eee(tp))
+ 		return -EOPNOTSUPP;
+ 
+-	return phy_ethtool_get_eee(tp->phydev, data);
++	ret = phy_ethtool_get_eee(tp->phydev, data);
++	if (ret)
++		return ret;
++
++	data->tx_lpi_timer = r8169_get_tx_lpi_timer_us(tp);
++	data->tx_lpi_enabled = data->tx_lpi_timer ? data->eee_enabled : false;
++
++	return 0;
+ }
+ 
+ static int rtl8169_set_eee(struct net_device *dev, struct ethtool_eee *data)
diff --git a/target/linux/generic/backport-6.6/780-06-v6.9-r8169-add-MODULE_FIRMWARE-entry-for-RTL8126A.patch b/target/linux/generic/backport-6.6/780-15-v6.9-r8169-add-MODULE_FIRMWARE-entry-for-RTL8126A.patch
similarity index 94%
rename from target/linux/generic/backport-6.6/780-06-v6.9-r8169-add-MODULE_FIRMWARE-entry-for-RTL8126A.patch
rename to target/linux/generic/backport-6.6/780-15-v6.9-r8169-add-MODULE_FIRMWARE-entry-for-RTL8126A.patch
index a6175c824e..6a7ebc885b 100644
--- a/target/linux/generic/backport-6.6/780-06-v6.9-r8169-add-MODULE_FIRMWARE-entry-for-RTL8126A.patch
+++ b/target/linux/generic/backport-6.6/780-15-v6.9-r8169-add-MODULE_FIRMWARE-entry-for-RTL8126A.patch
@@ -15,7 +15,7 @@ Signed-off-by: Jakub Kicinski <kuba at kernel.org>
 
 --- a/drivers/net/ethernet/realtek/r8169_main.c
 +++ b/drivers/net/ethernet/realtek/r8169_main.c
-@@ -680,6 +680,7 @@ MODULE_FIRMWARE(FIRMWARE_8168FP_3);
+@@ -676,6 +676,7 @@ MODULE_FIRMWARE(FIRMWARE_8168FP_3);
  MODULE_FIRMWARE(FIRMWARE_8107E_2);
  MODULE_FIRMWARE(FIRMWARE_8125A_3);
  MODULE_FIRMWARE(FIRMWARE_8125B_2);
diff --git a/target/linux/generic/backport-6.6/780-08-v6.10-r8169-fix-LED-related-deadlock-on-module-removal.patch b/target/linux/generic/backport-6.6/780-16-v6.9-r8169-fix-LED-related-deadlock-on-module-removal.patch
similarity index 96%
rename from target/linux/generic/backport-6.6/780-08-v6.10-r8169-fix-LED-related-deadlock-on-module-removal.patch
rename to target/linux/generic/backport-6.6/780-16-v6.9-r8169-fix-LED-related-deadlock-on-module-removal.patch
index c179a37252..d8e4a4f6ff 100644
--- a/target/linux/generic/backport-6.6/780-08-v6.10-r8169-fix-LED-related-deadlock-on-module-removal.patch
+++ b/target/linux/generic/backport-6.6/780-16-v6.9-r8169-fix-LED-related-deadlock-on-module-removal.patch
@@ -115,7 +115,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  }
 --- a/drivers/net/ethernet/realtek/r8169_main.c
 +++ b/drivers/net/ethernet/realtek/r8169_main.c
-@@ -651,6 +651,8 @@ struct rtl8169_private {
+@@ -647,6 +647,8 @@ struct rtl8169_private {
  	const char *fw_name;
  	struct rtl_fw *rtl_fw;
  
@@ -124,7 +124,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  	u32 ocp_base;
  };
  
-@@ -5122,6 +5124,8 @@ static void rtl_remove_one(struct pci_de
+@@ -5040,6 +5042,8 @@ static void rtl_remove_one(struct pci_de
  
  	cancel_work_sync(&tp->wk.work);
  
@@ -133,7 +133,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
  	unregister_netdev(tp->dev);
  
  	if (tp->dash_type != RTL_DASH_NONE)
-@@ -5582,9 +5586,9 @@ static int rtl_init_one(struct pci_dev *
+@@ -5498,9 +5502,9 @@ static int rtl_init_one(struct pci_dev *
  
  	if (IS_ENABLED(CONFIG_R8169_LEDS)) {
  		if (rtl_is_8125(tp))
diff --git a/target/linux/generic/backport-6.6/780-09-v6.10-r8169-add-missing-conditional-compiling-for-call-to-.patch b/target/linux/generic/backport-6.6/780-17-v6.9-r8169-add-missing-conditional-compiling-for-call-to-.patch
similarity index 94%
rename from target/linux/generic/backport-6.6/780-09-v6.10-r8169-add-missing-conditional-compiling-for-call-to-.patch
rename to target/linux/generic/backport-6.6/780-17-v6.9-r8169-add-missing-conditional-compiling-for-call-to-.patch
index abd7d1c36c..366ae803f9 100644
--- a/target/linux/generic/backport-6.6/780-09-v6.10-r8169-add-missing-conditional-compiling-for-call-to-.patch
+++ b/target/linux/generic/backport-6.6/780-17-v6.9-r8169-add-missing-conditional-compiling-for-call-to-.patch
@@ -19,7 +19,7 @@ Signed-off-by: Jakub Kicinski <kuba at kernel.org>
 
 --- a/drivers/net/ethernet/realtek/r8169_main.c
 +++ b/drivers/net/ethernet/realtek/r8169_main.c
-@@ -5124,7 +5124,8 @@ static void rtl_remove_one(struct pci_de
+@@ -5042,7 +5042,8 @@ static void rtl_remove_one(struct pci_de
  
  	cancel_work_sync(&tp->wk.work);
  
diff --git a/target/linux/generic/backport-6.6/780-07-v6.10-r8169-add-support-for-RTL8168M.patch b/target/linux/generic/backport-6.6/780-18-v6.10-r8169-add-support-for-RTL8168M.patch
similarity index 94%
rename from target/linux/generic/backport-6.6/780-07-v6.10-r8169-add-support-for-RTL8168M.patch
rename to target/linux/generic/backport-6.6/780-18-v6.10-r8169-add-support-for-RTL8168M.patch
index 557b8b1491..2abbe2ccf1 100644
--- a/target/linux/generic/backport-6.6/780-07-v6.10-r8169-add-support-for-RTL8168M.patch
+++ b/target/linux/generic/backport-6.6/780-18-v6.10-r8169-add-support-for-RTL8168M.patch
@@ -19,7 +19,7 @@ Signed-off-by: David S. Miller <davem at davemloft.net>
 
 --- a/drivers/net/ethernet/realtek/r8169_main.c
 +++ b/drivers/net/ethernet/realtek/r8169_main.c
-@@ -2212,6 +2212,8 @@ static enum mac_version rtl8169_get_mac_
+@@ -2230,6 +2230,8 @@ static enum mac_version rtl8169_get_mac_
  		 * the wild. Let's disable detection.
  		 * { 0x7cf, 0x540,	RTL_GIGA_MAC_VER_45 },
  		 */
diff --git a/target/linux/generic/backport-6.6/780-19-v6.10-net-annotate-writes-on-dev-mtu-from-ndo_change_mtu.patch b/target/linux/generic/backport-6.6/780-19-v6.10-net-annotate-writes-on-dev-mtu-from-ndo_change_mtu.patch
new file mode 100644
index 0000000000..cad1210e4d
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-19-v6.10-net-annotate-writes-on-dev-mtu-from-ndo_change_mtu.patch
@@ -0,0 +1,60 @@
+From 1eb2cded45b35816085c1f962933c187d970f9dc Mon Sep 17 00:00:00 2001
+From: Eric Dumazet <edumazet at google.com>
+Date: Mon, 6 May 2024 10:28:12 +0000
+Subject: [PATCH] net: annotate writes on dev->mtu from ndo_change_mtu()
+
+Simon reported that ndo_change_mtu() methods were never
+updated to use WRITE_ONCE(dev->mtu, new_mtu) as hinted
+in commit 501a90c94510 ("inet: protect against too small
+mtu values.")
+
+We read dev->mtu without holding RTNL in many places,
+with READ_ONCE() annotations.
+
+It is time to take care of ndo_change_mtu() methods
+to use corresponding WRITE_ONCE()
+
+Signed-off-by: Eric Dumazet <edumazet at google.com>
+Reported-by: Simon Horman <horms at kernel.org>
+Closes: https://lore.kernel.org/netdev/20240505144608.GB67882@kernel.org/
+Reviewed-by: Jacob Keller <jacob.e.keller at intel.com>
+Reviewed-by: Sabrina Dubroca <sd at queasysnail.net>
+Reviewed-by: Simon Horman <horms at kernel.org>
+Acked-by: Shannon Nelson <shannon.nelson at amd.com>
+Link: https://lore.kernel.org/r/20240506102812.3025432-1-edumazet@google.com
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/realtek/8139cp.c     | 4 ++--
+ drivers/net/ethernet/realtek/r8169_main.c | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/ethernet/realtek/8139cp.c
++++ b/drivers/net/ethernet/realtek/8139cp.c
+@@ -1277,14 +1277,14 @@ static int cp_change_mtu(struct net_devi
+ 
+ 	/* if network interface not up, no need for complexity */
+ 	if (!netif_running(dev)) {
+-		dev->mtu = new_mtu;
++		WRITE_ONCE(dev->mtu, new_mtu);
+ 		cp_set_rxbufsize(cp);	/* set new rx buf size */
+ 		return 0;
+ 	}
+ 
+ 	/* network IS up, close it, reset MTU, and come up again. */
+ 	cp_close(dev);
+-	dev->mtu = new_mtu;
++	WRITE_ONCE(dev->mtu, new_mtu);
+ 	cp_set_rxbufsize(cp);
+ 	return cp_open(dev);
+ }
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -3925,7 +3925,7 @@ static int rtl8169_change_mtu(struct net
+ {
+ 	struct rtl8169_private *tp = netdev_priv(dev);
+ 
+-	dev->mtu = new_mtu;
++	WRITE_ONCE(dev->mtu, new_mtu);
+ 	netdev_update_features(dev);
+ 	rtl_jumbo_config(tp);
+ 	rtl_set_eee_txidle_timer(tp);
diff --git a/target/linux/generic/backport-6.6/780-20-v6.11-r8169-disable-interrupt-source-RxOverflow.patch b/target/linux/generic/backport-6.6/780-20-v6.11-r8169-disable-interrupt-source-RxOverflow.patch
new file mode 100644
index 0000000000..cef5d95252
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-20-v6.11-r8169-disable-interrupt-source-RxOverflow.patch
@@ -0,0 +1,34 @@
+From 6994520a332887f1688464f250c9ec8002a89a8e Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Mon, 27 May 2024 21:16:56 +0200
+Subject: [PATCH] r8169: disable interrupt source RxOverflow
+
+Vendor driver calls this bit RxDescUnavail. All we do in the interrupt
+handler in this case is scheduling NAPI. If we should be out of
+RX descriptors, then NAPI is scheduled anyway. Therefore remove this
+interrupt source. Tested on RTL8168h.
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Reviewed-by: Sunil Goutham <sgoutham at marvell.com>
+Link: https://lore.kernel.org/r/9b2054b2-0548-4f48-bf91-b646572093b4@gmail.com
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -5083,12 +5083,10 @@ static void rtl_set_irq_mask(struct rtl8
+ 	tp->irq_mask = RxOK | RxErr | TxOK | TxErr | LinkChg;
+ 
+ 	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
+-		tp->irq_mask |= SYSErr | RxOverflow | RxFIFOOver;
++		tp->irq_mask |= SYSErr | RxFIFOOver;
+ 	else if (tp->mac_version == RTL_GIGA_MAC_VER_11)
+ 		/* special workaround needed */
+ 		tp->irq_mask |= RxFIFOOver;
+-	else
+-		tp->irq_mask |= RxOverflow;
+ }
+ 
+ static int rtl_alloc_irq(struct rtl8169_private *tp)
diff --git a/target/linux/generic/backport-6.6/780-21-v6.11-r8169-remove-detection-of-chip-version-11-early-RTL8.patch b/target/linux/generic/backport-6.6/780-21-v6.11-r8169-remove-detection-of-chip-version-11-early-RTL8.patch
new file mode 100644
index 0000000000..7f0f23fccb
--- /dev/null
+++ b/target/linux/generic/backport-6.6/780-21-v6.11-r8169-remove-detection-of-chip-version-11-early-RTL8.patch
@@ -0,0 +1,32 @@
+From 982300c115d229565d7af8e8b38aa1ee7bb1f5bd Mon Sep 17 00:00:00 2001
+From: Heiner Kallweit <hkallweit1 at gmail.com>
+Date: Mon, 27 May 2024 21:20:16 +0200
+Subject: [PATCH] r8169: remove detection of chip version 11 (early
+ RTL8168b)
+
+This early RTL8168b version was the first PCIe chip version, and it's
+quite quirky. Last sign of life is from more than 15 yrs ago.
+Let's remove detection of this chip version, we'll see whether anybody
+complains. If not, support for this chip version can be removed a few
+kernel versions later.
+
+Signed-off-by: Heiner Kallweit <hkallweit1 at gmail.com>
+Link: https://lore.kernel.org/r/875cdcf4-843c-420a-ad5d-417447b68572@gmail.com
+Signed-off-by: Jakub Kicinski <kuba at kernel.org>
+---
+ drivers/net/ethernet/realtek/r8169_main.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/realtek/r8169_main.c
++++ b/drivers/net/ethernet/realtek/r8169_main.c
+@@ -2275,7 +2275,9 @@ static enum mac_version rtl8169_get_mac_
+ 
+ 		/* 8168B family. */
+ 		{ 0x7c8, 0x380,	RTL_GIGA_MAC_VER_17 },
+-		{ 0x7c8, 0x300,	RTL_GIGA_MAC_VER_11 },
++		/* This one is very old and rare, let's see if anybody complains.
++		 * { 0x7c8, 0x300,	RTL_GIGA_MAC_VER_11 },
++		 */
+ 
+ 		/* 8101 family. */
+ 		{ 0x7c8, 0x448,	RTL_GIGA_MAC_VER_39 },




More information about the lede-commits mailing list