summaryrefslogtreecommitdiffstats
path: root/sys/dev/re
diff options
context:
space:
mode:
authorticso <ticso@FreeBSD.org>2006-02-20 10:29:40 +0000
committerticso <ticso@FreeBSD.org>2006-02-20 10:29:40 +0000
commit3064ac10ac601e8c8e24a2bb7f41564f0039180f (patch)
tree171eb248d55fe26c1a0d6bcd4b0f5eece0be4f81 /sys/dev/re
parent9ddbaff9a6671851d8b9eed9625f6d54112b32f1 (diff)
downloadFreeBSD-src-3064ac10ac601e8c8e24a2bb7f41564f0039180f.zip
FreeBSD-src-3064ac10ac601e8c8e24a2bb7f41564f0039180f.tar.gz
Copy MAC address to fix alignment problems.
Tested on alpha (AS600) with RTL8169S Suggested by: jhb
Diffstat (limited to 'sys/dev/re')
-rw-r--r--sys/dev/re/if_re.c10
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);
/*
OpenPOWER on IntegriCloud