We have two external ports and different MAC addresses on each port. So, assign different MAC to the LAN2. The address on LAN1 is the system default address. Signed-off-by: Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx> --- arch/arm/boards/skov-imx6/board.c | 47 ++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/arch/arm/boards/skov-imx6/board.c b/arch/arm/boards/skov-imx6/board.c index 3c51b76735..ab8b229a69 100644 --- a/arch/arm/boards/skov-imx6/board.c +++ b/arch/arm/boards/skov-imx6/board.c @@ -17,6 +17,12 @@ #include "version.h" +struct skov_imx6_priv { + struct device_d *dev; +}; + +static struct skov_imx6_priv *skov_priv; + static int eth_of_fixup_node(struct device_node *root, const char *node_path, const u8 *ethaddr) { @@ -542,6 +548,34 @@ static void skov_init_board(const struct board_description *variant) } } +/* */ +static int skov_set_switch_lan2_mac(struct skov_imx6_priv *priv) +{ + const char *state = "/state/ethaddr/eth2"; + struct device_node *lan2_np; + u8 ethaddr[ETH_ALEN]; + int ret; + + ret = get_mac_address_from_env_variable("state.ethaddr.eth2", ethaddr); + if (ret || !is_valid_ether_addr(ethaddr)) { + ret = get_default_mac_address_from_state_node(state, ethaddr); + if (ret || !is_valid_ether_addr(ethaddr)) { + dev_err(priv->dev, "can't get MAC for LAN2\n"); + return -ENODEV; + } + } + + lan2_np = of_find_node_by_path("/mdio/switch@0/ports/ports@1"); + if (!lan2_np) { + dev_err(priv->dev, "LAN2 node not found\n"); + return -ENODEV; + } + + of_eth_register_ethaddr(lan2_np, ethaddr); + + return 0; +} + static int skov_switch_test(void) { struct device_d *sw_dev; @@ -561,8 +595,11 @@ static int skov_switch_test(void) goto no_switch; } - if (dev_is_probed(sw_dev)) + if (dev_is_probed(sw_dev)) { + skov_set_switch_lan2_mac(skov_priv); + /* even if we fail, continue to boot as good as possible */ return 0; + } no_switch: skov_have_switch = false; @@ -584,6 +621,7 @@ late_initcall(skov_switch_test); static int skov_imx6_probe(struct device_d *dev) { + struct skov_imx6_priv *priv; unsigned v = 0; const struct board_description *variant; @@ -603,6 +641,13 @@ static int skov_imx6_probe(struct device_d *dev) skov_board_no = v; + priv = xzalloc(sizeof(*priv)); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + skov_priv = priv; + globalvar_add_simple_int("board.no", &skov_board_no, "%u"); globalvar_add_simple("board.variant", variant->variant); globalvar_add_simple("board.revision",variant->revision); -- 2.30.2