]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - net/tftp.c
mtd: nand: omap: optimize chip->ecc.calculate() for H/W ECC schemes
[karo-tx-uboot.git] / net / tftp.c
index 59a8ebb3cf339b3c40ff24846c13406e5dc0b9a4..966d1cfba360ce7e7505dd5f806ce13543b0654c 100644 (file)
@@ -40,6 +40,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
@@ -280,7 +281,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 */
@@ -299,6 +300,12 @@ static void tftp_complete(void)
                TftpNumchars++;
        }
 #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 +446,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 +465,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 +556,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 +644,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 +782,7 @@ void TftpStart(enum proto_t protocol)
                TftpState = STATE_SEND_RRQ;
        }
 
+       time_start = get_timer(0);
        TftpTimeoutCountMax = TftpRRQTimeoutCountMax;
 
        NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
@@ -841,6 +849,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 */