MIPS: Octeon: device_tree_init: use separate pass to fill mac addresses
Use separate pass to fill MAC addresses. This is needed because we want to do this also for the appended DTB. Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> Acked-by: David Daney <david.daney@cavium.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/12588/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
1a1590ab1a
commit
43349b9e4b
|
@ -560,7 +560,7 @@ static void __init octeon_fdt_rm_ethernet(int node)
|
||||||
fdt_nop_node(initial_boot_params, node);
|
fdt_nop_node(initial_boot_params, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init octeon_fdt_pip_port(int iface, int i, int p, int max, u64 *pmac)
|
static void __init octeon_fdt_pip_port(int iface, int i, int p, int max)
|
||||||
{
|
{
|
||||||
char name_buffer[20];
|
char name_buffer[20];
|
||||||
int eth;
|
int eth;
|
||||||
|
@ -583,10 +583,9 @@ static void __init octeon_fdt_pip_port(int iface, int i, int p, int max, u64 *pm
|
||||||
|
|
||||||
phy_addr = cvmx_helper_board_get_mii_address(ipd_port);
|
phy_addr = cvmx_helper_board_get_mii_address(ipd_port);
|
||||||
octeon_fdt_set_phy(eth, phy_addr);
|
octeon_fdt_set_phy(eth, phy_addr);
|
||||||
octeon_fdt_set_mac_addr(eth, pmac);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init octeon_fdt_pip_iface(int pip, int idx, u64 *pmac)
|
static void __init octeon_fdt_pip_iface(int pip, int idx)
|
||||||
{
|
{
|
||||||
char name_buffer[20];
|
char name_buffer[20];
|
||||||
int iface;
|
int iface;
|
||||||
|
@ -602,7 +601,73 @@ static void __init octeon_fdt_pip_iface(int pip, int idx, u64 *pmac)
|
||||||
count = cvmx_helper_ports_on_interface(idx);
|
count = cvmx_helper_ports_on_interface(idx);
|
||||||
|
|
||||||
for (p = 0; p < 16; p++)
|
for (p = 0; p < 16; p++)
|
||||||
octeon_fdt_pip_port(iface, idx, p, count - 1, pmac);
|
octeon_fdt_pip_port(iface, idx, p, count - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init octeon_fill_mac_addresses(void)
|
||||||
|
{
|
||||||
|
const char *alias_prop;
|
||||||
|
char name_buffer[20];
|
||||||
|
u64 mac_addr_base;
|
||||||
|
int aliases;
|
||||||
|
int pip;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
aliases = fdt_path_offset(initial_boot_params, "/aliases");
|
||||||
|
if (aliases < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mac_addr_base =
|
||||||
|
((octeon_bootinfo->mac_addr_base[0] & 0xffull)) << 40 |
|
||||||
|
((octeon_bootinfo->mac_addr_base[1] & 0xffull)) << 32 |
|
||||||
|
((octeon_bootinfo->mac_addr_base[2] & 0xffull)) << 24 |
|
||||||
|
((octeon_bootinfo->mac_addr_base[3] & 0xffull)) << 16 |
|
||||||
|
((octeon_bootinfo->mac_addr_base[4] & 0xffull)) << 8 |
|
||||||
|
(octeon_bootinfo->mac_addr_base[5] & 0xffull);
|
||||||
|
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
int mgmt;
|
||||||
|
|
||||||
|
snprintf(name_buffer, sizeof(name_buffer), "mix%d", i);
|
||||||
|
alias_prop = fdt_getprop(initial_boot_params, aliases,
|
||||||
|
name_buffer, NULL);
|
||||||
|
if (!alias_prop)
|
||||||
|
continue;
|
||||||
|
mgmt = fdt_path_offset(initial_boot_params, alias_prop);
|
||||||
|
if (mgmt < 0)
|
||||||
|
continue;
|
||||||
|
octeon_fdt_set_mac_addr(mgmt, &mac_addr_base);
|
||||||
|
}
|
||||||
|
|
||||||
|
alias_prop = fdt_getprop(initial_boot_params, aliases, "pip", NULL);
|
||||||
|
if (!alias_prop)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pip = fdt_path_offset(initial_boot_params, alias_prop);
|
||||||
|
if (pip < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i <= 4; i++) {
|
||||||
|
int iface;
|
||||||
|
int p;
|
||||||
|
|
||||||
|
snprintf(name_buffer, sizeof(name_buffer), "interface@%d", i);
|
||||||
|
iface = fdt_subnode_offset(initial_boot_params, pip,
|
||||||
|
name_buffer);
|
||||||
|
if (iface < 0)
|
||||||
|
continue;
|
||||||
|
for (p = 0; p < 16; p++) {
|
||||||
|
int eth;
|
||||||
|
|
||||||
|
snprintf(name_buffer, sizeof(name_buffer),
|
||||||
|
"ethernet@%x", p);
|
||||||
|
eth = fdt_subnode_offset(initial_boot_params, iface,
|
||||||
|
name_buffer);
|
||||||
|
if (eth < 0)
|
||||||
|
continue;
|
||||||
|
octeon_fdt_set_mac_addr(eth, &mac_addr_base);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init octeon_prune_device_tree(void)
|
int __init octeon_prune_device_tree(void)
|
||||||
|
@ -612,7 +677,6 @@ int __init octeon_prune_device_tree(void)
|
||||||
const char *alias_prop;
|
const char *alias_prop;
|
||||||
char name_buffer[20];
|
char name_buffer[20];
|
||||||
int aliases;
|
int aliases;
|
||||||
u64 mac_addr_base;
|
|
||||||
|
|
||||||
if (fdt_check_header(initial_boot_params))
|
if (fdt_check_header(initial_boot_params))
|
||||||
panic("Corrupt Device Tree.");
|
panic("Corrupt Device Tree.");
|
||||||
|
@ -623,15 +687,6 @@ int __init octeon_prune_device_tree(void)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
mac_addr_base =
|
|
||||||
((octeon_bootinfo->mac_addr_base[0] & 0xffull)) << 40 |
|
|
||||||
((octeon_bootinfo->mac_addr_base[1] & 0xffull)) << 32 |
|
|
||||||
((octeon_bootinfo->mac_addr_base[2] & 0xffull)) << 24 |
|
|
||||||
((octeon_bootinfo->mac_addr_base[3] & 0xffull)) << 16 |
|
|
||||||
((octeon_bootinfo->mac_addr_base[4] & 0xffull)) << 8 |
|
|
||||||
(octeon_bootinfo->mac_addr_base[5] & 0xffull);
|
|
||||||
|
|
||||||
if (OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))
|
if (OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))
|
||||||
max_port = 2;
|
max_port = 2;
|
||||||
else if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN68XX))
|
else if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN68XX))
|
||||||
|
@ -660,7 +715,6 @@ int __init octeon_prune_device_tree(void)
|
||||||
} else {
|
} else {
|
||||||
int phy_addr = cvmx_helper_board_get_mii_address(CVMX_HELPER_BOARD_MGMT_IPD_PORT + i);
|
int phy_addr = cvmx_helper_board_get_mii_address(CVMX_HELPER_BOARD_MGMT_IPD_PORT + i);
|
||||||
octeon_fdt_set_phy(mgmt, phy_addr);
|
octeon_fdt_set_phy(mgmt, phy_addr);
|
||||||
octeon_fdt_set_mac_addr(mgmt, &mac_addr_base);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -670,7 +724,7 @@ int __init octeon_prune_device_tree(void)
|
||||||
int pip = fdt_path_offset(initial_boot_params, pip_path);
|
int pip = fdt_path_offset(initial_boot_params, pip_path);
|
||||||
if (pip >= 0)
|
if (pip >= 0)
|
||||||
for (i = 0; i <= 4; i++)
|
for (i = 0; i <= 4; i++)
|
||||||
octeon_fdt_pip_iface(pip, i, &mac_addr_base);
|
octeon_fdt_pip_iface(pip, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* I2C */
|
/* I2C */
|
||||||
|
|
|
@ -1108,6 +1108,7 @@ void __init prom_free_prom_memory(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init octeon_fill_mac_addresses(void);
|
||||||
int octeon_prune_device_tree(void);
|
int octeon_prune_device_tree(void);
|
||||||
|
|
||||||
extern const char __appended_dtb;
|
extern const char __appended_dtb;
|
||||||
|
@ -1143,6 +1144,7 @@ void __init device_tree_init(void)
|
||||||
|
|
||||||
if (do_prune) {
|
if (do_prune) {
|
||||||
octeon_prune_device_tree();
|
octeon_prune_device_tree();
|
||||||
|
octeon_fill_mac_addresses();
|
||||||
pr_info("Using internal Device Tree.\n");
|
pr_info("Using internal Device Tree.\n");
|
||||||
}
|
}
|
||||||
unflatten_and_copy_device_tree();
|
unflatten_and_copy_device_tree();
|
||||||
|
|
Loading…
Reference in New Issue