]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - net/tftp.c
mtd: nand: use ssize_t instead of size_t to prevent infinite loop
[karo-tx-uboot.git] / net / tftp.c
index bc7fe05465cb9b4c3b0a1e8a1d45264862be7fae..09790eb7cf8202c051d594b5243aa3f843746691 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
@@ -156,7 +157,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;
@@ -177,7 +178,7 @@ store_block(unsigned block, uchar *src, unsigned len)
                rc = flash_write((char *)src, (ulong)(load_addr+offset), len);
                if (rc) {
                        flash_perror(rc);
-                       NetState = NETLOOP_FAIL;
+                       net_set_state(NETLOOP_FAIL);
                        return;
                }
        } else
@@ -299,8 +300,14 @@ 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");
-       NetState = NETLOOP_SUCCESS;
+       net_set_state(NETLOOP_SUCCESS);
 }
 
 static void
@@ -322,7 +329,7 @@ TftpSend(void)
         *      We will always be sending some sort of packet, so
         *      cobble together the packet headers now.
         */
-       pkt = (uchar *)(NetTxPacket + NetEthHdrSize() + IP_HDR_SIZE);
+       pkt = NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE;
 
        switch (TftpState) {
        case STATE_SEND_RRQ:
@@ -627,7 +634,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
                        if (MasterClient && (TftpBlock >= TftpEndingBlock)) {
                                puts("\nMulticast tftp done\n");
                                mcast_cleanup();
-                               NetState = NETLOOP_SUCCESS;
+                               net_set_state(NETLOOP_SUCCESS);
                        }
                } else
 #endif
@@ -644,7 +651,7 @@ TftpHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src,
                case TFTP_ERR_ACCESS_DENIED:
                        puts("Not retrying...\n");
                        eth_halt();
-                       NetState = NETLOOP_FAIL;
+                       net_set_state(NETLOOP_FAIL);
                        break;
                case TFTP_ERR_UNDEFINED:
                case TFTP_ERR_DISK_FULL:
@@ -775,10 +782,11 @@ void TftpStart(enum proto_t protocol)
                TftpState = STATE_SEND_RRQ;
        }
 
+       time_start = get_timer(0);
        TftpTimeoutCountMax = TftpRRQTimeoutCountMax;
 
        NetSetTimeout(TftpTimeoutMSecs, TftpTimeout);
-       NetSetHandler(TftpHandler);
+       net_set_udp_handler(TftpHandler);
 #ifdef CONFIG_CMD_TFTPPUT
        net_set_icmp_handler(icmp_handler);
 #endif
@@ -840,7 +848,7 @@ TftpStartServer(void)
 #endif
 
        TftpState = STATE_RECV_WRQ;
-       NetSetHandler(TftpHandler);
+       net_set_udp_handler(TftpHandler);
 }
 #endif /* CONFIG_CMD_TFTPSRV */