Date: Sat, 9 Jun 2007 16:03:35 +0200 (CEST) From: =?iso-8859-1?Q?Bj=F6rn_K=F6nig?= <bkoenig@alpha-tierchen.de> To: ticso@cicely.de Cc: arm@freebsd.org Subject: Re: if_ate handles the bytes of the MAC address in a "wrong" order Message-ID: <51831.2001:6f8:101e:0:20e:cff:fe6d:6adb.1181397815.squirrel@webmail.alpha-tierchen.de> In-Reply-To: <20070609123941.GJ16463@cicely12.cicely.de> References: <53385.2001:6f8:101e:0:20e:cff:fe6d:6adb.1181314300.squirrel@webmail.alpha-tierchen.de> <20070608.120902.-399284744.imp@bsdimp.com> <20070608225912.GB16463@cicely12.cicely.de> <63859.2001:6f8:101e:0:20e:cff:fe6d:6adb.1181372440.squirrel@webmail.alpha-tierchen.de> <20070609092708.GE16463@cicely12.cicely.de> <58807.2001:6f8:101e:0:20e:cff:fe6d:6adb.1181386624.squirrel@webmail.alpha-tierchen.de> <20070609112758.GH16463@cicely12.cicely.de> <59832.2001:6f8:101e:0:20e:cff:fe6d:6adb.1181391583.squirrel@webmail.alpha-tierchen.de> <20070609123941.GJ16463@cicely12.cicely.de>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
Bernd wrote:
> They do all agree - it is the same as the SAM7X.
Right, my mistake.
> However - I prefer the explizit byte code as we do now, instead of
> using bcopy.
I agree. It is safer and looks more familar.
Björn
[-- Attachment #2 --]
--- src/sys/boot/arm/at91/libat91/emac_init.c.orig Wed Dec 20 19:26:37 2006
+++ src/sys/boot/arm/at91/libat91/emac_init.c Sat Jun 9 15:55:23 2007
@@ -79,8 +79,8 @@
pPMC->PMC_PCER = ((unsigned) 1 << AT91C_ID_EMAC);
memcpy(localMACAddr, mac, 6);
- localMAClow = (mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5];
- localMAChigh = (mac[0] << 8) | mac[1];
+ localMAClow = (mac[3] << 24) | (mac[2] << 16) | (mac[1] << 8) | mac[0];
+ localMAChigh = (mac[5] << 8) | mac[4];
localMACSet = 1;
AT91C_BASE_PMC->PMC_PCER = 1u << AT91C_ID_EMAC;
[-- Attachment #3 --]
--- src/sys/arm/at91/if_ate.c.orig Sat Jun 9 15:50:50 2007
+++ src/sys/arm/at91/if_ate.c Sat Jun 9 15:52:51 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,32 @@
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)
+ {
+ eaddr[0] = low & 0xff;
+ eaddr[1] = (low >> 8) & 0xff;
+ eaddr[2] = (low >> 16) & 0xff;
+ eaddr[3] = (low >> 24) & 0xff;
+ eaddr[4] = high & 0xff;
+ eaddr[5] = (high >> 8) & 0xff;
+ return (0);
+ }
+ }
+
+ return (ENXIO);
}
static void
help
