da830evm: Add support for TI EMAC
[oweals/u-boot.git] / net / tftp.c
index cc60a3bd1ca888705b6b0375dfba61aa535291cb..a02463b003f1a710c1179e01cddf64101bd03e9f 100644 (file)
@@ -10,8 +10,6 @@
 #include "tftp.h"
 #include "bootp.h"
 
-#if defined(CONFIG_CMD_NET)
-
 #define WELL_KNOWN_PORT        69              /* Well known TFTP port #               */
 #define TIMEOUT                5000UL          /* Millisecs to timeout for lost pkt */
 #ifndef        CONFIG_NET_RETRY_COUNT
@@ -47,6 +45,16 @@ static int TftpTimeoutCountMax = TIMEOUT_COUNT;
 ulong TftpRRQTimeoutMSecs = TIMEOUT;
 int TftpRRQTimeoutCountMax = TIMEOUT_COUNT;
 
+enum {
+       TFTP_ERR_UNDEFINED           = 0,
+       TFTP_ERR_FILE_NOT_FOUND      = 1,
+       TFTP_ERR_ACCESS_DENIED       = 2,
+       TFTP_ERR_DISK_FULL           = 3,
+       TFTP_ERR_UNEXPECTED_OPCODE   = 4,
+       TFTP_ERR_UNKNOWN_TRANSFER_ID  = 5,
+       TFTP_ERR_FILE_ALREADY_EXISTS = 6,
+};
+
 static IPaddr_t TftpServerIP;
 static int     TftpServerPort;         /* The UDP port at their end            */
 static int     TftpOurPort;            /* The UDP port at our end              */
@@ -472,11 +480,27 @@ TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
        case TFTP_ERROR:
                printf ("\nTFTP error: '%s' (%d)\n",
                                        pkt + 2, ntohs(*(ushort *)pkt));
-               puts ("Starting again\n\n");
+
+               switch (ntohs(*(ushort *)pkt)) {
+               case TFTP_ERR_FILE_NOT_FOUND:
+               case TFTP_ERR_ACCESS_DENIED:
+                       puts("Not retrying...\n");
+                       eth_halt();
+                       NetState = NETLOOP_FAIL;
+                       break;
+               case TFTP_ERR_UNDEFINED:
+               case TFTP_ERR_DISK_FULL:
+               case TFTP_ERR_UNEXPECTED_OPCODE:
+               case TFTP_ERR_UNKNOWN_TRANSFER_ID:
+               case TFTP_ERR_FILE_ALREADY_EXISTS:
+               default:
+                       puts("Starting again\n\n");
 #ifdef CONFIG_MCAST_TFTP
-               mcast_cleanup();
+                       mcast_cleanup();
 #endif
-               NetStartAgain ();
+                       NetStartAgain();
+                       break;
+               }
                break;
        }
 }
@@ -690,5 +714,3 @@ static void parse_multicast_oack(char *pkt, int len)
 }
 
 #endif /* Multicast TFTP */
-
-#endif