[][Fix ethernet bring up issue for MT7622]
[Description]
Fix ethernet bring up issue for MT7622
1. Add condition check before registering FE Interrupt.
2. Add condition check before accessing SGMII.
3. Bypass DMA monitor for NETSYSv1.
[Release-log]
N/A
Change-Id: Ie3327b879db03da9703c128ce77260705e12785e
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/6006420
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_reset.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_reset.c
index 4df1892..391cc1d 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_reset.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_reset.c
@@ -323,12 +323,14 @@
mtk_w32(eth, val & ~(MTK_TX_DMA_EN), MTK_QDMA_GLO_CFG);
/* Power down sgmii */
- regmap_read(eth->sgmii->regmap[0], SGMSYS_QPHY_PWR_STATE_CTRL, &val);
- val |= SGMII_PHYA_PWD;
- regmap_write(eth->sgmii->regmap[0], SGMSYS_QPHY_PWR_STATE_CTRL, val);
- regmap_read(eth->sgmii->regmap[1], SGMSYS_QPHY_PWR_STATE_CTRL, &val);
- val |= SGMII_PHYA_PWD;
- regmap_write(eth->sgmii->regmap[1], SGMSYS_QPHY_PWR_STATE_CTRL, val);
+ for (i = 0; i < MTK_MAX_DEVS; i++) {
+ if (!eth->sgmii->regmap[i])
+ continue;
+
+ regmap_read(eth->sgmii->regmap[i], SGMSYS_QPHY_PWR_STATE_CTRL, &val);
+ val |= SGMII_PHYA_PWD;
+ regmap_write(eth->sgmii->regmap[i], SGMSYS_QPHY_PWR_STATE_CTRL, val);
+ }
/* Force link down GMAC */
val = mtk_r32(eth, MTK_MAC_MCR(0));
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 13b5369..40d840e 100755
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -2686,7 +2686,7 @@
phylink_start(mac->phylink);
netif_start_queue(dev);
phy_node = of_parse_phandle(mac->of_node, "phy-handle", 0);
- if (!phy_node) {
+ if (!phy_node && eth->sgmii->regmap[mac->id]) {
regmap_write(eth->sgmii->regmap[mac->id], SGMSYS_QPHY_PWR_STATE_CTRL, 0);
}
return 0;
@@ -2730,7 +2730,7 @@
val = _mtk_mdio_read(eth, 0, 0);
val |= BMCR_PDOWN;
_mtk_mdio_write(eth, 0, 0, val);
- }else {
+ } else if (eth->sgmii->regmap[mac->id]) {
regmap_read(eth->sgmii->regmap[mac->id], SGMSYS_QPHY_PWR_STATE_CTRL, &val);
val |= SGMII_PHYA_PWD;
regmap_write(eth->sgmii->regmap[mac->id], SGMSYS_QPHY_PWR_STATE_CTRL, val);
@@ -3128,7 +3128,7 @@
for (i = 0; i < MTK_MAC_COUNT; i++) {
mac = netdev_priv(eth->netdev[i]);
phy_node = of_parse_phandle(mac->of_node, "phy-handle", 0);
- if (!phy_node) {
+ if (!phy_node && eth->sgmii->regmap[i]) {
mtk_gmac_sgmii_path_setup(eth, i);
regmap_write(eth->sgmii->regmap[i], SGMSYS_QPHY_PWR_STATE_CTRL, 0);
}
@@ -3647,22 +3647,24 @@
if (err)
goto err_free_dev;
- if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSS)) {
- for (i = 1; i < MTK_RX_NAPI_NUM; i++) {
- err = devm_request_irq(eth->dev,
- eth->irq[2 + i],
- mtk_handle_irq_rx, 0,
- dev_name(eth->dev),
- ð->rx_napi[i]);
+ if (MTK_MAX_IRQ_NUM > 3) {
+ if (MTK_HAS_CAPS(eth->soc->caps, MTK_RSS)) {
+ for (i = 1; i < MTK_RX_NAPI_NUM; i++) {
+ err = devm_request_irq(eth->dev,
+ eth->irq[2 + i],
+ mtk_handle_irq_rx, 0,
+ dev_name(eth->dev),
+ ð->rx_napi[i]);
+ if (err)
+ goto err_free_dev;
+ }
+ } else {
+ err = devm_request_irq(eth->dev, eth->irq[3],
+ mtk_handle_fe_irq, 0,
+ dev_name(eth->dev), eth);
if (err)
goto err_free_dev;
}
- } else {
- err = devm_request_irq(eth->dev, eth->irq[3],
- mtk_handle_fe_irq, 0,
- dev_name(eth->dev), eth);
- if (err)
- goto err_free_dev;
}
}
@@ -3711,9 +3713,11 @@
platform_set_drvdata(pdev, eth);
register_netdevice_notifier(&mtk_eth_netdevice_nb);
+#if defined(CONFIG_MEDIATEK_NETSYS_V2)
timer_setup(ð->mtk_dma_monitor_timer, mtk_dma_monitor, 0);
eth->mtk_dma_monitor_timer.expires = jiffies;
add_timer(ð->mtk_dma_monitor_timer);
+#endif
return 0;