Skip to content

Commit 08ef55c

Browse files
blogicdavem330
authored andcommitted
net-next: mediatek: fix gigabit and flow control advertisement
The current code will not setup the PHYs advertisement features correctly. Fix this and properly advertise Gigabit features and properly handle asymmetric pause frames. Signed-off-by: Sean Wang <keyhaede@gmail.com> Signed-off-by: John Crispin <john@phrozen.org> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 207bdf1 commit 08ef55c

File tree

1 file changed

+26
-4
lines changed

1 file changed

+26
-4
lines changed

drivers/net/ethernet/mediatek/mtk_eth_soc.c

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ static int mtk_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg)
133133
static void mtk_phy_link_adjust(struct net_device *dev)
134134
{
135135
struct mtk_mac *mac = netdev_priv(dev);
136+
u16 lcl_adv = 0, rmt_adv = 0;
137+
u8 flowctrl;
136138
u32 mcr = MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG |
137139
MAC_MCR_FORCE_MODE | MAC_MCR_TX_EN |
138140
MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN |
@@ -150,11 +152,30 @@ static void mtk_phy_link_adjust(struct net_device *dev)
150152
if (mac->phy_dev->link)
151153
mcr |= MAC_MCR_FORCE_LINK;
152154

153-
if (mac->phy_dev->duplex)
155+
if (mac->phy_dev->duplex) {
154156
mcr |= MAC_MCR_FORCE_DPX;
155157

156-
if (mac->phy_dev->pause)
157-
mcr |= MAC_MCR_FORCE_RX_FC | MAC_MCR_FORCE_TX_FC;
158+
if (mac->phy_dev->pause)
159+
rmt_adv = LPA_PAUSE_CAP;
160+
if (mac->phy_dev->asym_pause)
161+
rmt_adv |= LPA_PAUSE_ASYM;
162+
163+
if (mac->phy_dev->advertising & ADVERTISED_Pause)
164+
lcl_adv |= ADVERTISE_PAUSE_CAP;
165+
if (mac->phy_dev->advertising & ADVERTISED_Asym_Pause)
166+
lcl_adv |= ADVERTISE_PAUSE_ASYM;
167+
168+
flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
169+
170+
if (flowctrl & FLOW_CTRL_TX)
171+
mcr |= MAC_MCR_FORCE_TX_FC;
172+
if (flowctrl & FLOW_CTRL_RX)
173+
mcr |= MAC_MCR_FORCE_RX_FC;
174+
175+
netif_dbg(mac->hw, link, dev, "rx pause %s, tx pause %s\n",
176+
flowctrl & FLOW_CTRL_RX ? "enabled" : "disabled",
177+
flowctrl & FLOW_CTRL_TX ? "enabled" : "disabled");
178+
}
158179

159180
mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
160181

@@ -236,7 +257,8 @@ static int mtk_phy_connect(struct mtk_mac *mac)
236257
mac->phy_dev->autoneg = AUTONEG_ENABLE;
237258
mac->phy_dev->speed = 0;
238259
mac->phy_dev->duplex = 0;
239-
mac->phy_dev->supported &= PHY_BASIC_FEATURES;
260+
mac->phy_dev->supported &= PHY_GBIT_FEATURES | SUPPORTED_Pause |
261+
SUPPORTED_Asym_Pause;
240262
mac->phy_dev->advertising = mac->phy_dev->supported |
241263
ADVERTISED_Autoneg;
242264
phy_start_aneg(mac->phy_dev);

0 commit comments

Comments
 (0)