diff options
Diffstat (limited to 'drivers/net/fm')
| -rw-r--r-- | drivers/net/fm/init.c | 53 | 
1 files changed, 52 insertions, 1 deletions
| diff --git a/drivers/net/fm/init.c b/drivers/net/fm/init.c index cd787f4ee..74c72d3ff 100644 --- a/drivers/net/fm/init.c +++ b/drivers/net/fm/init.c @@ -276,13 +276,64 @@ static void ft_fixup_port(void *blob, struct fm_eth_info *info, char *prop)  		"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)  {  	int i;  #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_xgec(blob, &fm_info[i]); +	}  #else  	for (i = 0; i < ARRAY_SIZE(fm_info); i++) {  		if (fm_info[i].type == FM_ETH_1G_E) |