Skip to content

Commit 3ae1a0f

Browse files
authored
Merge pull request #2750 from cesanta/gbephy
fix LAN87x
2 parents 50963df + 81f0f8a commit 3ae1a0f

File tree

2 files changed

+12
-34
lines changed

2 files changed

+12
-34
lines changed

mongoose.c

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15624,31 +15624,21 @@ static const char *mg_phy_id_to_str(uint16_t id1, uint16_t id2) {
1562415624
(void) id2;
1562515625
}
1562615626

15627-
static void mg_phy_set_clk_out(struct mg_phy *phy, uint8_t phy_addr) {
15628-
uint16_t id1, id2;
15629-
id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);
15630-
id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);
15631-
15632-
if (id1 == MG_PHY_DP83x && id2 == MG_PHY_DP83867) {
15633-
// write 0x10d to IO_MUX_CFG (0x0170)
15634-
phy->write_reg(phy_addr, 0x0d, 0x1f);
15635-
phy->write_reg(phy_addr, 0x0e, 0x170);
15636-
phy->write_reg(phy_addr, 0x0d, 0x401f);
15637-
phy->write_reg(phy_addr, 0x0e, 0x10d);
15638-
}
15639-
}
15640-
1564115627
void mg_phy_init(struct mg_phy *phy, uint8_t phy_addr, uint8_t config) {
1564215628
uint16_t id1, id2;
1564315629
phy->write_reg(phy_addr, MG_PHY_REG_BCR, MG_BIT(15)); // Reset PHY
15644-
phy->write_reg(phy_addr, MG_PHY_REG_BCR, MG_BIT(12)); // Autonegotiation
15630+
while (phy->read_reg(phy_addr, MG_PHY_REG_BCR) & MG_BIT(15)) (void) 0;
15631+
// MG_PHY_REG_BCR[12]: Autonegotiation is default unless hw says otherwise
1564515632

1564615633
id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);
1564715634
id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);
1564815635
MG_INFO(("PHY ID: %#04x %#04x (%s)", id1, id2, mg_phy_id_to_str(id1, id2)));
1564915636

1565015637
if (id1 == MG_PHY_DP83x && id2 == MG_PHY_DP83867) {
15651-
mg_phy_set_clk_out(phy, phy_addr);
15638+
phy->write_reg(phy_addr, 0x0d, 0x1f); // write 0x10d to IO_MUX_CFG (0x0170)
15639+
phy->write_reg(phy_addr, 0x0e, 0x170);
15640+
phy->write_reg(phy_addr, 0x0d, 0x401f);
15641+
phy->write_reg(phy_addr, 0x0e, 0x10d);
1565215642
}
1565315643

1565415644
if (config & MG_PHY_CLOCKS_MAC) {
@@ -15711,7 +15701,6 @@ bool mg_phy_up(struct mg_phy *phy, uint8_t phy_addr, bool *full_duplex,
1571115701
*speed = (scsr & MG_BIT(3)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
1571215702
} else if (id1 == MG_PHY_RTL8201) {
1571315703
uint16_t bcr = phy->read_reg(phy_addr, MG_PHY_REG_BCR);
15714-
if (bcr & MG_BIT(15)) return 0; // still resetting
1571515704
*full_duplex = bcr & MG_BIT(8);
1571615705
*speed = (bcr & MG_BIT(13)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
1571715706
}

src/drivers/phy.c

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,31 +45,21 @@ static const char *mg_phy_id_to_str(uint16_t id1, uint16_t id2) {
4545
(void) id2;
4646
}
4747

48-
static void mg_phy_set_clk_out(struct mg_phy *phy, uint8_t phy_addr) {
49-
uint16_t id1, id2;
50-
id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);
51-
id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);
52-
53-
if (id1 == MG_PHY_DP83x && id2 == MG_PHY_DP83867) {
54-
// write 0x10d to IO_MUX_CFG (0x0170)
55-
phy->write_reg(phy_addr, 0x0d, 0x1f);
56-
phy->write_reg(phy_addr, 0x0e, 0x170);
57-
phy->write_reg(phy_addr, 0x0d, 0x401f);
58-
phy->write_reg(phy_addr, 0x0e, 0x10d);
59-
}
60-
}
61-
6248
void mg_phy_init(struct mg_phy *phy, uint8_t phy_addr, uint8_t config) {
6349
uint16_t id1, id2;
6450
phy->write_reg(phy_addr, MG_PHY_REG_BCR, MG_BIT(15)); // Reset PHY
65-
phy->write_reg(phy_addr, MG_PHY_REG_BCR, MG_BIT(12)); // Autonegotiation
51+
while (phy->read_reg(phy_addr, MG_PHY_REG_BCR) & MG_BIT(15)) (void) 0;
52+
// MG_PHY_REG_BCR[12]: Autonegotiation is default unless hw says otherwise
6653

6754
id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);
6855
id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);
6956
MG_INFO(("PHY ID: %#04x %#04x (%s)", id1, id2, mg_phy_id_to_str(id1, id2)));
7057

7158
if (id1 == MG_PHY_DP83x && id2 == MG_PHY_DP83867) {
72-
mg_phy_set_clk_out(phy, phy_addr);
59+
phy->write_reg(phy_addr, 0x0d, 0x1f); // write 0x10d to IO_MUX_CFG (0x0170)
60+
phy->write_reg(phy_addr, 0x0e, 0x170);
61+
phy->write_reg(phy_addr, 0x0d, 0x401f);
62+
phy->write_reg(phy_addr, 0x0e, 0x10d);
7363
}
7464

7565
if (config & MG_PHY_CLOCKS_MAC) {
@@ -132,7 +122,6 @@ bool mg_phy_up(struct mg_phy *phy, uint8_t phy_addr, bool *full_duplex,
132122
*speed = (scsr & MG_BIT(3)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
133123
} else if (id1 == MG_PHY_RTL8201) {
134124
uint16_t bcr = phy->read_reg(phy_addr, MG_PHY_REG_BCR);
135-
if (bcr & MG_BIT(15)) return 0; // still resetting
136125
*full_duplex = bcr & MG_BIT(8);
137126
*speed = (bcr & MG_BIT(13)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
138127
}

0 commit comments

Comments
 (0)