Import pending series introducing support for standalone PCS drivers. This has previously already been used by the airoha target, and is also the base for the closer-to-upstream patches for MediaTek MT7988 10G SerDes support. In order to not having to diverge from upstream also backport series for standardized handling for PHY and PCS SerDes pair polarity. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
80 lines
3.0 KiB
Diff
80 lines
3.0 KiB
Diff
From 0e4d7df2f3b2e59c1bccc09ea099b7a6c2dda886 Mon Sep 17 00:00:00 2001
|
|
From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
|
|
Date: Wed, 28 Jan 2026 10:51:56 +0000
|
|
Subject: [PATCH] net: phylink: fix NULL pointer deref in
|
|
phylink_major_config()
|
|
|
|
When a MAC driver returns a PCS for an interface mode, and then we
|
|
attempt to switch to a different mode that doesn't require a PCS,
|
|
this causes phylink to oops:
|
|
|
|
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000010
|
|
Mem abort info:
|
|
ESR = 0x0000000096000044
|
|
EC = 0x25: DABT (current EL), IL = 32 bits
|
|
SET = 0, FnV = 0
|
|
EA = 0, S1PTW = 0
|
|
FSC = 0x04: level 0 translation fault
|
|
Data abort info:
|
|
ISV = 0, ISS = 0x00000044, ISS2 = 0x00000000
|
|
CM = 0, WnR = 1, TnD = 0, TagAccess = 0
|
|
GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
|
|
user pgtable: 4k pages, 48-bit VAs, pgdp=0000000137f96000
|
|
[0000000000000010] pgd=0000000000000000, p4d=0000000000000000
|
|
Internal error: Oops: 0000000096000044 [#1] SMP
|
|
Modules linked in: --
|
|
CPU: 1 UID: 0 PID: 55 Comm: kworker/u33:0 Not tainted 6.19.0-rc5-00581-g73cb8467a63e #1 PREEMPT
|
|
Hardware name: Qualcomm Technologies, Inc. Lemans Ride Rev3 (DT)
|
|
Workqueue: events_power_efficient phylink_resolve
|
|
pstate: 60400005 (nZCv daif +PAN -UAO -TCO -DIT -SSBS +BTYPE=--)
|
|
pc : phylink_major_config+0x408/0x948
|
|
lr : phylink_major_config+0x3fc/0x948
|
|
sp : ffff800080353c60
|
|
x29: ffff800080353cb0 x28: ffffb305068a8a00 x27: ffffb305068a8000
|
|
x26: ffff000080092100 x25: 0000000000000000 x24: 0000000000000000
|
|
x23: 0000000000000001 x22: 0000000000000000 x21: ffffb3050555b3d0
|
|
x20: ffff800080353d10 x19: ffff0000b6059400 x18: 00000000ffffffff
|
|
x17: 74756f2f79687020 x16: ffffb305045e4f18 x15: 6769666e6f632072
|
|
x14: 6f6a616d203a3168 x13: 782d657361623030 x12: ffffb305068c6a98
|
|
x11: 0000000000000583 x10: 0000000000000018 x9 : ffffb305068c6a98
|
|
x8 : 0000000100006583 x7 : 0000000000000000 x6 : ffff00008083cc40
|
|
x5 : ffff00008083cc40 x4 : 0000000000000001 x3 : 0000000000000001
|
|
x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff0000b269e5a8
|
|
Call trace:
|
|
phylink_major_config+0x408/0x948 (P)
|
|
phylink_resolve+0x294/0x6e4
|
|
process_one_work+0x148/0x28c
|
|
worker_thread+0x2d8/0x3d8
|
|
kthread+0x134/0x208
|
|
ret_from_fork+0x10/0x20
|
|
Code: d63f0020 f9400e60 b4000040 f900081f (f9000ad3)
|
|
---[ end trace 0000000000000000 ]---
|
|
|
|
This is caused by "pcs" being NULL when we attempt to execute:
|
|
|
|
pcs->phylink = pl;
|
|
|
|
Make this conditional on pcs being non-null.
|
|
|
|
Fixes: 486dc391ef43 ("net: phylink: allow mac_select_pcs() to remove a PCS")
|
|
Reported-by: Mohd Ayaan Anwar <mohd.anwar@oss.qualcomm.com>
|
|
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
|
Link: https://patch.msgid.link/E1vl39Q-00000006utm-229h@rmk-PC.armlinux.org.uk
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/phy/phylink.c | 3 ++-
|
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/net/phy/phylink.c
|
|
+++ b/drivers/net/phy/phylink.c
|
|
@@ -1287,7 +1287,8 @@ static void phylink_major_config(struct
|
|
if (pl->pcs)
|
|
pl->pcs->phylink = NULL;
|
|
|
|
- pcs->phylink = pl;
|
|
+ if (pcs)
|
|
+ pcs->phylink = pl;
|
|
|
|
pl->pcs = pcs;
|
|
}
|