Merge branch 'master' of git://www.denx.de/git/u-boot-mpc83xx
[oweals/u-boot.git] / drivers / net / mcffec.c
index 68a0ee640d2a2b384fb4de17bb40156e2ddf3a72..71d19608edeb8c93af200240126ee8197a546343 100644 (file)
 #include <common.h>
 #include <malloc.h>
 
+#ifdef CONFIG_MCFFEC
+
 #include <asm/fec.h>
 #include <asm/immap.h>
 
 #include <command.h>
-#include <config.h>
 #include <net.h>
 #include <miiphy.h>
 
-#ifdef CONFIG_MCFFEC
 #undef ET_DEBUG
 #undef MII_DEBUG
 
@@ -166,6 +166,13 @@ int fec_send(struct eth_device *dev, volatile void *packet, int length)
        /* Activate transmit Buffer Descriptor polling */
        fecp->tdar = 0x01000000;        /* Descriptor polling active    */
 
+       /* FEC fix for MCF5275, FEC unable to initial transmit data packet.
+        * A nop will ensure the descriptor polling active completed.
+        */
+#ifdef CONFIG_M5275
+       __asm__ ("nop");
+#endif
+
 #ifdef CFG_UNIFY_CACHE
        icache_invalid();
 #endif
@@ -430,20 +437,33 @@ int fec_init(struct eth_device *dev, bd_t * bd)
 
        /* Set station address   */
        if ((u32) fecp == CFG_FEC0_IOBASE) {
+#ifdef CFG_FEC1_IOBASE
+               volatile fec_t *fecp1 = (fec_t *) (CFG_FEC1_IOBASE);
+               ea = &bd->bi_enet1addr[0];
+               fecp1->palr =
+                   (ea[0] << 24) | (ea[1] << 16) | (ea[2] << 8) | (ea[3]);
+               fecp1->paur = (ea[4] << 24) | (ea[5] << 16);
+#endif
                ea = &bd->bi_enetaddr[0];
+               fecp->palr =
+                   (ea[0] << 24) | (ea[1] << 16) | (ea[2] << 8) | (ea[3]);
+               fecp->paur = (ea[4] << 24) | (ea[5] << 16);
        } else {
+#ifdef CFG_FEC0_IOBASE
+               volatile fec_t *fecp0 = (fec_t *) (CFG_FEC0_IOBASE);
+               ea = &bd->bi_enetaddr[0];
+               fecp0->palr =
+                   (ea[0] << 24) | (ea[1] << 16) | (ea[2] << 8) | (ea[3]);
+               fecp0->paur = (ea[4] << 24) | (ea[5] << 16);
+#endif
 #ifdef CFG_FEC1_IOBASE
                ea = &bd->bi_enet1addr[0];
+               fecp->palr =
+                   (ea[0] << 24) | (ea[1] << 16) | (ea[2] << 8) | (ea[3]);
+               fecp->paur = (ea[4] << 24) | (ea[5] << 16);
 #endif
        }
 
-       fecp->palr = (ea[0] << 24) | (ea[1] << 16) | (ea[2] << 8) | (ea[3]);
-       fecp->paur = (ea[4] << 24) | (ea[5] << 16);
-#ifdef ET_DEBUG
-       printf("Eth Addrs: %02x:%02x:%02x:%02x:%02x:%02x\n",
-              ea[0], ea[1], ea[2], ea[3], ea[4], ea[5]);
-#endif
-
        /* Clear unicast address hash table */
        fecp->iaur = 0;
        fecp->ialr = 0;