Merge pull request #416 from DrDoof/fix/phy-100m-half-adv

phy: advertise half duplex only when half duplex was asked for
This commit is contained in:
René van Dorst authored and GitHub committed 2026-09-08 22:06:11 +00:00
commit 5b28ddf80a
1 file changed
+14 -10
+14 -10
View File
@@ -332,21 +332,25 @@ void phy_set_speed(void) __banked
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_CTRL, 0x2000); // Clear bit 12: No Autoneg, Set Extended Pages (bit 13) phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_CTRL, 0x2000); // Clear bit 12: No Autoneg, Set Extended Pages (bit 13)
if (phy_settings.speed == PHY_SPEED_10M) { if (phy_settings.speed == PHY_SPEED_10M) {
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_MGBASE_CTRL, 0x6001); phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_MGBASE_CTRL, 0x6001);
if (!phy_settings.duplex) uint16_t adv10;
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_ADV, 0x1421); if (phy_settings.duplex == PHY_DUPLEX_HALF)
else if (phy_settings.duplex == 1) adv10 = 0x1421;
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_ADV, 0x1441); else if (phy_settings.duplex == PHY_DUPLEX_FULL)
adv10 = 0x1441;
else else
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_ADV, 0x1461); adv10 = 0x1461;
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_ADV, adv10);
phy_modify(phy_settings.port, PHY_MMD31, PHY_MMD31_GBCR, 0x0200, 0x0000); phy_modify(phy_settings.port, PHY_MMD31, PHY_MMD31_GBCR, 0x0200, 0x0000);
} else if (phy_settings.speed == PHY_SPEED_100M) { } else if (phy_settings.speed == PHY_SPEED_100M) {
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_MGBASE_CTRL, 0x6001); phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_MGBASE_CTRL, 0x6001);
if (!phy_settings.duplex) uint16_t adv100;
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_ADV, 0x1481); if (phy_settings.duplex == PHY_DUPLEX_HALF)
if (phy_settings.duplex == 1) adv100 = 0x1481;
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_ADV, 0x1501); else if (phy_settings.duplex == PHY_DUPLEX_FULL)
adv100 = 0x1501;
else else
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_ADV, 0x1581); adv100 = 0x1581;
phy_write(phy_settings.port, PHY_MMD_AN, PHY_ANEG_ADV, adv100);
phy_modify(phy_settings.port, PHY_MMD31, PHY_MMD31_GBCR, 0x0200, 0x0000); phy_modify(phy_settings.port, PHY_MMD31, PHY_MMD31_GBCR, 0x0200, 0x0000);
} else { } else {
// AN Advertisement Register (MMD 7.0x0010) // AN Advertisement Register (MMD 7.0x0010)