diff --git a/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c b/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c index 2e668ee078..a409d9b0dc 100644 --- a/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c +++ b/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c @@ -76,6 +76,13 @@ static int rtlsmp_register(void) #endif +static void __init apply_early_quirks(void) +{ + /* Open up write protected registers. Never mess with this elsewhere */ + if (soc_info.family == RTL8380_FAMILY_ID) + sw_w32(0x3, RTL838X_INT_RW_CTRL); +} + void __init device_tree_init(void) { if (!fdt_check_header(&__appended_dtb)) { @@ -106,7 +113,6 @@ static void __init rtl838x_read_details(u32 model) { u32 chip_info, ext_version, tmp; - sw_w32(0x3, RTL838X_INT_RW_CTRL); sw_w32(0xa << 28, RTL838X_CHIP_INFO); chip_info = sw_r32(RTL838X_CHIP_INFO); @@ -167,6 +173,7 @@ static u32 __init read_model(void) if ((id >= 0x8380 && id <= 0x8382) || id == 0x8330 || id == 0x8332) { soc_info.id = id; soc_info.family = RTL8380_FAMILY_ID; + apply_early_quirks(); rtl838x_read_details(model); return model; } @@ -176,6 +183,7 @@ static u32 __init read_model(void) if ((id >= 0x8391 && id <= 0x8396) || (id >= 0x8351 && id <= 0x8353)) { soc_info.id = id; soc_info.family = RTL8390_FAMILY_ID; + apply_early_quirks(); rtl839x_read_details(model); return model; } @@ -185,11 +193,13 @@ static u32 __init read_model(void) if (id >= 0x9301 && id <= 0x9303) { soc_info.id = id; soc_info.family = RTL9300_FAMILY_ID; + apply_early_quirks(); rtl93xx_read_details(model); return model; } else if (id >= 0x9311 && id <= 0x9313) { soc_info.id = id; soc_info.family = RTL9310_FAMILY_ID; + apply_early_quirks(); rtl93xx_read_details(model); return model; } diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c index 728190d667..661d0285ab 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c @@ -1489,10 +1489,8 @@ static void rtl838x_pie_init(struct rtl838x_switch_priv *priv) /* Delete all present rules */ rtl838x_pie_rule_del(priv, 0, priv->n_pie_blocks * PIE_BLOCK_SIZE - 1); - /* Routing bypasses source port filter: disable write-protection, first */ - sw_w32_mask(0, 3, RTL838X_INT_RW_CTRL); + /* Routing bypasses source port filter */ sw_w32_mask(0, 1, RTL838X_DMY_REG27); - sw_w32_mask(3, 0, RTL838X_INT_RW_CTRL); /* Enable predefined templates 0, 1 and 2 for even blocks */ template_selectors = 0 | (1 << 3) | (2 << 6); 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 cc1adeeec6..9147ba1572 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 @@ -58,7 +58,6 @@ #define RTPCS_838X_SDS_CFG_REG 0x34 #define RTPCS_838X_RST_GLB_CTRL_0 0x3c #define RTPCS_838X_SDS_MODE_SEL 0x0028 -#define RTPCS_838X_INT_RW_CTRL 0x0058 #define RTPCS_838X_INT_MODE_CTRL 0x005c #define RTPCS_838X_PLL_CML_CTRL 0x0ff8 @@ -527,9 +526,6 @@ static int rtpcs_838x_init_serdes_common(struct rtpcs_ctrl *ctrl) { dev_dbg(ctrl->dev, "Init RTL838X SerDes common\n"); - /* enable R/W of some protected registers */ - regmap_write(ctrl->map, RTPCS_838X_INT_RW_CTRL, 0x3); - /* power off and reset all SerDes */ regmap_write(ctrl->map, RTPCS_838X_SDS_CFG_REG, 0x3f); regmap_write(ctrl->map, RTPCS_838X_RST_GLB_CTRL_0, 0x10); /* SW_SERDES_RST */