Lines Matching +full:- +full:- +full:retry +full:- +full:delay

1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2018-19, Linaro Limited
127 return readl(ethqos->rgmii_base + offset); in rgmii_readl()
133 writel(value, ethqos->rgmii_base + offset); in rgmii_writel()
149 struct device *dev = &ethqos->pdev->dev; in rgmii_dump()
177 if (!phy_interface_mode_is_rgmii(ethqos->phy_mode)) in ethqos_update_link_clk()
182 ethqos->link_clk_rate = rate * 2; in ethqos_update_link_clk()
184 clk_set_rate(ethqos->link_clk, ethqos->link_clk_rate); in ethqos_update_link_clk()
190 if (!ethqos->needs_sgmii_loopback || in qcom_ethqos_set_sgmii_loopback()
191 ethqos->phy_mode != PHY_INTERFACE_MODE_2500BASEX) in qcom_ethqos_set_sgmii_loopback()
309 struct device *dev = &ethqos->pdev->dev; in ethqos_dll_configure()
311 int retry = 1000; in ethqos_dll_configure() local
329 if (!ethqos->has_emac_ge_3) { in ethqos_dll_configure()
344 retry--; in ethqos_dll_configure()
345 } while (retry > 0); in ethqos_dll_configure()
346 if (!retry) in ethqos_dll_configure()
354 retry = 1000; in ethqos_dll_configure()
361 retry--; in ethqos_dll_configure()
362 } while (retry > 0); in ethqos_dll_configure()
363 if (!retry) in ethqos_dll_configure()
370 if (!ethqos->has_emac_ge_3) { in ethqos_dll_configure()
390 struct device *dev = &ethqos->pdev->dev; in ethqos_rgmii_macro_init()
394 /* Determine if the PHY adds a 2 ns TX delay or the MAC handles it */ in ethqos_rgmii_macro_init()
395 if (ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_ID || in ethqos_rgmii_macro_init()
396 ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_TXID) in ethqos_rgmii_macro_init()
406 if (ethqos->rgmii_config_loopback_en) in ethqos_rgmii_macro_init()
415 switch (ethqos->speed) { in ethqos_rgmii_macro_init()
437 /* PRG_RCLK_DLY = TCXO period * TCXO_CYCLES_CNT / 2 * RX delay ns, in ethqos_rgmii_macro_init()
438 * in practice this becomes PRG_RCLK_DLY = 52 * 4 / 2 * RX delay ns in ethqos_rgmii_macro_init()
440 if (ethqos->has_emac_ge_3) { in ethqos_rgmii_macro_init()
475 if (ethqos->has_emac_ge_3) in ethqos_rgmii_macro_init()
515 if (ethqos->has_emac_ge_3) in ethqos_rgmii_macro_init()
535 dev_err(dev, "Invalid speed %d\n", ethqos->speed); in ethqos_rgmii_macro_init()
536 return -EINVAL; in ethqos_rgmii_macro_init()
544 struct device *dev = &ethqos->pdev->dev; in ethqos_configure_rgmii()
546 unsigned int i, retry = 1000; in ethqos_configure_rgmii() local
549 for (i = 0; i < ethqos->num_por; i++) in ethqos_configure_rgmii()
550 rgmii_writel(ethqos, ethqos->por[i].value, in ethqos_configure_rgmii()
551 ethqos->por[i].offset); in ethqos_configure_rgmii()
564 if (ethqos->has_emac_ge_3) { in ethqos_configure_rgmii()
565 if (ethqos->speed == SPEED_1000) { in ethqos_configure_rgmii()
583 if (ethqos->speed != SPEED_100 && ethqos->speed != SPEED_10) { in ethqos_configure_rgmii()
594 if (!ethqos->has_emac_ge_3) in ethqos_configure_rgmii()
604 retry--; in ethqos_configure_rgmii()
605 } while (retry > 0); in ethqos_configure_rgmii()
606 if (!retry) in ethqos_configure_rgmii()
610 if (ethqos->speed == SPEED_1000) in ethqos_configure_rgmii()
620 if (ethqos->serdes_speed != speed) { in ethqos_set_serdes_speed()
621 phy_set_speed(ethqos->serdes_phy, speed); in ethqos_set_serdes_speed()
622 ethqos->serdes_speed = speed; in ethqos_set_serdes_speed()
631 struct net_device *dev = platform_get_drvdata(ethqos->pdev); in ethqos_configure_sgmii()
635 val = readl(ethqos->mac_base + MAC_CTRL_REG); in ethqos_configure_sgmii()
637 switch (ethqos->speed) { in ethqos_configure_sgmii()
644 stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 0, 0, 0); in ethqos_configure_sgmii()
652 stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, 0, 0); in ethqos_configure_sgmii()
657 stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, 0, 0); in ethqos_configure_sgmii()
667 stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, 0, 0); in ethqos_configure_sgmii()
671 writel(val, ethqos->mac_base + MAC_CTRL_REG); in ethqos_configure_sgmii()
680 priv->plat->max_speed = 2500; in qcom_ethqos_speed_mode_2500()
681 priv->plat->phy_interface = PHY_INTERFACE_MODE_2500BASEX; in qcom_ethqos_speed_mode_2500()
686 return ethqos->configure_func(ethqos); in ethqos_configure()
694 ethqos->speed = speed; in ethqos_fix_mac_speed()
704 ret = phy_init(ethqos->serdes_phy); in qcom_ethqos_serdes_powerup()
708 ret = phy_power_on(ethqos->serdes_phy); in qcom_ethqos_serdes_powerup()
712 return phy_set_speed(ethqos->serdes_phy, ethqos->speed); in qcom_ethqos_serdes_powerup()
719 phy_power_off(ethqos->serdes_phy); in qcom_ethqos_serdes_powerdown()
720 phy_exit(ethqos->serdes_phy); in qcom_ethqos_serdes_powerdown()
729 ret = clk_prepare_enable(ethqos->link_clk); in ethqos_clks_config()
731 dev_err(&ethqos->pdev->dev, "link_clk enable failed\n"); in ethqos_clks_config()
742 clk_disable_unprepare(ethqos->link_clk); in ethqos_clks_config()
755 struct plat_stmmacenet_data *plat_dat = priv->plat; in ethqos_ptp_clk_freq_config()
758 if (!plat_dat->clk_ptp_ref) in ethqos_ptp_clk_freq_config()
762 err = clk_set_rate(plat_dat->clk_ptp_ref, ULONG_MAX); in ethqos_ptp_clk_freq_config()
764 netdev_err(priv->dev, "Failed to max out clk_ptp_ref: %d\n", err); in ethqos_ptp_clk_freq_config()
765 plat_dat->clk_ptp_rate = clk_get_rate(plat_dat->clk_ptp_ref); in ethqos_ptp_clk_freq_config()
767 netdev_dbg(priv->dev, "PTP rate %lu\n", plat_dat->clk_ptp_rate); in ethqos_ptp_clk_freq_config()
772 struct device_node *np = pdev->dev.of_node; in qcom_ethqos_probe()
776 struct device *dev = &pdev->dev; in qcom_ethqos_probe()
791 plat_dat->clks_config = ethqos_clks_config; in qcom_ethqos_probe()
795 return -ENOMEM; in qcom_ethqos_probe()
797 ethqos->phy_mode = plat_dat->phy_interface; in qcom_ethqos_probe()
798 switch (ethqos->phy_mode) { in qcom_ethqos_probe()
803 ethqos->configure_func = ethqos_configure_rgmii; in qcom_ethqos_probe()
806 plat_dat->speed_mode_2500 = qcom_ethqos_speed_mode_2500; in qcom_ethqos_probe()
809 ethqos->configure_func = ethqos_configure_sgmii; in qcom_ethqos_probe()
813 phy_modes(ethqos->phy_mode)); in qcom_ethqos_probe()
814 return -EINVAL; in qcom_ethqos_probe()
817 ethqos->pdev = pdev; in qcom_ethqos_probe()
818 ethqos->rgmii_base = devm_platform_ioremap_resource_byname(pdev, "rgmii"); in qcom_ethqos_probe()
819 if (IS_ERR(ethqos->rgmii_base)) in qcom_ethqos_probe()
820 return dev_err_probe(dev, PTR_ERR(ethqos->rgmii_base), in qcom_ethqos_probe()
823 ethqos->mac_base = stmmac_res.addr; in qcom_ethqos_probe()
826 ethqos->por = data->por; in qcom_ethqos_probe()
827 ethqos->num_por = data->num_por; in qcom_ethqos_probe()
828 ethqos->rgmii_config_loopback_en = data->rgmii_config_loopback_en; in qcom_ethqos_probe()
829 ethqos->has_emac_ge_3 = data->has_emac_ge_3; in qcom_ethqos_probe()
830 ethqos->needs_sgmii_loopback = data->needs_sgmii_loopback; in qcom_ethqos_probe()
832 ethqos->link_clk = devm_clk_get(dev, data->link_clk_name ?: "rgmii"); in qcom_ethqos_probe()
833 if (IS_ERR(ethqos->link_clk)) in qcom_ethqos_probe()
834 return dev_err_probe(dev, PTR_ERR(ethqos->link_clk), in qcom_ethqos_probe()
845 ethqos->serdes_phy = devm_phy_optional_get(dev, "serdes"); in qcom_ethqos_probe()
846 if (IS_ERR(ethqos->serdes_phy)) in qcom_ethqos_probe()
847 return dev_err_probe(dev, PTR_ERR(ethqos->serdes_phy), in qcom_ethqos_probe()
850 ethqos->speed = SPEED_1000; in qcom_ethqos_probe()
851 ethqos->serdes_speed = SPEED_1000; in qcom_ethqos_probe()
855 plat_dat->bsp_priv = ethqos; in qcom_ethqos_probe()
856 plat_dat->fix_mac_speed = ethqos_fix_mac_speed; in qcom_ethqos_probe()
857 plat_dat->dump_debug_regs = rgmii_dump; in qcom_ethqos_probe()
858 plat_dat->ptp_clk_freq_config = ethqos_ptp_clk_freq_config; in qcom_ethqos_probe()
859 plat_dat->has_gmac4 = 1; in qcom_ethqos_probe()
860 if (ethqos->has_emac_ge_3) in qcom_ethqos_probe()
861 plat_dat->dwmac4_addrs = &data->dwmac4_addrs; in qcom_ethqos_probe()
862 plat_dat->pmt = 1; in qcom_ethqos_probe()
864 plat_dat->flags |= STMMAC_FLAG_TSO_EN; in qcom_ethqos_probe()
865 if (of_device_is_compatible(np, "qcom,qcs404-ethqos")) in qcom_ethqos_probe()
866 plat_dat->flags |= STMMAC_FLAG_RX_CLK_RUNS_IN_LPI; in qcom_ethqos_probe()
867 if (data->has_integrated_pcs) in qcom_ethqos_probe()
868 plat_dat->flags |= STMMAC_FLAG_HAS_INTEGRATED_PCS; in qcom_ethqos_probe()
869 if (data->dma_addr_width) in qcom_ethqos_probe()
870 plat_dat->host_dma_width = data->dma_addr_width; in qcom_ethqos_probe()
872 if (ethqos->serdes_phy) { in qcom_ethqos_probe()
873 plat_dat->serdes_powerup = qcom_ethqos_serdes_powerup; in qcom_ethqos_probe()
874 plat_dat->serdes_powerdown = qcom_ethqos_serdes_powerdown; in qcom_ethqos_probe()
878 for (i = 1; i < plat_dat->tx_queues_to_use; i++) in qcom_ethqos_probe()
879 plat_dat->tx_queues_cfg[i].tbs_en = 1; in qcom_ethqos_probe()
885 { .compatible = "qcom,qcs404-ethqos", .data = &emac_v2_3_0_data},
886 { .compatible = "qcom,sa8775p-ethqos", .data = &emac_v4_0_0_data},
887 { .compatible = "qcom,sc8280xp-ethqos", .data = &emac_v3_0_0_data},
888 { .compatible = "qcom,sm8150-ethqos", .data = &emac_v2_1_0_data},
896 .name = "qcom-ethqos",