diff options
author | ticso <ticso@FreeBSD.org> | 2006-02-20 10:29:40 +0000 |
---|---|---|
committer | ticso <ticso@FreeBSD.org> | 2006-02-20 10:29:40 +0000 |
commit | 3064ac10ac601e8c8e24a2bb7f41564f0039180f (patch) | |
tree | 171eb248d55fe26c1a0d6bcd4b0f5eece0be4f81 | |
parent | 9ddbaff9a6671851d8b9eed9625f6d54112b32f1 (diff) | |
download | FreeBSD-src-3064ac10ac601e8c8e24a2bb7f41564f0039180f.zip FreeBSD-src-3064ac10ac601e8c8e24a2bb7f41564f0039180f.tar.gz |
Copy MAC address to fix alignment problems.
Tested on alpha (AS600) with RTL8169S
Suggested by: jhb
-rw-r--r-- | sys/dev/re/if_re.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c index cb96023..8b86714 100644 --- a/sys/dev/re/if_re.c +++ b/sys/dev/re/if_re.c @@ -2093,6 +2093,10 @@ re_init_locked(sc) struct ifnet *ifp = sc->rl_ifp; struct mii_data *mii; u_int32_t rxcfg = 0; + union { + uint32_t align_dummy; + u_char eaddr[ETHER_ADDR_LEN]; + } eaddr; RL_LOCK_ASSERT(sc); @@ -2119,11 +2123,13 @@ re_init_locked(sc) * documentation doesn't mention it, we need to enter "Config * register write enable" mode to modify the ID registers. */ + /* Copy MAC address on stack to align. */ + bcopy(IF_LLADDR(ifp), eaddr.eaddr, ETHER_ADDR_LEN); CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_WRITECFG); CSR_WRITE_STREAM_4(sc, RL_IDR0, - *(u_int32_t *)(&IF_LLADDR(sc->rl_ifp)[0])); + *(u_int32_t *)(&eaddr.eaddr[0])); CSR_WRITE_STREAM_4(sc, RL_IDR4, - *(u_int32_t *)(&IF_LLADDR(sc->rl_ifp)[4])); + *(u_int32_t *)(&eaddr.eaddr[4])); CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF); /* |