#define LEN_NAME 32
#ifdef CONFIG_SYS_SDRAM_BASE
-#define NFS_DOWNLOAD_ADDR __stringify(CONFIG_SYS_SDRAM_BASE)
+#define NFS_DOWNLOAD_ADDR CONFIG_SYS_SDRAM_BASE
#else
-#define NFS_DOWNLOAD_ADDR "0x40000000"
+#define NFS_DOWNLOAD_ADDR 0x40000000
#endif
+#define NFSDOWN_TRANSFER_SIZE SZ_256M
+
enum img_layout {
RAW_ADDR,
FS_FAT,
/**
* Donwload from nfs file and write to mmc stroage
*
- * @param buf_addr Download buffer address from NFS
+ * @param addr Download buffer address from NFS
* @param file_path Download file path from NFS
* @param part MMC partition
* @param offset img block offset
* @param blk_size MMC block size
* @return file_size written file size, return -1 if error occurs
*/
-static int do_nfs_to_mmc(struct mmc *mmc, char *buf_addr, char *file_path,
+static int do_nfs_to_mmc(struct mmc *mmc, void *addr, char *file_path,
uint part, uint offset, uint size, uint blk_size)
{
- char *_argv[3];
uint _size;
- int repeatable;
+ uint done = 0;
int ret;
- void *addr;
-
- _argv[0] = "nfs";
- _argv[1] = buf_addr;
- _argv[2] = file_path;
-
- ret = cmd_process(0, 3, _argv, &repeatable, NULL);
- if (ret != CMD_RET_SUCCESS) {
- puts("nfs download failed!!\n");
- return -1;
- }
-
- _size = (net_boot_file_size % blk_size) ?
- net_boot_file_size / blk_size + 1
- : net_boot_file_size / blk_size;
ret = blk_select_hwpart_devnum(IF_TYPE_MMC, 0, part);
if (ret) {
return -1;
}
- addr = (void *)simple_strtoul(buf_addr, NULL, 16);
+ do {
+ printf("Getting %s, offset %u...\n", file_path, done);
+ ret = netboot_nfs((unsigned long)addr, file_path, done,
+ NFSDOWN_TRANSFER_SIZE);
+ if (ret != CMD_RET_SUCCESS) {
+ puts("nfs download failed!!\n");
+ return -1;
+ }
+
+ _size = (net_boot_file_size % blk_size) ?
+ net_boot_file_size / blk_size + 1
+ : net_boot_file_size / blk_size;
- printf("MMC write: dev # %d, block # %d, count %d ...\n\n",
- part, offset, _size);
+ printf("MMC write: dev # %d, block # %d, count %d ...\n\n",
+ part, offset, _size);
#ifndef CONFIG_BLK
- ret = mmc->block_dev.block_write(&mmc->block_dev, offset, _size, addr);
+ ret = mmc->block_dev.block_write(&mmc->block_dev, offset, _size,
+ addr);
#else
- ret = blk_dwrite(mmc_get_blk_desc(mmc), offset, _size, addr);
+ ret = blk_dwrite(mmc_get_blk_desc(mmc), offset, _size, addr);
#endif
- if (ret != _size) {
- printk("Failed to write MMC: part(%d), start(%d), size(%d)",
- part, offset, _size);
- return -1;
- }
+ if (ret != _size) {
+ printk("Failed to write MMC: part(%d), start(%d), size(%d)",
+ part, offset, _size);
+ return -1;
+ }
+ done += net_boot_file_size;
+ offset += _size;
+ } while (net_boot_file_size == NFSDOWN_TRANSFER_SIZE);
- return (int)net_boot_file_size;
+ return (int)done;
}
-static int do_nfs_to_fat(char *buf_addr, char *file_path, char *file_name,
+static int do_nfs_to_fat(void *addr, char *file_path, char *file_name,
uint dev, uint part)
{
- char *_argv[3];
uint _size;
int ret;
- int repeatable;
char buf[256];
- _argv[0] = "nfs";
- _argv[1] = buf_addr;
- _argv[2] = file_path;
-
- ret = cmd_process(0, 3, _argv, &repeatable, NULL);
+ ret = netboot_nfs((unsigned long)addr, file_path, 0, 0);
if (ret != CMD_RET_SUCCESS) {
puts("nfs download failed!!\n");
return -1;
}
_size = net_boot_file_size;
- snprintf(buf, 256, "fatwrite mmc %d:%d %s %s %x", dev, part, buf_addr,
+ snprintf(buf, 256, "fatwrite mmc %d:%d %p %s %x", dev, part, addr,
file_name, _size);
run_command(buf, 0);