mediatek: update patches
[openwrt/staging/wigyori.git] / target / linux / mediatek / patches-4.4 / 0078-net-next-mediatek-fix-gigabit-and-flow-control-adver.patch
1 From 09313f26999e2685e0b9434374e7308e1f447e55 Mon Sep 17 00:00:00 2001
2 From: John Crispin <john@phrozen.org>
3 Date: Fri, 22 Apr 2016 11:05:23 +0200
4 Subject: [PATCH 078/102] net-next: mediatek: fix gigabit and flow control
5 advertisement
6
7 The current code will not setup the PHYs advertisement features correctly.
8 Fix this and properly advertise Gigabit features and properly handle
9 asymmetric pause frames.
10
11 Signed-off-by: Sean Wang <keyhaede@gmail.com>
12 Signed-off-by: John Crispin <john@phrozen.org>
13 ---
14 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 30 +++++++++++++++++++++++----
15 1 file changed, 26 insertions(+), 4 deletions(-)
16
17 diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
18 index 0c8d369..3436c7b 100644
19 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
20 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
21 @@ -133,6 +133,8 @@ static int mtk_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg)
22 static void mtk_phy_link_adjust(struct net_device *dev)
23 {
24 struct mtk_mac *mac = netdev_priv(dev);
25 + u16 lcl_adv = 0, rmt_adv = 0;
26 + u8 flowctrl;
27 u32 mcr = MAC_MCR_MAX_RX_1536 | MAC_MCR_IPG_CFG |
28 MAC_MCR_FORCE_MODE | MAC_MCR_TX_EN |
29 MAC_MCR_RX_EN | MAC_MCR_BACKOFF_EN |
30 @@ -150,11 +152,30 @@ static void mtk_phy_link_adjust(struct net_device *dev)
31 if (mac->phy_dev->link)
32 mcr |= MAC_MCR_FORCE_LINK;
33
34 - if (mac->phy_dev->duplex)
35 + if (mac->phy_dev->duplex) {
36 mcr |= MAC_MCR_FORCE_DPX;
37
38 - if (mac->phy_dev->pause)
39 - mcr |= MAC_MCR_FORCE_RX_FC | MAC_MCR_FORCE_TX_FC;
40 + if (mac->phy_dev->pause)
41 + rmt_adv = LPA_PAUSE_CAP;
42 + if (mac->phy_dev->asym_pause)
43 + rmt_adv |= LPA_PAUSE_ASYM;
44 +
45 + if (mac->phy_dev->advertising & ADVERTISED_Pause)
46 + lcl_adv |= ADVERTISE_PAUSE_CAP;
47 + if (mac->phy_dev->advertising & ADVERTISED_Asym_Pause)
48 + lcl_adv |= ADVERTISE_PAUSE_ASYM;
49 +
50 + flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
51 +
52 + if (flowctrl & FLOW_CTRL_TX)
53 + mcr |= MAC_MCR_FORCE_TX_FC;
54 + if (flowctrl & FLOW_CTRL_RX)
55 + mcr |= MAC_MCR_FORCE_RX_FC;
56 +
57 + netif_dbg(mac->hw, link, dev, "rx pause %s, tx pause %s\n",
58 + flowctrl & FLOW_CTRL_RX ? "enabled" : "disabled",
59 + flowctrl & FLOW_CTRL_TX ? "enabled" : "disabled");
60 + }
61
62 mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
63
64 @@ -236,7 +257,8 @@ static int mtk_phy_connect(struct mtk_mac *mac)
65 mac->phy_dev->autoneg = AUTONEG_ENABLE;
66 mac->phy_dev->speed = 0;
67 mac->phy_dev->duplex = 0;
68 - mac->phy_dev->supported &= PHY_BASIC_FEATURES;
69 + mac->phy_dev->supported &= PHY_GBIT_FEATURES | SUPPORTED_Pause |
70 + SUPPORTED_Asym_Pause;
71 mac->phy_dev->advertising = mac->phy_dev->supported |
72 ADVERTISED_Autoneg;
73 phy_start_aneg(mac->phy_dev);
74 --
75 1.7.10.4
76