Skip to content

Commit 8fd431a

Browse files
committed
Version 2.4.2d0 - Reworked auto-negotiation to fix issue with 100 MBit/s.
1 parent 39209e2 commit 8fd431a

File tree

6 files changed

+53
-120
lines changed

6 files changed

+53
-120
lines changed

RealtekRTL8111.xcodeproj/project.pbxproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@
255255
MACOSX_DEPLOYMENT_TARGET = 10.14;
256256
MARKETING_VERSION = "$(MODULE_VERSION)";
257257
MODULE_NAME = com.insanelymac.RealtekRTL8111;
258-
MODULE_VERSION = 2.4.0;
258+
MODULE_VERSION = 2.4.2d0;
259259
PRODUCT_BUNDLE_IDENTIFIER = "com.insanelymac.${PRODUCT_NAME:rfc1034identifier}";
260260
PRODUCT_NAME = RealtekRTL8111;
261261
RUN_CLANG_STATIC_ANALYZER = YES;
@@ -285,7 +285,7 @@
285285
MACOSX_DEPLOYMENT_TARGET = 10.14;
286286
MARKETING_VERSION = "$(MODULE_VERSION)";
287287
MODULE_NAME = com.insanelymac.RealtekRTL8111;
288-
MODULE_VERSION = 2.4.0;
288+
MODULE_VERSION = 2.4.2d0;
289289
PRODUCT_BUNDLE_IDENTIFIER = "com.insanelymac.${PRODUCT_NAME:rfc1034identifier}";
290290
PRODUCT_NAME = RealtekRTL8111;
291291
SDKROOT = macosx;

RealtekRTL8111/RealtekRTL8111-Info.plist

-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
<true/>
3535
<key>enableCSO6</key>
3636
<true/>
37-
<key>enableEEE</key>
38-
<true/>
3937
<key>enableTSO4</key>
4038
<true/>
4139
<key>enableTSO6</key>

RealtekRTL8111/RealtekRTL8111.cpp

+16-34
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,12 @@ bool RTL8111::init(OSDictionary *properties)
7171

7272
mtu = ETH_DATA_LEN;
7373
powerState = 0;
74-
speed = SPEED_1000;
74+
speed = 0;
7575
duplex = DUPLEX_FULL;
7676
autoneg = AUTONEG_ENABLE;
7777
flowCtl = kFlowControlOff;
7878
linuxData.eee_adv_t = 0;
79+
linuxData.eee_enabled = 1;
7980
eeeCap = 0;
8081
linuxData.aspm = 0;
8182
linuxData.s0_magic_packet = 0;
@@ -348,7 +349,7 @@ IOReturn RTL8111::enable(IONetworkInterface *netif)
348349
DebugLog("[RealtekRTL8111]: No medium selected. Falling back to autonegotiation.\n");
349350
selectedMedium = mediumTable[MEDIUM_INDEX_AUTO];
350351
}
351-
selectMedium(selectedMedium);
352+
setCurrentMedium(selectedMedium);
352353
enableRTL8111();
353354

354355
/* We have to enable the interrupt because we are using a msi interrupt. */
@@ -936,94 +937,84 @@ IOReturn RTL8111::selectMedium(const IONetworkMedium *medium)
936937
DebugLog("selectMedium() ===>\n");
937938

938939
if (medium) {
940+
autoneg = AUTONEG_DISABLE;
939941
flowCtl = kFlowControlOff;
940-
linuxData.eee_adv_t = 0;
942+
linuxData.eee_enabled = 0;
941943

942944
switch (medium->getIndex()) {
943945
case MEDIUM_INDEX_AUTO:
944946
autoneg = AUTONEG_ENABLE;
945947
speed = 0;
946948
duplex = DUPLEX_FULL;
947949
flowCtl = kFlowControlOn;
948-
linuxData.eee_adv_t = eeeCap;
950+
linuxData.eee_enabled = 1;
949951
break;
950952

951953
case MEDIUM_INDEX_10HD:
952-
autoneg = AUTONEG_DISABLE;
953954
speed = SPEED_10;
954955
duplex = DUPLEX_HALF;
955956
break;
956957

957958
case MEDIUM_INDEX_10FD:
958-
autoneg = AUTONEG_ENABLE;
959959
speed = SPEED_10;
960960
duplex = DUPLEX_FULL;
961961
break;
962962

963963
case MEDIUM_INDEX_100HD:
964-
autoneg = AUTONEG_DISABLE;
965964
speed = SPEED_100;
966965
duplex = DUPLEX_HALF;
967966
break;
968967

969968
case MEDIUM_INDEX_100FD:
970-
autoneg = AUTONEG_ENABLE;
971969
speed = SPEED_100;
972970
duplex = DUPLEX_FULL;
973971
break;
974972

975973
case MEDIUM_INDEX_100FDFC:
976-
autoneg = AUTONEG_ENABLE;
977974
speed = SPEED_100;
978975
duplex = DUPLEX_FULL;
979976
flowCtl = kFlowControlOn;
980977
break;
981978

982979
case MEDIUM_INDEX_1000FD:
983-
autoneg = AUTONEG_ENABLE;
984980
speed = SPEED_1000;
985981
duplex = DUPLEX_FULL;
986982
break;
987983

988984
case MEDIUM_INDEX_1000FDFC:
989-
autoneg = AUTONEG_ENABLE;
990985
speed = SPEED_1000;
991986
duplex = DUPLEX_FULL;
992987
flowCtl = kFlowControlOn;
993988
break;
994989

995990
case MEDIUM_INDEX_100FDEEE:
996-
autoneg = AUTONEG_ENABLE;
997991
speed = SPEED_100;
998992
duplex = DUPLEX_FULL;
999-
linuxData.eee_adv_t = eeeCap;
993+
linuxData.eee_enabled = 1;
1000994
break;
1001995

1002996
case MEDIUM_INDEX_100FDFCEEE:
1003-
autoneg = AUTONEG_ENABLE;
1004997
speed = SPEED_100;
1005998
duplex = DUPLEX_FULL;
1006999
flowCtl = kFlowControlOn;
1007-
linuxData.eee_adv_t = eeeCap;
1000+
linuxData.eee_enabled = 1;
10081001
break;
10091002

10101003
case MEDIUM_INDEX_1000FDEEE:
1011-
autoneg = AUTONEG_ENABLE;
10121004
speed = SPEED_1000;
10131005
duplex = DUPLEX_FULL;
1014-
linuxData.eee_adv_t = eeeCap;
1006+
linuxData.eee_enabled = 1;
10151007
break;
10161008

10171009
case MEDIUM_INDEX_1000FDFCEEE:
1018-
autoneg = AUTONEG_ENABLE;
10191010
speed = SPEED_1000;
10201011
duplex = DUPLEX_FULL;
10211012
flowCtl = kFlowControlOn;
1022-
linuxData.eee_adv_t = eeeCap;
1013+
linuxData.eee_enabled = 1;
10231014
break;
10241015
}
1025-
setPhyMedium();
10261016
setCurrentMedium(medium);
1017+
restartRTL8111();
10271018
}
10281019

10291020
DebugLog("selectMedium() <===\n");
@@ -1103,7 +1094,6 @@ void RTL8111::getParams()
11031094
{
11041095
OSDictionary *params;
11051096
OSNumber *intrMit;
1106-
OSBoolean *enableEEE;
11071097
OSBoolean *poll;
11081098
OSBoolean *tso4;
11091099
OSBoolean *tso6;
@@ -1122,15 +1112,6 @@ void RTL8111::getParams()
11221112

11231113
DebugLog("[RealtekRTL8111]: PCIe ASPM support %s.\n", disableASPM ? offName : onName);
11241114

1125-
enableEEE = OSDynamicCast(OSBoolean, params->getObject(kEnableEeeName));
1126-
1127-
if (enableEEE)
1128-
linuxData.eee_enabled = (enableEEE->getValue()) ? 1 : 0;
1129-
else
1130-
linuxData.eee_enabled = 0;
1131-
1132-
IOLog("[RealtekRTL8111]: EEE support %s.\n", linuxData.eee_enabled ? onName : offName);
1133-
11341115
poll = OSDynamicCast(OSBoolean, params->getObject(kEnableRxPollName));
11351116
rxPoll = (poll) ? poll->getValue() : false;
11361117

@@ -1173,7 +1154,6 @@ void RTL8111::getParams()
11731154
}
11741155
} else {
11751156
disableASPM = true;
1176-
linuxData.eee_enabled = 1;
11771157
rxPoll = true;
11781158
enableTSO4 = true;
11791159
enableTSO6 = true;
@@ -1822,6 +1802,8 @@ void RTL8111::checkLinkStatus()
18221802
UInt16 newIntrMitigate = 0x5f51;
18231803
UInt8 currLinkState;
18241804

1805+
DebugLog("Link change interrupt: Check link status.\n");
1806+
18251807
if (tp->mcfg == CFG_METHOD_11)
18261808
rtl8168dp_10mbps_gphy_para(tp);
18271809

@@ -2235,9 +2217,9 @@ void RTL8111::getChecksumResult(mbuf_t m, UInt32 status1, UInt32 status2)
22352217
static const char *speed1GName = "1-Gigabit";
22362218
static const char *speed100MName = "100-Megabit";
22372219
static const char *speed10MName = "10-Megabit";
2238-
static const char *duplexFullName = "Full-duplex";
2239-
static const char *duplexHalfName = "Half-duplex";
2240-
static const char *offFlowName = "No flow-control";
2220+
static const char *duplexFullName = "full-duplex";
2221+
static const char *duplexHalfName = "half-duplex";
2222+
static const char *offFlowName = "no flow-control";
22412223
static const char *onFlowName = "flow-control";
22422224

22432225
static const char* eeeNames[kEEETypeCount] = {

RealtekRTL8111/RealtekRTL8111.hpp

-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ enum
174174
};
175175

176176
#define kParamName "Driver Parameters"
177-
#define kEnableEeeName "enableEEE"
178177
#define kEnableCSO6Name "enableCSO6"
179178
#define kEnableTSO4Name "enableTSO4"
180179
#define kEnableTSO6Name "enableTSO6"

RealtekRTL8111/RealtekRTL8111Hardware.cpp

+35-81
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,10 @@ bool RTL8111::initRTL8111()
208208
tp->HwPkgDet = (tp->HwPkgDet >> 3) & 0x0F;
209209
break;
210210
}
211-
211+
/*
212212
if (HW_DASH_SUPPORT_TYPE_3(tp) && tp->HwPkgDet == 0x06)
213213
tp->eee_enabled = 0;
214-
214+
*/
215215
switch (tp->mcfg) {
216216
case CFG_METHOD_21:
217217
case CFG_METHOD_22:
@@ -1587,9 +1587,11 @@ void RTL8111::setPhyMedium()
15871587
struct rtl8168_private *tp = &linuxData;
15881588
int autoNego = 0;
15891589
int gigaCtrl = 0;
1590-
int force = 0;
1591-
int use_default = 0;
15921590

1591+
if ((speed != SPEED_1000) && (speed != SPEED_100) && (speed != SPEED_10)) {
1592+
duplex = DUPLEX_FULL;
1593+
autoneg = AUTONEG_ENABLE;
1594+
}
15931595
if (tp->mcfg == CFG_METHOD_29 || tp->mcfg == CFG_METHOD_30 ||
15941596
tp->mcfg == CFG_METHOD_31 || tp->mcfg == CFG_METHOD_32) {
15951597
/* Disable Giga Lite. */
@@ -1602,94 +1604,46 @@ void RTL8111::setPhyMedium()
16021604
rtl8168_mdio_write(tp, 0x1F, 0x0A40);
16031605
rtl8168_mdio_write(tp, 0x1F, 0x0000);
16041606
}
1605-
if ((speed != SPEED_1000) && (speed != SPEED_100) && (speed != SPEED_10)) {
1606-
speed = SPEED_1000;
1607-
duplex = DUPLEX_FULL;
1608-
autoneg = AUTONEG_ENABLE;
1609-
use_default = 1;
1610-
}
16111607
autoNego = rtl8168_mdio_read(tp, MII_ADVERTISE);
16121608
autoNego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL | ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
16131609

16141610
gigaCtrl = rtl8168_mdio_read(tp, MII_CTRL1000);
16151611
gigaCtrl &= ~(ADVERTISE_1000HALF | ADVERTISE_1000FULL);
16161612

1617-
if (tp->HwHasWrRamCodeToMicroP == TRUE) {
1618-
if ((tp->eee_enabled) && (linuxData.eee_adv_t != 0)) {
1619-
rtl8168_enable_EEE(tp);
1620-
DebugLog("Enable EEE support.\n");
1613+
if (autoneg == AUTONEG_ENABLE) {
1614+
/* The default medium has been selected. */
1615+
gigaCtrl |= ADVERTISE_1000FULL;
1616+
autoNego |= ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_10HALF | ADVERTISE_10FULL;
1617+
} else if (speed == SPEED_1000) {
1618+
gigaCtrl |= ADVERTISE_1000FULL;
1619+
} else if (speed == SPEED_100) {
1620+
if (duplex == DUPLEX_HALF) {
1621+
autoNego |= ADVERTISE_100HALF;
16211622
} else {
1622-
rtl8168_disable_EEE(tp);
1623-
DebugLog("Disable EEE support.\n");
1623+
autoNego |= ADVERTISE_100FULL;
16241624
}
1625-
}
1626-
if (autoneg == AUTONEG_ENABLE) {
1627-
/* n-way force */
1628-
if (speed == SPEED_1000) {
1629-
if (use_default) {
1630-
/* The default medium has been selected. */
1631-
gigaCtrl |= ADVERTISE_1000HALF | ADVERTISE_1000FULL;
1632-
autoNego |= ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_10HALF | ADVERTISE_10FULL;
1633-
} else {
1634-
if (duplex == DUPLEX_HALF) {
1635-
gigaCtrl |= ADVERTISE_1000HALF;
1636-
} else {
1637-
gigaCtrl |= ADVERTISE_1000FULL;
1638-
}
1639-
}
1640-
} else if (speed == SPEED_100) {
1641-
if (duplex == DUPLEX_HALF) {
1642-
autoNego |= ADVERTISE_100HALF;
1643-
} else {
1644-
autoNego |= ADVERTISE_100FULL;
1645-
}
1646-
} else { /* speed == SPEED_10 */
1647-
if (duplex == DUPLEX_HALF) {
1648-
autoNego |= ADVERTISE_10HALF;
1649-
} else {
1650-
autoNego |= ADVERTISE_10FULL;
1651-
}
1625+
} else { /* speed == SPEED_10 */
1626+
if (duplex == DUPLEX_HALF) {
1627+
autoNego |= ADVERTISE_10HALF;
1628+
} else {
1629+
autoNego |= ADVERTISE_10FULL;
16521630
}
1631+
}
1632+
/* Set flow control support. */
1633+
if (flowCtl == kFlowControlOn)
1634+
autoNego |= ADVERTISE_PAUSE_CAP|ADVERTISE_PAUSE_ASYM;
16531635

1654-
/* Set flow control support. */
1655-
if (flowCtl == kFlowControlOn)
1656-
autoNego |= ADVERTISE_PAUSE_CAP|ADVERTISE_PAUSE_ASYM;
1657-
1658-
tp->phy_auto_nego_reg = autoNego;
1659-
tp->phy_1000_ctrl_reg = gigaCtrl;
1660-
1661-
/* Setup EEE advertisement. */
1662-
if (eeeCap) {
1663-
if ((tp->mcfg >= CFG_METHOD_14) && (tp->mcfg < CFG_METHOD_21)) {
1664-
rtl8168_mdio_write(&linuxData, 0x0D, 0x0007);
1665-
rtl8168_mdio_write(&linuxData, 0x0E, 0x003C);
1666-
rtl8168_mdio_write(&linuxData, 0x0D, 0x4007);
1667-
rtl8168_mdio_write(&linuxData, 0x0E, linuxData.eee_adv_t);
1668-
rtl8168_mdio_write(tp, 0x1F, 0x0000);
1669-
}
1670-
}
1671-
rtl8168_mdio_write(tp, 0x1f, 0x0000);
1672-
rtl8168_mdio_write(tp, MII_ADVERTISE, autoNego);
1673-
rtl8168_mdio_write(tp, MII_CTRL1000, gigaCtrl);
1674-
rtl8168_mdio_write(tp, 0x1f, 0x0000);
1675-
rtl8168_mdio_write(tp, MII_BMCR, BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART);
1676-
mdelay(20);
1677-
} else {
1678-
/* true force */
1679-
if ((speed == SPEED_10) && (duplex == DUPLEX_HALF)) {
1680-
force = BMCR_SPEED10;
1681-
} else if ((speed == SPEED_10) && (duplex == DUPLEX_FULL)) {
1682-
force = BMCR_SPEED10 | BMCR_FULLDPLX;
1683-
} else if ((speed == SPEED_100) && (duplex == DUPLEX_HALF)) {
1684-
force = BMCR_SPEED100;
1685-
} else if ((speed == SPEED_100) && (duplex == DUPLEX_FULL)) {
1686-
force = BMCR_SPEED100 | BMCR_FULLDPLX;
1687-
}
1636+
tp->phy_auto_nego_reg = autoNego;
1637+
tp->phy_1000_ctrl_reg = gigaCtrl;
16881638

1689-
rtl8168_mdio_write(tp, 0x1f, 0x0000);
1690-
rtl8168_mdio_write(tp, MII_BMCR, force);
1691-
}
1692-
tp->autoneg = autoneg;
1639+
rtl8168_mdio_write(tp, 0x1f, 0x0000);
1640+
rtl8168_mdio_write(tp, MII_ADVERTISE, autoNego);
1641+
rtl8168_mdio_write(tp, MII_CTRL1000, gigaCtrl);
1642+
rtl8168_mdio_write(tp, 0x1f, 0x0000);
1643+
rtl8168_mdio_write(tp, MII_BMCR, BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART);
1644+
mdelay(20);
1645+
1646+
tp->autoneg = AUTONEG_ENABLE;
16931647
tp->speed = speed;
16941648
tp->duplex = duplex;
16951649

0 commit comments

Comments
 (0)