]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.19.312/r8169-fix-issue-caused-by-buggy-bios-on-certain-boards-with-rtl8168d.patch
Linux 4.19.312
[thirdparty/kernel/stable-queue.git] / releases / 4.19.312 / r8169-fix-issue-caused-by-buggy-bios-on-certain-boards-with-rtl8168d.patch
1 From 5d872c9f46bd2ea3524af3c2420a364a13667135 Mon Sep 17 00:00:00 2001
2 From: Heiner Kallweit <hkallweit1@gmail.com>
3 Date: Sat, 30 Mar 2024 12:49:02 +0100
4 Subject: r8169: fix issue caused by buggy BIOS on certain boards with RTL8168d
5
6 From: Heiner Kallweit <hkallweit1@gmail.com>
7
8 commit 5d872c9f46bd2ea3524af3c2420a364a13667135 upstream.
9
10 On some boards with this chip version the BIOS is buggy and misses
11 to reset the PHY page selector. This results in the PHY ID read
12 accessing registers on a different page, returning a more or
13 less random value. Fix this by resetting the page selector first.
14
15 Fixes: f1e911d5d0df ("r8169: add basic phylib support")
16 Cc: stable@vger.kernel.org
17 Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
18 Reviewed-by: Simon Horman <horms@kernel.org>
19 Link: https://lore.kernel.org/r/64f2055e-98b8-45ec-8568-665e3d54d4e6@gmail.com
20 Signed-off-by: Jakub Kicinski <kuba@kernel.org>
21 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
22 ---
23 drivers/net/ethernet/realtek/r8169_main.c | 9 +++++++++
24 1 file changed, 9 insertions(+)
25
26 --- a/drivers/net/ethernet/realtek/r8169_main.c
27 +++ b/drivers/net/ethernet/realtek/r8169_main.c
28 @@ -7303,6 +7303,15 @@ static int r8169_mdio_register(struct rt
29 struct mii_bus *new_bus;
30 int ret;
31
32 + /* On some boards with this chip version the BIOS is buggy and misses
33 + * to reset the PHY page selector. This results in the PHY ID read
34 + * accessing registers on a different page, returning a more or
35 + * less random value. Fix this by resetting the page selector first.
36 + */
37 + if (tp->mac_version == RTL_GIGA_MAC_VER_25 ||
38 + tp->mac_version == RTL_GIGA_MAC_VER_26)
39 + r8169_mdio_write(tp, 0x1f, 0);
40 +
41 new_bus = devm_mdiobus_alloc(&pdev->dev);
42 if (!new_bus)
43 return -ENOMEM;