From 956cf4a47c5adee11a047dd413ca4ee0711ebe92 Mon Sep 17 00:00:00 2001 From: Jonas Jelonek Date: Tue, 13 Jan 2026 11:02:49 +0000 Subject: [PATCH] realtek: pcs: rtl930x: add standalone USXGMII-SX setup Add everything that's needed to setup USXGMII-SX mode (10G single port USXGMII). This includes patch sequences and adjustments to the symbol error reset and reading, and allowing it in the SerDes setup. Signed-off-by: Jonas Jelonek Link: https://github.com/openwrt/openwrt/pull/21930 Signed-off-by: Hauke Mehrtens --- .../files-6.12/drivers/net/pcs/pcs-rtl-otto.c | 59 ++++++++++++++++++- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c b/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c index a13b591af89..928c636388d 100644 --- a/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c +++ b/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c @@ -2429,8 +2429,8 @@ static int rtpcs_930x_sds_sym_err_reset(struct rtpcs_serdes *sds, case RTPCS_SDS_MODE_10GBASER: case RTPCS_SDS_MODE_USXGMII_10GSXGMII: /* Read twice to clear */ - rtpcs_sds_read(sds, 5, 1); - rtpcs_sds_read(sds, 5, 1); + rtpcs_sds_read(sds, 0x5, 0x1); + rtpcs_sds_read(sds, 0x5, 0x1); return 0; case RTPCS_SDS_MODE_XSGMII: @@ -2484,7 +2484,8 @@ static u32 rtpcs_930x_sds_sym_err_get(struct rtpcs_serdes *sds, case RTPCS_SDS_MODE_1000BASEX: case RTPCS_SDS_MODE_SGMII: case RTPCS_SDS_MODE_10GBASER: - v = rtpcs_sds_read(sds, 5, 1); + case RTPCS_SDS_MODE_USXGMII_10GSXGMII: + v = rtpcs_sds_read(sds, 0x5, 0x1); return v & 0xff; default: @@ -2518,6 +2519,7 @@ static int rtpcs_930x_sds_check_calibration(struct rtpcs_serdes *sds, } break; case RTPCS_SDS_MODE_10GBASER: + case RTPCS_SDS_MODE_USXGMII_10GSXGMII: case RTPCS_SDS_MODE_USXGMII_10GQXGMII: if (errors2 > 0) { pr_info("%s: 10G error rate too high\n", __func__); @@ -2768,6 +2770,46 @@ static const struct rtpcs_sds_config rtpcs_930x_sds_cfg_xsgmii_odd[] = {0x2D, 0x13, 0x3C87}, {0x2D, 0x14, 0x1808}, }; +static const struct rtpcs_sds_config rtpcs_930x_sds_cfg_usxgmii_sx_even[] = +{ + {0x06, 0x00, 0x0000}, {0x06, 0x0D, 0x0F00}, {0x06, 0x0E, 0x055A}, {0x07, 0x10, 0x6003}, + {0x06, 0x1D, 0x0600}, {0x06, 0x13, 0x68C1}, {0x06, 0x14, 0xF021}, {0x07, 0x06, 0x1401}, + {0x21, 0x03, 0x8206}, {0x21, 0x05, 0x40B0}, {0x21, 0x06, 0x0010}, {0x21, 0x07, 0xF09F}, + {0x21, 0x0C, 0x0007}, {0x21, 0x0D, 0x6009}, {0x21, 0x0E, 0x0000}, {0x21, 0x0F, 0x0008}, + {0x2E, 0x00, 0xA668}, {0x2E, 0x01, 0x2088}, {0x2E, 0x02, 0xD020}, {0x2E, 0x06, 0xC000}, + {0x2E, 0x0B, 0x1892}, {0x2E, 0x0F, 0xFFDF}, {0x2E, 0x11, 0x8280}, {0x2E, 0x12, 0x0484}, + {0x2E, 0x13, 0x027F}, {0x2E, 0x14, 0x1311}, {0x2E, 0x17, 0xA100}, {0x2E, 0x1A, 0x0001}, + {0x2E, 0x1C, 0x0400}, {0x2F, 0x01, 0x0300}, {0x2F, 0x02, 0x1017}, {0x2F, 0x03, 0xFFDF}, + {0x2F, 0x05, 0x7F7C}, {0x2F, 0x07, 0x8104}, {0x2F, 0x08, 0x0001}, {0x2F, 0x09, 0xFFD4}, + {0x2F, 0x0A, 0x7C2F}, {0x2F, 0x0E, 0x003F}, {0x2F, 0x0F, 0x0121}, {0x2F, 0x10, 0x0020}, + {0x2F, 0x11, 0x8840}, + {0x2B, 0x13, 0x0050}, {0x2B, 0x18, 0x8E88}, {0x2B, 0x19, 0x4902}, {0x2B, 0x1D, 0x2501}, + {0x2D, 0x13, 0x0050}, {0x2D, 0x18, 0x8E88}, {0x2D, 0x19, 0x4902}, {0x2D, 0x1D, 0x2641}, + {0x2F, 0x13, 0x0050}, {0x2F, 0x18, 0x8E88}, {0x2F, 0x19, 0x4902}, {0x2F, 0x1D, 0x66E1}, + /*enable eee*/ + {0x06, 0x03, 0xc45c}, +}; + +static const struct rtpcs_sds_config rtpcs_930x_sds_cfg_usxgmii_sx_odd[] = +{ + {0x06, 0x00, 0x0000}, {0x06, 0x0D, 0x0F00}, {0x06, 0x0E, 0x055A}, {0x07, 0x10, 0x6003}, + {0x06, 0x1D, 0x0600}, {0x06, 0x13, 0x68C1}, {0x06, 0x14, 0xF021}, {0x07, 0x06, 0x1401}, + {0x21, 0x03, 0x8206}, {0x21, 0x05, 0x40B0}, {0x21, 0x06, 0x0010}, {0x21, 0x07, 0xF09F}, + {0x21, 0x0A, 0x0003}, {0x21, 0x0B, 0x0005}, {0x21, 0x0C, 0x0007}, {0x21, 0x0D, 0x6009}, + {0x21, 0x0E, 0x0000}, {0x21, 0x0F, 0x0008}, + {0x2E, 0x00, 0xA668}, {0x2E, 0x02, 0xD020}, {0x2E, 0x06, 0xC000}, {0x2E, 0x0B, 0x1892}, + {0x2E, 0x0F, 0xFFDF}, {0x2E, 0x11, 0x8280}, {0x2E, 0x12, 0x0484}, {0x2E, 0x13, 0x027F}, + {0x2E, 0x14, 0x1311}, {0x2E, 0x17, 0xA100}, {0x2E, 0x1A, 0x0001}, {0x2E, 0x1C, 0x0400}, + {0x2F, 0x00, 0x820F}, {0x2F, 0x01, 0x0300}, {0x2F, 0x02, 0x1017}, {0x2F, 0x03, 0xFFDF}, + {0x2F, 0x05, 0x7F7C}, {0x2F, 0x07, 0x8104}, {0x2F, 0x08, 0x0001}, {0x2F, 0x09, 0xFFD4}, + {0x2F, 0x0A, 0x7C2F}, {0x2F, 0x0E, 0x003F}, {0x2F, 0x0F, 0x0121}, {0x2F, 0x10, 0x0020}, + {0x2F, 0x11, 0x8840}, + {0x2B, 0x13, 0x3D87},{0x2B, 0x14, 0x3108}, + {0x2D, 0x13, 0x3C87},{0x2D, 0x14, 0x1808}, + /*enable eee*/ + {0x06, 0x03, 0xc45c}, +}; + static void rtpcs_930x_sds_usxgmii_config(struct rtpcs_serdes *sds, int nway_en, u32 opcode, u32 am_period, u32 all_am_markers, u32 an_table, @@ -2843,6 +2885,16 @@ static void rtpcs_930x_sds_patch(struct rtpcs_serdes *sds, return; + case RTPCS_SDS_MODE_USXGMII_10GSXGMII: + if (is_even_sds) { + config = rtpcs_930x_sds_cfg_usxgmii_sx_even; + count = ARRAY_SIZE(rtpcs_930x_sds_cfg_usxgmii_sx_even); + } else { + config = rtpcs_930x_sds_cfg_usxgmii_sx_odd; + count = ARRAY_SIZE(rtpcs_930x_sds_cfg_usxgmii_sx_odd); + } + break; + case RTPCS_SDS_MODE_USXGMII_10GQXGMII: default: return; @@ -2895,6 +2947,7 @@ static int rtpcs_930x_setup_serdes(struct rtpcs_serdes *sds, case RTPCS_SDS_MODE_SGMII: case RTPCS_SDS_MODE_2500BASEX: case RTPCS_SDS_MODE_10GBASER: + case RTPCS_SDS_MODE_USXGMII_10GSXGMII: case RTPCS_SDS_MODE_USXGMII_10GQXGMII: case RTPCS_SDS_MODE_XSGMII: break; -- 2.47.3