OSDN Git Service

net: macb: Perform zynqmp dynamic configuration only for SGMII interface
authorRadhey Shyam Pandey <radhey.shyam.pandey@amd.com>
Thu, 2 Feb 2023 12:26:19 +0000 (17:56 +0530)
committerJakub Kicinski <kuba@kernel.org>
Sat, 4 Feb 2023 03:34:55 +0000 (19:34 -0800)
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>
drivers/net/ethernet/cadence/macb_main.c

index 72e4282..6cda315 100644 (file)
@@ -4627,25 +4627,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 */