Signed-off-by: Chuanhong Guo <gch981...@gmail.com> --- Changes since that RFC patch: Changed compatible string to ar7100-mii0/1-eth and ar9130-mii0-eth/ar9132-mii1-eth. AR9130 dosen't have a second gmac so I named the second one ar9132-mii1-eth.
target/linux/ath79/dts/ar7100.dtsi | 4 +- target/linux/ath79/dts/ar9132.dtsi | 2 +- .../net/ethernet/atheros/ag71xx/ag71xx_main.c | 102 +++++++++++++++--- 3 files changed, 92 insertions(+), 16 deletions(-) diff --git a/target/linux/ath79/dts/ar7100.dtsi b/target/linux/ath79/dts/ar7100.dtsi index 8994a7d688..bb3c10bdc5 100644 --- a/target/linux/ath79/dts/ar7100.dtsi +++ b/target/linux/ath79/dts/ar7100.dtsi @@ -171,7 +171,7 @@ }; ð0 { - compatible = "qca,ar7100-eth"; + compatible = "qca,ar7100-mii0-eth"; reg = <0x19000000 0x200 0x18070000 0x4>; @@ -189,7 +189,7 @@ }; ð1 { - compatible = "qca,ar7100-eth"; + compatible = "qca,ar7100-mii1-eth"; reg = <0x1a000000 0x200 0x18070004 0x4>; diff --git a/target/linux/ath79/dts/ar9132.dtsi b/target/linux/ath79/dts/ar9132.dtsi index 9d8ddcf9ba..bf5e9c06fa 100644 --- a/target/linux/ath79/dts/ar9132.dtsi +++ b/target/linux/ath79/dts/ar9132.dtsi @@ -185,7 +185,7 @@ }; ð0 { - compatible = "qca,ar9130-eth", "syscon"; + compatible = "qca,ar9130-mii0-eth", "syscon"; reg = <0x19000000 0x200 0x18070000 0x4>; pll-data = <0x1a000000 0x13000a44 0x00441099>; diff --git a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c index 1e0bb6937f..72c6673037 100644 --- a/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c +++ b/target/linux/ath79/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c @@ -529,6 +529,60 @@ static void ath79_set_pll(struct ag71xx *ag) udelay(100); } +static void ath79_mii_ctrl_set_if(struct ag71xx *ag, unsigned int mii_if) +{ + u32 t; + + t = __raw_readl(ag->mii_base); + t &= ~(AR71XX_MII_CTRL_IF_MASK); + t |= (mii_if & AR71XX_MII_CTRL_IF_MASK); + __raw_writel(t, ag->mii_base); +} + +static void ath79_mii0_ctrl_set_if(struct ag71xx *ag) +{ + unsigned int mii_if; + + switch (ag->phy_if_mode) { + case PHY_INTERFACE_MODE_MII: + mii_if = AR71XX_MII0_CTRL_IF_MII; + break; + case PHY_INTERFACE_MODE_GMII: + mii_if = AR71XX_MII0_CTRL_IF_GMII; + break; + case PHY_INTERFACE_MODE_RGMII: + mii_if = AR71XX_MII0_CTRL_IF_RGMII; + break; + case PHY_INTERFACE_MODE_RMII: + mii_if = AR71XX_MII0_CTRL_IF_RMII; + break; + default: + WARN(1, "Impossible PHY mode defined.\n"); + return; + } + + ath79_mii_ctrl_set_if(ag, mii_if); +} + +static void ath79_mii1_ctrl_set_if(struct ag71xx *ag) +{ + unsigned int mii_if; + + switch (ag->phy_if_mode) { + case PHY_INTERFACE_MODE_RMII: + mii_if = AR71XX_MII1_CTRL_IF_RMII; + break; + case PHY_INTERFACE_MODE_RGMII: + mii_if = AR71XX_MII1_CTRL_IF_RGMII; + break; + default: + WARN(1, "Impossible PHY mode defined.\n"); + return; + } + + ath79_mii_ctrl_set_if(ag, mii_if); +} + static void ath79_mii_ctrl_set_speed(struct ag71xx *ag) { unsigned int mii_speed; @@ -573,8 +627,10 @@ __ag71xx_link_adjust(struct ag71xx *ag, bool update) return; } - if (!of_device_is_compatible(np, "qca,ar9130-eth") && - !of_device_is_compatible(np, "qca,ar7100-eth")) + if (!of_device_is_compatible(np, "qca,ar9130-mii0-eth") && + !of_device_is_compatible(np, "qca,ar9132-mii1-eth") && + !of_device_is_compatible(np, "qca,ar7100-mii0-eth") && + !of_device_is_compatible(np, "qca,ar7100-mii1-eth")) ag71xx_fast_reset(ag); cfg2 = ag71xx_rr(ag, AG71XX_REG_MAC_CFG2); @@ -612,8 +668,10 @@ __ag71xx_link_adjust(struct ag71xx *ag, bool update) ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, ag->fifodata[2]); if (update) { - if (of_device_is_compatible(np, "qca,ar7100-eth") || - of_device_is_compatible(np, "qca,ar9130-eth")) { + if (of_device_is_compatible(np, "qca,ar7100-mii0-eth") || + of_device_is_compatible(np, "qca,ar7100-mii1-eth") || + of_device_is_compatible(np, "qca,ar9130-mii0-eth") || + of_device_is_compatible(np, "qca,ar9132-mii1-eth")) { ath79_set_pll(ag); ath79_mii_ctrl_set_speed(ag); } else if (of_device_is_compatible(np, "qca,ar7242-eth") || @@ -1307,8 +1365,10 @@ static int ag71xx_probe(struct platform_device *pdev) } if (of_property_read_u32_array(np, "fifo-data", ag->fifodata, 3)) { - if (of_device_is_compatible(np, "qca,ar9130-eth") || - of_device_is_compatible(np, "qca,ar7100-eth")) { + if (of_device_is_compatible(np, "qca,ar7100-mii0-eth") || + of_device_is_compatible(np, "qca,ar7100-mii1-eth") || + of_device_is_compatible(np, "qca,ar9130-mii0-eth") || + of_device_is_compatible(np, "qca,ar9132-mii1-eth")) { ag->fifodata[0] = 0x0fff0000; ag->fifodata[1] = 0x00001fff; } else { @@ -1316,9 +1376,11 @@ static int ag71xx_probe(struct platform_device *pdev) ag->fifodata[1] = 0x015500aa; ag->fifodata[2] = 0x01f00140; } - if (of_device_is_compatible(np, "qca,ar9130-eth")) + if (of_device_is_compatible(np, "qca,ar9130-mii0-eth") || + of_device_is_compatible(np, "qca,ar9132-mii1-eth")) ag->fifodata[2] = 0x00780fff; - else if (of_device_is_compatible(np, "qca,ar7100-eth")) + else if (of_device_is_compatible(np, "qca,ar7100-mii0-eth") || + of_device_is_compatible(np, "qca,ar7100-mii1-eth")) ag->fifodata[2] = 0x008001ff; } @@ -1392,11 +1454,14 @@ static int ag71xx_probe(struct platform_device *pdev) ag->tx_hang_workaround = 1; ag->rx_buf_offset = NET_SKB_PAD; - if (!of_device_is_compatible(np, "qca,ar7100-eth") && - !of_device_is_compatible(np, "qca,ar9130-eth")) + if (!of_device_is_compatible(np, "qca,ar9130-mii0-eth") && + !of_device_is_compatible(np, "qca,ar9132-mii1-eth") && + !of_device_is_compatible(np, "qca,ar7100-mii0-eth") && + !of_device_is_compatible(np, "qca,ar7100-mii1-eth")) ag->rx_buf_offset += NET_IP_ALIGN; - if (of_device_is_compatible(np, "qca,ar7100-eth")) { + if (of_device_is_compatible(np, "qca,ar7100-mii0-eth") || + of_device_is_compatible(np, "qca,ar7100-mii1-eth")) { ag->tx_ring.desc_split = AG71XX_TX_RING_SPLIT; tx_size *= AG71XX_TX_RING_DS_PER_PKT; } @@ -1427,6 +1492,15 @@ static int ag71xx_probe(struct platform_device *pdev) goto err_free; } + if (ag->mii_base) { + if (of_device_is_compatible(np, "qca,ar7100-mii0-eth") || + of_device_is_compatible(np, "qca,ar9130-mii0-eth")) + ath79_mii0_ctrl_set_if(ag); + else if (of_device_is_compatible(np, "qca,ar7100-mii1-eth") || + of_device_is_compatible(np, "qca,ar9132-mii1-eth")) + ath79_mii1_ctrl_set_if(ag); + } + netif_napi_add(dev, &ag->napi, ag71xx_poll, AG71XX_NAPI_WEIGHT); ag71xx_wr(ag, AG71XX_REG_MAC_CFG1, 0); @@ -1490,11 +1564,13 @@ static int ag71xx_remove(struct platform_device *pdev) } static const struct of_device_id ag71xx_match[] = { - { .compatible = "qca,ar7100-eth" }, + { .compatible = "qca,ar7100-mii0-eth" }, + { .compatible = "qca,ar7100-mii1-eth" }, { .compatible = "qca,ar7240-eth" }, { .compatible = "qca,ar7241-eth" }, { .compatible = "qca,ar7242-eth" }, - { .compatible = "qca,ar9130-eth" }, + { .compatible = "qca,ar9130-mii0-eth" }, + { .compatible = "qca,ar9132-mii1-eth" }, { .compatible = "qca,ar9330-eth" }, { .compatible = "qca,ar9340-eth" }, { .compatible = "qca,qca9530-eth" }, -- 2.17.1 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel