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 ec0962993a..d1997b7a09 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 @@ -67,8 +67,8 @@ #define RTPCS_93XX_MAC_LINK_SPD_BITS 4 -#define RTL93XX_MODEL_NAME_INFO (0x0004) -#define RTL93XX_CHIP_INFO (0x0008) +#define RTPCS_93XX_MODEL_NAME_INFO (0x0004) +#define RTPCS_93XX_CHIP_INFO (0x0008) #define PHY_PAGE_2 2 #define PHY_PAGE_4 4 @@ -152,6 +152,11 @@ enum rtpcs_sds_pll_type { RTPCS_SDS_PLL_END, }; +enum rtpcs_chip_version { + RTPCS_CHIP_V1 = 0, + RTPCS_CHIP_V2, +}; + struct rtpcs_ctrl; struct rtpcs_serdes; @@ -188,6 +193,9 @@ struct rtpcs_ctrl { struct rtpcs_serdes serdes[RTPCS_SDS_CNT]; struct rtpcs_link *link[RTPCS_PORT_CNT]; struct mutex lock; + + /* meaning and source may be family-specific */ + enum rtpcs_chip_version chip_version; }; struct rtpcs_link { @@ -1002,6 +1010,30 @@ static void rtpcs_93xx_sds_restart_autoneg(struct rtpcs_serdes *sds) rtpcs_sds_modify(sds, 0x2, MII_BMCR, BMCR_ANRESTART, BMCR_ANRESTART); } +static int rtpcs_93xx_init_serdes_common(struct rtpcs_ctrl *ctrl) +{ + u32 model_info = 0; + int rl_vid, val; + + regmap_read(ctrl->map, RTPCS_93XX_MODEL_NAME_INFO, &model_info); + if (model_info & BIT(4)) + dev_warn(ctrl->dev, "ES chip variants may not work properly!\n"); + + val = 0xa0000; /* CHIP_INFO_EN */ + regmap_write(ctrl->map, RTPCS_93XX_CHIP_INFO, val); + regmap_read(ctrl->map, RTPCS_93XX_CHIP_INFO, &val); + rl_vid = FIELD_GET(GENMASK(31, 28), val); + + if (rl_vid & BIT(0)) + ctrl->chip_version = RTPCS_CHIP_V2; + + val = 0; + regmap_write(ctrl->map, RTPCS_93XX_CHIP_INFO, val); + + dev_dbg(ctrl->dev, "chip_version %u\n", ctrl->chip_version + 1); + return 0; +} + /* RTL930X */ /* @@ -3544,8 +3576,8 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds, }; struct rtpcs_serdes *even_sds = rtpcs_sds_get_even(sds); struct rtpcs_ctrl *ctrl = sds->ctrl; - u32 band, model_info, val; u32 sds_id = sds->id; + u32 band, val; int ret; /* @@ -3577,11 +3609,6 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds, pr_info("%s CMU page 0x28 0x7 %08x\n", __func__, rtpcs_sds_read(sds, 0x28, 0x7)); pr_info("%s XSG page 0x0 0xe %08x\n", __func__, rtpcs_sds_read(sds, 0x40, 0xe)); pr_info("%s XSG2 page 0x0 0xe %08x\n", __func__, rtpcs_sds_read(sds, 0x80, 0xe)); - - regmap_read(ctrl->map, RTL93XX_MODEL_NAME_INFO, &model_info); - if ((model_info >> 4) & 0x1) - dev_warn(ctrl->dev, "ES chip variants may not work properly!\n"); - pr_info("%s: 2.5gbit %08X", __func__, rtpcs_sds_read(sds, 0x41, 0x14)); rtpcs_931x_sds_power(sds, false); @@ -3614,17 +3641,11 @@ static int rtpcs_931x_setup_serdes(struct rtpcs_serdes *sds, rtpcs_931x_sds_config_cmu(sds, hw_mode); if (sds_id >= 2) { - val = 0xa0000; - regmap_write(ctrl->map, RTL93XX_CHIP_INFO, val); - regmap_read(ctrl->map, RTL93XX_CHIP_INFO, &val); - - if (val & BIT(28)) /* consider 9311 etc. RTL9313_CHIP_ID == HWP_CHIP_ID(unit)) */ + if (ctrl->chip_version == RTPCS_CHIP_V2) + /* consider 9311 etc. RTL9313_CHIP_ID == HWP_CHIP_ID(unit)) */ rtpcs_sds_write(sds, 0x2E, 0x1, board_sds_tx2[sds_id - 2]); else rtpcs_sds_write(sds, 0x2E, 0x1, board_sds_tx[sds_id - 2]); - - val = 0; - regmap_write(ctrl->map, RTL93XX_CHIP_INFO, val); } rtpcs_931x_sds_set_polarity(sds, sds->tx_pol_inv, sds->rx_pol_inv); @@ -4011,6 +4032,7 @@ static const struct rtpcs_config rtpcs_930x_cfg = { .serdes_count = RTPCS_930X_SERDES_CNT, .pcs_ops = &rtpcs_930x_pcs_ops, .sds_ops = &rtpcs_930x_sds_ops, + .init_serdes_common = rtpcs_93xx_init_serdes_common, .setup_serdes = rtpcs_930x_setup_serdes, }; @@ -4039,6 +4061,7 @@ static const struct rtpcs_config rtpcs_931x_cfg = { .serdes_count = RTPCS_931X_SERDES_CNT, .pcs_ops = &rtpcs_931x_pcs_ops, .sds_ops = &rtpcs_931x_sds_ops, + .init_serdes_common = rtpcs_93xx_init_serdes_common, .setup_serdes = rtpcs_931x_setup_serdes, };