Skip to content

Commit 9447ae4

Browse files
committed
Add support for RTL8211
1 parent 0365607 commit 9447ae4

File tree

2 files changed

+28
-10
lines changed

2 files changed

+28
-10
lines changed

mongoose.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

src/drivers/phy.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ enum {
2828
MG_PHY_LAN87x_REG_SCSR = 31,
2929
MG_PHY_RTL8201_REG_RMSR = 16, // in page 7
3030
MG_PHY_RTL8201_REG_PAGESEL = 31,
31+
MG_PHY_RTL8211_REG_PHYSR = 26, // in page a43
32+
MG_PHY_RTL8211_REG_PAGESEL = 31,
3133
MG_PHY_ICS189432_REG_POLL = 17
3234
};
3335

@@ -99,14 +101,14 @@ void mg_phy_init(struct mg_phy *phy, uint8_t phy_addr, uint8_t config) {
99101
(uint16_t) (MG_BIT(15) | MG_BIT(8) | MG_BIT(7)));
100102
} else if (id1 == MG_PHY_LAN87x) {
101103
// nothing to do
102-
} else if (id1 == MG_PHY_RTL8201) {
104+
} else if (id1 == MG_PHY_RTL82x && id2 == MG_PHY_RTL8201) {
103105
// assume PHY has been hardware strapped properly
104106
#if 0
105107
phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_PAGESEL, 7); // Select page 7
106108
phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_RMSR, 0x1ffa);
107109
phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_PAGESEL, 0); // Select page 0
108110
#endif
109-
} else if (id1 == MG_PHY_RTL8211) {
111+
} else if (id1 == MG_PHY_RTL82x && id2 == MG_PHY_RTL8211) {
110112
// assume PHY has been hardware strapped properly
111113
}
112114
}
@@ -149,11 +151,18 @@ bool mg_phy_up(struct mg_phy *phy, uint8_t phy_addr, bool *full_duplex,
149151
*speed = (scsr & MG_BIT(3)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
150152
} else if (id1 == MG_PHY_RTL82x) {
151153
uint16_t id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);
152-
uint16_t bcr = phy->read_reg(phy_addr, MG_PHY_REG_BCR);
153-
*full_duplex = bcr & MG_BIT(8);
154154
if (id2 == MG_PHY_RTL8211) {
155-
*speed = (bcr & MG_BIT(6)) ? MG_PHY_SPEED_1000M : (bcr & MG_BIT(13)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
155+
uint16_t physr;
156+
phy->write_reg(phy_addr, MG_PHY_RTL8211_REG_PAGESEL, 0xa43);
157+
physr = phy->read_reg(phy_addr, MG_PHY_RTL8211_REG_PHYSR);
158+
phy->write_reg(phy_addr, MG_PHY_RTL8211_REG_PAGESEL, 0);
159+
*full_duplex = physr & MG_BIT(3);
160+
*speed = (physr & MG_BIT(5)) ? MG_PHY_SPEED_1000M
161+
: (physr & MG_BIT(4)) ? MG_PHY_SPEED_100M
162+
: MG_PHY_SPEED_10M;
156163
} else {
164+
uint16_t bcr = phy->read_reg(phy_addr, MG_PHY_REG_BCR);
165+
*full_duplex = bcr & MG_BIT(8);
157166
*speed = (bcr & MG_BIT(13)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;
158167
}
159168
} else if (id1 == MG_PHY_ICS1894x) {

0 commit comments

Comments
 (0)