int do_stage_boot(cmd_tbl_t * cmdtb, int flag, int argc, char *argv[]) { char *path_to_image, *path_to_scr, *path_to_initrd, *all_partions; ulong addr; int j,i=1,step=0,len,index,device,initrd=0; char * kernel_addr, *bootargs; char * args_to_func[5]; char device_prt[4]; if(argc < 2){ printf("No args, try help stage_boot\n"); return 0; } path_to_initrd = (char *)malloc((strlen(SCRIPT_PATH)+strlen(getenv("initrd_name")))*sizeof(char)); strcpy(path_to_initrd,SCRIPT_PATH); strcat(path_to_initrd,getenv("initrd_name")); path_to_image = (char *)malloc((strlen(SCRIPT_PATH)+strlen(getenv("image_name")))*sizeof(char)); strcpy(path_to_image,SCRIPT_PATH); strcat(path_to_image,getenv("image_name")); path_to_scr = (char *)malloc((strlen(SCRIPT_PATH)+strlen(getenv("script_name")))*sizeof(char)); strcpy(path_to_scr,SCRIPT_PATH); strcat(path_to_scr,getenv("script_name")); all_partions = (char *)malloc(strlen(getenv("device_partition"))*sizeof(char)); strcpy(all_partions,getenv("device_partition")); kernel_addr = getenv("kernel_addr_r"); #if !defined(CONFIG_MACH_AVANTA_LP_FPGA) ide_init(); #endif for(device=1;device<argc;device++) { #if !defined(CONFIG_MACH_AVANTA_LP_FPGA) /* step 1 load script from ide */ len=strlen(all_partions); for(index=0;index<len && i==1 && strcmp(argv[device],"hd_scr")==0 ;index++) { step=1; for(j=0;j<3;j++,index++) device_prt[j]=all_partions[index]; device_prt[3]='\0'; printf("\ntry to load script from ide %s\n",device_prt); args_to_func[0]="ext2load"; args_to_func[1]=INTERFACE_HD; args_to_func[2]=device_prt; args_to_func[3]=LOAD_ADDR; args_to_func[4]=path_to_scr; i = do_ext2load(cmdtb, 1, 5 , args_to_func); addr = simple_strtoul(args_to_func[3], NULL, 16); } /* finish step 1 */ /* step 2 boot PXE */ if (i== 1 && strcmp(argv[device],"pxe") == 0) { step = 2; save_env(); setenv("boot_from_pxe","1"); setenv("autoload","no"); setenv("pxefile_addr_r",LOAD_ADDR); args_to_func[0]="dhcp"; args_to_func[1]=getenv("pxefile_addr_r"); i = do_dhcp(cmdtb, 1, 1, args_to_func); if(i==0) i = do_pxe_get(cmdtb, 1 , 1, args_to_func); setenv("boot_from_pxe","0"); if(i==1) restore_env(); } /* finish step 2 */ /* step 3 load linux image from ide */ if( i == 1 && strcmp(argv[device],"hd_img")==0 ) { step = 3; len=strlen(all_partions); for(index=0;index<len && i==1 ;index++) { for(j=0;j<3;j++,index++) device_prt[j]=all_partions[index]; device_prt[3]='\0'; printf("\ntry to load image from ide %s\n", device_prt); args_to_func[0]="ext2load"; args_to_func[1]=INTERFACE_HD; args_to_func[2]=device_prt; args_to_func[3]=getenv("kernel_addr_r"); args_to_func[4]=path_to_image; i = do_ext2load(cmdtb, 1, 5 , args_to_func); addr = simple_strtoul(args_to_func[3], NULL, 16); if( i==0 ){ int temp; args_to_func[3]=getenv("ramdisk_addr_r"); args_to_func[4]=path_to_initrd; temp = do_ext2load(cmdtb, 1, 5 , args_to_func); if(temp == 0) { initrd = 1; args_to_func[1] = getenv("kernel_addr_r"); args_to_func[2] = getenv("ramdisk_addr_r"); } } } } /* finish step 3 */ /*step 4 load script from tftp */ if( i == 1 && strcmp(argv[device],"net_scr")==0 ) { printf("\ntry to load script from tftp\n"); step = 4; args_to_func[0]="tftp"; args_to_func[1]=LOAD_ADDR; args_to_func[2]=getenv("script_name"); i = do_tftpb(cmdtb, 1, 3,args_to_func); addr = simple_strtoul(args_to_func[1], NULL, 16); } #endif /* finish step 4 */ /*step 5 load linux image from tftp */ if( i == 1 && strcmp(argv[device],"net_img")==0 ) { printf("\ntry to load image from tftp\n"); step = 5; args_to_func[0]="tftp"; args_to_func[1]=getenv("kernel_addr_r"); args_to_func[2]=getenv("image_name"); i = do_tftpb(cmdtb, 1, 3,args_to_func); addr = simple_strtoul(args_to_func[1], NULL, 16); } /* finish step 5 */ } free(path_to_image); free(path_to_scr); path_to_image = getenv("bootargs_dflt"); if(!path_to_image) { printf("missing environment variable: bootargs_dflt\n"); return 0; } if (step == 3 && initrd ==1){ setenv("bootargs_dflt","console=ttyS0,115200 earlyprintk=ttyS0 root=/dev/sda2 ro pm_disable"); } bootargs = (char *)malloc(sizeof(char)*(strlen(getenv("bootargs_dflt"))+17)); strcpy(bootargs,"setenv bootargs "); #ifndef CONFIG_SYS_HUSH_PARSER if (run_command(strcat(bootargs,getenv("bootargs_dflt")), flag) < 0) { printf("missing environment variable: bootargs_dflt\n"); return 0; } #else marvell_recursive_parse = 1; if (parse_string_outer(strcat(bootargs,getenv("bootargs_dflt")), FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0){ printf("missing environment variable: bootargs_dflt\n"); marvell_recursive_parse = 0; return 0; } marvell_recursive_parse = 0; #endif if(i==0) { if(step == 1 || step == 4) source(addr,NULL); else if ((step == 3 && initrd ==0 )|| step == 5) do_bootm(cmdtb, 1,1,(char * const*)kernel_addr); else if (step ==2) do_pxe_boot(cmdtb, 2, 1,(char * const *)NULL); else if (step == 3 && initrd ==1){ do_bootm(cmdtb, 1,2,args_to_func); } } else { printf("Unable to load image/script\n"); } return 1; }
//extern int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); void recoveryHandle(void) { char cmd[256]; char img[10]; char * argv[3]; char *env; MV_32 imagAddr, imagSize = 0, netflag = 1; char ip[16]= {"dhcp"}; char* usbload[5]; unsigned int netwait = 3000; int upgrade = -1; /* get the loadaddr env var */ if (!getenv("loadaddr")) { printf("Missing loadaddr environment variable assuming default (%s)!\n", RCVR_LOAD_ADDR); setenv("loadaddr",RCVR_LOAD_ADDR); saveenv(); } #ifdef CONFIG_USB_STORAGE /* First try to perform recovery from USB DOK*/ /* try to recognize storage devices immediately */ if (usb_init() >= 0) { if (usb_stor_scan(1) >= 0) { netflag = 0; usbload[0] = "usbload"; usbload[1] = "usb"; usbload[2] = "0:1"; usbload[3] = getenv("loadaddr"); usbload[4] = "/multiware.img"; printf("Trying to load image from USB flash drive using FAT FS\n"); if (do_fat_fsload(0, 0, 5, usbload) == 1) { printf("Trying to load image from USB flash drive using ext2 FS partition 0\n"); usbload[2] = "0:0"; if(do_ext2load(0, 0, 5, usbload) == 1) { printf("Trying to load image from USB flash drive using ext2 FS partition 1\n"); usbload[2] = "0:1"; if(do_ext2load(0, 0, 5, usbload) == 1) { printf("Couldn't load recovery image from USB flash drive, Trying network interface\n"); netflag = 1; } else { env = getenv("filesize"); usbload[3] = getenv("loadaddr"); imagSize = simple_strtoul(env, NULL, 16); /* get the filesize env var */ /* Trying to check if we forced to upgrade by placing upgrade.me */ usbload[4] = "/upgrade.me"; usbload[3] = "0x000000000"; env=getenv("loadaddr"); imagAddr=simple_strtoul(env, NULL, 16); sprintf(usbload[3], "0x%x", imagAddr + imagSize + 1); printf("dummyaddr:%s\n", usbload[3]); upgrade=do_ext2load(0, 0, 5, usbload); } } else { env = getenv("filesize"); imagSize = simple_strtoul(env, NULL, 16); /* get the filesize env var */ /* Trying to check if we forced to upgrade by placing upgrade.me */ usbload[4] = "/upgrade.me"; usbload[3] = "0x000000000"; env=getenv("loadaddr"); imagAddr=simple_strtoul(env, NULL, 16); sprintf(usbload[3], "0x%x", imagAddr + imagSize + 1); printf("dummyaddr:%s\n", usbload[3]); upgrade=do_ext2load(0, 0, 5, usbload); } } else { env = getenv("filesize"); imagSize = simple_strtoul(env, NULL, 16); /* get the filesize env var */ /* Trying to check if we forced to upgrade by placing upgrade.me */ usbload[4] = "/upgrade.me"; usbload[3] = "0x000000000"; env=getenv("loadaddr"); imagAddr=simple_strtoul(env, NULL, 16); sprintf(usbload[3], "0x%x", imagAddr + imagSize + 1); printf("dummyaddr:%s\n", usbload[3]); upgrade=do_fat_fsload(0, 0, 5, usbload); } // Decide on upgrade/init mode if (upgrade == 0) sprintf(ip, "usb_upgrade"); else sprintf(ip, "usb"); printf("USB mode:%s\n", ip); } } #endif if(netflag == 1) { /* if recovery ip set same as our ip then skip dhcp */ while ( strcmp(getenv("rcvrip"), getenv("ipaddr")) && (netwait > 0) ) { /* Perform the DHCP */ printf("Aquiring an IP address using DHCP after delay...\n"); mvOsDelay(netwait); netwait-=1000; if (NetLoop(DHCP) != -1) { /* We'vev got DHCP progressing with recovery */ printf("DHCP should be ready for Recovery.\n"); break; } } /* No DHCP after timeout or forced */ if ( !strcmp(getenv("rcvrip"), getenv("ipaddr")) || (netwait <= 0) ) { ulong tmpip; printf("No DHCP after timeout or manual IP address configured, switching to static IP address (%s)!\n", getenv("rcvrip")); tmpip = getenv_IPaddr ("rcvrip"); NetCopyIP(&NetOurIP, &tmpip); sprintf(ip, "static"); } /* Perform the recovery */ printf("Starting retrieval of recovery image over network...\n"); if ((imagSize = NetLoop(RCVR)) == -1) { printf("Failed\n"); return; } } switch (mvBoardIdGet()) { case RD_88F6510_SFU_ID: case RD_88F6560_GW_ID: case DB_88F6535_BP_ID: setenv("bootcmd","setenv bootargs ${console} ubi.mtd=2 root=ubi0:rootfsU rootfstype=ubifs ${mvNetConfig} ${mvPhoneConfig}; nand read.e ${loadaddr} 0x200000 0x400000; bootm ${loadaddr};"); setenv("console","console=ttyS0,115200"); saveenv(); break; } printf("\nPermanent bootcmd: %s\n", getenv("bootcmd")); printf("\nPermanent console: %s\n", getenv("console")); /* This assignment to cmd should execute prior to the RD setenv and saveenv below*/ sprintf(cmd,"setenv bootargs ${console} root=/dev/ram0 ${mvNetConfig} recovery=%s rcvrip=%s:%s%s ethact=${ethact} ethaddr=%s eth1addr=%s; bootm ${loadaddr};", ip, getenv("rcvrip"), getenv("serverip"), getenv("bootargs_end"), getenv("ethaddr"), getenv("eth1addr")); setenv("bootcmd", cmd); printf("\nRecovery bootcmd: %s\n", cmd); printf("Booting recovery image at: [%s]...\n", getenv("loadaddr")); sprintf(cmd, "boot"); sprintf(img, "%s", getenv("loadaddr")); argv[0] = cmd; argv[1] = img; do_bootd(NULL, 0, 2, argv); }