]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - net/eth.c
Add support CONFIG_UEC_ETH3 in MPC83xx
[karo-tx-uboot.git] / net / eth.c
index 0fc22115dc20772349dde0e9bd9fd7fa849314d4..d2fced8bbbcc053ba328ea4e1a0e59c724651c18 100644 (file)
--- a/net/eth.c
+++ b/net/eth.c
@@ -26,7 +26,7 @@
 #include <net.h>
 #include <miiphy.h>
 
-#if (CONFIG_COMMANDS & CFG_CMD_NET) && defined(CONFIG_NET_MULTI)
+#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI)
 
 #ifdef CFG_GT_6426x
 extern int gt6426x_eth_initialize(bd_t *bis);
@@ -40,6 +40,7 @@ extern int eth_3com_initialize(bd_t*);
 extern int fec_initialize(bd_t*);
 extern int inca_switch_initialize(bd_t*);
 extern int mpc5xxx_fec_initialize(bd_t*);
+extern int mpc512x_fec_initialize(bd_t*);
 extern int mpc8220_fec_initialize(bd_t*);
 extern int mv6436x_eth_initialize(bd_t *);
 extern int mv6446x_eth_initialize(bd_t *);
@@ -53,11 +54,24 @@ extern int rtl8169_initialize(bd_t*);
 extern int scc_initialize(bd_t*);
 extern int skge_initialize(bd_t*);
 extern int tsi108_eth_initialize(bd_t*);
+extern int uli526x_initialize(bd_t *);
 extern int tsec_initialize(bd_t*, int, char *);
 extern int npe_initialize(bd_t *);
 extern int uec_initialize(int);
 extern int bfin_EMAC_initialize(bd_t *);
 extern int atstk1000_eth_initialize(bd_t *);
+extern int mcffec_initialize(bd_t*);
+
+#ifdef CONFIG_API
+extern void (*push_packet)(volatile void *, int);
+
+static struct {
+       uchar data[PKTSIZE];
+       int length;
+} eth_rcv_bufs[PKTBUFSRX];
+
+static unsigned int eth_rcv_current = 0, eth_rcv_last = 0;
+#endif
 
 static struct eth_device *eth_devices, *eth_current;
 
@@ -135,14 +149,16 @@ int eth_register(struct eth_device* dev)
 
 int eth_initialize(bd_t *bis)
 {
-       char enetvar[32], env_enetaddr[6];
+       char enetvar[32];
+       unsigned char env_enetaddr[6];
        int i, eth_number = 0;
        char *tmp, *end;
 
        eth_devices = NULL;
        eth_current = NULL;
 
-#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
+       show_boot_progress (64);
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
        miiphy_init();
 #endif
 
@@ -167,34 +183,29 @@ int eth_initialize(bd_t *bis)
 #if defined(CONFIG_MPC5xxx_FEC)
        mpc5xxx_fec_initialize(bis);
 #endif
+#if defined(CONFIG_MPC512x_FEC)
+       mpc512x_fec_initialize (bis);
+#endif
 #if defined(CONFIG_MPC8220_FEC)
        mpc8220_fec_initialize(bis);
 #endif
 #if defined(CONFIG_SK98)
        skge_initialize(bis);
 #endif
-#if defined(CONFIG_MPC85XX_TSEC1)
-       tsec_initialize(bis, 0, CONFIG_MPC85XX_TSEC1_NAME);
-#elif defined(CONFIG_MPC83XX_TSEC1)
-       tsec_initialize(bis, 0, CONFIG_MPC83XX_TSEC1_NAME);
+#if defined(CONFIG_TSEC1)
+       tsec_initialize(bis, 0, CONFIG_TSEC1_NAME);
 #endif
-#if defined(CONFIG_MPC85XX_TSEC2)
-       tsec_initialize(bis, 1, CONFIG_MPC85XX_TSEC2_NAME);
-#elif defined(CONFIG_MPC83XX_TSEC2)
-       tsec_initialize(bis, 1, CONFIG_MPC83XX_TSEC2_NAME);
+#if defined(CONFIG_TSEC2)
+       tsec_initialize(bis, 1, CONFIG_TSEC2_NAME);
 #endif
 #if defined(CONFIG_MPC85XX_FEC)
        tsec_initialize(bis, 2, CONFIG_MPC85XX_FEC_NAME);
 #else
-#    if defined(CONFIG_MPC85XX_TSEC3)
-       tsec_initialize(bis, 2, CONFIG_MPC85XX_TSEC3_NAME);
-#    elif defined(CONFIG_MPC83XX_TSEC3)
-       tsec_initialize(bis, 2, CONFIG_MPC83XX_TSEC3_NAME);
+#    if defined(CONFIG_TSEC3)
+       tsec_initialize(bis, 2, CONFIG_TSEC3_NAME);
 #    endif
-#    if defined(CONFIG_MPC85XX_TSEC4)
-       tsec_initialize(bis, 3, CONFIG_MPC85XX_TSEC4_NAME);
-#    elif defined(CONFIG_MPC83XX_TSEC4)
-       tsec_initialize(bis, 3, CONFIG_MPC83XX_TSEC4_NAME);
+#    if defined(CONFIG_TSEC4)
+       tsec_initialize(bis, 3, CONFIG_TSEC4_NAME);
 #    endif
 #endif
 #if defined(CONFIG_UEC_ETH1)
@@ -203,20 +214,8 @@ int eth_initialize(bd_t *bis)
 #if defined(CONFIG_UEC_ETH2)
        uec_initialize(1);
 #endif
-#if defined(CONFIG_MPC86XX_TSEC1)
-       tsec_initialize(bis, 0, CONFIG_MPC86XX_TSEC1_NAME);
-#endif
-
-#if defined(CONFIG_MPC86XX_TSEC2)
-       tsec_initialize(bis, 1, CONFIG_MPC86XX_TSEC2_NAME);
-#endif
-
-#if defined(CONFIG_MPC86XX_TSEC3)
-       tsec_initialize(bis, 2, CONFIG_MPC86XX_TSEC3_NAME);
-#endif
-
-#if defined(CONFIG_MPC86XX_TSEC4)
-       tsec_initialize(bis, 3, CONFIG_MPC86XX_TSEC4_NAME);
+#if defined(CONFIG_UEC_ETH3)
+       uec_initialize(2);
 #endif
 
 #if defined(FEC_ENET) || defined(CONFIG_ETHER_ON_FCC)
@@ -255,6 +254,9 @@ int eth_initialize(bd_t *bis)
 #if defined(CONFIG_TSI108_ETH)
        tsi108_eth_initialize(bis);
 #endif
+#if defined(CONFIG_ULI526X)
+       uli526x_initialize(bis);
+#endif
 #if defined(CONFIG_RTL8139)
        rtl8139_initialize(bis);
 #endif
@@ -267,13 +269,18 @@ int eth_initialize(bd_t *bis)
 #if defined(CONFIG_ATSTK1000)
        atstk1000_eth_initialize(bis);
 #endif
+#if defined(CONFIG_MCFFEC)
+       mcffec_initialize(bis);
+#endif
 
        if (!eth_devices) {
                puts ("No ethernet found.\n");
+               show_boot_progress (-64);
        } else {
                struct eth_device *dev = eth_devices;
                char *ethprime = getenv ("ethprime");
 
+               show_boot_progress (65);
                do {
                        if (eth_number)
                                puts (", ");
@@ -369,29 +376,74 @@ void eth_set_enetaddr(int num, char *addr) {
 
        memcpy(dev->enetaddr, enetaddr, 6);
 }
+#ifdef CONFIG_MCAST_TFTP
+/* Multicast.
+ * mcast_addr: multicast ipaddr from which multicast Mac is made
+ * join: 1=join, 0=leave.
+ */
+int eth_mcast_join( IPaddr_t mcast_ip, u8 join)
+{
+ u8 mcast_mac[6];
+       if (!eth_current || !eth_current->mcast)
+               return -1;
+       mcast_mac[5] = htonl(mcast_ip) & 0xff;
+       mcast_mac[4] = (htonl(mcast_ip)>>8) & 0xff;
+       mcast_mac[3] = (htonl(mcast_ip)>>16) & 0x7f;
+       mcast_mac[2] = 0x5e;
+       mcast_mac[1] = 0x0;
+       mcast_mac[0] = 0x1;
+       return eth_current->mcast(eth_current, mcast_mac, join);
+}
+
+/* the 'way' for ethernet-CRC-32. Spliced in from Linux lib/crc32.c
+ * and this is the ethernet-crc method needed for TSEC -- and perhaps
+ * some other adapter -- hash tables
+ */
+#define CRCPOLY_LE 0xedb88320
+u32 ether_crc (size_t len, unsigned char const *p)
+{
+       int i;
+       u32 crc;
+       crc = ~0;
+       while (len--) {
+               crc ^= *p++;
+               for (i = 0; i < 8; i++)
+                       crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
+       }
+       /* an reverse the bits, cuz of way they arrive -- last-first */
+       crc = (crc >> 16) | (crc << 16);
+       crc = (crc >> 8 & 0x00ff00ff) | (crc << 8 & 0xff00ff00);
+       crc = (crc >> 4 & 0x0f0f0f0f) | (crc << 4 & 0xf0f0f0f0);
+       crc = (crc >> 2 & 0x33333333) | (crc << 2 & 0xcccccccc);
+       crc = (crc >> 1 & 0x55555555) | (crc << 1 & 0xaaaaaaaa);
+       return crc;
+}
+
+#endif
+
 
 int eth_init(bd_t *bis)
 {
        struct eth_device* old_current;
 
        if (!eth_current)
-               return 0;
+               return -1;
 
        old_current = eth_current;
        do {
                debug ("Trying %s\n", eth_current->name);
 
-               if (eth_current->init(eth_current, bis)) {
+               if (!eth_current->init(eth_current,bis)) {
                        eth_current->state = ETH_STATE_ACTIVE;
 
-                       return 1;
+                       return 0;
                }
                debug  ("FAIL\n");
 
                eth_try_another(0);
        } while (old_current != eth_current);
 
-       return 0;
+       return -1;
 }
 
 void eth_halt(void)
@@ -420,6 +472,53 @@ int eth_rx(void)
        return eth_current->recv(eth_current);
 }
 
+#ifdef CONFIG_API
+static void eth_save_packet(volatile void *packet, int length)
+{
+       volatile char *p = packet;
+       int i;
+
+       if ((eth_rcv_last+1) % PKTBUFSRX == eth_rcv_current)
+               return;
+
+       if (PKTSIZE < length)
+               return;
+
+       for (i = 0; i < length; i++)
+               eth_rcv_bufs[eth_rcv_last].data[i] = p[i];
+
+       eth_rcv_bufs[eth_rcv_last].length = length;
+       eth_rcv_last = (eth_rcv_last + 1) % PKTBUFSRX;
+}
+
+int eth_receive(volatile void *packet, int length)
+{
+       volatile char *p = packet;
+       void *pp = push_packet;
+       int i;
+
+       if (eth_rcv_current == eth_rcv_last) {
+               push_packet = eth_save_packet;
+               eth_rx();
+               push_packet = pp;
+
+               if (eth_rcv_current == eth_rcv_last)
+                       return -1;
+       }
+
+       if (length < eth_rcv_bufs[eth_rcv_current].length)
+               return -1;
+
+       length = eth_rcv_bufs[eth_rcv_current].length;
+
+       for (i = 0; i < length; i++)
+               p[i] = eth_rcv_bufs[eth_rcv_current].data[i];
+
+       eth_rcv_current = (eth_rcv_current + 1) % PKTBUFSRX;
+       return length;
+}
+#endif /* CONFIG_API */
+
 void eth_try_another(int first_restart)
 {
        static struct eth_device *first_failed = NULL;
@@ -474,16 +573,18 @@ char *eth_get_name (void)
 {
        return (eth_current ? eth_current->name : "unknown");
 }
-#elif (CONFIG_COMMANDS & CFG_CMD_NET) && !defined(CONFIG_NET_MULTI)
+#elif defined(CONFIG_CMD_NET) && !defined(CONFIG_NET_MULTI)
 
 extern int at91rm9200_miiphy_initialize(bd_t *bis);
 extern int emac4xx_miiphy_initialize(bd_t *bis);
 extern int mcf52x2_miiphy_initialize(bd_t *bis);
 extern int ns7520_miiphy_initialize(bd_t *bis);
+extern int dm644x_eth_miiphy_initialize(bd_t *bis);
+
 
 int eth_initialize(bd_t *bis)
 {
-#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
        miiphy_init();
 #endif
 
@@ -499,6 +600,9 @@ int eth_initialize(bd_t *bis)
 #endif
 #if defined(CONFIG_NETARM)
        ns7520_miiphy_initialize(bis);
+#endif
+#if defined(CONFIG_DRIVER_TI_EMAC)
+       dm644x_eth_miiphy_initialize(bis);
 #endif
        return 0;
 }