]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - net/net.c
NAND: rearrange ONFI revision checking, add ONFI 2.3
[people/ms/u-boot.git] / net / net.c
index cab4b2dd885cde6b952a6ba8737e2f1913ca073f..a6096324126ada55e2f30afe023d376f6720ff16 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -80,7 +80,9 @@
 #include <net.h>
 #include "bootp.h"
 #include "tftp.h"
+#ifdef CONFIG_CMD_RARP
 #include "rarp.h"
+#endif
 #include "nfs.h"
 #ifdef CONFIG_STATUS_LED
 #include <status_led.h>
@@ -96,8 +98,6 @@
 #include "dns.h"
 #endif
 
-#if defined(CONFIG_CMD_NET)
-
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifndef        CONFIG_ARP_TIMEOUT
@@ -197,6 +197,8 @@ volatile uchar *NetTxPacket = 0;    /* THE transmit packet                  */
 
 static int net_check_prereq (proto_t protocol);
 
+static int NetTryCount;
+
 /**********************************************************************/
 
 IPaddr_t       NetArpWaitPacketIP;
@@ -320,6 +322,7 @@ NetLoop(proto_t protocol)
        NetArpWaitReplyIP = 0;
        NetArpWaitTxPacket = NULL;
        NetTxPacket = NULL;
+       NetTryCount = 1;
 
        if (!NetTxPacket) {
                int     i;
@@ -400,11 +403,13 @@ restart:
                        BootpRequest ();
                        break;
 
+#if defined(CONFIG_CMD_RARP)
                case RARP:
                        RarpTry = 0;
                        NetOurIP = 0;
                        RarpRequest ();
                        break;
+#endif
 #if defined(CONFIG_CMD_PING)
                case PING:
                        PingStart();
@@ -558,17 +563,30 @@ startAgainHandler(uchar * pkt, unsigned dest, unsigned src, unsigned len)
 void NetStartAgain (void)
 {
        char *nretry;
-       int noretry = 0, once = 0;
+       int retry_forever = 0;
+       unsigned long retrycnt = 0;
+
+       nretry = getenv("netretry");
+       if (nretry) {
+               if (!strcmp(nretry, "yes"))
+                       retry_forever = 1;
+               else if (!strcmp(nretry, "no"))
+                       retrycnt = 0;
+               else if (!strcmp(nretry, "once"))
+                       retrycnt = 1;
+               else
+                       retrycnt = simple_strtoul(nretry, NULL, 0);
+       } else
+               retry_forever = 1;
 
-       if ((nretry = getenv ("netretry")) != NULL) {
-               noretry = (strcmp (nretry, "no") == 0);
-               once = (strcmp (nretry, "once") == 0);
-       }
-       if (noretry) {
-               eth_halt ();
+       if ((!retry_forever) && (NetTryCount >= retrycnt)) {
+               eth_halt();
                NetState = NETLOOP_FAIL;
                return;
        }
+
+       NetTryCount++;
+
 #ifndef CONFIG_NET_MULTI
        NetSetTimeout (10000UL, startAgainTimeout);
        NetSetHandler (startAgainHandler);
@@ -580,7 +598,7 @@ void NetStartAgain (void)
        eth_init (gd->bd);
        if (NetRestartWrap) {
                NetRestartWrap = 0;
-               if (NetDevExists && !once) {
+               if (NetDevExists) {
                        NetSetTimeout (10000UL, startAgainTimeout);
                        NetSetHandler (startAgainHandler);
                } else {
@@ -1187,7 +1205,8 @@ static IP_t *__NetDefragment(IP_t *ip, int *lenp)
                h = payload + h->next_hole;
        }
 
-       if (offset8 + (len / 8) <= h - payload) {
+       /* last fragment may be 1..7 bytes, the "+7" forces acceptance */
+       if (offset8 + ((len + 7) / 8) <= h - payload) {
                /* no overlap with holes (dup fragment?) */
                return NULL;
        }
@@ -1477,6 +1496,7 @@ NetReceive(volatile uchar * inpkt, int len)
                }
                break;
 
+#ifdef CONFIG_CMD_RARP
        case PROT_RARP:
                debug("Got RARP\n");
                arp = (ARP_t *)ip;
@@ -1500,7 +1520,7 @@ NetReceive(volatile uchar * inpkt, int len)
                        (*packetHandler)(0,0,0,0);
                }
                break;
-
+#endif
        case PROT_IP:
                debug("Got IP\n");
                /* Before we start poking the header, make sure it is there */
@@ -1714,10 +1734,12 @@ static int net_check_prereq (proto_t protocol)
                }
                /* Fall through */
 
-       case DHCP:
+#ifdef CONFIG_CMD_RARP
        case RARP:
+#endif
        case BOOTP:
        case CDP:
+       case DHCP:
                if (memcmp (NetOurEther, "\0\0\0\0\0\0", 6) == 0) {
 #ifdef CONFIG_NET_MULTI
                        extern int eth_get_dev_index (void);
@@ -1843,7 +1865,7 @@ NetSetIP(volatile uchar * xip, IPaddr_t dest, int dport, int sport, int len)
        ip->ip_sum   = ~NetCksum((uchar *)ip, IP_HDR_SIZE_NO_UDP / 2);
 }
 
-void copy_filename (char *dst, char *src, int size)
+void copy_filename (char *dst, const char *src, int size)
 {
        if (*src && (*src == '"')) {
                ++src;
@@ -1856,15 +1878,15 @@ void copy_filename (char *dst, char *src, int size)
        *dst = '\0';
 }
 
-#endif
-
 #if defined(CONFIG_CMD_NFS) || defined(CONFIG_CMD_SNTP) || defined(CONFIG_CMD_DNS)
 /*
- * make port a little random, but use something trivial to compute
+ * make port a little random (1024-17407)
+ * This keeps the math somewhat trivial to compute, and seems to work with
+ * all supported protocols/clients/servers
  */
 unsigned int random_port(void)
 {
-       return 1024 + (get_timer(0) % 0x8000);;
+       return 1024 + (get_timer(0) % 0x4000);
 }
 #endif
 
@@ -1878,27 +1900,6 @@ void ip_to_string (IPaddr_t x, char *s)
        );
 }
 
-IPaddr_t string_to_ip(char *s)
-{
-       IPaddr_t addr;
-       char *e;
-       int i;
-
-       if (s == NULL)
-               return(0);
-
-       for (addr=0, i=0; i<4; ++i) {
-               ulong val = s ? simple_strtoul(s, &e, 10) : 0;
-               addr <<= 8;
-               addr |= (val & 0xFF);
-               if (s) {
-                       s = (*e) ? e+1 : e;
-               }
-       }
-
-       return (htonl(addr));
-}
-
 void VLAN_to_string(ushort x, char *s)
 {
        x = ntohs(x);
@@ -1912,7 +1913,7 @@ void VLAN_to_string(ushort x, char *s)
                sprintf(s, "%d", x & VLAN_IDMASK);
 }
 
-ushort string_to_VLAN(char *s)
+ushort string_to_VLAN(const char *s)
 {
        ushort id;
 
@@ -1927,11 +1928,6 @@ ushort string_to_VLAN(char *s)
        return htons(id);
 }
 
-IPaddr_t getenv_IPaddr (char *var)
-{
-       return (string_to_ip(getenv(var)));
-}
-
 ushort getenv_VLAN(char *var)
 {
        return (string_to_VLAN(getenv(var)));