sh: Move cpu/$CPU to arch/sh/cpu/$CPU
[oweals/u-boot.git] / cpu / arm920t / at91rm9200 / ether.c
index b00b948ee86111adf35648ead0b4aaaa34af95f2..91eab95eed1e1844384ed34a9438747546d8868a 100644 (file)
@@ -24,6 +24,7 @@
 #include <at91rm9200_net.h>
 #include <net.h>
 #include <miiphy.h>
+#include <asm/mach-types.h>
 
 /* ----- Ethernet Buffer definitions ----- */
 
@@ -53,10 +54,11 @@ typedef struct {
 #if defined(CONFIG_CMD_NET)
 
 /* alignment as per Errata #11 (64 bytes) is insufficient! */
-rbf_t rbfdt[RBF_FRAMEMAX] __attribute((aligned(512)));
+rbf_t rbfdt[RBF_FRAMEMAX] __attribute__((aligned(512)));
 rbf_t *rbfp;
 
-unsigned char rbf_framebuf[RBF_FRAMEMAX][RBF_FRAMELEN] __attribute((aligned(4)));
+unsigned char rbf_framebuf[RBF_FRAMEMAX][RBF_FRAMELEN]
+       __attribute__((aligned(4)));
 
 /* structure to interface the PHY */
 AT91S_PhyOps PhyOps;
@@ -183,7 +185,7 @@ int eth_init (bd_t * bd)
 
        p_mac->EMAC_CFG |= AT91C_EMAC_CSR;      /* Clear statistics */
 
-       /* Init Ehternet buffers */
+       /* Init Ethernet buffers */
        for (i = 0; i < RBF_FRAMEMAX; i++) {
                rbfdt[i].addr = (unsigned long)rbf_framebuf[i];
                rbfdt[i].size = 0;
@@ -192,9 +194,22 @@ int eth_init (bd_t * bd)
        rbfp = &rbfdt[0];
 
        eth_getenv_enetaddr("ethaddr", enetaddr);
-       p_mac->EMAC_SA2L = (enetaddr[3] << 24) | (enetaddr[2] << 16)
-                        | (enetaddr[1] <<  8) | (enetaddr[0]);
-       p_mac->EMAC_SA2H = (enetaddr[5] <<  8) | (enetaddr[4]);
+
+       /* The CSB337 originally used a version of the MicroMonitor bootloader
+        * which saved Ethernet addresses in the "wrong" order.  Operating
+        * systems (like Linux) know this, and apply a workaround.  Replicate
+        * that MicroMonitor behavior so we avoid needing to make such OS code
+        * care about which bootloader was used.
+        */
+       if (machine_is_csb337()) {
+               p_mac->EMAC_SA2H = (enetaddr[0] <<  8) | (enetaddr[1]);
+               p_mac->EMAC_SA2L = (enetaddr[2] << 24) | (enetaddr[3] << 16)
+                                | (enetaddr[4] <<  8) | (enetaddr[5]);
+       } else {
+               p_mac->EMAC_SA2L = (enetaddr[3] << 24) | (enetaddr[2] << 16)
+                                | (enetaddr[1] <<  8) | (enetaddr[0]);
+               p_mac->EMAC_SA2H = (enetaddr[5] <<  8) | (enetaddr[4]);
+       }
 
        p_mac->EMAC_RBQP = (long) (&rbfdt[0]);
        p_mac->EMAC_RSR &= ~(AT91C_EMAC_RSR_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA);