diff options
Diffstat (limited to 'net/nfs.c')
-rw-r--r-- | net/nfs.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -44,6 +44,7 @@ static int nfs_len; static char dirfh[NFS_FHSIZE]; /* file handle of directory */ static char filefh[NFS_FHSIZE]; /* file handle of kernel image */ +static int NfsDownloadState; static IPaddr_t NfsServerIP; static int NfsSrvMountPort; static int NfsSrvNfsPort; @@ -63,7 +64,7 @@ static char *nfs_filename; static char *nfs_path; static char nfs_path_buff[2048]; -static __inline__ void +static __inline__ int store_block (uchar * src, unsigned offset, unsigned len) { ulong newsize = offset + len; @@ -82,8 +83,7 @@ store_block (uchar * src, unsigned offset, unsigned len) rc = flash_write ((uchar *)src, (ulong)(load_addr+offset), len); if (rc) { flash_perror (rc); - NetState = NETLOOP_FAIL; - return; + return -1; } } else #endif /* CFG_DIRECT_FLASH_NFS */ @@ -93,6 +93,7 @@ store_block (uchar * src, unsigned offset, unsigned len) if (NetBootFileXferSize < (offset+len)) NetBootFileXferSize = newsize; + return 0; } static char* @@ -573,7 +574,8 @@ nfs_read_reply (uchar *pkt, unsigned len) } rlen = ntohl(rpc_pkt.u.reply.data[18]); - store_block ((uchar *)pkt+sizeof(rpc_pkt.u.reply), nfs_offset, rlen); + if ( store_block ((uchar *)pkt+sizeof(rpc_pkt.u.reply), nfs_offset, rlen) ) + return -9999; return rlen; } @@ -632,7 +634,7 @@ NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len) NetState = NETLOOP_FAIL; } else { puts ("\ndone\n"); - NetState = NETLOOP_SUCCESS; + NetState = NfsDownloadState; } break; @@ -678,6 +680,7 @@ NfsHandler (uchar *pkt, unsigned dest, unsigned src, unsigned len) NfsState = STATE_READLINK_REQ; NfsSend (); } else { + if ( ! rlen ) NfsDownloadState = NETLOOP_SUCCESS; NfsState = STATE_UMOUNT_REQ; NfsSend (); } @@ -692,6 +695,7 @@ NfsStart (void) #ifdef NFS_DEBUG printf ("%s\n", __FUNCTION__); #endif + NfsDownloadState = NETLOOP_FAIL; NfsServerIP = NetServerIP; nfs_path = (char *)nfs_path_buff; |