diff mbox series

[2/2] drivers: net: fsl-mc: fix MAC address fixup procedure

Message ID 20230209160704.3791631-3-ioana.ciornei@nxp.com
State Accepted
Commit 8491a7e4ed82a996189a8c97acca90e88f63d345
Delegated to: Ramon Fried
Headers show
Series drivers: net: fsl-mc: fix MAC address fixup procedure | expand

Commit Message

Ioana Ciornei Feb. 9, 2023, 4:07 p.m. UTC
In the process of adopting CONFIG_DM_ETH on the DPAA2 based platforms,
interfaces which were previously defined as "xgmii" were transitioned to
be defined as "xfi" in the DTS.
See the commit below for reference:
commit 87274918f2f4 ("arm: dts: ls2088ardb: add DPMAC and PHY nodes")

Then Vladimir's commit replaced all occurrences of "xfi" with
"10gbase-r" in an effort to make U-Boot work with the same device tree
as Linux.
commit 77b11f760416 ("net: replace the "xfi" phy-mode with "10gbase-r"")

These changes to the phy_interface_t of an Ethernet port meant that the
mc_fixup_mac_addrs() function was no longer capable to properly fixup
the MAC addresses. The problem arises from the fact that the hardcoded
information about an interface (wriop_get_enet_if()) was no longer
matching any actual device.

For example, the function tried to search for "DPMAC1@xgmii1" by name
using eth_get_dev_by_name() when only "DPMAC1@10gbase-r" was available.

This function removes the need to rely on the hardcoded information by
iterating through all the UCLASS_ETH devices which are DPAA2 and request
a fixup for each of them.

Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
---
 drivers/net/fsl-mc/mc.c | 31 +++++++++++++------------------
 1 file changed, 13 insertions(+), 18 deletions(-)

Comments

Ramon Fried Feb. 18, 2023, 8:07 p.m. UTC | #1
On Thu, Feb 9, 2023 at 6:07 PM Ioana Ciornei <ioana.ciornei@nxp.com> wrote:
>
> In the process of adopting CONFIG_DM_ETH on the DPAA2 based platforms,
> interfaces which were previously defined as "xgmii" were transitioned to
> be defined as "xfi" in the DTS.
> See the commit below for reference:
> commit 87274918f2f4 ("arm: dts: ls2088ardb: add DPMAC and PHY nodes")
>
> Then Vladimir's commit replaced all occurrences of "xfi" with
> "10gbase-r" in an effort to make U-Boot work with the same device tree
> as Linux.
> commit 77b11f760416 ("net: replace the "xfi" phy-mode with "10gbase-r"")
>
> These changes to the phy_interface_t of an Ethernet port meant that the
> mc_fixup_mac_addrs() function was no longer capable to properly fixup
> the MAC addresses. The problem arises from the fact that the hardcoded
> information about an interface (wriop_get_enet_if()) was no longer
> matching any actual device.
>
> For example, the function tried to search for "DPMAC1@xgmii1" by name
> using eth_get_dev_by_name() when only "DPMAC1@10gbase-r" was available.
>
> This function removes the need to rely on the hardcoded information by
> iterating through all the UCLASS_ETH devices which are DPAA2 and request
> a fixup for each of them.
>
> Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
> ---
>  drivers/net/fsl-mc/mc.c | 31 +++++++++++++------------------
>  1 file changed, 13 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/net/fsl-mc/mc.c b/drivers/net/fsl-mc/mc.c
> index 4f84403d956c..78a40f285aa2 100644
> --- a/drivers/net/fsl-mc/mc.c
> +++ b/drivers/net/fsl-mc/mc.c
> @@ -29,6 +29,7 @@
>  #include <fsl-mc/fsl_dpsparser.h>
>  #include <fsl-mc/fsl_qbman_portal.h>
>  #include <fsl-mc/ldpaa_wriop.h>
> +#include <net/ldpaa_eth.h>
>
>  #define MC_RAM_BASE_ADDR_ALIGNMENT  (512UL * 1024 * 1024)
>  #define MC_RAM_BASE_ADDR_ALIGNMENT_MASK        (~(MC_RAM_BASE_ADDR_ALIGNMENT - 1))
> @@ -383,37 +384,31 @@ static int mc_fixup_dpc_mac_addr(void *blob, int dpmac_id,
>
>  static int mc_fixup_mac_addrs(void *blob, enum mc_fixup_type type)
>  {
> -       int i, err = 0, ret = 0;
> -#define ETH_NAME_LEN 20
>         struct udevice *eth_dev;
> -       char ethname[ETH_NAME_LEN];
> -
> -       for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
> -               /* port not enabled */
> -               if (wriop_is_enabled_dpmac(i) != 1)
> -                       continue;
> -
> -               snprintf(ethname, ETH_NAME_LEN, "DPMAC%d@%s", i,
> -                        phy_interface_strings[wriop_get_enet_if(i)]);
> -
> -               eth_dev = eth_get_dev_by_name(ethname);
> -               if (eth_dev == NULL)
> +       int err = 0, ret = 0;
> +       struct uclass *uc;
> +       uint32_t dpmac_id;
> +
> +       uclass_get(UCLASS_ETH, &uc);
> +       uclass_foreach_dev(eth_dev, uc) {
> +               if (!eth_dev->driver || !eth_dev->driver->name ||
> +                   strcmp(eth_dev->driver->name, LDPAA_ETH_DRIVER_NAME))
>                         continue;
>
> +               dpmac_id = ldpaa_eth_get_dpmac_id(eth_dev);
>                 switch (type) {
>                 case MC_FIXUP_DPL:
> -                       err = mc_fixup_dpl_mac_addr(blob, i, eth_dev);
> +                       err = mc_fixup_dpl_mac_addr(blob, dpmac_id, eth_dev);
>                         break;
>                 case MC_FIXUP_DPC:
> -                       err = mc_fixup_dpc_mac_addr(blob, i, eth_dev);
> +                       err = mc_fixup_dpc_mac_addr(blob, dpmac_id, eth_dev);
>                         break;
>                 default:
>                         break;
>                 }
>
>                 if (err)
> -                       printf("fsl-mc: ERROR fixing mac address for %s\n",
> -                              ethname);
> +                       printf("fsl-mc: ERROR fixing mac address for %s\n", eth_dev->name);
>                 ret |= err;
>         }
>
> --
> 2.25.1
>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
Tom Rini May 6, 2023, 2:54 p.m. UTC | #2
On Thu, Feb 09, 2023 at 06:07:04PM +0200, Ioana Ciornei wrote:

> In the process of adopting CONFIG_DM_ETH on the DPAA2 based platforms,
> interfaces which were previously defined as "xgmii" were transitioned to
> be defined as "xfi" in the DTS.
> See the commit below for reference:
> commit 87274918f2f4 ("arm: dts: ls2088ardb: add DPMAC and PHY nodes")
> 
> Then Vladimir's commit replaced all occurrences of "xfi" with
> "10gbase-r" in an effort to make U-Boot work with the same device tree
> as Linux.
> commit 77b11f760416 ("net: replace the "xfi" phy-mode with "10gbase-r"")
> 
> These changes to the phy_interface_t of an Ethernet port meant that the
> mc_fixup_mac_addrs() function was no longer capable to properly fixup
> the MAC addresses. The problem arises from the fact that the hardcoded
> information about an interface (wriop_get_enet_if()) was no longer
> matching any actual device.
> 
> For example, the function tried to search for "DPMAC1@xgmii1" by name
> using eth_get_dev_by_name() when only "DPMAC1@10gbase-r" was available.
> 
> This function removes the need to rely on the hardcoded information by
> iterating through all the UCLASS_ETH devices which are DPAA2 and request
> a fixup for each of them.
> 
> Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
> Reviewed-by: Ramon Fried <rfried.dev@gmail.com>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/drivers/net/fsl-mc/mc.c b/drivers/net/fsl-mc/mc.c
index 4f84403d956c..78a40f285aa2 100644
--- a/drivers/net/fsl-mc/mc.c
+++ b/drivers/net/fsl-mc/mc.c
@@ -29,6 +29,7 @@ 
 #include <fsl-mc/fsl_dpsparser.h>
 #include <fsl-mc/fsl_qbman_portal.h>
 #include <fsl-mc/ldpaa_wriop.h>
+#include <net/ldpaa_eth.h>
 
 #define MC_RAM_BASE_ADDR_ALIGNMENT  (512UL * 1024 * 1024)
 #define MC_RAM_BASE_ADDR_ALIGNMENT_MASK	(~(MC_RAM_BASE_ADDR_ALIGNMENT - 1))
@@ -383,37 +384,31 @@  static int mc_fixup_dpc_mac_addr(void *blob, int dpmac_id,
 
 static int mc_fixup_mac_addrs(void *blob, enum mc_fixup_type type)
 {
-	int i, err = 0, ret = 0;
-#define ETH_NAME_LEN 20
 	struct udevice *eth_dev;
-	char ethname[ETH_NAME_LEN];
-
-	for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
-		/* port not enabled */
-		if (wriop_is_enabled_dpmac(i) != 1)
-			continue;
-
-		snprintf(ethname, ETH_NAME_LEN, "DPMAC%d@%s", i,
-			 phy_interface_strings[wriop_get_enet_if(i)]);
-
-		eth_dev = eth_get_dev_by_name(ethname);
-		if (eth_dev == NULL)
+	int err = 0, ret = 0;
+	struct uclass *uc;
+	uint32_t dpmac_id;
+
+	uclass_get(UCLASS_ETH, &uc);
+	uclass_foreach_dev(eth_dev, uc) {
+		if (!eth_dev->driver || !eth_dev->driver->name ||
+		    strcmp(eth_dev->driver->name, LDPAA_ETH_DRIVER_NAME))
 			continue;
 
+		dpmac_id = ldpaa_eth_get_dpmac_id(eth_dev);
 		switch (type) {
 		case MC_FIXUP_DPL:
-			err = mc_fixup_dpl_mac_addr(blob, i, eth_dev);
+			err = mc_fixup_dpl_mac_addr(blob, dpmac_id, eth_dev);
 			break;
 		case MC_FIXUP_DPC:
-			err = mc_fixup_dpc_mac_addr(blob, i, eth_dev);
+			err = mc_fixup_dpc_mac_addr(blob, dpmac_id, eth_dev);
 			break;
 		default:
 			break;
 		}
 
 		if (err)
-			printf("fsl-mc: ERROR fixing mac address for %s\n",
-			       ethname);
+			printf("fsl-mc: ERROR fixing mac address for %s\n", eth_dev->name);
 		ret |= err;
 	}