net: stmmac: dwmac-mediatek: fix wrong delay value issue when resume back
authorBiao Huang <biao.huang@mediatek.com>
Wed, 9 Oct 2019 07:33:48 +0000 (15:33 +0800)
committerJakub Kicinski <jakub.kicinski@netronome.com>
Thu, 10 Oct 2019 02:39:00 +0000 (19:39 -0700)
mac_delay value will be divided by 550/170 in mt2712_delay_ps2stage(),
which is invoked at the beginning of mt2712_set_delay(), and the value
should be restored at the end of mt2712_set_delay().
Or, mac_delay will be divided again when invoking mt2712_set_delay()
when resume back.
So, add mt2712_delay_stage2ps() to mt2712_set_delay() to recovery the
original mac_delay value.

Signed-off-by: Biao Huang <biao.huang@mediatek.com>
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
drivers/net/ethernet/stmicro/stmmac/dwmac-mediatek.c

index 79f2ee37afed15bee64fbac8354f5de93f6e9d24..cea7a0c7ce689f902ab3d7b5e7234d2dd054cc3e 100644 (file)
@@ -130,6 +130,31 @@ static void mt2712_delay_ps2stage(struct mediatek_dwmac_plat_data *plat)
        }
 }
 
+static void mt2712_delay_stage2ps(struct mediatek_dwmac_plat_data *plat)
+{
+       struct mac_delay_struct *mac_delay = &plat->mac_delay;
+
+       switch (plat->phy_mode) {
+       case PHY_INTERFACE_MODE_MII:
+       case PHY_INTERFACE_MODE_RMII:
+               /* 550ps per stage for MII/RMII */
+               mac_delay->tx_delay *= 550;
+               mac_delay->rx_delay *= 550;
+               break;
+       case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_TXID:
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+       case PHY_INTERFACE_MODE_RGMII_ID:
+               /* 170ps per stage for RGMII */
+               mac_delay->tx_delay *= 170;
+               mac_delay->rx_delay *= 170;
+               break;
+       default:
+               dev_err(plat->dev, "phy interface not supported\n");
+               break;
+       }
+}
+
 static int mt2712_set_delay(struct mediatek_dwmac_plat_data *plat)
 {
        struct mac_delay_struct *mac_delay = &plat->mac_delay;
@@ -199,6 +224,8 @@ static int mt2712_set_delay(struct mediatek_dwmac_plat_data *plat)
        regmap_write(plat->peri_regmap, PERI_ETH_DLY, delay_val);
        regmap_write(plat->peri_regmap, PERI_ETH_DLY_FINE, fine_val);
 
+       mt2712_delay_stage2ps(plat);
+
        return 0;
 }