]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: pcs: rtl838x: merge and simplify patching 23741/head
authorJonas Jelonek <jelonek.jonas@gmail.com>
Sat, 6 Jun 2026 21:03:07 +0000 (21:03 +0000)
committerJonas Jelonek <jelonek.jonas@gmail.com>
Thu, 11 Jun 2026 18:27:30 +0000 (20:27 +0200)
Reduce the per-SerDes patching to a per-mode patching since they share a
lot of similarities, especially for QSGMII.

For fiber patching, the differences are bigger. This takes an approach
to merge the sequences completely despite applying some settings which
weren't applied before on one of the SerDes. Testing and SerDes dumps
showed no or minimal differences, and no practical effect on
functionality. A look at the SerDes register documentation we have shows
reordering the writes isn't problematic because most of the bits aren't
any trigger bits.

With all its users gone, we can now drop also the workaround SDS macro.

Link: https://github.com/openwrt/openwrt/pull/23741
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c

index 79d1c72958eb2dcab482ea590bbba144fc27c703..bedf219a2e971f95dca5afe4affc028f6c59e560 100644 (file)
@@ -661,90 +661,45 @@ static const s16 rtpcs_838x_sds_hw_mode_vals[RTPCS_SDS_MODE_MAX] = {
        [RTPCS_SDS_MODE_QSGMII]         = 0x6,
 };
 
-#define SDS(ctrl,n)    (&(ctrl)->serdes[n])
-
-static void rtpcs_838x_sds_patch_01_qsgmii_6275b(struct rtpcs_ctrl *ctrl)
-{
-       rtpcs_sds_write(SDS(ctrl, 0), 1, 3, 0xf46f);
-       rtpcs_sds_write(SDS(ctrl, 0), 1, 2, 0x85fa);
-       rtpcs_sds_write(SDS(ctrl, 1), 1, 2, 0x85fa);
-       rtpcs_sds_write(SDS(ctrl, 0), 1, 6, 0x20d8);
-       rtpcs_sds_write(SDS(ctrl, 1), 1, 6, 0x20d8);
-       rtpcs_sds_write(SDS(ctrl, 0), 1, 17, 0xb7c9);
-       rtpcs_sds_write(SDS(ctrl, 1), 1, 11, 0x482);
-       rtpcs_sds_write(SDS(ctrl, 1), 1, 10, 0x80c7);
-       rtpcs_sds_write(SDS(ctrl, 0), 1, 18, 0xab8e);
-       rtpcs_sds_write(SDS(ctrl, 0), 1, 11, 0x482);
-       rtpcs_sds_write(SDS(ctrl, 0), 1, 19, 0x24ab);
-       rtpcs_sds_write(SDS(ctrl, 1), 1, 17, 0x4208);
-       rtpcs_sds_write(SDS(ctrl, 1), 1, 18, 0xc208);
-       rtpcs_sds_write(SDS(ctrl, 0), 2, 25, 0x303);
-       rtpcs_sds_write(SDS(ctrl, 1), 2, 25, 0x303);
-       rtpcs_sds_write(SDS(ctrl, 0), 1, 14, 0xfcc2);
-       rtpcs_sds_write(SDS(ctrl, 1), 1, 14, 0xfcc2);
-}
-
-static void rtpcs_838x_sds_patch_23_qsgmii_6275b(struct rtpcs_ctrl *ctrl)
-{
-       rtpcs_sds_write(SDS(ctrl, 2), 1, 3, 0xf46d);
-       rtpcs_sds_write(SDS(ctrl, 2), 1, 2, 0x85fa);
-       rtpcs_sds_write(SDS(ctrl, 3), 1, 2, 0x85fa);
-       rtpcs_sds_write(SDS(ctrl, 2), 1, 6, 0x20d8);
-       rtpcs_sds_write(SDS(ctrl, 3), 1, 6, 0x20d8);
-       rtpcs_sds_write(SDS(ctrl, 2), 1, 17, 0xb7c9);
-       rtpcs_sds_write(SDS(ctrl, 2), 1, 18, 0xab8e);
-       rtpcs_sds_write(SDS(ctrl, 2), 1, 11, 0x482);
-       rtpcs_sds_write(SDS(ctrl, 3), 1, 11, 0x482);
-       rtpcs_sds_write(SDS(ctrl, 2), 1, 19, 0x24ab);
-       rtpcs_sds_write(SDS(ctrl, 3), 1, 17, 0x4208);
-       rtpcs_sds_write(SDS(ctrl, 3), 1, 18, 0xc208);
-       rtpcs_sds_write(SDS(ctrl, 2), 2, 25, 0x303);
-       rtpcs_sds_write(SDS(ctrl, 3), 2, 25, 0x303);
-       rtpcs_sds_write(SDS(ctrl, 2), 1, 14, 0xfcc2);
-       rtpcs_sds_write(SDS(ctrl, 3), 1, 14, 0xfcc2);
-}
-
-static void rtpcs_838x_sds_patch_4_fiber_6275b(struct rtpcs_ctrl *ctrl)
-{
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 2, 0x85fa);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 11, 0x1482);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 6, 0x20d8);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 10, 0xc3);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 17, 0xb7c9);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 18, 0xab8e);
-       rtpcs_sds_write(SDS(ctrl, 4), 2, 25, 0x303);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 14, 0xfcc2);
-}
-
-static void rtpcs_838x_sds_patch_4_qsgmii_6275b(struct rtpcs_ctrl *ctrl)
-{
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 3, 0xf46d);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 2, 0x85fa);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 11, 0x0482);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 6, 0x20d8);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 10, 0x58c7);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 17, 0xb7c9);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 18, 0xab8e);
-       rtpcs_sds_write(SDS(ctrl, 4), 2, 25, 0x303);
-       rtpcs_sds_write(SDS(ctrl, 4), 1, 14, 0xfcc2);
-}
-
-static void rtpcs_838x_sds_patch_5_fiber_6275b(struct rtpcs_ctrl *ctrl)
-{
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 2, 0x85fa);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 3, 0x00);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 4, 0xdccc);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 5, 0x00);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 6, 0x3600);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 7, 0x03);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 8, 0x79aa);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 9, 0x8c64);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 10, 0xc3);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 11, 0x1482);
-       rtpcs_sds_write(SDS(ctrl, 5), 2, 24, 0x14aa);
-       rtpcs_sds_write(SDS(ctrl, 5), 2, 25, 0x303);
-       rtpcs_sds_write(SDS(ctrl, 5), 1, 14, 0xf002);
-       rtpcs_sds_write(SDS(ctrl, 5), 2, 27, 0x4bf);
+static void rtpcs_838x_sds_patch_qsgmii(struct rtpcs_serdes *sds)
+{
+       bool is_even = (rtpcs_sds_get_even(sds) == sds);
+
+       rtpcs_sds_write(sds, 0x1, 0x3, 0xf46d);
+       rtpcs_sds_write(sds, 0x1, 0x2, 0x85fa);
+       rtpcs_sds_write(sds, 0x1, 0x6, 0x20d8);
+
+       rtpcs_sds_write(sds, 0x1, 10, is_even ? 0x58c7 : 0x80c7);
+       rtpcs_sds_write(sds, 0x1, 17, is_even ? 0xb7c9 : 0x4208);
+       rtpcs_sds_write(sds, 0x1, 18, is_even ? 0xab8e : 0xc208);
+       rtpcs_sds_write(sds, 0x1, 11, 0x482);
+       if (is_even)
+               rtpcs_sds_write(sds, 0x1, 19, 0x24ab);
+
+       rtpcs_sds_write(sds, 0x2, 25, 0x303);
+       rtpcs_sds_write(sds, 0x1, 14, 0xfcc2);
+}
+
+static void rtpcs_838x_sds_patch_fiber(struct rtpcs_serdes *sds)
+{
+       bool is_even = rtpcs_sds_get_even(sds) == sds;
+
+       rtpcs_sds_write(sds, 1, 2, 0x85fa);
+       rtpcs_sds_write(sds, 1, 3, 0x00);
+       rtpcs_sds_write(sds, 1, 4, 0xdccc);
+       rtpcs_sds_write(sds, 1, 5, 0x00);
+       rtpcs_sds_write(sds, 1, 6, is_even ? 0x20d8 : 0x3600);
+       rtpcs_sds_write(sds, 1, 7, 0x03);
+       rtpcs_sds_write(sds, 1, 8, 0x79aa);
+       rtpcs_sds_write(sds, 1, 9, 0x8c64);
+       rtpcs_sds_write(sds, 1, 10, 0xc3);
+       rtpcs_sds_write(sds, 1, 11, 0x1482);
+       rtpcs_sds_write(sds, 1, 17, 0xb7c9);
+       rtpcs_sds_write(sds, 1, 18, 0xab8e);
+       rtpcs_sds_write(sds, 2, 24, 0x14aa);
+       rtpcs_sds_write(sds, 2, 25, 0x303);
+       rtpcs_sds_write(sds, 1, 14, 0xf002);
+       rtpcs_sds_write(sds, 2, 27, 0x4bf);
 }
 
 static void rtpcs_838x_sds_reset(struct rtpcs_serdes *sds)
@@ -874,20 +829,10 @@ static int rtpcs_838x_sds_patch(struct rtpcs_serdes *sds,
 
        switch (hw_mode) {
        case RTPCS_SDS_MODE_1000BASEX:
-               if (sds_id == 4)
-                       rtpcs_838x_sds_patch_4_fiber_6275b(ctrl);
-               else if (sds_id == 5)
-                       rtpcs_838x_sds_patch_5_fiber_6275b(ctrl);
-
+               rtpcs_838x_sds_patch_fiber(sds);
                break;
        case RTPCS_SDS_MODE_QSGMII:
-               if (sds_id == 0 || sds_id == 1)
-                       rtpcs_838x_sds_patch_01_qsgmii_6275b(ctrl);
-               else if (sds_id == 2 || sds_id == 3)
-                       rtpcs_838x_sds_patch_23_qsgmii_6275b(ctrl);
-               else if (sds_id == 4)
-                       rtpcs_838x_sds_patch_4_qsgmii_6275b(ctrl);
-
+               rtpcs_838x_sds_patch_qsgmii(sds);
                break;
        default:
                break;