| From 79aa42342498631058d9055e5b8f5088b9d7abf3 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 4 Jan 2022 16:38:31 +0000 |
| Subject: net: gemini: allow any RGMII interface mode |
| |
| From: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> |
| |
| [ Upstream commit 4e4f325a0a55907b14f579e6b1a38c53755e3de2 ] |
| |
| The four RGMII interface modes take care of the required RGMII delay |
| configuration at the PHY and should not be limited by the network MAC |
| driver. Sadly, gemini was only permitting RGMII mode with no delays, |
| which would require the required delay to be inserted via PCB tracking |
| or by the MAC. |
| |
| However, there are designs that require the PHY to add the delay, which |
| is impossible without Gemini permitting the other three PHY interface |
| modes. Fix the driver to allow these. |
| |
| Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> |
| Reviewed-by: Linus Walleij <linus.walleij@linaro.org> |
| Tested-by: Corentin Labbe <clabbe.montjoie@gmail.com> |
| Link: https://lore.kernel.org/r/E1n4mpT-002PLd-Ha@rmk-PC.armlinux.org.uk |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/cortina/gemini.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c |
| index c9fb1ec625d8b..a8a8b77c1611e 100644 |
| --- a/drivers/net/ethernet/cortina/gemini.c |
| +++ b/drivers/net/ethernet/cortina/gemini.c |
| @@ -304,21 +304,21 @@ static void gmac_speed_set(struct net_device *netdev) |
| switch (phydev->speed) { |
| case 1000: |
| status.bits.speed = GMAC_SPEED_1000; |
| - if (phydev->interface == PHY_INTERFACE_MODE_RGMII) |
| + if (phy_interface_mode_is_rgmii(phydev->interface)) |
| status.bits.mii_rmii = GMAC_PHY_RGMII_1000; |
| netdev_dbg(netdev, "connect %s to RGMII @ 1Gbit\n", |
| phydev_name(phydev)); |
| break; |
| case 100: |
| status.bits.speed = GMAC_SPEED_100; |
| - if (phydev->interface == PHY_INTERFACE_MODE_RGMII) |
| + if (phy_interface_mode_is_rgmii(phydev->interface)) |
| status.bits.mii_rmii = GMAC_PHY_RGMII_100_10; |
| netdev_dbg(netdev, "connect %s to RGMII @ 100 Mbit\n", |
| phydev_name(phydev)); |
| break; |
| case 10: |
| status.bits.speed = GMAC_SPEED_10; |
| - if (phydev->interface == PHY_INTERFACE_MODE_RGMII) |
| + if (phy_interface_mode_is_rgmii(phydev->interface)) |
| status.bits.mii_rmii = GMAC_PHY_RGMII_100_10; |
| netdev_dbg(netdev, "connect %s to RGMII @ 10 Mbit\n", |
| phydev_name(phydev)); |
| @@ -388,6 +388,9 @@ static int gmac_setup_phy(struct net_device *netdev) |
| status.bits.mii_rmii = GMAC_PHY_GMII; |
| break; |
| case PHY_INTERFACE_MODE_RGMII: |
| + case PHY_INTERFACE_MODE_RGMII_ID: |
| + case PHY_INTERFACE_MODE_RGMII_TXID: |
| + case PHY_INTERFACE_MODE_RGMII_RXID: |
| netdev_dbg(netdev, |
| "RGMII: set GMAC0 and GMAC1 to MII/RGMII mode\n"); |
| status.bits.mii_rmii = GMAC_PHY_RGMII_100_10; |
| -- |
| 2.34.1 |
| |