]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - net/net.c
gpio: remove gpiolib.c and define remaining functions as static inline in asm/gpio.h
[karo-tx-uboot.git] / net / net.c
index 4f4b34b2ac2756a2ed31c59ff7181b089c7b4e0c..30ecfcc403cfe0b168987d05e39db6e821e864f8 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -6,6 +6,7 @@
  *     Copyright 2000 Roland Borde
  *     Copyright 2000 Paolo Scaffardi
  *     Copyright 2000-2002 Wolfgang Denk, wd@denx.de
+ *     SPDX-License-Identifier:        GPL-2.0
  */
 
 /*
@@ -82,6 +83,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <environment.h>
 #include <net.h>
 #if defined(CONFIG_STATUS_LED)
 #include <miiphy.h>
@@ -180,7 +182,7 @@ IPaddr_t    NetNtpServerIP;
 int            NetTimeOffset;
 #endif
 
-uchar PktBuf[(PKTBUFSRX+1) * PKTSIZE_ALIGN + PKTALIGN];
+static uchar PktBuf[(PKTBUFSRX+1) * PKTSIZE_ALIGN + PKTALIGN];
 
 /* Receive packet */
 uchar *NetRxPackets[PKTBUFSRX];
@@ -206,34 +208,50 @@ static int net_check_prereq(enum proto_t protocol);
 
 static int NetTryCount;
 
+int __maybe_unused net_busy_flag;
+
 /**********************************************************************/
 
+static int on_bootfile(const char *name, const char *value, enum env_op op,
+       int flags)
+{
+       switch (op) {
+       case env_op_create:
+       case env_op_overwrite:
+               copy_filename(BootFile, value, sizeof(BootFile));
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+U_BOOT_ENV_CALLBACK(bootfile, on_bootfile);
+
 /*
  * Check if autoload is enabled. If so, use either NFS or TFTP to download
  * the boot file.
  */
 void net_auto_load(void)
 {
+#if defined(CONFIG_CMD_NFS)
        const char *s = getenv("autoload");
 
-       if (s != NULL) {
-               if (*s == 'n') {
-                       /*
-                        * Just use BOOTP/RARP to configure system;
-                        * Do not use TFTP to load the bootfile.
-                        */
-                       net_set_state(NETLOOP_SUCCESS);
-                       return;
-               }
-#if defined(CONFIG_CMD_NFS)
-               if (strcmp(s, "NFS") == 0) {
-                       /*
-                        * Use NFS to load the bootfile.
-                        */
-                       NfsStart();
-                       return;
-               }
+       if (s != NULL && strcmp(s, "NFS") == 0) {
+               /*
+                * Use NFS to load the bootfile.
+                */
+               NfsStart();
+               return;
+       }
 #endif
+       if (getenv_yesno("autoload") == 0) {
+               /*
+                * Just use BOOTP/RARP to configure system;
+                * Do not use TFTP to load the bootfile.
+                */
+               net_set_state(NETLOOP_SUCCESS);
+               return;
        }
        TftpStart(TFTPGET);
 }
@@ -256,6 +274,8 @@ static void NetInitLoop(void)
 #endif
                env_changed_id = env_id;
        }
+       if (eth_get_dev())
+               memcpy(NetOurEther, eth_get_dev()->enetaddr, 6);
 
        return;
 }
@@ -310,19 +330,24 @@ int NetLoop(enum proto_t protocol)
        NetRestarted = 0;
        NetDevExists = 0;
        NetTryCount = 1;
+       debug_cond(DEBUG_INT_STATE, "--- NetLoop Entry\n");
 
        bootstage_mark_name(BOOTSTAGE_ID_ETH_START, "eth_start");
        net_init();
-       eth_halt();
-       eth_set_current();
-       if (eth_init(bd) < 0) {
+       if (eth_is_on_demand_init() || protocol != NETCONS) {
                eth_halt();
-               return -1;
-       }
+               eth_set_current();
+               if (eth_init(bd) < 0) {
+                       eth_halt();
+                       return -1;
+               }
+       } else
+               eth_init_state_only(bd);
 
 restart:
-       memcpy(NetOurEther, eth_get_dev()->enetaddr, 6);
-
+#ifdef CONFIG_USB_KEYBOARD
+       net_busy_flag = 0;
+#endif
        net_set_state(NETLOOP_CONTINUE);
 
        /*
@@ -330,6 +355,7 @@ restart:
         *      here on, this code is a state machine driven by received
         *      packets and timer events.
         */
+       debug_cond(DEBUG_INT_STATE, "--- NetLoop Init\n");
        NetInitLoop();
 
        switch (net_check_prereq(protocol)) {
@@ -360,14 +386,14 @@ restart:
 #endif
 #if defined(CONFIG_CMD_DHCP)
                case DHCP:
-                       BootpTry = 0;
+                       BootpReset();
                        NetOurIP = 0;
                        DhcpRequest();          /* Basically same as BOOTP */
                        break;
 #endif
 
                case BOOTP:
-                       BootpTry = 0;
+                       BootpReset();
                        NetOurIP = 0;
                        BootpRequest();
                        break;
@@ -394,7 +420,7 @@ restart:
                        CDPStart();
                        break;
 #endif
-#ifdef CONFIG_NETCONSOLE
+#if defined (CONFIG_NETCONSOLE) && !(CONFIG_SPL_BUILD)
                case NETCONS:
                        NcStart();
                        break;
@@ -413,6 +439,11 @@ restart:
                case LINKLOCAL:
                        link_local_start();
                        break;
+#endif
+#if defined(CONFIG_CMD_BOOTCE)
+               case BOOTME:
+                       BootmeStart();
+                       break;
 #endif
                default:
                        break;
@@ -434,6 +465,9 @@ restart:
                status_led_set(STATUS_LED_RED, STATUS_LED_ON);
 #endif /* CONFIG_SYS_FAULT_ECHO_LINK_DOWN, ... */
 #endif /* CONFIG_MII, ... */
+#ifdef CONFIG_USB_KEYBOARD
+       net_busy_flag = 1;
+#endif
 
        /*
         *      Main packet reception loop.  Loop receiving packets until
@@ -459,7 +493,13 @@ restart:
 
                        net_cleanup_loop();
                        eth_halt();
+                       /* Invalidate the last protocol */
+                       eth_set_last_protocol(BOOTP);
+
                        puts("\nAbort\n");
+                       /* include a debug print as well incase the debug
+                          messages are directed to stderr */
+                       debug_cond(DEBUG_INT_STATE, "--- NetLoop Abort!\n");
                        goto done;
                }
 
@@ -469,7 +509,7 @@ restart:
                 *      Check for a timeout, and run the timeout handler
                 *      if we have one.
                 */
-               if (timeHandler && ((get_timer(0) - timeStart) > timeDelta)) {
+               if (timeHandler && ((get_timer(timeStart)) > timeDelta)) {
                        thand_f *x;
 
 #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
@@ -487,6 +527,7 @@ restart:
                        }
 #endif /* CONFIG_SYS_FAULT_ECHO_LINK_DOWN, ... */
 #endif /* CONFIG_MII, ... */
+                       debug_cond(DEBUG_INT_STATE, "--- NetLoop timeout\n");
                        x = timeHandler;
                        timeHandler = (thand_f *)0;
                        (*x)();
@@ -502,22 +543,29 @@ restart:
                case NETLOOP_SUCCESS:
                        net_cleanup_loop();
                        if (NetBootFileXferSize > 0) {
-                               char buf[20];
                                printf("Bytes transferred = %ld (%lx hex)\n",
                                        NetBootFileXferSize,
                                        NetBootFileXferSize);
-                               sprintf(buf, "%lX", NetBootFileXferSize);
-                               setenv("filesize", buf);
-
-                               sprintf(buf, "%lX", (unsigned long)load_addr);
-                               setenv("fileaddr", buf);
+                               setenv_hex("filesize", NetBootFileXferSize);
+                               setenv_hex("fileaddr", load_addr);
                        }
-                       eth_halt();
+                       if (protocol != NETCONS) {
+                               eth_halt();
+                       } else {
+                               eth_halt_state_only();
+                       }
+
+                       eth_set_last_protocol(protocol);
+
                        ret = NetBootFileXferSize;
+                       debug_cond(DEBUG_INT_STATE, "--- NetLoop Success!\n");
                        goto done;
 
                case NETLOOP_FAIL:
                        net_cleanup_loop();
+                       /* Invalidate the last protocol */
+                       eth_set_last_protocol(BOOTP);
+                       debug_cond(DEBUG_INT_STATE, "--- NetLoop Fail!\n");
                        goto done;
 
                case NETLOOP_CONTINUE:
@@ -526,6 +574,9 @@ restart:
        }
 
 done:
+#ifdef CONFIG_USB_KEYBOARD
+       net_busy_flag = 0;
+#endif
 #ifdef CONFIG_CMD_TFTPPUT
        /* Clear out the handlers */
        net_set_udp_handler(NULL);
@@ -605,6 +656,7 @@ rxhand_f *net_get_udp_handler(void)
 
 void net_set_udp_handler(rxhand_f *f)
 {
+       debug_cond(DEBUG_INT_STATE, "--- NetLoop UDP handler set (%p)\n", f);
        if (f == NULL)
                udp_packet_handler = dummy_handler;
        else
@@ -618,6 +670,7 @@ rxhand_f *net_get_arp_handler(void)
 
 void net_set_arp_handler(rxhand_f *f)
 {
+       debug_cond(DEBUG_INT_STATE, "--- NetLoop ARP handler set (%p)\n", f);
        if (f == NULL)
                arp_packet_handler = dummy_handler;
        else
@@ -635,11 +688,15 @@ void
 NetSetTimeout(ulong iv, thand_f *f)
 {
        if (iv == 0) {
+               debug_cond(DEBUG_INT_STATE,
+                       "--- NetLoop timeout handler cancelled\n");
                timeHandler = (thand_f *)0;
        } else {
+               debug_cond(DEBUG_INT_STATE,
+                       "--- NetLoop timeout handler set (%p)\n", f);
                timeHandler = f;
                timeStart = get_timer(0);
-               timeDelta = iv;
+               timeDelta = iv * CONFIG_SYS_HZ / 1000;
        }
 }
 
@@ -672,7 +729,7 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport,
 
        /* if MAC address was not discovered yet, do an ARP request */
        if (memcmp(ether, NetEtherNullAddr, 6) == 0) {
-               debug("sending ARP for %pI4\n", &dest);
+               debug_cond(DEBUG_DEV_PKT, "sending ARP for %pI4\n", &dest);
 
                /* save the ip and eth addr for the packet to send after arp */
                NetArpWaitPacketIP = dest;
@@ -687,7 +744,8 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport,
                ArpRequest();
                return 1;       /* waiting */
        } else {
-               debug("sending UDP to %pI4/%pM\n", &dest, ether);
+               debug_cond(DEBUG_DEV_PKT, "sending UDP to %pI4/%pM\n",
+                       &dest, ether);
                NetSendPacket(NetTxPacket, pkt_hdr_size + payload_len);
                return 0;       /* transmitted */
        }
@@ -910,7 +968,7 @@ NetReceive(uchar *inpkt, int len)
 #endif
        ushort cti = 0, vlanid = VLAN_NONE, myvlanid, mynvlanid;
 
-       debug("packet received\n");
+       debug_cond(DEBUG_NET_PKT, "packet received\n");
 
        NetRxPacket = inpkt;
        NetRxPacketLen = len;
@@ -941,8 +999,6 @@ NetReceive(uchar *inpkt, int len)
 
        eth_proto = ntohs(et->et_protlen);
 
-       debug("packet received\n");
-
        if (eth_proto < 1514) {
                struct e802_hdr *et802 = (struct e802_hdr *)et;
                /*
@@ -962,7 +1018,7 @@ NetReceive(uchar *inpkt, int len)
                struct vlan_ethernet_hdr *vet =
                        (struct vlan_ethernet_hdr *)et;
 
-               debug("VLAN packet received\n");
+               debug_cond(DEBUG_NET_PKT, "VLAN packet received\n");
 
                /* too small packet? */
                if (len < VLAN_ETHER_HDR_SIZE)
@@ -984,7 +1040,7 @@ NetReceive(uchar *inpkt, int len)
                len -= VLAN_ETHER_HDR_SIZE;
        }
 
-       debug("Receive from protocol 0x%x\n", eth_proto);
+       debug_cond(DEBUG_NET_PKT, "Receive from protocol 0x%x\n", eth_proto);
 
 #if defined(CONFIG_CMD_CDP)
        if (iscdp) {
@@ -1013,7 +1069,7 @@ NetReceive(uchar *inpkt, int len)
                break;
 #endif
        case PROT_IP:
-               debug("Got IP\n");
+               debug_cond(DEBUG_NET_PKT, "Got IP\n");
                /* Before we start poking the header, make sure it is there */
                if (len < IP_UDP_HDR_SIZE) {
                        debug("len bad %d < %lu\n", len,
@@ -1022,11 +1078,12 @@ NetReceive(uchar *inpkt, int len)
                }
                /* Check the packet length */
                if (len < ntohs(ip->ip_len)) {
-                       printf("len bad %d < %d\n", len, ntohs(ip->ip_len));
+                       debug("len bad %d < %d\n", len, ntohs(ip->ip_len));
                        return;
                }
                len = ntohs(ip->ip_len);
-               debug("len=%d, v=%02x\n", len, ip->ip_hl_v & 0xff);
+               debug_cond(DEBUG_NET_PKT, "len=%d, v=%02x\n",
+                       len, ip->ip_hl_v & 0xff);
 
                /* Can't deal with anything except IPv4 */
                if ((ip->ip_hl_v & 0xf0) != 0x40)
@@ -1036,7 +1093,7 @@ NetReceive(uchar *inpkt, int len)
                        return;
                /* Check the Checksum of the header */
                if (!NetCksumOk((uchar *)ip, IP_HDR_SIZE / 2)) {
-                       puts("checksum bad\n");
+                       debug("checksum bad\n");
                        return;
                }
                /* If it is not for us, ignore it */
@@ -1085,6 +1142,10 @@ NetReceive(uchar *inpkt, int len)
                        return;
                }
 
+               debug_cond(DEBUG_DEV_PKT,
+                       "received UDP (to=%pI4, from=%pI4, len=%d)\n",
+                       &dst_ip, &src_ip, len);
+
 #ifdef CONFIG_UDP_CHECKSUM
                if (ip->udp_xsum != 0) {
                        ulong   xsum;
@@ -1128,8 +1189,9 @@ NetReceive(uchar *inpkt, int len)
 #endif
 
 
-#ifdef CONFIG_NETCONSOLE
+#if defined (CONFIG_NETCONSOLE) && !(CONFIG_SPL_BUILD)
                nc_input_packet((uchar *)ip + IP_UDP_HDR_SIZE,
+                                       src_ip,
                                        ntohs(ip->udp_dst),
                                        ntohs(ip->udp_src),
                                        ntohs(ip->udp_len) - UDP_HDR_SIZE);
@@ -1152,7 +1214,6 @@ NetReceive(uchar *inpkt, int len)
 static int net_check_prereq(enum proto_t protocol)
 {
        switch (protocol) {
-               /* Fall through */
 #if defined(CONFIG_CMD_PING)
        case PING:
                if (NetPingIP == 0) {
@@ -1192,6 +1253,7 @@ common:
 #endif
                /* Fall through */
 
+       case BOOTME:
        case NETCONS:
        case TFTPSRV:
                if (NetOurIP == 0) {