if_ate handles the bytes of the MAC address in a "wrong" order
Bernd Walter
ticso at cicely12.cicely.de
Sat Jun 9 12:40:00 UTC 2007
On Sat, Jun 09, 2007 at 02:19:43PM +0200, Björn König wrote:
> This is finally my suggestion for a new ate_get_mac function that
> corresponds with the ate_set_mac function and with Linux's code, but not
> with the SAM7X example.
They do all agree - it is the same as the SAM7X.
However - I prefer the explizit byte code as we do now, instead of
using bcopy.
Of course we need to fix the order in our loader ocde as well.
> --- src/sys/arm/at91/if_ate.c.orig Fri Feb 23 13:18:27 2007
> +++ src/sys/arm/at91/if_ate.c Sat Jun 9 13:59:16 2007
> @@ -170,7 +170,7 @@
> struct sysctl_ctx_list *sctx;
> struct sysctl_oid *soid;
> int err;
> - u_char eaddr[6];
> + u_char eaddr[ETHER_ADDR_LEN];
>
> sc->dev = dev;
> err = ate_activate(dev);
> @@ -587,24 +587,28 @@
> static int
> ate_get_mac(struct ate_softc *sc, u_char *eaddr)
> {
> + bus_size_t sa_low_reg[] = { ETH_SA1L, ETH_SA2L, ETH_SA3L, ETH_SA4L };
> + bus_size_t sa_high_reg[] = { ETH_SA1H, ETH_SA2H, ETH_SA3H, ETH_SA4H };
> uint32_t low, high;
> + int i;
>
> /*
> * The boot loader setup the MAC with an address, if one is set in
> - * the loader. The TSC loader will also set the MAC address in a
> - * similar way. Grab the MAC address from the SA1[HL] registers.
> + * the loader. Grab the MAC address from the SA[1-4][HL] registers.
> */
> - low = RD4(sc, ETH_SA1L);
> - high = RD4(sc, ETH_SA1H);
> - if ((low | (high & 0xffff)) == 0)
> - return (ENXIO);
> - eaddr[0] = (high >> 8) & 0xff;
> - eaddr[1] = high & 0xff;
> - eaddr[2] = (low >> 24) & 0xff;
> - eaddr[3] = (low >> 16) & 0xff;
> - eaddr[4] = (low >> 8) & 0xff;
> - eaddr[5] = low & 0xff;
> - return (0);
> + for (i = 0; i < 4; i++)
> + {
> + low = RD4(sc, sa_low_reg[i]);
> + high = RD4(sc, sa_high_reg[i]);
> + if ((low | (high & 0xffff)) != 0)
> + {
> + bcopy(&low, eaddr, 4);
> + bcopy(&high, eaddr+4, 2);
> + return (0);
> + }
> + }
> +
> + return (ENXIO);
> }
>
> static void
--
B.Walter http://www.bwct.de http://www.fizon.de
bernd at bwct.de info at bwct.de support at fizon.de
More information about the freebsd-arm
mailing list