? nfe_diff.txt Index: if_nfe.c =================================================================== RCS file: /dcvs/src/sys/dev/netif/nfe/if_nfe.c,v retrieving revision 1.31 diff -u -p -r1.31 if_nfe.c --- if_nfe.c 5 Jul 2008 07:29:44 -0000 1.31 +++ if_nfe.c 7 Jul 2008 08:50:15 -0000 @@ -373,7 +373,8 @@ nfe_probe(device_t dev) case PCI_PRODUCT_NVIDIA_NFORCE_LAN: case PCI_PRODUCT_NVIDIA_NFORCE2_LAN: case PCI_PRODUCT_NVIDIA_NFORCE3_LAN1: - sc->sc_caps = NFE_NO_PWRCTL; + sc->sc_caps = NFE_NO_PWRCTL | + NFE_FIX_EADDR; break; case PCI_PRODUCT_NVIDIA_NFORCE3_LAN2: case PCI_PRODUCT_NVIDIA_NFORCE3_LAN3: @@ -381,10 +382,13 @@ nfe_probe(device_t dev) case PCI_PRODUCT_NVIDIA_NFORCE3_LAN5: sc->sc_caps = NFE_JUMBO_SUP | NFE_HW_CSUM | - NFE_NO_PWRCTL; + NFE_NO_PWRCTL | + NFE_FIX_EADDR; break; case PCI_PRODUCT_NVIDIA_MCP51_LAN1: case PCI_PRODUCT_NVIDIA_MCP51_LAN2: + sc->sc_caps = NFE_FIX_EADDR; + /* FALL THROUGH */ case PCI_PRODUCT_NVIDIA_MCP61_LAN1: case PCI_PRODUCT_NVIDIA_MCP61_LAN2: case PCI_PRODUCT_NVIDIA_MCP61_LAN3: @@ -397,7 +401,7 @@ nfe_probe(device_t dev) case PCI_PRODUCT_NVIDIA_MCP73_LAN2: case PCI_PRODUCT_NVIDIA_MCP73_LAN3: case PCI_PRODUCT_NVIDIA_MCP73_LAN4: - sc->sc_caps = NFE_40BIT_ADDR; + sc->sc_caps |= NFE_40BIT_ADDR; break; case PCI_PRODUCT_NVIDIA_CK804_LAN1: case PCI_PRODUCT_NVIDIA_CK804_LAN2: @@ -406,7 +410,8 @@ nfe_probe(device_t dev) sc->sc_caps = NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM | - NFE_NO_PWRCTL; + NFE_NO_PWRCTL | + NFE_FIX_EADDR; break; case PCI_PRODUCT_NVIDIA_MCP65_LAN1: case PCI_PRODUCT_NVIDIA_MCP65_LAN2: @@ -420,7 +425,8 @@ nfe_probe(device_t dev) sc->sc_caps = NFE_JUMBO_SUP | NFE_40BIT_ADDR | NFE_HW_CSUM | - NFE_HW_VLAN; + NFE_HW_VLAN | + NFE_FIX_EADDR; break; case PCI_PRODUCT_NVIDIA_MCP77_LAN1: case PCI_PRODUCT_NVIDIA_MCP77_LAN2: @@ -2114,17 +2120,27 @@ done: static void nfe_get_macaddr(struct nfe_softc *sc, uint8_t *addr) { - uint32_t tmp; + uint32_t lo, hi; + + lo = NFE_READ(sc, NFE_MACADDR_LO); + hi = NFE_READ(sc, NFE_MACADDR_HI); + if (sc->sc_caps & NFE_FIX_EADDR) { + addr[0] = (lo >> 8) & 0xff; + addr[1] = (lo & 0xff); + + addr[2] = (hi >> 24) & 0xff; + addr[3] = (hi >> 16) & 0xff; + addr[4] = (hi >> 8) & 0xff; + addr[5] = (hi & 0xff); + } else { + addr[0] = (hi & 0xff); + addr[1] = (hi >> 8) & 0xff; + addr[2] = (hi >> 16) & 0xff; + addr[3] = (hi >> 24) & 0xff; - tmp = NFE_READ(sc, NFE_MACADDR_LO); - addr[0] = (tmp >> 8) & 0xff; - addr[1] = (tmp & 0xff); - - tmp = NFE_READ(sc, NFE_MACADDR_HI); - addr[2] = (tmp >> 24) & 0xff; - addr[3] = (tmp >> 16) & 0xff; - addr[4] = (tmp >> 8) & 0xff; - addr[5] = (tmp & 0xff); + addr[4] = (lo & 0xff); + addr[5] = (lo >> 8) & 0xff; + } } static void Index: if_nfevar.h =================================================================== RCS file: /dcvs/src/sys/dev/netif/nfe/if_nfevar.h,v retrieving revision 1.9 diff -u -p -r1.9 if_nfevar.h --- if_nfevar.h 5 Jul 2008 07:29:44 -0000 1.9 +++ if_nfevar.h 7 Jul 2008 08:50:15 -0000 @@ -97,6 +97,7 @@ struct nfe_softc { #define NFE_40BIT_ADDR 0x02 #define NFE_HW_CSUM 0x04 #define NFE_HW_VLAN 0x08 +#define NFE_FIX_EADDR 0x10 #define NFE_NO_PWRCTL 0x20 uint32_t sc_flags;