diff options
author | yongari <yongari@FreeBSD.org> | 2008-06-08 02:52:26 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2008-06-08 02:52:26 +0000 |
commit | 5644710476d005c14983ed14846197690b2d1f99 (patch) | |
tree | 53f0003950d87b9b50d6fb87d1f3ab581a620069 /sys | |
parent | 6e1dea357c52a62ee0e05cab11b1d520cb7aa4bc (diff) | |
download | FreeBSD-src-5644710476d005c14983ed14846197690b2d1f99.zip FreeBSD-src-5644710476d005c14983ed14846197690b2d1f99.tar.gz |
Ethernet hardware address stored in DC_AL_PAR0/DC_AL_PAR1 register
is in little endian form. Likewise setting DC_AL_PAR0/DC_AL_PAR1
register expect the address to be in little endian form. For big
endian architectures the address should be swapped to get correct
one.
Change setting/getting ethernet hardware address to big endian
architecture frendly.
Reported by: Robert Murillo ( billypilgrim782001 at yahoo dot com )
Tested by: Robert Murillo ( billypilgrim782001 at yahoo dot com )
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/dc/if_dc.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c index 4663559..6d70804 100644 --- a/sys/dev/dc/if_dc.c +++ b/sys/dev/dc/if_dc.c @@ -1141,7 +1141,7 @@ dc_setfilt_21143(struct dc_softc *sc) static void dc_setfilt_admtek(struct dc_softc *sc) { - uint32_t eaddr[(ETHER_ADDR_LEN+3)/4]; + uint8_t eaddr[ETHER_ADDR_LEN]; struct ifnet *ifp; struct ifmultiaddr *ifma; int h = 0; @@ -1151,8 +1151,9 @@ dc_setfilt_admtek(struct dc_softc *sc) /* Init our MAC address. */ bcopy(IF_LLADDR(sc->dc_ifp), eaddr, ETHER_ADDR_LEN); - CSR_WRITE_4(sc, DC_AL_PAR0, eaddr[0]); - CSR_WRITE_4(sc, DC_AL_PAR1, eaddr[1]); + CSR_WRITE_4(sc, DC_AL_PAR0, eaddr[3] << 24 | eaddr[2] << 16 | + eaddr[1] << 8 | eaddr[0]); + CSR_WRITE_4(sc, DC_AL_PAR1, eaddr[5] << 8 | eaddr[4]); /* If we want promiscuous mode, set the allframes bit. */ if (ifp->if_flags & IFF_PROMISC) @@ -1812,7 +1813,7 @@ dc_attach(device_t dev) u_int32_t command; struct dc_softc *sc; struct ifnet *ifp; - u_int32_t revision; + u_int32_t reg, revision; int error = 0, rid, mac_offset; int i; u_int8_t *mac; @@ -2052,8 +2053,15 @@ dc_attach(device_t dev) break; case DC_TYPE_AL981: case DC_TYPE_AN985: - eaddr[0] = CSR_READ_4(sc, DC_AL_PAR0); - eaddr[1] = CSR_READ_4(sc, DC_AL_PAR1); + reg = CSR_READ_4(sc, DC_AL_PAR0); + mac = (uint8_t *)&eaddr[0]; + mac[0] = (reg >> 0) & 0xff; + mac[1] = (reg >> 8) & 0xff; + mac[2] = (reg >> 16) & 0xff; + mac[3] = (reg >> 24) & 0xff; + reg = CSR_READ_4(sc, DC_AL_PAR1); + mac[4] = (reg >> 0) & 0xff; + mac[5] = (reg >> 8) & 0xff; break; case DC_TYPE_CONEXANT: bcopy(sc->dc_srom + DC_CONEXANT_EE_NODEADDR, &eaddr, |