@@ -23466,6 +23466,8 @@ enum {
2346623466 MG_PHY_LAN87x_REG_SCSR = 31,
2346723467 MG_PHY_RTL8201_REG_RMSR = 16, // in page 7
2346823468 MG_PHY_RTL8201_REG_PAGESEL = 31,
23469+ MG_PHY_RTL8211_REG_PHYSR = 26, // in page a43
23470+ MG_PHY_RTL8211_REG_PAGESEL = 31,
2346923471 MG_PHY_ICS189432_REG_POLL = 17
2347023472};
2347123473
@@ -23537,14 +23539,14 @@ void mg_phy_init(struct mg_phy *phy, uint8_t phy_addr, uint8_t config) {
2353723539 (uint16_t) (MG_BIT(15) | MG_BIT(8) | MG_BIT(7)));
2353823540 } else if (id1 == MG_PHY_LAN87x) {
2353923541 // nothing to do
23540- } else if (id1 == MG_PHY_RTL8201) {
23542+ } else if (id1 == MG_PHY_RTL82x && id2 == MG_PHY_RTL8201) {
2354123543 // assume PHY has been hardware strapped properly
2354223544#if 0
2354323545 phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_PAGESEL, 7); // Select page 7
2354423546 phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_RMSR, 0x1ffa);
2354523547 phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_PAGESEL, 0); // Select page 0
2354623548#endif
23547- } else if (id1 == MG_PHY_RTL8211) {
23549+ } else if (id1 == MG_PHY_RTL82x && id2 == MG_PHY_RTL8211) {
2354823550 // assume PHY has been hardware strapped properly
2354923551 }
2355023552 }
@@ -23587,11 +23589,18 @@ bool mg_phy_up(struct mg_phy *phy, uint8_t phy_addr, bool *full_duplex,
2358723589 *speed = (scsr & MG_BIT(3)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
2358823590 } else if (id1 == MG_PHY_RTL82x) {
2358923591 uint16_t id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);
23590- uint16_t bcr = phy->read_reg(phy_addr, MG_PHY_REG_BCR);
23591- *full_duplex = bcr & MG_BIT(8);
2359223592 if (id2 == MG_PHY_RTL8211) {
23593- *speed = (bcr & MG_BIT(6)) ? MG_PHY_SPEED_1000M : (bcr & MG_BIT(13)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
23593+ uint16_t physr;
23594+ phy->write_reg(phy_addr, MG_PHY_RTL8211_REG_PAGESEL, 0xa43);
23595+ physr = phy->read_reg(phy_addr, MG_PHY_RTL8211_REG_PHYSR);
23596+ phy->write_reg(phy_addr, MG_PHY_RTL8211_REG_PAGESEL, 0);
23597+ *full_duplex = physr & MG_BIT(3);
23598+ *speed = (physr & MG_BIT(5)) ? MG_PHY_SPEED_1000M
23599+ : (physr & MG_BIT(4)) ? MG_PHY_SPEED_100M
23600+ : MG_PHY_SPEED_10M;
2359423601 } else {
23602+ uint16_t bcr = phy->read_reg(phy_addr, MG_PHY_REG_BCR);
23603+ *full_duplex = bcr & MG_BIT(8);
2359523604 *speed = (bcr & MG_BIT(13)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
2359623605 }
2359723606 } else if (id1 == MG_PHY_ICS1894x) {
0 commit comments