]> git.dujemihanovic.xyz Git - linux.git/commitdiff
net: stmmac: dwmac-ipq806x: account for rgmii-txid/rxid/id phy-mode
authorChristian Marangi <ansuelsmth@gmail.com>
Mon, 6 May 2024 12:32:46 +0000 (14:32 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 May 2024 11:19:54 +0000 (12:19 +0100)
Currently the ipq806x dwmac driver is almost always used attached to the
CPU port of a switch and phy-mode was always set to "rgmii" or "sgmii".

Some device came up with a special configuration where the PHY is
directly attached to the GMAC port and in those case phy-mode needs to
be set to "rgmii-id" to make the PHY correctly work and receive packets.

Since the driver supports only "rgmii" and "sgmii" mode, when "rgmii-id"
(or variants) mode is set, the mode is rejected and probe fails.

Add support also for these phy-modes to correctly setup PHYs that requires
delay applied to tx/rx.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c

index 281687d7083bd47415ecd94ddd947d5bfba66f4a..4ba15873d5b1af7652ef1c32a579d41d765c78fe 100644 (file)
@@ -171,6 +171,9 @@ static int ipq806x_gmac_set_speed(struct ipq806x_gmac *gmac, unsigned int speed)
 
        switch (gmac->phy_mode) {
        case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+       case PHY_INTERFACE_MODE_RGMII_TXID:
                div = get_clk_div_rgmii(gmac, speed);
                clk_bits = NSS_COMMON_CLK_GATE_RGMII_RX_EN(gmac->id) |
                           NSS_COMMON_CLK_GATE_RGMII_TX_EN(gmac->id);
@@ -410,6 +413,9 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
        val |= NSS_COMMON_GMAC_CTL_CSYS_REQ;
        switch (gmac->phy_mode) {
        case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+       case PHY_INTERFACE_MODE_RGMII_TXID:
                val |= NSS_COMMON_GMAC_CTL_PHY_IFACE_SEL;
                break;
        case PHY_INTERFACE_MODE_SGMII:
@@ -425,6 +431,9 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
        val &= ~(1 << NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id));
        switch (gmac->phy_mode) {
        case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+       case PHY_INTERFACE_MODE_RGMII_TXID:
                val |= NSS_COMMON_CLK_SRC_CTRL_RGMII(gmac->id) <<
                        NSS_COMMON_CLK_SRC_CTRL_OFFSET(gmac->id);
                break;
@@ -442,6 +451,9 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
        val |= NSS_COMMON_CLK_GATE_PTP_EN(gmac->id);
        switch (gmac->phy_mode) {
        case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+       case PHY_INTERFACE_MODE_RGMII_TXID:
                val |= NSS_COMMON_CLK_GATE_RGMII_RX_EN(gmac->id) |
                        NSS_COMMON_CLK_GATE_RGMII_TX_EN(gmac->id);
                break;