]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - net/nfs.c
net: cosmetic: Clean up TFTP variables and functions
[karo-tx-uboot.git] / net / nfs.c
index 5b9976354cc184d8ba7f17e048a7edadfec314ad..68992655144af692e164ef81e585aaab098ad24a 100644 (file)
--- a/net/nfs.c
+++ b/net/nfs.c
 #include <command.h>
 #include <net.h>
 #include <malloc.h>
+#include <mapmem.h>
 #include "nfs.h"
 #include "bootp.h"
 
 #define HASHES_PER_LINE 65     /* Number of "loading" hashes per line  */
 #define NFS_RETRY_COUNT 30
-#define NFS_TIMEOUT 2000UL
+#ifndef CONFIG_NFS_TIMEOUT
+# define NFS_TIMEOUT 2000UL
+#else
+# define NFS_TIMEOUT CONFIG_NFS_TIMEOUT
+#endif
+
+#define NFS_RPC_ERR    1
+#define NFS_RPC_DROP   124
 
 static int fs_mounted;
 static unsigned long rpc_id;
 static int nfs_offset = -1;
 static int nfs_len;
+static ulong nfs_timeout = NFS_TIMEOUT;
 
 static char dirfh[NFS_FHSIZE]; /* file handle of directory */
 static char filefh[NFS_FHSIZE]; /* file handle of kernel image */
 
 static enum net_loop_state nfs_download_state;
-static IPaddr_t NfsServerIP;
+static struct in_addr nfs_server_ip;
 static int     NfsSrvMountPort;
 static int     NfsSrvNfsPort;
 static int     NfsOurPort;
@@ -85,11 +94,14 @@ store_block(uchar *src, unsigned offset, unsigned len)
        } else
 #endif /* CONFIG_SYS_DIRECT_FLASH_NFS */
        {
-               (void)memcpy((void *)(load_addr + offset), src, len);
+               void *ptr = map_sysmem(load_addr + offset, len);
+
+               memcpy(ptr, src, len);
+               unmap_sysmem(ptr);
        }
 
-       if (NetBootFileXferSize < (offset+len))
-               NetBootFileXferSize = newsize;
+       if (net_boot_file_size < (offset + len))
+               net_boot_file_size = newsize;
        return 0;
 }
 
@@ -189,8 +201,8 @@ rpc_req(int rpc_prog, int rpc_proc, uint32_t *data, int datalen)
 
        pktlen = (char *)p + datalen*sizeof(uint32_t) - (char *)&pkt;
 
-       memcpy((char *)NetTxPacket + NetEthHdrSize() + IP_UDP_HDR_SIZE,
-               (char *)&pkt, pktlen);
+       memcpy((char *)net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE,
+              (char *)&pkt, pktlen);
 
        if (rpc_prog == PROG_PORTMAP)
                sport = SUNRPC_PORT;
@@ -199,8 +211,8 @@ rpc_req(int rpc_prog, int rpc_proc, uint32_t *data, int datalen)
        else
                sport = NfsSrvNfsPort;
 
-       NetSendUDPPacket(NetServerEther, NfsServerIP, sport, NfsOurPort,
-               pktlen);
+       net_send_udp_packet(net_server_ethaddr, nfs_server_ip, sport,
+                           NfsOurPort, pktlen);
 }
 
 /**************************************************************************
@@ -395,8 +407,10 @@ rpc_lookup_reply(int prog, uchar *pkt, unsigned len)
 
        debug("%s\n", __func__);
 
-       if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
-               return -1;
+       if (ntohl(rpc_pkt.u.reply.id) > rpc_id)
+               return -NFS_RPC_ERR;
+       else if (ntohl(rpc_pkt.u.reply.id) < rpc_id)
+               return -NFS_RPC_DROP;
 
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
@@ -424,8 +438,10 @@ nfs_mount_reply(uchar *pkt, unsigned len)
 
        memcpy((unsigned char *)&rpc_pkt, pkt, len);
 
-       if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
-               return -1;
+       if (ntohl(rpc_pkt.u.reply.id) > rpc_id)
+               return -NFS_RPC_ERR;
+       else if (ntohl(rpc_pkt.u.reply.id) < rpc_id)
+               return -NFS_RPC_DROP;
 
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
@@ -448,8 +464,10 @@ nfs_umountall_reply(uchar *pkt, unsigned len)
 
        memcpy((unsigned char *)&rpc_pkt, pkt, len);
 
-       if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
-               return -1;
+       if (ntohl(rpc_pkt.u.reply.id) > rpc_id)
+               return -NFS_RPC_ERR;
+       else if (ntohl(rpc_pkt.u.reply.id) < rpc_id)
+               return -NFS_RPC_DROP;
 
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
@@ -471,8 +489,10 @@ nfs_lookup_reply(uchar *pkt, unsigned len)
 
        memcpy((unsigned char *)&rpc_pkt, pkt, len);
 
-       if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
-               return -1;
+       if (ntohl(rpc_pkt.u.reply.id) > rpc_id)
+               return -NFS_RPC_ERR;
+       else if (ntohl(rpc_pkt.u.reply.id) < rpc_id)
+               return -NFS_RPC_DROP;
 
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
@@ -495,8 +515,10 @@ nfs_readlink_reply(uchar *pkt, unsigned len)
 
        memcpy((unsigned char *)&rpc_pkt, pkt, len);
 
-       if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
-               return -1;
+       if (ntohl(rpc_pkt.u.reply.id) > rpc_id)
+               return -NFS_RPC_ERR;
+       else if (ntohl(rpc_pkt.u.reply.id) < rpc_id)
+               return -NFS_RPC_DROP;
 
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
@@ -530,8 +552,10 @@ nfs_read_reply(uchar *pkt, unsigned len)
 
        memcpy((uchar *)&rpc_pkt, pkt, sizeof(rpc_pkt.u.reply));
 
-       if (ntohl(rpc_pkt.u.reply.id) != rpc_id)
-               return -1;
+       if (ntohl(rpc_pkt.u.reply.id) > rpc_id)
+               return -NFS_RPC_ERR;
+       else if (ntohl(rpc_pkt.u.reply.id) < rpc_id)
+               return -NFS_RPC_DROP;
 
        if (rpc_pkt.u.reply.rstatus  ||
            rpc_pkt.u.reply.verifier ||
@@ -570,15 +594,17 @@ NfsTimeout(void)
                NetStartAgain();
        } else {
                puts("T ");
-               NetSetTimeout(NFS_TIMEOUT, NfsTimeout);
+               NetSetTimeout(nfs_timeout + NFS_TIMEOUT * NfsTimeoutCount,
+                             NfsTimeout);
                NfsSend();
        }
 }
 
-static void
-NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
+static void nfs_handler(uchar *pkt, unsigned dest, struct in_addr sip,
+                       unsigned src, unsigned len)
 {
        int rlen;
+       int reply;
 
        debug("%s\n", __func__);
 
@@ -587,19 +613,24 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
 
        switch (NfsState) {
        case STATE_PRCLOOKUP_PROG_MOUNT_REQ:
-               rpc_lookup_reply(PROG_MOUNT, pkt, len);
+               if (rpc_lookup_reply(PROG_MOUNT, pkt, len) == -NFS_RPC_DROP)
+                       break;
                NfsState = STATE_PRCLOOKUP_PROG_NFS_REQ;
                NfsSend();
                break;
 
        case STATE_PRCLOOKUP_PROG_NFS_REQ:
-               rpc_lookup_reply(PROG_NFS, pkt, len);
+               if (rpc_lookup_reply(PROG_NFS, pkt, len) == -NFS_RPC_DROP)
+                       break;
                NfsState = STATE_MOUNT_REQ;
                NfsSend();
                break;
 
        case STATE_MOUNT_REQ:
-               if (nfs_mount_reply(pkt, len)) {
+               reply = nfs_mount_reply(pkt, len);
+               if (reply == -NFS_RPC_DROP)
+                       break;
+               else if (reply == -NFS_RPC_ERR) {
                        puts("*** ERROR: Cannot mount\n");
                        /* just to be sure... */
                        NfsState = STATE_UMOUNT_REQ;
@@ -611,7 +642,10 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
                break;
 
        case STATE_UMOUNT_REQ:
-               if (nfs_umountall_reply(pkt, len)) {
+               reply = nfs_umountall_reply(pkt, len);
+               if (reply == -NFS_RPC_DROP)
+                       break;
+               else if (reply == -NFS_RPC_ERR) {
                        puts("*** ERROR: Cannot umount\n");
                        net_set_state(NETLOOP_FAIL);
                } else {
@@ -621,7 +655,10 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
                break;
 
        case STATE_LOOKUP_REQ:
-               if (nfs_lookup_reply(pkt, len)) {
+               reply = nfs_lookup_reply(pkt, len);
+               if (reply == -NFS_RPC_DROP)
+                       break;
+               else if (reply == -NFS_RPC_ERR) {
                        puts("*** ERROR: File lookup fail\n");
                        NfsState = STATE_UMOUNT_REQ;
                        NfsSend();
@@ -634,7 +671,10 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
                break;
 
        case STATE_READLINK_REQ:
-               if (nfs_readlink_reply(pkt, len)) {
+               reply = nfs_readlink_reply(pkt, len);
+               if (reply == -NFS_RPC_DROP)
+                       break;
+               else if (reply == -NFS_RPC_ERR) {
                        puts("*** ERROR: Symlink fail\n");
                        NfsState = STATE_UMOUNT_REQ;
                        NfsSend();
@@ -650,7 +690,7 @@ NfsHandler(uchar *pkt, unsigned dest, IPaddr_t sip, unsigned src, unsigned len)
 
        case STATE_READ_REQ:
                rlen = nfs_read_reply(pkt, len);
-               NetSetTimeout(NFS_TIMEOUT, NfsTimeout);
+               NetSetTimeout(nfs_timeout, NfsTimeout);
                if (rlen > 0) {
                        nfs_offset += rlen;
                        NfsSend();
@@ -675,7 +715,7 @@ NfsStart(void)
        debug("%s\n", __func__);
        nfs_download_state = NETLOOP_FAIL;
 
-       NfsServerIP = NetServerIP;
+       nfs_server_ip = net_server_ip;
        nfs_path = (char *)nfs_path_buff;
 
        if (nfs_path == NULL) {
@@ -684,27 +724,27 @@ NfsStart(void)
                return;
        }
 
-       if (BootFile[0] == '\0') {
+       if (net_boot_file_name[0] == '\0') {
                sprintf(default_filename, "/nfsroot/%02X%02X%02X%02X.img",
-                       NetOurIP & 0xFF,
-                       (NetOurIP >>  8) & 0xFF,
-                       (NetOurIP >> 16) & 0xFF,
-                       (NetOurIP >> 24) & 0xFF);
+                       net_ip.s_addr & 0xFF,
+                       (net_ip.s_addr >>  8) & 0xFF,
+                       (net_ip.s_addr >> 16) & 0xFF,
+                       (net_ip.s_addr >> 24) & 0xFF);
                strcpy(nfs_path, default_filename);
 
                printf("*** Warning: no boot file name; using '%s'\n",
                        nfs_path);
        } else {
-               char *p = BootFile;
+               char *p = net_boot_file_name;
 
                p = strchr(p, ':');
 
                if (p != NULL) {
-                       NfsServerIP = string_to_ip(BootFile);
+                       nfs_server_ip = string_to_ip(net_boot_file_name);
                        ++p;
                        strcpy(nfs_path, p);
                } else {
-                       strcpy(nfs_path, BootFile);
+                       strcpy(nfs_path, net_boot_file_name);
                }
        }
 
@@ -713,29 +753,32 @@ NfsStart(void)
 
        printf("Using %s device\n", eth_get_name());
 
-       printf("File transfer via NFS from server %pI4"
-               "; our IP address is %pI4", &NfsServerIP, &NetOurIP);
+       printf("File transfer via NFS from server %pI4; our IP address is %pI4",
+              &nfs_server_ip, &net_ip);
 
        /* Check if we need to send across this subnet */
-       if (NetOurGatewayIP && NetOurSubnetMask) {
-               IPaddr_t OurNet     = NetOurIP    & NetOurSubnetMask;
-               IPaddr_t ServerNet  = NetServerIP & NetOurSubnetMask;
+       if (net_gateway.s_addr && net_netmask.s_addr) {
+               struct in_addr our_net;
+               struct in_addr server_net;
 
-               if (OurNet != ServerNet)
+               our_net.s_addr = net_ip.s_addr & net_netmask.s_addr;
+               server_net.s_addr = net_server_ip.s_addr & net_netmask.s_addr;
+               if (our_net.s_addr != server_net.s_addr)
                        printf("; sending through gateway %pI4",
-                               &NetOurGatewayIP);
+                               &net_gateway);
        }
        printf("\nFilename '%s/%s'.", nfs_path, nfs_filename);
 
-       if (NetBootFileSize) {
-               printf(" Size is 0x%x Bytes = ", NetBootFileSize<<9);
-               print_size(NetBootFileSize<<9, "");
+       if (net_boot_file_expected_size_in_blocks) {
+               printf(" Size is 0x%x Bytes = ",
+                      net_boot_file_expected_size_in_blocks << 9);
+               print_size(net_boot_file_expected_size_in_blocks << 9, "");
        }
        printf("\nLoad address: 0x%lx\n"
                "Loading: *\b", load_addr);
 
-       NetSetTimeout(NFS_TIMEOUT, NfsTimeout);
-       net_set_udp_handler(NfsHandler);
+       NetSetTimeout(nfs_timeout, NfsTimeout);
+       net_set_udp_handler(nfs_handler);
 
        NfsTimeoutCount = 0;
        NfsState = STATE_PRCLOOKUP_PROG_MOUNT_REQ;
@@ -745,7 +788,7 @@ NfsStart(void)
        NfsOurPort = 1000;
 
        /* zero out server ether in case the server ip has changed */
-       memset(NetServerEther, 0, 6);
+       memset(net_server_ethaddr, 0, 6);
 
        NfsSend();
 }