boolean writeBackUpCommand(script_process_type MDM_MODEM ) 
{
 
	int mtd_op_result = 0;
		
	
	if(userDataBackUpInfo.dl_info_cnt<MAX_INFO_COUNT)
		userDataBackUpInfo.dl_info_cnt++;
	else 
		userDataBackUpInfo.dl_info_cnt=1;

	if(MDM_MODEM==MODEM_BACKUP)
	 mtd_op_result = lge_write_block(srd_bytes_pos_in_emmc, (char*)&userDataBackUpInfo, sizeof(user_data_backup_info));
	else
	mtd_op_result = lge_write_block(srd_bytes_pos_in_emmc+0x400000, (char*)&userDataBackUpInfo, sizeof(user_data_backup_info));	
	
        if(mtd_op_result!= sizeof(user_data_backup_info))
        {
		return FALSE;
                   
        }

	 write_counter_sector ++;

	return TRUE;
}
int lge_erase_block(int bytes_pos, size_t erase_size)
{
	unsigned char *erasebuf;
	size_t r_erasebuf = 0;
	unsigned int written = 0;
	unsigned int written_out = 0;
	int erasebuf_cnt = 0;
	int index = 0;
	size_t erasebuf_size=8192; //8KB

	erasebuf_cnt = (int) (erase_size / erasebuf_size);
	r_erasebuf = erase_size % erasebuf_size;
	erasebuf = kmalloc(erasebuf_size, GFP_KERNEL);	
	printk("%s, ERASE BLOCK size : %d\n", __func__, erase_size);

	if(!erasebuf)
	{
		printk("%s, allocation failed at fixed erasebuf, expected size : %d\n", __func__, erasebuf_size);
		return 0;
	}
	memset(erasebuf, 0xff, erasebuf_size);
	for(index =0; index < erasebuf_cnt;index++)
	{
		written_out = lge_write_block(bytes_pos, erasebuf, erasebuf_size);
		if(written_out > 0)
		{
			written += written_out;
		}
		else
		{
			printk("lge_write_block fail postition at %d\n",bytes_pos);
		}
		bytes_pos+=erasebuf_size;
	}
	kfree(erasebuf);
	
	if (r_erasebuf){
		erasebuf = kmalloc(r_erasebuf, GFP_KERNEL);
		if(!erasebuf)
		{
			printk("%s, allocation failed at remainder erasebuf, expected size : %d\n", __func__, r_erasebuf);
			return 0;
		}
		memset(erasebuf, 0xff, r_erasebuf);
		written_out = lge_write_block(bytes_pos, erasebuf, erase_size);
		if(written_out > 0)
		{
			written += written_out;
		}
		else
		{
			printk("lge_write_block remain  fail postition at %d\n",bytes_pos);
		}
		kfree(erasebuf);			
	}
	return written;
		
}
// Begin: hyechan.lee 2011-04-06
// 0018768: [fota]Fix an issue that when VZW logo is displayed, remove battery it won¡¯t enter recovery mode 
static int fota_write_block(const char *val, struct kernel_param *kp)
{

	const MmcPartition *pMisc_part; 
	unsigned long bootmsg_bytes_pos = 0;
	unsigned long fotamsg_bytes_pos = 0;

	
	unsigned int bootmsg_size, fotamsg_size;
	unsigned int fota_reboot_result;

	lge_mmc_scan_partitions();
	pMisc_part = lge_mmc_find_partition_by_name("misc");
	if ( pMisc_part == NULL )
	{
		printk(KERN_INFO"NO MISC\n");
		return -1;
	}
	
	bootmsg_bytes_pos = (pMisc_part->dfirstsec*512);

	printk(KERN_INFO"writing block\n");

	bootmsg_size= sizeof("boot-recovery");

	fota_reboot_result = lge_write_block(bootmsg_bytes_pos, "boot-recovery", bootmsg_size);

	if ( fota_reboot_result != bootmsg_size ) 
	{
		printk(KERN_INFO"%s: write block fail\n", __func__);
		return -1;
	}

	fotamsg_bytes_pos = ((pMisc_part->dfirstsec+3)*512);

	printk(KERN_INFO"%lx writing block\n", fotamsg_bytes_pos);

	fotamsg_size= sizeof("fota-recovery");

	fota_reboot_result = lge_write_block(fotamsg_bytes_pos, "fota-recovery", fotamsg_size);

	if ( fota_reboot_result != fotamsg_size ) 
	{
		printk(KERN_INFO"%s: write block fail\n", __func__);
		return -1;
	}

	printk(KERN_INFO"fota write block\n");
	return 0;
}
static int test_write_block(const char *val, struct kernel_param *kp)
{
	int i;
	int err;
	int normal_block_seq = 0;
	unsigned char *test_string = "write test";

	printk(KERN_INFO"%s: writing block\n", __func__);

	for (i = 0; i < ebcnt; ++i) {
		if (bbt[i])
			continue;
		if (i == target_block)
			break;
		normal_block_seq++;
	}

	err = lge_write_block(normal_block_seq, test_string, strlen(test_string));
	if (err) {
		printk(KERN_INFO"%s: write %u block fail\n", __func__, i);
		return err;
	}

	printk(KERN_INFO"%s: write %u block\n", __func__, i);

	return 0;
}
//[START]kcal for 325
static int write_lcd_k_cal(const char *val, struct kernel_param *kp)
{

	int i = 0;
	int err = 0; //                                            
	int mtd_op_result = 0;
	int mmc_scan_partion_result = 0;
	const MmcPartition *pMisc_part;
	unsigned long lcdkcal_bytes_pos_in_emmc = 0;
	static unsigned char lcd_buf2[6];

	memcpy(lcd_buf,val,LCD_K_CAL_SIZE);

#if 1
	for(i=0;i<LCD_K_CAL_SIZE;i++)
	{
		printk("write_lcd_k_cal :%x:\n",lcd_buf[i]);
	}
#endif

	mmc_scan_partion_result = lge_mmc_scan_partitions();
	if (mmc_scan_partion_result < 0)
	{
		printk(KERN_INFO"mmc_scan_fail\n");
		return 0;
	}
	pMisc_part = lge_mmc_find_partition_by_name("misc");
	if ( pMisc_part == NULL )
	{
		printk(KERN_INFO"NO MISC\n");
		return 0;
	}

	lcdkcal_bytes_pos_in_emmc = (pMisc_part->dfirstsec*512)+PTN_LCD_K_CAL_PARTITION;

	printk("write_lcd_k_cal %ld block\n", lcdkcal_bytes_pos_in_emmc);

	mtd_op_result = lge_write_block(lcdkcal_bytes_pos_in_emmc, lcd_buf, LCD_K_CAL_SIZE);

	if ( mtd_op_result != LCD_K_CAL_SIZE ) {
		printk("%s: write %u block fail\n", __func__, i);
		return err;
	}
	mtd_op_result = lge_read_block(lcdkcal_bytes_pos_in_emmc, &lcd_buf2[0], LCD_K_CAL_SIZE);
	if ( mtd_op_result != LCD_K_CAL_SIZE ) {
		printk("%s: write %u block fail\n", __func__, i);
		return err;
	}
#if 1
	for(i=0;i<LCD_K_CAL_SIZE;i++)
	{
		printk("read_lcd_k_cal :%x:\n",lcd_buf2[i]);
	}
#endif
	printk("write %d block\n", i);
	return 0;
}
static int test_write_block(const char *val, struct kernel_param *kp)
{
	int i;
	int err;
/* LGE_CHANGE_S [[email protected]] 2010-08-22, merge First Boot Complete Test from VS660 */
	unsigned char *test_string;
	unsigned long flag=0;
	// LGE_CHANGE [[email protected]] 2010-08-23, do something after cold boot
	struct diagcmd_dev *diagpdev;

	flag = simple_strtoul(val,NULL,10);
	if(5 == flag)
		test_string="FACT_RESET_5";
	else if(6 == flag)
		test_string="FACT_RESET_6";
	// LGE_CHANGE [[email protected]] 2010-09-04, for RTN and Factory reset
	else if (3 == flag)
		test_string="FACT_RESET_3";
	else
		return -1;
	
	test_init();
	test_erase_block();
	printk(KERN_INFO"%s: writing block: flag = %lu\n", __func__, flag);
/* LGE_CHANGE_E [[email protected]] 2010-08-22, merge First Boot Complete Test from VS660 */
	
	for (i = 0; i < ebcnt; i++) {
		if (bbt[i])
			continue;
		else
			break;
	}
#ifdef LGE_RETRY_MTD_DIRECT_ACCESS
	err = lge_retry_write_block(i, test_string, strlen(test_string));
#else
	err = lge_write_block(i, test_string, strlen(test_string));
#endif
	if (err) {
		printk(KERN_INFO"%s: write %u block fail\n", __func__, i);
		return err;
	}
	
	printk(KERN_INFO"%s: write %u block\n", __func__, i);
	
	// LGE_CHANGE [[email protected]] 2010-08-23, do something after cold boot
	if (flag == 5) {
		diagpdev = diagcmd_get_dev();	
		if (diagpdev != NULL) {
			update_diagcmd_state(diagpdev, "ADBSET", 0);
		}
	}
	
	return 0;
}
Example #7
0
//heebae.song for kcal
static int write_lcd_k_cal(const char *val, struct kernel_param *kp)
{

	int i = 0;
	int err;
	int mtd_op_result = 0;
	const MmcPartition *pMisc_part;
	unsigned long lcdkcal_bytes_pos_in_emmc = 0;
    unsigned char buf[10]={255,};
	
	memcpy(buf,val,10);

	lcd_buf[0] = lcdtest_ascii_to_int(buf[0]) * 100 + lcdtest_ascii_to_int(buf[1])*10 + lcdtest_ascii_to_int(buf[2]);
	lcd_buf[1] = lcdtest_ascii_to_int(buf[3]) * 100 + lcdtest_ascii_to_int(buf[4])*10 + lcdtest_ascii_to_int(buf[5]);
	lcd_buf[2] = lcdtest_ascii_to_int(buf[6]) * 100 + lcdtest_ascii_to_int(buf[7])*10 + lcdtest_ascii_to_int(buf[8]);
	lcd_buf[3]=0;
	lcd_buf[4]=111;
	lcd_buf[5]=222;
#if 1
		for(i=0;i<LCD_K_CAL_SIZE;i++)
		{
			printk("write_lcd_k_cal,  lcd_buf[%d] :%d:\n",i,lcd_buf[i]);
		}
#endif

	lge_mmc_scan_partitions();
	pMisc_part = lge_mmc_find_partition_by_name("misc");
	if ( pMisc_part == NULL )
	{
		printk(KERN_INFO"NO MISC\n");
		return 0;
	}

	lcdkcal_bytes_pos_in_emmc = (pMisc_part->dfirstsec*512)+K_CAL_DATA_OFFSET_IN_BYTES;

	printk("write_lcd_k_cal %ld block\n", lcdkcal_bytes_pos_in_emmc);

	mtd_op_result = lge_write_block(lcdkcal_bytes_pos_in_emmc, lcd_buf, LCD_K_CAL_SIZE);

	if ( mtd_op_result != LCD_K_CAL_SIZE ) {
		printk("%s: write %u block fail\n", __func__, i);
		return err;
	}
	printk("write %d block\n", i);
	return 0;
}
int lge_erase_block(int bytes_pos, size_t erase_size)
{
	unsigned char *erasebuf;
	unsigned written = 0;
	erasebuf = kmalloc(erase_size, GFP_KERNEL);
	// allocation exception handling
	if(!erasebuf)
	{
		printk("%s, allocation failed, expected size : %d\n", __func__, erase_size);
		return 0;
	}
	memset(erasebuf, 0xff, erase_size);
	written += lge_write_block(bytes_pos, erasebuf, erase_size);

	kfree(erasebuf);

	return written;
}
boolean writeBackUpNVdata( char * ram_start_address , unsigned int size)
{
int mtd_op_result = 0;
unsigned char *buf = (char *)ram_start_address;	
	
	
	 mtd_op_result = lge_write_block(srd_bytes_pos_in_emmc+(write_counter_sector*512), buf, size);
        if(mtd_op_result!= size)
        {
		return FALSE;
                   
        }

	 write_counter_sector =0;
//todo  ??  srd_bytes_pos_in_emmc=srd_bytes_pos_in_emmc +512   ,  app 에서는 info만 write ,,
	
	return TRUE;
	
}
static int test_bootcmd_write_block(const char *val, struct kernel_param *kp)
{

	int i = 0;
	int err = 0; /* mbhyun.kim 2013.01.22 : WBT ID 100709 */
	int mtd_op_result = 0;
	const MmcPartition *pMisc_part; 
	unsigned long bootcmd_bytes_pos_in_emmc = 0;
	struct bootloader_message boot;

	memset(&boot, 0, sizeof(boot));

	strlcpy(boot.command, "boot-recovery", sizeof(boot.command));
	strlcpy(boot.recovery, "recovery\n", sizeof(boot.recovery));
	
	printk(KERN_INFO"bootcmd write block\n");
	
	lge_mmc_scan_partitions();
	pMisc_part = lge_mmc_find_partition_by_name("misc");
	if ( pMisc_part == NULL )
	{
		printk(KERN_INFO"NO MISC\n");
		return 0;
	}

	bootcmd_bytes_pos_in_emmc = (pMisc_part->dfirstsec*512)+BOOTCMD_FLAG_OFFSET_IN_BYTES;

	printk(KERN_INFO"bootcmd writing block\n");

	mtd_op_result = lge_write_block(bootcmd_bytes_pos_in_emmc, (void *)&boot, sizeof(boot));
	if ( mtd_op_result != sizeof(boot) ) {
		printk(KERN_INFO"bootcmd %s: write %u block fail\n", __func__, i);
		return err;
	}

	printk(KERN_INFO"bootcmd write %d block\n", i);
	return 0;
}
static int test_write_block(const char *val, struct kernel_param *kp)
{
	int i = 0;
	//                               
	int err = 0;
	//int normal_block_seq = 0;
	int mtd_op_result = 0;
	const MmcPartition *pMisc_part;
	unsigned long factoryreset_bytes_pos_in_emmc = 0;
	unsigned long flag=0;

	unsigned char *test_string;

	test_string = kmalloc(FACTORY_RESET_STR_SIZE+2, GFP_KERNEL);
	// allocation exception handling
	if(!test_string)
	{
		printk(KERN_ERR "allocation failed, return\n");
		return 0;
	}

	printk(KERN_INFO"write block1\n");

	flag = simple_strtoul(val,NULL,10);
	sprintf(test_string,"FACT_RESET_%d\n", (char)flag);

	lge_mmc_scan_partitions();
	pMisc_part = lge_mmc_find_partition_by_name("misc");
	if ( pMisc_part == NULL )
	{
		printk(KERN_INFO"NO MISC\n");
		return 0;
	}

	factoryreset_bytes_pos_in_emmc = (pMisc_part->dfirstsec*512)+PTN_FRST_PERSIST_POSITION_IN_MISC_PARTITION;

	printk(KERN_INFO"writing block\n");

	mtd_op_result = lge_write_block(factoryreset_bytes_pos_in_emmc, test_string, FACTORY_RESET_STR_SIZE+2);
	if ( mtd_op_result != (FACTORY_RESET_STR_SIZE+2) ) {
		printk(KERN_INFO"%s: write %u block fail\n", __func__, i);
		kfree(test_string);
		return err;
	}

/*                                            */
/* ADD 0013860: [FACTORY RESET] ERI file save */
/* request rpc for eri file when the factory reset completes */
/* migrate eri codes to qem daemon */
#if 0 //                              
	if (flag == 5)
	{
		printk(KERN_INFO "%s, received flag : %ld, activate work queue\n", __func__, flag);
		eri_dload_data.flag = flag;
		queue_work(eri_dload_wq, &eri_dload_data.work);
	}
#endif
/*                                          */

	printk(KERN_INFO"write %d block\n", i);
	kfree(test_string);
	return 0;
}
Example #12
0
void remote_did_rpc(void)
{
	struct oem_rapi_client_streaming_func_arg arg;
	struct oem_rapi_client_streaming_func_ret ret;
	int rc= -1;
	
	//int file_size=0;
	char fs_err_buf[20];
	//test_mode_emmc_direct_type did_info;

	const MmcPartition *pMisc_part; 
	unsigned int did_bytes_pos_in_emmc ;
	 int mtd_op_result ;
	

	printk(KERN_ERR "%s, start OEM_RAPI\n",__func__);
	//memset(&did_info,0x0,sizeof(test_mode_emmc_direct_type));
	
	//memset(fs_err_buf, 0, sizeof(fs_err_buf));

	Open_check();

	arg.event = LG_FW_DID_BACKUP_REQUEST;
	arg.cb_func = NULL;
	arg.handle = (void*) 0;
	arg.in_len =  sizeof(fs_err_buf);
	arg.input =fs_err_buf;
	arg.out_len_valid = 1;
	arg.output_valid = 1;
	arg.output_size = sizeof(pbuf_emmc);

	ret.output = NULL;
	ret.out_len = NULL;

	rc = oem_rapi_client_streaming_function(client,&arg,&ret);

	if(ret.output == NULL || ret.out_len == NULL){ 
		printk(KERN_ERR "%s, output is NULL\n",__func__);
		return;
	}	

	printk(KERN_ERR "%s, output lenght =%dis\n",__func__,*ret.out_len);	
	//memcpy(&did_info, ret.output, *ret.out_len);
	memcpy((void *)&pbuf_emmc2[0], ret.output, 192);  //form modem  length =192

//===================== emmc wirte routine =======================
	printk(KERN_ERR "%s, lge_mmc_scan_partitions\n",__func__);  
	rc = lge_mmc_scan_partitions();
	if (rc < 0) {
		printk(KERN_ERR "%s couldn't scan the partition\n", __func__);
		return ;
	}

	pMisc_part = lge_mmc_find_partition_by_name("misc");
	printk(KERN_ERR "%s, lge_mmc_find_partition_by_name\n",__func__);  
	if (pMisc_part ==NULL)
	{
		if (ret.output)
		kfree(ret.output);
		if (ret.out_len)
		kfree(ret.out_len);
		return ; 
	}
	
	did_bytes_pos_in_emmc = (pMisc_part->dfirstsec)*512+0x300000;  //3M 
	memset((void *)pbuf_emmc, 0, sizeof(pbuf_emmc));  
	
	mtd_op_result = lge_read_block(did_bytes_pos_in_emmc, pbuf_emmc, 192);
	//printk(KERN_ERR "%s,lge_read_block\n",__func__);  
	//if(memcmp((void *)pbuf_emmc,(void *)ret.output, sizeof(pbuf_emmc)) != 0) 
	if(memcmp((void *)pbuf_emmc,(void *)pbuf_emmc2, sizeof(pbuf_emmc)) != 0) 
	{
	  //printk(KERN_ERR "%s,lge_write_block0\n",__func__);  
	  lge_write_block(did_bytes_pos_in_emmc, pbuf_emmc2, 192);	
	 // printk(KERN_ERR "%s,lge_write_block1\n",__func__);  
	}

//=============================================================			

/*                                            */
/* MOD 0014591: [LG_RAPI] rpc request heap leakage bug fix */
	// free received buffers if it is not empty
	if (ret.output)
		kfree(ret.output);
	if (ret.out_len)
		kfree(ret.out_len);
/*                                         */
	
	return;
}
static int test_write_block(const char *val, struct kernel_param *kp)
{

	int i;
	int err;
	//int normal_block_seq = 0;
	int mtd_op_result = 0;
	const MmcPartition *pMisc_part; 
	unsigned long factoryreset_bytes_pos_in_emmc = 0;
	unsigned long flag=0;

	unsigned char *test_string;

	test_string = kmalloc(FACTORY_RESET_STR_SIZE+2, GFP_KERNEL);
	// allocation exception handling
	if(!test_string)
	{
		printk(KERN_ERR "allocation failed, return\n");
		return 0;
	}
	
	printk(KERN_INFO"write block1\n");
	
	flag = simple_strtoul(val,NULL,10);
//	if (flag == 5 || flag == 6 )
//	{
/* BEGIN: 0014076 [email protected] 20110114 */
/* MOD 0014076: [FACTORY RESET] Android factory reset flag bug fix */
/* make sure to store only 13 bytes, string 11, flag 1, carriage 1 */
		//sprintf(test_string,"FACT_RESET_%d\n", flag);
		sprintf(test_string,"FACT_RESET_%d\n", (char)flag);
/* END: 0014076 [email protected] 20110114 */
//	} else {
//		kfree(test_string);
//		return -1;
//	}
	
	lge_mmc_scan_partitions();
	pMisc_part = lge_mmc_find_partition_by_name("misc");
	if ( pMisc_part == NULL )
	{
	
		printk(KERN_INFO"NO MISC\n");
		return 0;
	}
	
	factoryreset_bytes_pos_in_emmc = (pMisc_part->dfirstsec*512)+PTN_FRST_PERSIST_POSITION_IN_MISC_PARTITION;


	printk(KERN_INFO"writing block\n");


	mtd_op_result = lge_write_block(factoryreset_bytes_pos_in_emmc, test_string, FACTORY_RESET_STR_SIZE+2);
	if ( mtd_op_result != (FACTORY_RESET_STR_SIZE+2) ) {
		printk(KERN_INFO"%s: write %u block fail\n", __func__, i);
		kfree(test_string);		
		return err;
	}

/* BEGIN: 0013860 [email protected] 20110111 */
/* ADD 0013860: [FACTORY RESET] ERI file save */
/* request rpc for eri file when the factory reset completes */
#ifdef CONFIG_LGE_ERI_DOWNLOAD
	if (flag == 5)
	{
		printk(KERN_INFO "%s, received flag : %ld, activate work queue\n", __func__, flag);
		eri_dload_data.flag = flag;
		queue_work(eri_dload_wq, &eri_dload_data.work);
	}
#endif
/* END: 0013860 [email protected] 20110111 */

	printk(KERN_INFO"write %d block\n", i);
	kfree(test_string);
	return 0;
}
int lge_retry_write_block(int ebnum, unsigned char *buf, size_t size)
{
	int retry_cnt = 0;
	int err = 0;
	unsigned char preadback_buf[2048];

	err = lge_write_block(ebnum, buf, size);

	if(err != 0)
	{
		printk(KERN_ERR "%s: lge_write_block() failed, error num = %d \n", __func__, err);

		for(retry_cnt=0; retry_cnt<5; retry_cnt++)
		{
			err = lge_retry_erase_block(ebnum);
			if(err!=0)
			{
				printk(KERN_ERR "%s: lge_retry_erase_block() failed, error num = %d \n", __func__, err);
			}
			else
			{
				err = lge_write_block(ebnum, buf, size);						
				if(err!=0)
				{
					printk(KERN_ERR "%s: lge_write_block() failed, error num = %d, retry count = %d \n", 
																					__func__, err, retry_cnt);
					continue;
				}
				else
				{
					memset((void*)preadback_buf, 0, sizeof(preadback_buf));
					err = lge_read_block(ebnum, preadback_buf);
					if(err!=0)
					{
						printk(KERN_ERR "%s: lge_read_block() failed, error num = %d, retry count = %d \n", 
																						__func__, err, retry_cnt);
						continue;
					}
					else
					{
						if(memcmp(preadback_buf, FACTORY_RESET_STR, FACTORY_RESET_STR_SIZE) == 0) // tag read sucess
						{
							printk(KERN_ERR "%s: lge_read_block() succeeded read back, error num = %d, retry count = %d \n",
																						__func__, err, retry_cnt);
							break;
						}
						else
						{
							printk(KERN_ERR "%s: lge_read_block() failed read back, error num = %d, retry count = %d \n",
																						__func__, err, retry_cnt);
							continue;
						}
					}
				}
			}
		}
	}
	else
	{
		printk(KERN_ERR "%s: lge_write_block() succeeded, error num = %d \n", __func__, err);
		
		memset((void*)preadback_buf, 0, sizeof(preadback_buf));
		err = lge_read_block(ebnum, preadback_buf);
		if(err!=0)
		{
			printk(KERN_ERR "%s: lge_read_block() failed, error num = %d \n", __func__, err);

			for(retry_cnt=0; retry_cnt<5; retry_cnt++)
			{
				err = lge_retry_erase_block(ebnum);
				if(err!=0)
				{
					printk(KERN_ERR "%s: lge_retry_erase_block() failed, error num = %d \n", __func__, err);
				}
				else
				{
					err = lge_write_block(ebnum, buf, size);						
					if(err!=0)
					{
						printk(KERN_ERR "%s: lge_write_block() failed, error num = %d, retry count = %d \n", 
																						__func__, err, retry_cnt);
						continue;					
					}
					else
					{
						memset((void*)preadback_buf, 0, sizeof(preadback_buf));
						err = lge_read_block(ebnum, preadback_buf);
						if(err!=0)
						{
							printk(KERN_ERR "%s: lge_read_block() failed, error num = %d, retry count = %d \n", 
																							__func__, err, retry_cnt);
							continue;
						}
						else
						{
							if(memcmp(preadback_buf, FACTORY_RESET_STR, FACTORY_RESET_STR_SIZE) == 0) // tag read sucess
							{
								printk(KERN_ERR "%s: lge_read_block() succeeded read back, error num = %d, retry count = %d \n",
																							__func__, err, retry_cnt);
								break;
							}
							else
							{
								printk(KERN_ERR "%s: lge_read_block() failed read back, error num = %d, retry count = %d \n",
																							__func__, err, retry_cnt);
								continue;
							}
						}
					}
				}
			}
		}
		else
		{
			printk(KERN_ERR "%s: lge_read_block() succeeded, error num = %d \n", __func__, err);
			if(memcmp(preadback_buf, FACTORY_RESET_STR, FACTORY_RESET_STR_SIZE) == 0) // tag read sucess
			{
				printk(KERN_ERR "%s: lge_read_block() succeeded read back, error num = %d \n", __func__, err);
			}
			else
			{
				printk(KERN_ERR "%s: lge_read_block() failed, error num = %d \n", __func__, err);
				
				for(retry_cnt=0; retry_cnt<5; retry_cnt++)
				{
					err = lge_retry_erase_block(ebnum);
					if(err!=0)
					{
						printk(KERN_ERR "%s: lge_retry_erase_block() failed, error num = %d \n", __func__, err);
					}
					else
					{
						err = lge_write_block(ebnum, buf, size);						
						if(err!=0)
						{
							printk(KERN_ERR "%s: lge_write_block() failed, error num = %d, retry count = %d \n", 
																							__func__, err, retry_cnt);
							continue;					
						}
						else
						{
							memset((void*)preadback_buf, 0, sizeof(preadback_buf));
							err = lge_read_block(ebnum, preadback_buf);
							if(err!=0)
							{
								printk(KERN_ERR "%s: lge_read_block() failed, error num = %d, retry count = %d \n", 
																								__func__, err, retry_cnt);
								continue;
							}
							else
							{
								if(memcmp(preadback_buf, FACTORY_RESET_STR, FACTORY_RESET_STR_SIZE) == 0) // tag read sucess
								{
									printk(KERN_ERR "%s: lge_read_block() succeeded read back, error num = %d, retry count = %d \n",
																								__func__, err, retry_cnt);
									break;
								}
								else
								{
									printk(KERN_ERR "%s: lge_read_block() failed read back, error num = %d, retry count = %d \n",
																								__func__, err, retry_cnt);
									continue;
								}
							}
						}
					}
				}
			}
		}
	}

	return err;
}
Example #15
0
void remote_did_rpc(void)
{
	struct oem_rapi_client_streaming_func_arg arg;
	struct oem_rapi_client_streaming_func_ret ret;
	int rc= -1;

	char fs_err_buf[20];

	const MmcPartition *pMisc_part; 
	unsigned int did_bytes_pos_in_emmc ;
	 int mtd_op_result ;
	

	printk(KERN_ERR "%s, start OEM_RAPI\n",__func__);

	Open_check();

		arg.event = LG_FW_DID_BACKUP_REQUEST;
		arg.cb_func = NULL;
		arg.handle = (void*) 0;
		arg.in_len =  sizeof(fs_err_buf);
		arg.input =fs_err_buf;
		arg.out_len_valid = 1;
		arg.output_valid = 1;
		arg.output_size = sizeof(pbuf_emmc);

		ret.output = NULL;
		ret.out_len = NULL;

		rc = oem_rapi_client_streaming_function(client,&arg,&ret);

	if(ret.output == NULL || ret.out_len == NULL){ 
		printk(KERN_ERR "%s, output is NULL\n",__func__);
		return;
	}	

	
	printk(KERN_ERR "%s, output lenght =%dis\n",__func__,*ret.out_len);	

	memcpy((void *)&pbuf_emmc2[0], ret.output, 192);  //form modem  length =192

	printk(KERN_ERR "%s, lge_mmc_scan_partitions\n",__func__);  
	lge_mmc_scan_partitions();
	pMisc_part = lge_mmc_find_partition_by_name("misc");
	printk(KERN_ERR "%s, lge_mmc_find_partition_by_name\n",__func__);  
	if (pMisc_part ==NULL)
	{
		if (ret.output)
		kfree(ret.output);
		if (ret.out_len)
		kfree(ret.out_len);
		return ; 
	}
	
	did_bytes_pos_in_emmc = (pMisc_part->dfirstsec)*512+0x300000;
	memset((void *)pbuf_emmc, 0, sizeof(pbuf_emmc));  
	
	mtd_op_result = lge_read_block(did_bytes_pos_in_emmc, pbuf_emmc, 192);
	if(memcmp((void *)pbuf_emmc,(void *)pbuf_emmc2, sizeof(pbuf_emmc)) != 0) 
	{
	  lge_write_block(did_bytes_pos_in_emmc, pbuf_emmc2, 192);
	}

	if (ret.output)
		kfree(ret.output);
	if (ret.out_len)
		kfree(ret.out_len);
	
	return;
}