]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - cpu/arm920t/at91rm9200/ether.c
imported Freescale specific U-Boot additions for i.MX28,... release L2.6.31_10.08.01
[karo-tx-uboot.git] / cpu / arm920t / at91rm9200 / ether.c
index 67008d0b9112ece297408d2f5000b164a45e4ec1..91eab95eed1e1844384ed34a9438747546d8868a 100755 (executable)
@@ -24,6 +24,7 @@
 #include <at91rm9200_net.h>
 #include <net.h>
 #include <miiphy.h>
+#include <asm/mach-types.h>
 
 /* ----- Ethernet Buffer definitions ----- */
 
@@ -50,13 +51,14 @@ typedef struct {
 
 #ifdef CONFIG_DRIVER_ETHER
 
-#if (CONFIG_COMMANDS & CFG_CMD_NET)
+#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;
@@ -105,7 +107,7 @@ void at91rm9200_EmacDisableMDIO (AT91PS_EMAC p_mac)
  * Arguments:
  *     dev - pointer to struct net_device
  *     RegisterAddress - unsigned char
- *     pInput - pointer to value read from register
+ *     pInput - pointer to value read from register
  * Return value:
  *     TRUE - if data read successfully
  */
@@ -134,7 +136,7 @@ UCHAR at91rm9200_EmacReadPhy (AT91PS_EMAC p_mac,
  * Arguments:
  *     dev - pointer to struct net_device
  *     RegisterAddress - unsigned char
- *     pOutput - pointer to value to be written in the register
+ *     pOutput - pointer to value to be written in the register
  * Return value:
  *     TRUE - if data read successfully
  */
@@ -155,6 +157,7 @@ int eth_init (bd_t * bd)
 {
        int ret;
        int i;
+       uchar enetaddr[6];
 
        p_mac = AT91C_BASE_EMAC;
 
@@ -182,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;
@@ -190,9 +193,23 @@ int eth_init (bd_t * bd)
        rbfdt[RBF_FRAMEMAX - 1].addr |= RBF_WRAP;
        rbfp = &rbfdt[0];
 
-       p_mac->EMAC_SA2L = (bd->bi_enetaddr[3] << 24) | (bd->bi_enetaddr[2] << 16)
-                        | (bd->bi_enetaddr[1] <<  8) | (bd->bi_enetaddr[0]);
-       p_mac->EMAC_SA2H = (bd->bi_enetaddr[5] <<  8) | (bd->bi_enetaddr[4]);
+       eth_getenv_enetaddr("ethaddr", enetaddr);
+
+       /* 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);
@@ -265,7 +282,7 @@ void eth_halt (void)
 {
 };
 
-#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
 int  at91rm9200_miiphy_read(char *devname, unsigned char addr,
                unsigned char reg, unsigned short * value)
 {
@@ -284,16 +301,16 @@ int  at91rm9200_miiphy_write(char *devname, unsigned char addr,
        return 0;
 }
 
-#endif /* defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII) */
+#endif
 
 int at91rm9200_miiphy_initialize(bd_t *bis)
 {
-#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
        miiphy_register("at91rm9200phy", at91rm9200_miiphy_read, at91rm9200_miiphy_write);
 #endif
        return 0;
 }
 
-#endif /* CONFIG_COMMANDS & CFG_CMD_NET */
+#endif
 
 #endif /* CONFIG_DRIVER_ETHER */