Message ID | 1474358360-29901-2-git-send-email-sean.wang@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 09/20/2016 12:59 AM, sean.wang@mediatek.com wrote: > From: Sean Wang <sean.wang@mediatek.com> > > adds PHY-mode "trgmii" as an extension for the operation > mode of the PHY interface, TRGMII can be compatible with > RGMII, so the extended mode doesn't really have effects on > the target MAC and PHY, is used as the indication if the > current MAC is connected to an internal switch or external > PHY respectively by the given configuration on the board and > then to perform the corresponding setup on TRGMII hardware > module. Based on my googling, it seems like Turbo RGMII is a Mediatek-specific thing for now, but this could become standard and used by other vendors at some point, so I would be inclined to just extend the phy-mode property to support trgmii as another interface type. If you do so, do you also mind proposing an update to the Device Tree specification: https://www.devicetree.org/specifications/ Thanks!
Date: Tue, 20 Sep 2016 14:23:24 -0700, Florian Fainelli <f.fainelli@gmail.com> wrote: >On 09/20/2016 12:59 AM, sean.wang@mediatek.com wrote: >> From: Sean Wang <sean.wang@mediatek.com> >> >> adds PHY-mode "trgmii" as an extension for the operation >> mode of the PHY interface, TRGMII can be compatible with >> RGMII, so the extended mode doesn't really have effects on >> the target MAC and PHY, is used as the indication if the >> current MAC is connected to an internal switch or external >> PHY respectively by the given configuration on the board and >> then to perform the corresponding setup on TRGMII hardware >> module. > >Based on my googling, it seems like Turbo RGMII is a Mediatek-specific >thing for now, but this could become standard and used by other vendors >at some point, so I would be inclined to just extend the phy-mode >property to support trgmii as another interface type. > >If you do so, do you also mind proposing an update to the Device Tree >specification: > >https://www.devicetree.org/specifications/ > >Thanks! I am willing to do the these thing 1) in the next version, I will extend rgmii mode as another interface type as PHY_INTERFACE_MODE_TRGMII defined in linux/phy.h instead of extension only inside the current driver. This change also helps to save some code. 2) I send another separate patch for updating the Device Tree specification about TRGMII adding description are these all okay for you?
On 09/21/2016 12:33 AM, Sean Wang wrote: > Date: Tue, 20 Sep 2016 14:23:24 -0700, Florian Fainelli <f.fainelli@gmail.com> wrote: >> On 09/20/2016 12:59 AM, sean.wang@mediatek.com wrote: >>> From: Sean Wang <sean.wang@mediatek.com> >>> >>> adds PHY-mode "trgmii" as an extension for the operation >>> mode of the PHY interface, TRGMII can be compatible with >>> RGMII, so the extended mode doesn't really have effects on >>> the target MAC and PHY, is used as the indication if the >>> current MAC is connected to an internal switch or external >>> PHY respectively by the given configuration on the board and >>> then to perform the corresponding setup on TRGMII hardware >>> module. >> >> Based on my googling, it seems like Turbo RGMII is a Mediatek-specific >> thing for now, but this could become standard and used by other vendors >> at some point, so I would be inclined to just extend the phy-mode >> property to support trgmii as another interface type. >> >> If you do so, do you also mind proposing an update to the Device Tree >> specification: >> >> https://www.devicetree.org/specifications/ >> >> Thanks! > > I am willing to do the these thing > > 1) > in the next version, I will extend rgmii mode as > another interface type as PHY_INTERFACE_MODE_TRGMII > defined in linux/phy.h instead of extension only inside > the current driver. This change also helps to save some code. > > 2) > I send another separate patch for updating the Device Tree > specification about TRGMII adding description > > are these all okay for you? Absolutely, thanks a lot!
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index ca6b501..a0e338b 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -135,6 +135,26 @@ static int mtk_mdio_read(struct mii_bus *bus, int phy_addr, int phy_reg) return _mtk_mdio_read(eth, phy_addr, phy_reg); } +static int mtk_of_get_phy_mode(struct mtk_mac *mac, struct device_node *np) +{ + int phy_mode, err; + const char *pm; + + phy_mode = of_get_phy_mode(np); + + if (phy_mode >= 0) + return phy_mode; + err = of_property_read_string(np, "phy-mode", &pm); + if (err < 0) + return err; + if (!strcasecmp(pm, "trgmii")) { + mac->trgmii = true; + /* TRGMII could be compatible with RGMII */ + return PHY_INTERFACE_MODE_RGMII; + } else + return -ENODEV; +} + static void mtk_phy_link_adjust(struct net_device *dev) { struct mtk_mac *mac = netdev_priv(dev); @@ -207,7 +227,7 @@ static int mtk_phy_connect_node(struct mtk_eth *eth, struct mtk_mac *mac, return -EINVAL; } addr = be32_to_cpu(*_addr); - phy_mode = of_get_phy_mode(phy_node); + phy_mode = mtk_of_get_phy_mode(mac, phy_node); if (phy_mode < 0) { dev_err(eth->dev, "incorrect phy-mode %d\n", phy_mode); return -EINVAL; @@ -243,7 +263,7 @@ static int mtk_phy_connect(struct mtk_mac *mac) if (!np) return -ENODEV; - switch (of_get_phy_mode(np)) { + switch (mtk_of_get_phy_mode(mac, np)) { case PHY_INTERFACE_MODE_RGMII_TXID: case PHY_INTERFACE_MODE_RGMII_RXID: case PHY_INTERFACE_MODE_RGMII_ID: diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h index 7c5e534..e3b9525 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h @@ -529,6 +529,8 @@ struct mtk_eth { * @hw: Backpointer to our main datastruture * @hw_stats: Packet statistics counter * @phy_dev: The attached PHY if available + * @trgmii Indicate if the MAC uses TRGMII connected to internal + switch */ struct mtk_mac { int id; @@ -539,6 +541,7 @@ struct mtk_mac { struct phy_device *phy_dev; __be32 hwlro_ip[MTK_MAX_LRO_IP_CNT]; int hwlro_ip_cnt; + bool trgmii; }; /* the struct describing the SoC. these are declared in the soc_xyz.c files */