net/fman: add ft_fixup_xgec to support 3rd and 4th 10GEC

As mEMAC1 and mEMAC2 are dual-role MACs, which are used as 1G or 10G MAC.
So we update dynamically 'cell-index' to '2' and '3' for 10GEC3 and 10GEC4.
Also change 'fsl,fman-port-1g-rx' to 'fsl,fman-port-10g-rx', ditto for Tx.

Signed-off-by: Shengzhou Liu <Shengzhou.Liu@freescale.com>
Acked-by: York Sun <yorksun@freescale.com>
This commit is contained in:
Shengzhou Liu 2013-12-02 10:23:11 +08:00 committed by York Sun
parent c1015c67f4
commit 732dfe090d

View file

@ -276,13 +276,64 @@ static void ft_fixup_port(void *blob, struct fm_eth_info *info, char *prop)
"status", "disabled", strlen("disabled") + 1, 1); "status", "disabled", strlen("disabled") + 1, 1);
} }
#ifdef CONFIG_SYS_FMAN_V3
static int ft_fixup_xgec(void *blob, struct fm_eth_info *info)
{
int off, i, ci;
#define FM1_10GEC3_RX_PORT_ADDR (CONFIG_SYS_CCSRBAR_PHYS + 0x488000)
#define FM1_10GEC3_TX_PORT_ADDR (CONFIG_SYS_CCSRBAR_PHYS + 0x4a8000)
#define FM1_10GEC3_MAC_ADDR (CONFIG_SYS_CCSRBAR_PHYS + 0x4e0000)
if ((info->port == FM1_10GEC3) || (info->port == FM1_10GEC4)) {
ci = (info->port == FM1_10GEC3) ? 2 : 3;
i = (info->port == FM1_10GEC3) ? 0 : 1;
off = fdt_node_offset_by_compat_reg(blob, "fsl,fman-port-1g-rx",
FM1_10GEC3_RX_PORT_ADDR +
i * 0x1000);
if (off > 0) {
fdt_setprop(blob, off, "cell-index", &ci, sizeof(int));
fdt_setprop(blob, off, "compatible",
"fsl,fman-port-10g-rx", 20);
} else {
goto err;
}
off = fdt_node_offset_by_compat_reg(blob, "fsl,fman-port-1g-tx",
FM1_10GEC3_TX_PORT_ADDR +
i * 0x1000);
if (off > 0) {
fdt_setprop(blob, off, "cell-index", &ci, sizeof(int));
fdt_setprop(blob, off, "compatible",
"fsl,fman-port-10g-tx", 20);
} else {
goto err;
}
off = fdt_node_offset_by_compat_reg(blob, "fsl,fman-memac",
FM1_10GEC3_MAC_ADDR +
i * 0x2000);
if (off > 0)
fdt_setprop(blob, off, "cell-index", &ci, sizeof(int));
else
goto err;
}
return 0;
err:
printf("WARNING: Fail to find the node\n");
return -1;
}
#endif
void fdt_fixup_fman_ethernet(void *blob) void fdt_fixup_fman_ethernet(void *blob)
{ {
int i; int i;
#ifdef CONFIG_SYS_FMAN_V3 #ifdef CONFIG_SYS_FMAN_V3
for (i = 0; i < ARRAY_SIZE(fm_info); i++) for (i = 0; i < ARRAY_SIZE(fm_info); i++) {
ft_fixup_port(blob, &fm_info[i], "fsl,fman-memac"); ft_fixup_port(blob, &fm_info[i], "fsl,fman-memac");
ft_fixup_xgec(blob, &fm_info[i]);
}
#else #else
for (i = 0; i < ARRAY_SIZE(fm_info); i++) { for (i = 0; i < ARRAY_SIZE(fm_info); i++) {
if (fm_info[i].type == FM_ETH_1G_E) if (fm_info[i].type == FM_ETH_1G_E)