|
@@ -39,7 +39,7 @@ Signed-off-by: Alexander Couzens <[email protected]>
|
|
|
#define RTL8366RB_POWER_SAVE 0x15
|
|
#define RTL8366RB_POWER_SAVE 0x15
|
|
|
#define RTL8366RB_POWER_SAVE_ON BIT(12)
|
|
#define RTL8366RB_POWER_SAVE_ON BIT(12)
|
|
|
|
|
|
|
|
-@@ -841,6 +850,43 @@ static irqreturn_t rtl9000a_handle_inter
|
|
|
|
|
|
|
+@@ -841,6 +850,48 @@ static irqreturn_t rtl9000a_handle_inter
|
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -48,8 +48,13 @@ Signed-off-by: Alexander Couzens <[email protected]>
|
|
|
+ u16 option_mode;
|
|
+ u16 option_mode;
|
|
|
+
|
|
+
|
|
|
+ switch (phydev->interface) {
|
|
+ switch (phydev->interface) {
|
|
|
-+ case PHY_INTERFACE_MODE_SGMII:
|
|
|
|
|
+ case PHY_INTERFACE_MODE_2500BASEX:
|
|
+ case PHY_INTERFACE_MODE_2500BASEX:
|
|
|
|
|
++ if (!phydev->is_c45) {
|
|
|
|
|
++ option_mode = RTL8221B_SERDES_OPTION_MODE_2500BASEX;
|
|
|
|
|
++ break;
|
|
|
|
|
++ }
|
|
|
|
|
++ fallthrough;
|
|
|
|
|
++ case PHY_INTERFACE_MODE_SGMII:
|
|
|
+ option_mode = RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII;
|
|
+ option_mode = RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII;
|
|
|
+ break;
|
|
+ break;
|
|
|
+ default:
|
|
+ default:
|
|
@@ -57,24 +62,24 @@ Signed-off-by: Alexander Couzens <[email protected]>
|
|
|
+ }
|
|
+ }
|
|
|
+
|
|
+
|
|
|
+ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL,
|
|
+ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL,
|
|
|
-+ 0x75f3, 0);
|
|
|
|
|
|
|
++ 0x75f3, 0);
|
|
|
+
|
|
+
|
|
|
+ phy_modify_mmd_changed(phydev, RTL8221B_MMD_SERDES_CTRL,
|
|
+ phy_modify_mmd_changed(phydev, RTL8221B_MMD_SERDES_CTRL,
|
|
|
+ RTL8221B_SERDES_OPTION,
|
|
+ RTL8221B_SERDES_OPTION,
|
|
|
+ RTL8221B_SERDES_OPTION_MODE_MASK, option_mode);
|
|
+ RTL8221B_SERDES_OPTION_MODE_MASK, option_mode);
|
|
|
+ switch (option_mode) {
|
|
+ switch (option_mode) {
|
|
|
-+ case RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII:
|
|
|
|
|
-+ case RTL8221B_SERDES_OPTION_MODE_2500BASEX:
|
|
|
|
|
-+ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6a04, 0x0503);
|
|
|
|
|
-+ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f10, 0xd455);
|
|
|
|
|
-+ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f11, 0x8020);
|
|
|
|
|
-+ break;
|
|
|
|
|
-+ case RTL8221B_SERDES_OPTION_MODE_HISGMII_SGMII:
|
|
|
|
|
-+ case RTL8221B_SERDES_OPTION_MODE_HISGMII:
|
|
|
|
|
-+ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6a04, 0x0503);
|
|
|
|
|
-+ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f10, 0xd433);
|
|
|
|
|
-+ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f11, 0x8020);
|
|
|
|
|
-+ break;
|
|
|
|
|
|
|
++ case RTL8221B_SERDES_OPTION_MODE_2500BASEX_SGMII:
|
|
|
|
|
++ case RTL8221B_SERDES_OPTION_MODE_2500BASEX:
|
|
|
|
|
++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6a04, 0x0503);
|
|
|
|
|
++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f10, 0xd455);
|
|
|
|
|
++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f11, 0x8020);
|
|
|
|
|
++ break;
|
|
|
|
|
++ case RTL8221B_SERDES_OPTION_MODE_HISGMII_SGMII:
|
|
|
|
|
++ case RTL8221B_SERDES_OPTION_MODE_HISGMII:
|
|
|
|
|
++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6a04, 0x0503);
|
|
|
|
|
++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f10, 0xd433);
|
|
|
|
|
++ phy_write_mmd(phydev, RTL8221B_MMD_SERDES_CTRL, 0x6f11, 0x8020);
|
|
|
|
|
++ break;
|
|
|
+ }
|
|
+ }
|
|
|
+
|
|
+
|
|
|
+ return 0;
|
|
+ return 0;
|
|
@@ -83,19 +88,19 @@ Signed-off-by: Alexander Couzens <[email protected]>
|
|
|
static struct phy_driver realtek_drvs[] = {
|
|
static struct phy_driver realtek_drvs[] = {
|
|
|
{
|
|
{
|
|
|
PHY_ID_MATCH_EXACT(0x00008201),
|
|
PHY_ID_MATCH_EXACT(0x00008201),
|
|
|
-@@ -981,6 +1027,7 @@ static struct phy_driver realtek_drvs[]
|
|
|
|
|
|
|
+@@ -981,6 +1032,7 @@ static struct phy_driver realtek_drvs[]
|
|
|
PHY_ID_MATCH_EXACT(0x001cc849),
|
|
PHY_ID_MATCH_EXACT(0x001cc849),
|
|
|
.name = "RTL8221B-VB-CG 2.5Gbps PHY",
|
|
.name = "RTL8221B-VB-CG 2.5Gbps PHY",
|
|
|
.get_features = rtl822x_get_features,
|
|
.get_features = rtl822x_get_features,
|
|
|
-+ .config_init = rtl8221b_config_init,
|
|
|
|
|
|
|
++ .config_init = rtl8221b_config_init,
|
|
|
.config_aneg = rtl822x_config_aneg,
|
|
.config_aneg = rtl822x_config_aneg,
|
|
|
.read_status = rtl822x_read_status,
|
|
.read_status = rtl822x_read_status,
|
|
|
.suspend = genphy_suspend,
|
|
.suspend = genphy_suspend,
|
|
|
-@@ -992,6 +1039,7 @@ static struct phy_driver realtek_drvs[]
|
|
|
|
|
|
|
+@@ -992,6 +1044,7 @@ static struct phy_driver realtek_drvs[]
|
|
|
.name = "RTL8221B-VM-CG 2.5Gbps PHY",
|
|
.name = "RTL8221B-VM-CG 2.5Gbps PHY",
|
|
|
.get_features = rtl822x_get_features,
|
|
.get_features = rtl822x_get_features,
|
|
|
.config_aneg = rtl822x_config_aneg,
|
|
.config_aneg = rtl822x_config_aneg,
|
|
|
-+ .config_init = rtl8221b_config_init,
|
|
|
|
|
|
|
++ .config_init = rtl8221b_config_init,
|
|
|
.read_status = rtl822x_read_status,
|
|
.read_status = rtl822x_read_status,
|
|
|
.suspend = genphy_suspend,
|
|
.suspend = genphy_suspend,
|
|
|
.resume = rtlgen_resume,
|
|
.resume = rtlgen_resume,
|