BIOS: TFTP: try UDP/69 if specified port fails
authorEwen McNeill <ewen@naos.co.nz>
Thu, 18 Jan 2018 02:10:28 +0000 (13:10 +1100)
committerEwen McNeill <ewen@naos.co.nz>
Thu, 18 Jan 2018 02:10:28 +0000 (13:10 +1100)
litex/soc/software/bios/boot.c

index 3972f3b1ff3a63e5bffa9ebcd358399f4d0e0601..90b6b5300467f75d9e487444c4e0442b60bc1ced 100644 (file)
@@ -210,8 +210,9 @@ int serialboot(void)
 #define REMOTEIP4 100
 #endif
 
+#define DEFAULT_TFTP_SERVER_PORT 69  /* IANA well known port: UDP/69 */
 #ifndef TFTP_SERVER_PORT
-#define TFTP_SERVER_PORT 69    /* IANA well known port: UDP/69 */
+#define TFTP_SERVER_PORT DEFAULT_TFTP_SERVER_PORT
 #endif
 
 static int tftp_get_v(unsigned int ip, unsigned short server_port,
@@ -244,11 +245,21 @@ void netboot(void)
 
        microudp_start(macadr, IPTOINT(LOCALIP1, LOCALIP2, LOCALIP3, LOCALIP4));
 
-        tftp_port = TFTP_SERVER_PORT;
+       tftp_port = TFTP_SERVER_PORT;
        printf("Fetching from: UDP/%d\n", tftp_port);
 
-       if(tftp_get_v(ip, tftp_port, "boot.bin", (void *)MAIN_RAM_BASE) <= 0) {
-                /* XXX: Try alternate TFTP port here? */
+       size = tftp_get_v(ip, tftp_port, "boot.bin", (void *)MAIN_RAM_BASE);
+
+       if ((size <= 0) && (tftp_port != DEFAULT_TFTP_SERVER_PORT)) {
+               /* Try default TFTP port if timed out on non-standard port */
+               tftp_port = DEFAULT_TFTP_SERVER_PORT;
+               printf("Fetching from: UDP/%d\n", tftp_port);
+
+               size = tftp_get_v(ip, tftp_port, "boot.bin",
+                       (void *)MAIN_RAM_BASE);
+        }
+
+        if (size <= 0) {
                printf("Network boot failed\n");
                return;
        }