diff options
author | raj <raj@FreeBSD.org> | 2008-03-12 16:32:08 +0000 |
---|---|---|
committer | raj <raj@FreeBSD.org> | 2008-03-12 16:32:08 +0000 |
commit | 8e81cff1fea20b1d0d53988daff826286c50640c (patch) | |
tree | bee3dfa13f4fb01fa9d5de6630099aac13d777f4 /sys/powerpc/mpc85xx | |
parent | 054d727b12bc095749d9c28ef9354f5aab773391 (diff) | |
download | FreeBSD-src-8e81cff1fea20b1d0d53988daff826286c50640c.zip FreeBSD-src-8e81cff1fea20b1d0d53988daff826286c50640c.tar.gz |
Obtain TSEC h/w address from the parent bus (OCP) and not rely blindly on what
might be currently programmed into the registers.
Underlying firmware (U-Boot) would typically program MAC address into the
first unit only, and others are left uninitialized. It is now possible to
retrieve and program MAC address for all units properly, provided they were
passed on in the bootinfo metadata.
Reviewed by: imp, marcel
Approved by: cognet (mentor)
Diffstat (limited to 'sys/powerpc/mpc85xx')
-rw-r--r-- | sys/powerpc/mpc85xx/ocpbus.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/powerpc/mpc85xx/ocpbus.c b/sys/powerpc/mpc85xx/ocpbus.c index a62e78b..cf86eed 100644 --- a/sys/powerpc/mpc85xx/ocpbus.c +++ b/sys/powerpc/mpc85xx/ocpbus.c @@ -555,6 +555,8 @@ static int ocpbus_read_ivar(device_t dev, device_t child, int index, uintptr_t *result) { struct ocp_devinfo *dinfo; + struct bi_eth_addr *eth; + int unit; if (device_get_parent(child) != dev) return (EINVAL); @@ -571,6 +573,13 @@ ocpbus_read_ivar(device_t dev, device_t child, int index, uintptr_t *result) case OCPBUS_IVAR_HWUNIT: *result = dinfo->ocp_unit; return (0); + case OCPBUS_IVAR_MACADDR: + unit = device_get_unit(child); + if (unit > bootinfo->bi_eth_addr_no - 1) + return (EINVAL); + eth = bootinfo_eth() + unit; + *result = (uintptr_t)eth; + return (0); } return (EINVAL); |