]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - net/tftp.c
dm: eth: Add support for aliases
[karo-tx-uboot.git] / net / tftp.c
index b2e08b4bfb3d3daba64328c24e84ecbe9afc6970..51c67be952222200df6a0ab04ef8a08089641d27 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <mapmem.h>
 #include <net.h>
 #include "tftp.h"
 #include "bootp.h"
@@ -40,6 +41,7 @@
 
 static ulong TftpTimeoutMSecs = TIMEOUT;
 static int TftpTimeoutCountMax = TIMEOUT_COUNT;
+static ulong time_start;   /* Record time we started tftp */
 
 /*
  * These globals govern the timeout behavior when attempting a connection to a
@@ -156,7 +158,7 @@ mcast_cleanup(void)
 #endif /* CONFIG_MCAST_TFTP */
 
 static inline void
-store_block(unsigned block, uchar *src, unsigned len)
+store_block(int block, uchar *src, unsigned len)
 {
        ulong offset = block * TftpBlkSize + TftpBlockWrapOffset;
        ulong newsize = offset + len;
@@ -183,7 +185,10 @@ store_block(unsigned block, uchar *src, unsigned len)
        } else
 #endif /* CONFIG_SYS_DIRECT_FLASH_TFTP */
        {
-               (void)memcpy((void *)(load_addr + offset), src, len);
+               void *ptr = map_sysmem(load_addr + offset, len);
+
+               memcpy(ptr, src, len);
+               unmap_sysmem(ptr);
        }
 #ifdef CONFIG_MCAST_TFTP
        if (Multicast)
@@ -280,7 +285,7 @@ static void update_block_number(void)
         * number of 0 this means that there was a wrap
         * around of the (16 bit) counter.
         */
-       if (TftpBlock == 0) {
+       if (TftpBlock == 0 && TftpLastBlock != 0) {
                TftpBlockWrap++;
                TftpBlockWrapOffset += TftpBlkSize * TFTP_SEQUENCE_SIZE;
                TftpTimeoutCount = 0; /* we've done well, reset thhe timeout */
@@ -298,7 +303,15 @@ static void tftp_complete(void)
                putc('#');
                TftpNumchars++;
        }
-#endif
+       puts("  ");
+       print_size(TftpTsize, "");
+#endif
+       time_start = get_timer(time_start);
+       if (time_start > 0) {
+               puts("\n\t ");  /* Line up with "Loading: " */
+               print_size(NetBootFileXferSize /
+                       time_start * 1000, "/s");
+       }
        puts("\ndone\n");
        net_set_state(NETLOOP_SUCCESS);
 }
@@ -439,8 +452,8 @@ static void
 TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
            unsigned len)
 {
-       ushort proto;
-       ushort *s;
+       __be16 proto;
+       __be16 *s;
        int i;
 
        if (dest != TftpOurPort) {
@@ -458,7 +471,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
                return;
        len -= 2;
        /* warning: don't use increment (++) in ntohs() macros!! */
-       s = (ushort *)pkt;
+       s = (__be16 *)pkt;
        proto = *s++;
        pkt = (uchar *)s;
        switch (ntohs(proto)) {
@@ -549,7 +562,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
                if (len < 2)
                        return;
                len -= 2;
-               TftpBlock = ntohs(*(ushort *)pkt);
+               TftpBlock = ntohs(*(__be16 *)pkt);
 
                update_block_number();
 
@@ -637,9 +650,9 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
 
        case TFTP_ERROR:
                printf("\nTFTP error: '%s' (%d)\n",
-                      pkt + 2, ntohs(*(ushort *)pkt));
+                      pkt + 2, ntohs(*(__be16 *)pkt));
 
-               switch (ntohs(*(ushort *)pkt)) {
+               switch (ntohs(*(__be16 *)pkt)) {
                case TFTP_ERR_FILE_NOT_FOUND:
                case TFTP_ERR_ACCESS_DENIED:
                        puts("Not retrying...\n");
@@ -775,6 +788,7 @@ void TftpStart(enum proto_t protocol)
                TftpState = STATE_SEND_RRQ;
        }
 
+       time_start = get_timer(0);
        TftpTimeoutCountMax = TftpRRQTimeoutCountMax;
 
        NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
@@ -841,6 +855,9 @@ TftpStartServer(void)
 
        TftpState = STATE_RECV_WRQ;
        net_set_udp_handler(TftpHandler);
+
+       /* zero out server ether in case the server ip has changed */
+       memset(NetServerEther, 0, 6);
 }
 #endif /* CONFIG_CMD_TFTPSRV */