| From 5005767028535c1f809e54743f4c1b669cc2a71a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 2 Feb 2023 17:56:19 +0530 |
| Subject: net: macb: Perform zynqmp dynamic configuration only for SGMII |
| interface |
| |
| From: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> |
| |
| [ Upstream commit c9011b028e956c3b6baa6f131d9eec43e4e52020 ] |
| |
| In zynqmp platforms where firmware supports dynamic SGMII configuration |
| but has other non-SGMII ethernet devices, it fails them with no packets |
| received at the RX interface. |
| |
| To fix this behaviour perform SGMII dynamic configuration only |
| for the SGMII phy interface. |
| |
| Fixes: 32cee7818111 ("net: macb: Add zynqmp SGMII dynamic configuration support") |
| Signed-off-by: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> |
| Reviewed-by: Jiri Pirko <jiri@nvidia.com> |
| Reported-by: Michal Simek <michal.simek@amd.com> |
| Tested-by: Michal Simek <michal.simek@amd.com> |
| Reviewed-by: Claudiu Beznea <claudiu.beznea@microchip.com> |
| Link: https://lore.kernel.org/r/1675340779-27499-1-git-send-email-radhey.shyam.pandey@amd.com |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/cadence/macb_main.c | 31 ++++++++++++------------ |
| 1 file changed, 16 insertions(+), 15 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c |
| index 300f47ca42e3e..e255780f3867c 100644 |
| --- a/drivers/net/ethernet/cadence/macb_main.c |
| +++ b/drivers/net/ethernet/cadence/macb_main.c |
| @@ -4614,25 +4614,26 @@ static int init_reset_optional(struct platform_device *pdev) |
| if (ret) |
| return dev_err_probe(&pdev->dev, ret, |
| "failed to init SGMII PHY\n"); |
| - } |
| |
| - ret = zynqmp_pm_is_function_supported(PM_IOCTL, IOCTL_SET_GEM_CONFIG); |
| - if (!ret) { |
| - u32 pm_info[2]; |
| + ret = zynqmp_pm_is_function_supported(PM_IOCTL, IOCTL_SET_GEM_CONFIG); |
| + if (!ret) { |
| + u32 pm_info[2]; |
| + |
| + ret = of_property_read_u32_array(pdev->dev.of_node, "power-domains", |
| + pm_info, ARRAY_SIZE(pm_info)); |
| + if (ret) { |
| + dev_err(&pdev->dev, "Failed to read power management information\n"); |
| + goto err_out_phy_exit; |
| + } |
| + ret = zynqmp_pm_set_gem_config(pm_info[1], GEM_CONFIG_FIXED, 0); |
| + if (ret) |
| + goto err_out_phy_exit; |
| |
| - ret = of_property_read_u32_array(pdev->dev.of_node, "power-domains", |
| - pm_info, ARRAY_SIZE(pm_info)); |
| - if (ret) { |
| - dev_err(&pdev->dev, "Failed to read power management information\n"); |
| - goto err_out_phy_exit; |
| + ret = zynqmp_pm_set_gem_config(pm_info[1], GEM_CONFIG_SGMII_MODE, 1); |
| + if (ret) |
| + goto err_out_phy_exit; |
| } |
| - ret = zynqmp_pm_set_gem_config(pm_info[1], GEM_CONFIG_FIXED, 0); |
| - if (ret) |
| - goto err_out_phy_exit; |
| |
| - ret = zynqmp_pm_set_gem_config(pm_info[1], GEM_CONFIG_SGMII_MODE, 1); |
| - if (ret) |
| - goto err_out_phy_exit; |
| } |
| |
| /* Fully reset controller at hardware level if mapped in device tree */ |
| -- |
| 2.39.0 |
| |