[Feature][ZXW-241]merge P56U01 version

Only Configure: No
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: Yes
Doc Update: No

Change-Id: I7985538dde6951dd824c36149bf9a1e3ca23c734
diff --git a/ap/os/linux/linux-3.4.x/drivers/cpko/cpko_main.c b/ap/os/linux/linux-3.4.x/drivers/cpko/cpko_main.c
index 7a9c22c..341d668 100755
--- a/ap/os/linux/linux-3.4.x/drivers/cpko/cpko_main.c
+++ b/ap/os/linux/linux-3.4.x/drivers/cpko/cpko_main.c
@@ -77,36 +77,37 @@
 extern SINT32 zDrvVp_AudioDataWrite(const VOID*pBuf,UINT32 uiLen);extern SINT32 
 zDrvVp_AudioDataOpen(UINT32 audioType,UINT32 sampleRate);extern SINT32 
 zDrvVp_AudioDataClose(void);extern SINT32 zDrvVp_GetVpLoop_Wrap(VOID);extern 
-VOID zDrvVp_Status(UINT32*sample_rate,UINT32*voice_status);typedef struct 
-cpko_section{unsigned int cpko_text_start;unsigned int cpko_rodata_start;
-unsigned int __utran_modem_text_start;unsigned int __lte_modem_text_start;
-unsigned int __comm_modem_text_start;unsigned int modem_text_end;unsigned int 
-cpko_data_start;unsigned int cpko_bss_start;unsigned int cpko_text_offset;}
-cpko_section_layout;cpko_section_layout cpko_ps_section;int raise(int signo){
-return(0x404+8970-0x270e);}extern unsigned int SysEntry(void);static int 
-ko_Main_Thread(void*data){struct sched_param param={.sched_priority=
-MAX_USER_RT_PRIO/(0xafb+4511-0x1c98)-(0x1633+3815-0x2517)};int ret=
-(0x1f43+402-0x20d5);sched_setscheduler(current,SCHED_FIFO,&param);ret=SysEntry()
-;if(ret!=(0x10b8+3966-0x2036))panic("Main_Thread\n");param.sched_priority=
-MAX_USER_RT_PRIO-(0xfb3+2852-0x1aa9);sched_setscheduler(kthreadd_task,SCHED_FIFO
-,&param);return(0xaa6+6401-0x23a7);}int zte_modem_ko_start(void){kthread_run(
-ko_Main_Thread,NULL,"\x5a\x54\x45\x4d\x61\x69\x6e\x54\x68\x72\x65\x61\x64");
-return(0x8b9+1955-0x105c);}static void cpko_sectioninfo_set(void){int ret;struct
- file*fp;mm_segment_t old_fs;loff_t cpko_pos=(0x6ed+5503-0x1c6c);struct 
+VOID zDrvVp_Status(UINT32*sample_rate,UINT32*voice_status);extern VOID 
+zDrvVp_UpdateVoiceNv(UINT8*voice_nv_update);typedef struct cpko_section{unsigned
+ int cpko_text_start;unsigned int cpko_rodata_start;unsigned int 
+__utran_modem_text_start;unsigned int __lte_modem_text_start;unsigned int 
+__comm_modem_text_start;unsigned int modem_text_end;unsigned int cpko_data_start
+;unsigned int cpko_bss_start;unsigned int cpko_text_offset;}cpko_section_layout;
+cpko_section_layout cpko_ps_section;int raise(int signo){return(0x6ed+448-0x8ad)
+;}extern unsigned int SysEntry(void);static int ko_Main_Thread(void*data){struct
+ sched_param param={.sched_priority=MAX_USER_RT_PRIO/(0x81a+3335-0x151f)-
+(0x931+4823-0x1c05)};int ret=(0x138+9138-0x24ea);sched_setscheduler(current,
+SCHED_FIFO,&param);ret=SysEntry();if(ret!=(0x4c9+1313-0x9ea))panic(
+"Main_Thread\n");param.sched_priority=MAX_USER_RT_PRIO-(0x7a1+7631-0x2542);
+sched_setscheduler(kthreadd_task,SCHED_FIFO,&param);return(0x1239+1857-0x197a);}
+int zte_modem_ko_start(void){kthread_run(ko_Main_Thread,NULL,
+"\x5a\x54\x45\x4d\x61\x69\x6e\x54\x68\x72\x65\x61\x64");return
+(0x1050+3114-0x1c7a);}static void cpko_sectioninfo_set(void){int ret;struct file
+*fp;mm_segment_t old_fs;loff_t cpko_pos=(0x160b+1733-0x1cd0);struct 
 cpps_globalModem globalVar;fp=filp_open(
 "\x2f\x6c\x69\x62\x2f\x63\x70\x6b\x6f\x2f\x63\x70\x6b\x6f\x5f\x73\x65\x63\x69\x6e\x66\x6f\x2e\x62\x69\x6e"
-,(0xf28+2571-0x1933),(0xa59+1171-0xeec));if(IS_ERR(fp)||fp==NULL)panic(
+,(0xd6c+3198-0x19ea),(0x655+5701-0x1c9a));if(IS_ERR(fp)||fp==NULL)panic(
 "\x6f\x70\x65\x6e\x20\x66\x69\x6c\x65\x20\x65\x72\x72\x6f\x72" "\n");old_fs=
 get_fs();set_fs(KERNEL_DS);ret=vfs_read(fp,(char*)&cpko_ps_section,sizeof(
-cpko_section_layout),&cpko_pos);if(ret<=(0x304+3756-0x11b0))panic(
+cpko_section_layout),&cpko_pos);if(ret<=(0x235f+23-0x2376))panic(
 "\x72\x65\x61\x64\x20\x66\x69\x6c\x65\x20\x65\x72\x72\x6f\x72" "\n");filp_close(
 fp,NULL);
 #ifdef CONFIG_MODEM_CODE_IS_MAPPING
 fp=filp_open(
 "\x2f\x6c\x69\x62\x2f\x63\x70\x6b\x6f\x2f\x63\x70\x6b\x6f\x2e\x6b\x6f",
-(0x1019+4563-0x21ec),(0x1cf2+1837-0x241f));if(IS_ERR(fp)||fp==NULL)panic(
+(0x940+3724-0x17cc),(0xb2a+3215-0x17b9));if(IS_ERR(fp)||fp==NULL)panic(
 "\x6f\x70\x65\x6e\x20\x66\x69\x6c\x65\x20\x65\x72\x72\x6f\x72" "\n");fp->f_ra.
-ra_pages=(0x53f+4485-0x16c4);
+ra_pages=(0x15a8+769-0x18a9);
 #endif
 if(cpko_ps_section.cpko_text_start){globalVar.cpko_text_start=(unsigned long)
 cpko_ps_section.cpko_text_start;globalVar.cpko_rodata_start=(unsigned long)
@@ -126,7 +127,7 @@
 vfree_modem_section(globalVar.cpko_text_start,globalVar.modem_text_end);
 #endif
 }else panic("\x66\x69\x6c\x65\x20\x65\x72\x72\x6f\x72" "\n");}static int 
-cpko_start(void){struct cpps_callbacks callback={(0x913+4588-0x1aff)};callback.
+cpko_start(void){struct cpps_callbacks callback={(0x66f+4526-0x181d)};callback.
 zOss_ResetNVFactory=zOss_ResetNVFactory;callback.zOss_NvramFlush=zOss_NvramFlush
 ;callback.zOss_NvItemWrite=zOss_NvItemWrite;callback.zOss_NvItemWriteFactory=
 zOss_NvItemWriteFactory;callback.zOss_NvItemRead=zOss_NvItemRead;callback.
@@ -190,7 +191,8 @@
 mmp_AmrDecClose;callback.mmp_AmrEncClose=mmp_AmrEncClose;callback.
 zDrvVp_AudioDataOpen=zDrvVp_AudioDataOpen;callback.zDrvVp_AudioDataWrite=
 zDrvVp_AudioDataWrite;callback.zDrvVp_AudioDataClose=zDrvVp_AudioDataClose;
-callback.zDrvVp_Status=zDrvVp_Status;
+callback.zDrvVp_Status=zDrvVp_Status;callback.zDrvVp_UpdateVoiceNv=
+zDrvVp_UpdateVoiceNv;
 #endif	
 callback.psm_ModemDevSleep=psm_ModemDevSleep;callback.psm_ModemSleepCheck=
 psm_ModemSleepCheck;callback.psm_ModemSleepTimeGet=psm_ModemSleepTimeGet;
@@ -198,5 +200,5 @@
 psm_GetModemSleepFlagStatus=psm_GetModemSleepFlagStatus;
 #endif
 cpps_callbacks_register(&callback);cpko_sectioninfo_set();zte_modem_ko_start();
-return(0xb43+4520-0x1ceb);}static int cpko_stop(void){return(0x20cd+460-0x2299);
-}module_init(cpko_start);module_exit(cpko_stop);
+return(0x1a6d+2639-0x24bc);}static int cpko_stop(void){return(0x62+561-0x293);}
+module_init(cpko_start);module_exit(cpko_stop);
diff --git a/ap/os/linux/linux-3.4.x/drivers/mfd/zx234290-regulator-wrapper.c b/ap/os/linux/linux-3.4.x/drivers/mfd/zx234290-regulator-wrapper.c
index c5d99db..f6bf3c4 100755
--- a/ap/os/linux/linux-3.4.x/drivers/mfd/zx234290-regulator-wrapper.c
+++ b/ap/os/linux/linux-3.4.x/drivers/mfd/zx234290-regulator-wrapper.c
@@ -157,13 +157,13 @@
     //zx234290_set_buck4_sleep_mode(BUCK234_SLP_SHUTDOWN);   /*PA 3V6*/

     //zx234290_set_ldo1_sleep_mode(LDOA_SLP_SHUTDOWN);       /*USB 0V9*/

     //zx234290_set_ldo5_sleep_mode(LDOA_SLP_SHUTDOWN);       /*USB 3V3*/

-	zx234290_set_ldo2_sleep_mode(LDOA_SLP_ECO_VOLT_SLP);    /*io1.8v/mcp1.8v/sd01.8v*/

-	zx234290_set_ldo3_sleep_mode(LDOA_SLP_ECO_VOLT_SLP);	/*vp111.8v/vddr_pll1.8v/*/

+	zx234290_set_ldo2_sleep_mode(LDOA_SLP_ECO_VOLT);    /*io1.8v/mcp1.8v/sd01.8v*/

+	zx234290_set_ldo3_sleep_mode(LDOA_SLP_ECO_VOLT);	/*vp111.8v/vddr_pll1.8v/*/

 	zx234290_set_ldo4_sleep_mode(LDOA_SLP_SHUTDOWN);		/*vcxo*/

     //zx234290_set_ldo6_sleep_mode(LDOA_SLP_SHUTDOWN);       /*SIM1 1V8*/

-    zx234290_set_ldo7_sleep_mode(LDOA_SLP_ECO_VOLT_SLP);  /*RF 2V85 -- 26M */

-    zx234290_set_ldo8_sleep_mode(LDOA_SLP_ECO_VOLT_SLP);       /*ZSP JTAG/SD 2V85/LCD*/

-    zx234290_set_ldo9_sleep_mode(LDOA_SLP_ECO_VOLT_SLP);       /*PLL 0V9*/

+    zx234290_set_ldo7_sleep_mode(LDOA_SLP_ECO_VOLT);  /*RF -- 26M */

+    zx234290_set_ldo8_sleep_mode(LDOA_SLP_ECO_VOLT);       /*ZSP JTAG/SD 2V85/LCD*/

+    zx234290_set_ldo9_sleep_mode(LDOA_SLP_ECO_VOLT);       /*PLL 0V9*/

     //zx234290_set_ldo10_sleep_mode(LDOA_SLP_SHUTDOWN);      /*ABB DIG*/

 

 	return 0;

@@ -191,9 +191,16 @@
 	ret += zDrvZx234290_DischargerConfig();

 

 	//zDrvZx234290_SleepConfig();

+#ifdef _USE_VEHICLE_DC	

+	ret += zx234290_SetTllpToDo(LLP_RESTART);

+	ret += zx234290_SetLlpTime(LLP_TIME_6S);

 

-    ret += zx234290_SetLlpEnable(LLP_ENABLE);

+#else

     ret += zx234290_SetTllpToDo(LLP_SHUTDOWN);

+	ret += zx234290_SetLlpTime(LLP_TIME_10S);

+#endif

+	ret += zx234290_SetLlpEnable(LLP_ENABLE);

+

    // ret += zx234290_SetRestartDly(LLP_DLY_500MS);  //LLP_DLY_250MS 

     if(ret != 0)

 	{

diff --git a/ap/os/linux/linux-3.4.x/drivers/mmc/host/zx29_mmc.c b/ap/os/linux/linux-3.4.x/drivers/mmc/host/zx29_mmc.c
index 425d6a7..4724b88 100755
--- a/ap/os/linux/linux-3.4.x/drivers/mmc/host/zx29_mmc.c
+++ b/ap/os/linux/linux-3.4.x/drivers/mmc/host/zx29_mmc.c
@@ -40,7 +40,7 @@
 
 #include <linux/sched.h>
 #include <linux/kthread.h>
-
+#include <linux/ramdump/ramdump.h>
 
 #include <mach/zx29_mmc.h>
 #include "mmc_xlog.h"
@@ -4020,9 +4020,9 @@
 
 #if (defined CONFIG_ARCH_ZX297520V2)||(defined CONFIG_ARCH_ZX297520V3)
 	if (host->host_id == 0){
-		ramdump_ram_conf_table_add("sd0_reg_0x01210000.bin", 0x01210000, 0x110, (unsigned long)host->regs, 0, 0);
+		ramdump_ram_conf_table_add("sd0_reg_0x01210000.bin", 0x01210000, 0x110, (unsigned long)host->regs, RAMDUMP_FLAG_LEVEL_MEDIUM, 0);
 	}else{
-		ramdump_ram_conf_table_add("sd1_reg_0x01211000.bin", 0x01211000, 0x110, (unsigned long)host->regs, 0, 0);
+		ramdump_ram_conf_table_add("sd1_reg_0x01211000.bin", 0x01211000, 0x110, (unsigned long)host->regs, RAMDUMP_FLAG_LEVEL_MEDIUM, 0);
 	}
 #endif
 
diff --git a/ap/os/linux/linux-3.4.x/drivers/net/psnet/psnet_dev.c b/ap/os/linux/linux-3.4.x/drivers/net/psnet/psnet_dev.c
index 09a1b2b..f47694b 100755
--- a/ap/os/linux/linux-3.4.x/drivers/net/psnet/psnet_dev.c
+++ b/ap/os/linux/linux-3.4.x/drivers/net/psnet/psnet_dev.c
@@ -271,6 +271,7 @@
 	buff = buff + sizeof(struct in6_addr);
 	memcpy(&g_ipv4_local_subnet, buff, sizeof(struct in_addr));
 	g_xlat_dev = dev_get_by_name(&init_net, dev_name);
+	return 0;
 }
 
 int fill_ip_header(struct iphdr *ip, const struct ipv6hdr *old_header) {
diff --git a/ap/os/linux/linux-3.4.x/drivers/net/psnet/psnet_io.c b/ap/os/linux/linux-3.4.x/drivers/net/psnet/psnet_io.c
index 7033685..b5ffada 100755
--- a/ap/os/linux/linux-3.4.x/drivers/net/psnet/psnet_io.c
+++ b/ap/os/linux/linux-3.4.x/drivers/net/psnet/psnet_io.c
@@ -12,8 +12,7 @@
 #include <net/ipv6.h>
 #include <net/protocol.h>
 #include <net/ndisc.h>
-
-extern struct psnet *global_psnet[DDR_DEV_MAX];
+#include <linux/netdevice.h>
 
 #define ZATI2_DATA_CHANNEL_ID_NUM_START		(CHANNEL_AP2PS_MAXID)//+1
 #define ZATI2_DATA_CHANNEL_BASE 90
@@ -70,6 +69,14 @@
 	struct in6_addr nd_opt_pi_prefix;
 };
 
+struct nd_opt_mtu_info     /* mtu information */
+{
+	uint8_t   nd_opt_mi_type;
+	uint8_t   nd_opt_mi_len;
+	uint16_t  nd_opt_mi_reserved2;
+	uint32_t  nd_opt_mi_mtu;
+};
+
 struct psnet_RA_info
 {
 	unsigned int flag;
@@ -85,6 +92,10 @@
 extern int zAti2_IsExCid(unsigned char cid, unsigned char *pcid);
 struct psnet_RA_info g_psnet_ipv6_prefix[DDR_DEV_MAX] = {0};
 
+int ra_mtu_enable;
+module_param(ra_mtu_enable, int, 0644);
+extern struct psnet *global_psnet[DDR_DEV_MAX];
+
 void psnet_parse_RA_pkt(unsigned char cid, unsigned char* pkt, int len)
 {
 	//warn("cid=%d flag=%d\n", cid, g_psnet_ipv6_prefix[cid-1].flag);
@@ -130,7 +141,17 @@
 					g_psnet_ipv6_prefix[ext_cid-1].flag = 1;
 					up(&g_psnet_ipv6_prefix[ext_cid-1].sem);
 					warn("cid=%d prefix_len=%d\n", ext_cid, pinfo->nd_opt_pi_prefix_len);
-					return;
+					//return;
+				}
+				if((nd_opt->nd_opt_type) == ND_OPT_MTU){
+					if(ra_mtu_enable) {
+						int err;
+						struct nd_opt_mtu_info *minfo = (struct nd_opt_mtu_info *)nd_opt;
+						warn("mtu: %u, dev: %s\n", ntohl(minfo->nd_opt_mi_mtu), global_psnet[cid-1]->net->name);
+						err = dev_set_mtu(global_psnet[cid-1]->net, ntohl(minfo->nd_opt_mi_mtu));
+						warn("err: %d", err);
+					}					
+					//return;
 				}
 				opt_len -= l;
 				nd_opt = ((void *)nd_opt) + l;
diff --git a/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/Makefile b/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/Makefile
index 7caf507..1a5c814 100755
--- a/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/Makefile
+++ b/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/Makefile
@@ -152,6 +152,7 @@
 CONFIG_TXRX_THREAD_PRIO = y
 CONFIG_DPD = y
 CONFIG_FORCE_DPD_CALIB = y
+CONFIG_TEMP_PW = y
 
 # Support of MU-MIMO transmission (need FW support)
 ifeq ($(CONFIG_RWNX_BFMER), y)
@@ -267,6 +268,7 @@
 ccflags-$(CONFIG_TXRX_THREAD_PRIO) += -DCONFIG_TXRX_THREAD_PRIO
 ccflags-$(CONFIG_DPD)  += -DCONFIG_DPD
 ccflags-$(CONFIG_FORCE_DPD_CALIB) += -DCONFIG_FORCE_DPD_CALIB -DCONFIG_DPD
+ccflags-$(CONFIG_TEMP_PW) += -DCONFIG_TEMP_PW
 
 ifeq ($(CONFIG_LESS_SKB), y)
 ccflags-y += -DLESS_SKB
diff --git a/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/aicwf_sdio.c b/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/aicwf_sdio.c
index a9c7fb5..d300096 100755
--- a/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/aicwf_sdio.c
+++ b/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/aicwf_sdio.c
@@ -334,11 +334,13 @@
     struct aic_sdio_dev *sdiodev = NULL;
 
     sdio_dbg("%s\n", __func__);
+#ifdef CONFIG_TEMP_PW
 	if (timer_pending(&g_rwnx_plat->sdiodev->tp_timer)) {
 		printk("%s del_timer\n", __func__);
 		del_timer_sync(&g_rwnx_plat->sdiodev->tp_timer);
 	}
 	cancel_work_sync(&g_rwnx_plat->sdiodev->tp_work);
+#endif
     host = func->card->host;
     host->caps &= ~MMC_CAP_NONREMOVABLE;
     bus_if = dev_get_drvdata(&func->dev);
@@ -1835,50 +1837,9 @@
     sdio_release_host(sdiodev->func);
 }
 
+#ifdef CONFIG_TEMP_PW
 extern void set_txpwr_ctrl(struct aic_sdio_dev *sdiodev, s8_l value);
-#if 0
-static void set_txpwr_ctrl(struct aic_sdio_dev *sdiodev, s8_l value)
-{
-	nvram_info.txpwr_loss.loss_enable = 1;
-	if (value > TEMP_THD_1 && value <= TEMP_THD_2) {
-		if (sdiodev->range == 0) {
-			nvram_info.txpwr_loss.loss_value += -TEMP_STEP_1;
-			sdiodev.range = 1;
-			rwnx_send_txpwr_lvl_req(sdiodev->rwnx_hw);
-		} else if (sdiodev->range == 1) {
-			continue;
-		} else if (sdiodev->range == 2) {
-			nvram_info.txpwr_loss.loss_value += TEMP_STEP_1;
-			sdiodev.range = 1;
-			rwnx_send_txpwr_lvl_req(sdiodev->rwnx_hw);
-		}
-	} else if (value > TEMP_THD_2) {
-		if (sdiodev->range == 0) {
-			nvram_info.txpwr_loss.loss_value += -TEMP_STEP_2;
-			sdiodev.range = 2;
-			rwnx_send_txpwr_lvl_req(sdiodev->rwnx_hw);
-		} else if (sdiodev->range == 1) {
-			nvram_info.txpwr_loss.loss_value += -TEMP_STEP_1;
-			sdiodev.range = 2;
-			rwnx_send_txpwr_lvl_req(sdiodev->rwnx_hw);
-		} else {
-			continue;
-		}
-	} else {
-		if (sdiodev->range == 0) {
-			continue;
-		} else if (sdiodev->range == 1) {
-			nvram_info.txpwr_loss.loss_value += TEMP_STEP_1;
-			sdiodev.range = 0;
-			rwnx_send_txpwr_lvl_req(sdiodev->rwnx_hw);
-		} else if (sdiodev->range == 2) {
-			nvram_info.txpwr_loss.loss_value += TEMP_STEP_2;
-			sdiodev.range = 0;
-			rwnx_send_txpwr_lvl_req(sdiodev->rwnx_hw);
-		}
-	}
-}
-#endif
+
 void aicwf_temp_worker(struct work_struct *work)
 {
 	struct rwnx_hw *rwnx_hw;
@@ -1904,6 +1865,7 @@
 		schedule_work(&sdiodev->tp_work);
 	return;
 }
+#endif
 void *aicwf_sdio_bus_init(struct aic_sdio_dev *sdiodev)
 {
     int ret;
@@ -1947,6 +1909,7 @@
     init_waitqueue_head(&tx_priv->cmd_txdone_wait);
     atomic_set(&tx_priv->tx_pktcnt, 0);
 
+#ifdef CONFIG_TEMP_PW
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0)
 		init_timer(&sdiodev->tp_timer);
 		sdiodev->tp_timer.data = (ulong) sdiodev;
@@ -1958,6 +1921,7 @@
 		INIT_WORK(&sdiodev->tp_work, aicwf_temp_worker);
 		mod_timer(&sdiodev->tp_timer, jiffies + msecs_to_jiffies(10 * 1000));
 		sdiodev->range = 0;
+#endif
 #if defined(CONFIG_SDIO_PWRCTRL)
 #if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
     init_timer(&sdiodev->timer);
diff --git a/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/aicwf_sdio.h b/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/aicwf_sdio.h
index 9a10cd4..fd98dcc 100755
--- a/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/aicwf_sdio.h
+++ b/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/aicwf_sdio.h
@@ -84,9 +84,11 @@
     u8 flowctrl;
     spinlock_t tx_flow_lock;
 #endif
+#ifdef CONFIG_TEMP_PW
 	struct timer_list tp_timer;
 	struct work_struct tp_work;
 	u8 range;
+#endif
     #if defined(CONFIG_SDIO_PWRCTRL)
     //for sdio pwr ctrl
     struct timer_list timer;
@@ -100,7 +102,9 @@
 int aicwf_sdio_writeb(struct aic_sdio_dev *sdiodev, uint regaddr, u8 val);
 void aicwf_sdio_hal_irqhandler(struct sdio_func *func);
 void aicwf_sdio_hal_irqhandler_func2(struct sdio_func *func);
+#ifdef CONFIG_TEMP_PW
 void aicwf_temp_worker(struct work_struct *work);
+#endif
 
 #if defined(CONFIG_SDIO_PWRCTRL)
 void aicwf_sdio_pwrctl_timer(struct aic_sdio_dev *sdiodev, uint duration);
diff --git a/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/rwnx_platform.c b/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/rwnx_platform.c
index e1703a4..ea9abb7 100755
--- a/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/rwnx_platform.c
+++ b/ap/os/linux/linux-3.4.x/drivers/net/wireless/aic8800/rwnx_platform.c
@@ -110,13 +110,9 @@
     },
 };
 
-extern u8 chip_id;
+#ifdef CONFIG_TEMP_PW
 void set_txpwr_ctrl(struct aic_sdio_dev *sdiodev, s8_l value)
 {
-	if (!IS_CHIP_ID_H()) {
-		printk("%s  !h\n", __func__);
-		return;
-	}
 	nvram_info.txpwr_loss.loss_enable = 1;
 	if (value > TEMP_THD_1 && value <= TEMP_THD_2) {
 		if (sdiodev->range == 0) {
@@ -157,6 +153,7 @@
 	}
 	return;
 }
+#endif
 
 #ifdef VENDOR_SPECIFIED_FW_PATH
 int rwnx_load_firmware(u32 **fw_buf, const char *name, struct device *device)
@@ -802,7 +799,7 @@
 void set_txpwr_loss_ofst(s8_l value)
 {
     nvram_info.txpwr_loss.loss_enable = 1;
-    nvram_info.txpwr_loss.loss_value += value;
+    nvram_info.txpwr_loss.loss_value = value;
     printk("%s:value:%d\r\n",      __func__, value);
 }
 void get_userconfig_txpwr_ofst(txpwr_ofst_conf_t *txpwr_ofst)
diff --git a/ap/os/linux/linux-3.4.x/drivers/net/wireless/ssv6x5x/smac/dev.c b/ap/os/linux/linux-3.4.x/drivers/net/wireless/ssv6x5x/smac/dev.c
index 64335ed..38c1bc9 100755
--- a/ap/os/linux/linux-3.4.x/drivers/net/wireless/ssv6x5x/smac/dev.c
+++ b/ap/os/linux/linux-3.4.x/drivers/net/wireless/ssv6x5x/smac/dev.c
@@ -1089,6 +1089,8 @@
 	    if (sta) {
 	        if (ssv6xxx_compare_ether_addr(hdr->addr1, sta->addr)) {
 	            ssv_skb_free(sc, skb);
+		    if (wsid <= SSV_SW_TXQ_ID_STAMAX)
+	        	HCI_TXQ_UNLOCK_BY_STA(sc->sh, wsid);
 	            continue;
 	        } else {
 	            ssv6xxx_setup_ampdu_session((void *)sc, sta, skb);
diff --git a/ap/os/linux/linux-3.4.x/drivers/rtc/zx234290-rtc.c b/ap/os/linux/linux-3.4.x/drivers/rtc/zx234290-rtc.c
index 54428db..1ea194c 100755
--- a/ap/os/linux/linux-3.4.x/drivers/rtc/zx234290-rtc.c
+++ b/ap/os/linux/linux-3.4.x/drivers/rtc/zx234290-rtc.c
@@ -279,7 +279,7 @@
 	zte_send_hour_irq_event();

 	return IRQ_HANDLED;

 }

-/*alarm enable/disable, 0:disable 1:enable*/

+/*alarm enable/disable, 1:disable 0:enable*/

 int zx234290_rtc_alarm_enable(zx234290_alarm_type type, unsigned int enabled)

 {

     int ret = 0;

@@ -351,7 +351,15 @@
 	int reg_val=0, mask=0;

 

 	pr_debug("%s: aie=%d\n", __func__, enabled);

-

+	

+	if(0==enabled)//disable alarm

+	{

+		zx234290_rtc_alarm_enable(ALARM_SECOND, 1);		

+		zx234290_rtc_alarm_enable(ALARM_MINUTE, 1);		

+		zx234290_rtc_alarm_enable(ALARM_HOUR, 1);		

+		zx234290_rtc_alarm_enable(ALARM_DAY, 1);	

+		zx234290_rtc_alarm_enable(ALARM_WEEKDAY, 1);

+	};

     /*enable/disable AIE bit*/

 	mask = ZX234290_BITFMASK(ZX234290_RTC_AIE_WID, ZX234290_RTC_AIE_LSH);

 	reg_val= ZX234290_BITFVAL(enabled, ZX234290_RTC_AIE_LSH);

diff --git a/ap/os/linux/linux-3.4.x/drivers/soc/zte/otp/otp_zx.c b/ap/os/linux/linux-3.4.x/drivers/soc/zte/otp/otp_zx.c
index 87ef398..fba3f50 100755
--- a/ap/os/linux/linux-3.4.x/drivers/soc/zte/otp/otp_zx.c
+++ b/ap/os/linux/linux-3.4.x/drivers/soc/zte/otp/otp_zx.c
@@ -26,6 +26,7 @@
 #include <linux/dmaengine.h>

 #include <mach/iomap.h>

 #include <mach/gpio.h>

+#include <linux/sched.h>

 

 extern struct mutex otpMutex;

 extern char *nor_cmdline;

@@ -542,43 +543,7 @@
 	  return 0;

    }

    

-   int nor_write(u32 to, u32 len, u32 buf)

-  {

-	  int ret;

-	  u32 page_offset, page_size, i;

-	  struct nor_info *info = spi_nor_flash;

-

-	  soft_spin_lock(NAND_SFLOCK);

-	  mutex_lock(&otpMutex);

- 

-	  nor_write_reg(CMD_WREN, NULL, 0);

-	  

-	  page_offset = to & (info->page_size - 1);

   

-	  /* do all the bytes fit onto one page? */

-	  if (page_offset + len <= info->page_size) {

-		  ret = spi_nor_write(to, len, (uint8_t *)buf);

-	  } else {

-		  /* the size of data remaining on the first page */

-		  page_size = info->page_size - page_offset;

-		  ret = spi_nor_write(to, page_size, (uint8_t *)buf);

-  

-		  /* read everything in nor->page_size chunks */

-		  for (i = page_size; i < len; i += page_size) {

-			  page_size = len - i;

-			  if (page_size > info->page_size)

-				  page_size = info->page_size;

- 

-			  nor_write_reg(CMD_WREN, NULL, 0);

-			  ret = spi_nor_write(to + i, page_size, ((uint8_t *)buf + i));

-		  }

-	  }

-

-	  mutex_unlock(&otpMutex);

-	  soft_spin_unlock(NAND_SFLOCK);

-  

-	  return ret;

-  }

   int spi_nor_read(uint32_t from, size_t len, u_char *buf)

   {

 	  int ret;

@@ -613,7 +578,61 @@
 	  cs_close();//spp

 	  return 0;

   }

+

+   int nor_write(u32 to, u32 len, u32 buf)

+  {

+	  int ret;

+	  u32 page_offset, page_size, i;

+	  struct nor_info *info = spi_nor_flash;

+	  char temp_addr[4096] = {0};

+	  unsigned long long start_time,end_time,delta_time = 0;

+

+	  soft_spin_lock(NAND_SFLOCK);

+	  mutex_lock(&otpMutex);

+ 

+	  nor_write_reg(CMD_WREN, NULL, 0);

+	  

+	  page_offset = to & (info->page_size - 1);

   

+	  /* do all the bytes fit onto one page? */

+	  if (page_offset + len <= info->page_size) {

+		  ret = spi_nor_write(to, len, (uint8_t *)buf);

+	  } else {

+		  /* the size of data remaining on the first page */

+		  page_size = info->page_size - page_offset;

+		  ret = spi_nor_write(to, page_size, (uint8_t *)buf);

+  

+		  /* read everything in nor->page_size chunks */

+		  for (i = page_size; i < len; i += page_size) {

+			  page_size = len - i;

+			  if (page_size > info->page_size)

+				  page_size = info->page_size;

+ 

+			  nor_write_reg(CMD_WREN, NULL, 0);

+			  start_time = cpu_clock(0)>>10;

+			  ret = spi_nor_write(to + i, page_size, ((uint8_t *)buf + i));

+			  end_time = cpu_clock(0)>>10;

+			  delta_time = end_time - start_time;

+			  //printk("time consumed: %lld\n",delta_time);

+			  spi_nor_read(to + i, page_size, ((uint8_t *)temp_addr)); 

+			  while(memcmp(((uint8_t *)buf + i), ((uint8_t *)temp_addr),info->page_size)) {

+			  	    printk("addr 0x%x write fail.\n",to+i);

+					nor_write_reg(CMD_WREN, NULL, 0);

+					start_time = cpu_clock(0)>>10;

+					ret = spi_nor_write(to + i, page_size, ((uint8_t *)buf + i));

+					end_time = cpu_clock(0)>>10;

+					delta_time = end_time - start_time;

+				    printk("time consumed: %lld\n",delta_time);

+			        spi_nor_read(to + i, page_size, ((uint8_t *)temp_addr)); 

+			  }

+		  }

+	  }

+

+	  mutex_unlock(&otpMutex);

+	  soft_spin_unlock(NAND_SFLOCK);

+  

+	  return ret;

+  }

   int nor_read(u32 from, u32 len, u32 to)

   {

 	  int ret;

diff --git a/ap/os/linux/linux-3.4.x/drivers/soc/zte/tsc/zx-tsc-strategy.c b/ap/os/linux/linux-3.4.x/drivers/soc/zte/tsc/zx-tsc-strategy.c
index bf90b0b..3ad800c 100755
--- a/ap/os/linux/linux-3.4.x/drivers/soc/zte/tsc/zx-tsc-strategy.c
+++ b/ap/os/linux/linux-3.4.x/drivers/soc/zte/tsc/zx-tsc-strategy.c
@@ -107,6 +107,8 @@
 extern int zx29_set_frequency(unsigned int old_index,unsigned int new_index);

 extern unsigned int zx_getspeed(unsigned int cpu);

 #endif

+

+extern void zx29_restart(char str,const char * cmd);

 /*******************************************************************************

 *                                       functions                                     *

 *******************************************************************************/

@@ -178,17 +180,21 @@
 		{

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_UPTRANSIMITPOWER2, g_bit_probe[probe_num] ,STRTEGY_START);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);

+			tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

 		}

 		else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_3)

 		{   

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);

+			tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

 		}

 		else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_1)

 		{	

-			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);

+			//tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);

+			tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

 		}   

 		else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_0)

 		{

+			tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_HOLD);

 		}

 		else

 		{	

@@ -202,12 +208,14 @@
 			tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num], STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_UPTRANSIMITPOWER2, g_bit_probe[probe_num], STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_STOP);

+			tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_STOP);

 		}

 		else if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_2)

 		{

 			tsctrl_set_strategy2Iram(TSCTRL_SHUTDOWN,g_bit_probe[probe_num],STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num], STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_UPTRANSIMITPOWER2 ,g_bit_probe[probe_num], STRTEGY_STOP);

+			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_STOP);

 		}

 		else if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_4)

 		{

@@ -241,24 +249,20 @@
 		else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_5)

 		{

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_UPTRANSIMITPOWER2, g_bit_probe[probe_num] ,STRTEGY_START);

-			//	tsctrl_set_strategy2Iram(TSCTRL_LIMIT_W_UPTRANSIMITPOWER2, g_bit_probe[probe_num] ,STRTEGY_START);	   

 			tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);

-			//	tsctrl_set_strategy2Iram(TSCTRL_LIMIT_W_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);

 			tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_START);//zDrvPow_SetArmPsCoreFreq(CLK312M);	   

 		}

 		else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_3)

 		{   

 			tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);

-			//	tsctrl_set_strategy2Iram(TSCTRL_LIMIT_W_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);	   

 			tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_START);//zDrvPow_SetArmPsCoreFreq(CLK312M);	   

 		}

 		else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_1)

 		{	

 			tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

-			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);

-			//	   tsctrl_set_strategy2Iram(TSCTRL_LIMIT_W_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);	  		

+			//tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_START);

 		}   

 		else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_0)

 		{

@@ -274,10 +278,8 @@
 			tsctrl_set_strategy2Iram(TSCTRL_SHUTDOWN,g_bit_probe[probe_num],STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num], STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_UPTRANSIMITPOWER2, g_bit_probe[probe_num], STRTEGY_STOP);

-			//	   tsctrl_set_strategy2Iram(TSCTRL_LIMIT_W_UPTRANSIMITPOWER2, g_bit_probe[probe_num], STRTEGY_STOP);	   	   	   

 			tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_STOP);

-			//	   tsctrl_set_strategy2Iram(TSCTRL_LIMIT_W_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_STOP);	   

 			tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_STOP);// zDrvPow_SetArmPsCoreFreq(CLK624M);

 		}

 		else if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_2)

@@ -285,7 +287,7 @@
 			tsctrl_set_strategy2Iram(TSCTRL_SHUTDOWN,g_bit_probe[probe_num],STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num], STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_UPTRANSIMITPOWER2 ,g_bit_probe[probe_num], STRTEGY_STOP);

-			//	   tsctrl_set_strategy2Iram(TSCTRL_LIMIT_W_UPTRANSIMITPOWER2 ,g_bit_probe[probe_num], STRTEGY_STOP);	   	   

+			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_DOWNRATE2, g_bit_probe[probe_num], STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_STOP);// zDrvPow_SetArmPsCoreFreq(CLK624M);

 		}

 		else if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_4)

@@ -294,7 +296,6 @@
 			tsctrl_set_strategy2Iram(TSCTRL_SHUTDOWN,g_bit_probe[probe_num],STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT,g_bit_probe[probe_num],STRTEGY_STOP);

 			tsctrl_set_strategy2Iram(TSCTRL_LIMIT_LTE_UPTRANSIMITPOWER2,g_bit_probe[probe_num],STRTEGY_STOP);

-			//	tsctrl_set_strategy2Iram(TSCTRL_LIMIT_W_UPTRANSIMITPOWER2,g_bit_probe[probe_num],STRTEGY_STOP);	   

 		}

 		else if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_6)

 		{

@@ -398,25 +399,26 @@
    }	

    else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_7)

    {

-	   tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num] ,STRTEGY_START);

+	 //  tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num] ,STRTEGY_START);

+	tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_START);	   

    }

    else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_5)

    {

-	tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

-	tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_START);//zDrvPow_SetArmPsCoreFreq(CLK312M);	   

+	//tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

+	tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_START);	   

    }

    else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_3)

    {   

-	tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

-	tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_START);//zDrvPow_SetArmPsCoreFreq(CLK312M);	   

+	//tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

+	tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_START);	   

    }

 	else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_1)

 	{	

-	   tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

+	   //tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_START);

 	}   

 	else if(temperature>=TsNvData.Threshods[probe_num].THROSHOLD_0)

    {

-		tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_HOLD);

+		//tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_HOLD);

    }

    else

    {	

@@ -427,25 +429,25 @@
    if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_0)

    {

 	   tsctrl_set_strategy2Iram(TSCTRL_SHUTDOWN,g_bit_probe[probe_num],STRTEGY_STOP);

-	   tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num], STRTEGY_STOP);

-	   tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_STOP);

+	//   tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num], STRTEGY_STOP);

+	 //  tsctrl_set_strategy2Iram(TSCTRL_PS_RATE, g_bit_probe[probe_num], STRTEGY_STOP);

 	  tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_STOP);// zDrvPow_SetArmPsCoreFreq(CLK624M);

    }

    else if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_2)

    {

 	   tsctrl_set_strategy2Iram(TSCTRL_SHUTDOWN,g_bit_probe[probe_num],STRTEGY_STOP);

-	   tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num], STRTEGY_STOP);

+	  // tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT, g_bit_probe[probe_num], STRTEGY_STOP);

 	  tsctrl_set_strategy2Iram(TSCTRL_DFS, g_bit_probe[probe_num], STRTEGY_STOP);// zDrvPow_SetArmPsCoreFreq(CLK624M);

    }

    else if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_4)

    {

   	tsctrl_set_strategy2Iram(TSCTRL_SHUTDOWN,g_bit_probe[probe_num],STRTEGY_STOP); 

-	tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT,g_bit_probe[probe_num],STRTEGY_STOP);

+	//tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT,g_bit_probe[probe_num],STRTEGY_STOP);

    }

    else if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_6)

    {

 	   tsctrl_set_strategy2Iram(TSCTRL_SHUTDOWN,g_bit_probe[probe_num],STRTEGY_STOP);

-	   tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT,g_bit_probe[probe_num],STRTEGY_STOP);

+	  // tsctrl_set_strategy2Iram(TSCTRL_PS_ANYRESIDENT,g_bit_probe[probe_num],STRTEGY_STOP);

    }   

    else if(temperature<TsNvData.Threshods[probe_num].THROSHOLD_8)

    {

@@ -587,14 +589,15 @@
 	if(zDrvTsc_GetTscEn() == 0xB2)

 	{

 		if(TsNvData.User_En == 0xB2){

-

 			/*USER*/

 			if(tsc_read_reg(TSCTRL_SHUTDOWN)!=0){

 				/*user strategy start*/

 				tsc_set_reg_bits(TSCTRL_AP,BIT_SHUTDOWN,BITS_FOR_APPIRAM,STRTEGY_START);			

+				sc_debug_info_record(MODULE_ID_AP_TSC, "tsc_reboot!!!\n" );

+				zx29_restart(NULL, "tsc_reboot!!!\n");

 				

 				if(g_tsc_print_log_debug)

-					tsc_print_log("user strategy start reserve \n")

+					tsc_print_log("user strategy start \n");

 			}

 			else{

 				//tsc_print_log("user strategy stop reserve \n")

diff --git a/ap/os/linux/linux-3.4.x/drivers/soc/zte/tsc/zx-tsc.c b/ap/os/linux/linux-3.4.x/drivers/soc/zte/tsc/zx-tsc.c
index 5d3bbba..7bd4b4a 100755
--- a/ap/os/linux/linux-3.4.x/drivers/soc/zte/tsc/zx-tsc.c
+++ b/ap/os/linux/linux-3.4.x/drivers/soc/zte/tsc/zx-tsc.c
@@ -39,6 +39,10 @@
 #define IRAM_TEMPCOMP_RFDDAC (IRAM_BASE_ADDR_SLAVE_AFC+0x8)  //high16bit: the ADC value of temp	

 #define IRAM_TEMPCOMP_RFDTEMP (IRAM_BASE_ADDR_SLAVE_AFC+0xc)  //temp of adcrfd

 

+#define RFDDAC_LOW	1

+#define RFDDAC_LOWE	1591

+#define RFDDAC_HIGHE 6096

+#define RFDDAC_HIGH	8191

 

 volatile u32 g_adc1_flag = 0;//¨¨?adc1¨®?¨®¨²¨¬?2apa2¨¤???¨¨¡ê??¨°g_adc1_flag=1

 volatile u32 g_adc2_flag = 0;//¨¨?adc2¨®?¨®¨²¨¬?2apa2¨¤???¨¨¡ê??¨°g_adc2_flag=1

@@ -557,11 +561,40 @@
 		if(g_adc3_flag==1){

 			adcRfValue = tsc_dac_read(IRAM_TEMPCOMP_DAC); 

 			tsc_get_probe_adcvalue(adcRfValue,&tempRf, 0);

+			if((adcRfValue<RFDDAC_LOW)||(adcRfValue>RFDDAC_HIGH))

+			{

+				printk("!!!!!!!(adcRfValue < %d)||(adcRfValue > %d)\n", RFDDAC_LOW, RFDDAC_HIGH);

+				tempRf=25;

+			}

+			if((adcRfValue>=RFDDAC_LOW)&&(adcRfValue<=RFDDAC_LOWE))

+			{

+				printk("curcuit breakage(%d<=adcRfValue<= %d)\n", RFDDAC_LOW, RFDDAC_LOWE);

+				tempRf= -100 ;

+			}

+			if((adcRfValue>=RFDDAC_HIGHE)&&(adcRfValue<=RFDDAC_HIGH))

+			{

+				printk("curcuit short(%d<=adcRfValue<= %d)\n", RFDDAC_HIGHE, RFDDAC_HIGH);

+				tempRfd= -75 ;

+			}			

 		}

 		if(TsNvData.AdcRFd_En==0xB2){	

 			adcRfdValue =(zx_read_reg(IRAM_TEMPCOMP_RFDDAC)&0xffff0000)>>16; 

 			tsc_get_probe_adcvalue(adcRfdValue,&tempRfd, 1);

-			//tempRfd = zx_read_reg(IRAM_TEMPCOMP_RFDTEMP)>>10; 

+			if((adcRfdValue<RFDDAC_LOW)||(adcRfdValue>RFDDAC_HIGH))

+			{

+				printk("!!!!!!!(adcRfdValue < %d)||(adcRfdValue > %d)\n", RFDDAC_LOW, RFDDAC_HIGH);

+				tempRfd=25;

+			}

+			if((adcRfdValue>=RFDDAC_LOW)&&(adcRfdValue<=RFDDAC_LOWE))

+			{

+				printk("curcuit breakage(%d<=adcRfdValue<= %d)\n", RFDDAC_LOW, RFDDAC_LOWE);

+				tempRfd= -100 ;

+			}

+			if((adcRfdValue>=RFDDAC_HIGHE)&&(adcRfdValue<=RFDDAC_HIGH))

+			{

+				printk("curcuit short(%d<=adcRfdValue<= %d)\n", RFDDAC_HIGHE, RFDDAC_HIGH);

+				tempRfd= -75 ;

+			}			

 		}

 

 		tsc_lock();

@@ -598,6 +631,8 @@
 				tsc_print_log("adc1Value=%d,adc2Value=%d,adcRfValue=%d,temp1 = %d.temp2 = %d.temprf = %d.\n",

 				adc1Value,adc2Value,adcRfValue,temp1,temp2, g_ts_data_info[PROBE_ADCRF][TS_MEMBER_TEMP] );

 			}

+			tsc_print_log("DetectEn:0x%x; AdcRFd_En:0x%x; Modemrate_En:0x%x; TansmitPower_En:0x%x; Dfs_En:0x%x; User_En:0x%x;",

+				TsNvData.DetectEn, TsNvData.AdcRFd_En, TsNvData.Modemrate_En, TsNvData.TansmitPower_En, TsNvData.Dfs_En, TsNvData.User_En );

 		}

 

 		if((((tsc_record_time_cnt*TS_POLLING_TIME_S)%tsc_record_time)==0) && tsc_record_flag)

diff --git a/ap/os/linux/linux-3.4.x/drivers/staging/voicedrv/Makefile b/ap/os/linux/linux-3.4.x/drivers/staging/voicedrv/Makefile
old mode 100644
new mode 100755
index 2a540eb..f1622df
--- a/ap/os/linux/linux-3.4.x/drivers/staging/voicedrv/Makefile
+++ b/ap/os/linux/linux-3.4.x/drivers/staging/voicedrv/Makefile
@@ -4,6 +4,7 @@
 
 
 ccflags-y += -Idrivers/staging/voicedrv/include
+ccflags-y += -I$(TOPDIR)/pub/project/$(CHIP_NAME)/include/nv
 
 obj-$(CONFIG_VOICE_DRV)	+= voice_drv.o
 voice_drv-$(CONFIG_VOICE_DRV) := voice.o
diff --git a/ap/os/linux/linux-3.4.x/drivers/staging/voicedrv/voice.c b/ap/os/linux/linux-3.4.x/drivers/staging/voicedrv/voice.c
old mode 100644
new mode 100755
index a4e39a0..a47acf0
--- a/ap/os/linux/linux-3.4.x/drivers/staging/voicedrv/voice.c
+++ b/ap/os/linux/linux-3.4.x/drivers/staging/voicedrv/voice.c
@@ -11,6 +11,7 @@
 
 #include "voice.h"
 
+#include "RWNvConfig.h"
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("xxq");
@@ -44,6 +45,34 @@
 
 #ifdef _USE_VEHICLE_DC
 
+#define VOICE_NVRW_MAX_LEN (8 * 1024)
+
+static unsigned char *voice_nvrw_param = NULL;
+
+static void voice_SetVoiceNVRW(void)
+{
+	unsigned char voice_nv_update = 0;
+
+    while(1){
+        CPPS_FUNC(cpps_callbacks, zDrvVp_UpdateVoiceNv)(&voice_nv_update);
+        
+        if(1 == voice_nv_update){
+            print_audio("voice_SetVoiceNVRW voice_nv_update = %d!\n", voice_nv_update); 
+            break;
+        }
+    }
+
+    if(CPPS_FUNC(cpps_callbacks, zOss_NvItemWrite)(OS_FLASH_VOICE_RW_NONFAC_BASE_ADDR, \
+        (voice_nvrw_param + 8), *((int*)voice_nvrw_param + 1))){
+    	print_audio("voice_SetVoiceNVRW zOss_NvItemWrite error, update voice_nvrw fail!\n");
+    }
+    else{
+        print_audio("voice_SetVoiceNVRW zOss_NvItemWrite end, write len = %d!\n", *((int*)voice_nvrw_param + 1));
+    }
+    
+	return;
+}
+
 static int voice_SetMute(bool enable)
 {
 	int ret = 0;
@@ -324,7 +353,7 @@
 		T_Voice_Para para;
 		//pr_info("start volte read \n");
 		if (copy_from_user(&para, argp, sizeof(para))) {
-			print_audio("volte_ioctl  stop copy_to_user err!\n");
+			print_audio("voice_ioctl  stop copy_to_user err!\n");
 			return -EFAULT;
 		}
 
@@ -338,7 +367,7 @@
 		T_Voice_Para para;
 
 		if (copy_from_user(&para, argp, sizeof(para))) {
-			print_audio("volte_ioctl  stop copy_to_user err!\n");
+			print_audio("voice_ioctl  stop copy_to_user err!\n");
 			return -EFAULT;
 		}
 		ret =  voice_stop(para);
@@ -352,7 +381,7 @@
 		int para;
 
 		if (copy_from_user(&para, argp, sizeof(para))) {
-			print_audio("volte_ioctl  set vol copy_to_user err!\n");
+			print_audio("voice_ioctl  set vol copy_to_user err!\n");
 			return -EFAULT;
 		}
 		ret = voice_SetVol(para);
@@ -377,7 +406,7 @@
 		bool para;
 
 		if (copy_from_user(&para, argp, sizeof(para))) {
-			print_audio("volte_ioctl  set vol copy_to_user err!\n");
+			print_audio("voice_ioctl  set vol copy_to_user err!\n");
 			return -EFAULT;
 		}
 		ret = voice_SetMute(para);
@@ -402,7 +431,7 @@
 		int para;
 
 		if (copy_from_user(&para, argp, sizeof(para))) {
-			print_audio("volte_ioctl  set path copy_to_user err!\n");
+			print_audio("voice_ioctl  set path copy_to_user err!\n");
 			return -EFAULT;
 		}
 		ret = voice_SetPath(para);
@@ -421,6 +450,28 @@
 		}
 		break;
 	}
+
+    case VOICE_IOCTL_SET_VOICE_NVRW: {
+        voice_nvrw_param = kzalloc((2 * sizeof(int) + VOICE_NVRW_MAX_LEN), GFP_KERNEL);
+        if(!voice_nvrw_param){
+            print_audio("voice_ioctl voice_nvrw_param malloc fail!\n");
+            return -EFAULT;
+        }
+    
+		if (copy_from_user(voice_nvrw_param, argp, 2 * sizeof(int) + VOICE_NVRW_MAX_LEN)){
+			print_audio("voice_ioctl  set voice nvrw copy_from_user err!\n");
+			return -EFAULT;
+		}
+
+        voice_SetVoiceNVRW();
+
+        if(voice_nvrw_param){
+            kfree(voice_nvrw_param);
+            voice_nvrw_param = NULL;
+        }
+        
+		break;
+	}
 #endif
 
 	case VOICE_IOCTL_GET_SLIC_USE_FLAG: {
@@ -441,7 +492,7 @@
 		int path;
 
 		if (copy_from_user(&path, argp, sizeof(path))) {
-			print_audio("volte_ioctl  zDrvVp_Loop copy_to_user err!\n");
+			print_audio("voice_ioctl  zDrvVp_Loop copy_to_user err!\n");
 			return -EFAULT;
 		}
 		ret = CPPS_FUNC(cpps_callbacks, zDrvVp_Loop)(path);
diff --git a/ap/os/linux/linux-3.4.x/drivers/tty/serial/zx29_uart.c b/ap/os/linux/linux-3.4.x/drivers/tty/serial/zx29_uart.c
index e599f79..bb6e1c6 100755
--- a/ap/os/linux/linux-3.4.x/drivers/tty/serial/zx29_uart.c
+++ b/ap/os/linux/linux-3.4.x/drivers/tty/serial/zx29_uart.c
@@ -3366,11 +3366,11 @@
 #endif
 
 #if CONFIG_SERIAL_ZX29_DMA
-	if(pdev->id != 1) //zw.wang modify for T106BUG-531 on 20240304
-		{
+	if(pdev->id != DEBUG_CONSOLE)
+	{
 		uart_dma_init(port);
 		printk(KERN_INFO "[%s][%d]UART DMA is OPENED%d\n",__func__,__LINE__,pdev->id);
-		}
+	}
 #endif
 
     ret=uart_add_one_port(&zx29_uart_driver, &port->port);
diff --git a/ap/os/linux/linux-3.4.x/drivers/usb/dwc_otg/dwc_otg_driver.c b/ap/os/linux/linux-3.4.x/drivers/usb/dwc_otg/dwc_otg_driver.c
index 997ad3c..3c5fedb 100755
--- a/ap/os/linux/linux-3.4.x/drivers/usb/dwc_otg/dwc_otg_driver.c
+++ b/ap/os/linux/linux-3.4.x/drivers/usb/dwc_otg/dwc_otg_driver.c
@@ -800,9 +800,9 @@
 	dwc_otg_device->os_dep.base= ioremap(iomem->start, resource_size(iomem));
 
 #ifdef CONFIG_RAMDUMP
-	ramdump_ram_conf_table_add("usb_global.bin", ZX29_USB_GLOBAL_REG, USB_GLOBAL_SIZE, 0, RAMDUMP_FLAG_HAS_EXTERNAL, usb_global_reg);
-	ramdump_ram_conf_table_add("usb_device.bin", ZX29_USB_DEVICE_REG, USB_DEVICE_SIZE, 0, RAMDUMP_FLAG_HAS_EXTERNAL, usb_device_reg);
-	ramdump_ram_conf_table_add("usb_pwr_clk.bin", ZX29_USB_PWR_CLK_REG, USB_PWR_CLK_SIZE, 0, RAMDUMP_FLAG_HAS_EXTERNAL, usb_pwr_clk_reg);
+	ramdump_ram_conf_table_add("usb_global.bin", ZX29_USB_GLOBAL_REG, USB_GLOBAL_SIZE, 0, RAMDUMP_FLAG_HAS_EXTERNAL|RAMDUMP_FLAG_LEVEL_LOW, usb_global_reg);
+	ramdump_ram_conf_table_add("usb_device.bin", ZX29_USB_DEVICE_REG, USB_DEVICE_SIZE, 0, RAMDUMP_FLAG_HAS_EXTERNAL|RAMDUMP_FLAG_LEVEL_LOW, usb_device_reg);
+	ramdump_ram_conf_table_add("usb_pwr_clk.bin", ZX29_USB_PWR_CLK_REG, USB_PWR_CLK_SIZE, 0, RAMDUMP_FLAG_HAS_EXTERNAL|RAMDUMP_FLAG_LEVEL_LOW, usb_pwr_clk_reg);
 #endif
 
 #if 0
diff --git a/ap/os/linux/linux-3.4.x/drivers/usb/dwc_otg/dwc_otg_pwr.c b/ap/os/linux/linux-3.4.x/drivers/usb/dwc_otg/dwc_otg_pwr.c
old mode 100644
new mode 100755
index cb0b488..b2b9a8f
--- a/ap/os/linux/linux-3.4.x/drivers/usb/dwc_otg/dwc_otg_pwr.c
+++ b/ap/os/linux/linux-3.4.x/drivers/usb/dwc_otg/dwc_otg_pwr.c
@@ -270,7 +270,7 @@
 		}
 		dwc_otg_hal_state.clk_state = 1;
 		clk_enable(pclk);
-//		dwc_chg_udelay(20);
+		dwc_chg_udelay(20);
 		clk_enable(wclk);
 		USBHAL_DBG("**ENABLE CLOCK**");
 	}else{
@@ -281,6 +281,7 @@
 		dwc_otg_hal_state.clk_state = 0;
 //		dwc_chg_udelay(5);
 		clk_disable(pclk);
+		dwc_chg_udelay(20);
 		clk_disable(wclk);
 		USBHAL_DBG("**DISABLE CLOCK**");
 	}
@@ -337,6 +338,7 @@
 	//usb  clock enable
 	dwc_otg_clk_enable(1);
 	
+	dwc_chg_udelay(2000);
 	// usb  ahb bus reset
 	reg_spin_lock();
 	value = ioread32(ZX29_SOC_USB_RSTEN);
@@ -382,7 +384,7 @@
 	value  |= (1<<3);
 	iowrite32(value,ZX29_SOC_USB_RSTEN);
 	reg_spin_unlock();
-	dwc_chg_udelay(10);
+	dwc_chg_udelay(1000);
 
 	value = 0;
 	while((ioread32(ZX29_SOC_USB_RESET_STATE)&0x02) == 0)
diff --git a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/adb_server.c b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/adb_server.c
index 8426431..e3a24fe 100755
--- a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/adb_server.c
+++ b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/adb_server.c
@@ -544,7 +544,7 @@
 	while(!kthread_should_stop()){	
 		/* we will block until we're online */
 		while (!dev->agent_start) {
-			USBSTACK_DBG("adb_rpmsg_recv_thread: waiting foragt_start_wait\n");
+			USBSTACK_DBG("adb_rpmsg_recv_thread: waiting for agt_start_wait\n");
 			ret = wait_event_interruptible(dev->agt_start_wait,
 					( dev->agent_start ||kthread_should_stop()));
 			if (ret < 0) {
@@ -558,18 +558,27 @@
 			USBSTACK_DBG("unbind thread stop");
 			break;
 		}
+		if(!dev->agent_start){
+			USBSTACK_DBG("adb_rpmsg_recv_thread: agent_start not start\n");
+			continue;
+		}
 			USBSTACK_DBG("adb_rpmsg_recv_thread: now send request\n");
 
 requeue_req:
+
+		if(!dev->online){
+			USBSTACK_DBG("rpmsg_recv dev is offline, agent_start:%d\n", dev->agent_start);
+			r = -EIO;
+			goto done;
+		}	
+		if(!dev->rx_req){
+			USBSTACK_DBG("adb_rpmsg_recv_thread, rx_req is NULL\n");
+			continue;
+		}
 		/* queue a request */
 		req = dev->rx_req;
 		req->length = ADB_BULK_BUFFER_SIZE;
 		dev->rx_done = 0;
-		if(!dev->online){
-			USBSTACK_DBG("rpmsg_recv dev is offline\n");
-			r = -EIO;
-			goto done;
-		}
 #if 0		
 		if(atomic_read(&dev->adb_read_flag)){
 			printk("\nadb_rpmsg_recv_thread adb_read_flag, wait_read_wq\n");
diff --git a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/android.c b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/android.c
index cb4a4cc..d456ddd 100755
--- a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/android.c
+++ b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/android.c
@@ -79,6 +79,7 @@
 
 #ifndef CONFIG_SYSTEM_RECOVERY
 int zDrvNand_WriteBootflag( int flag );
+unsigned int zDrvNand_ReadBootflag(void);
 #endif
 
 #define pr_err		USB_DEBUG
@@ -3193,8 +3194,16 @@
 			spin_unlock_irqrestore(&cdev->lock, flags);
 			
 			break;
-		//case :
-		//	break;
+		case USB_RPMSG_GET_USB_DL_STATE:
+			t_resp->cmd = USB_RPMSG_GET_USB_DL_STATE;
+			spin_lock_irqsave(&cdev->lock, flags);
+#ifndef CONFIG_SYSTEM_RECOVERY			
+			//1:dl_off;0:dl_oen
+			n = zDrvNand_ReadBootflag();			
+			sprintf(t_resp->param, "%d\n",n);
+#endif			
+			spin_unlock_irqrestore(&cdev->lock, flags);			
+			break;
 		//case :
 		//	break;
 		default:
diff --git a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/f_adb.c b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/f_adb.c
index a2ae7c9..91c1c62 100755
--- a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/f_adb.c
+++ b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/f_adb.c
@@ -375,15 +375,16 @@
 #endif	
 
 requeue_req:
-	/* queue a request */
-	req = dev->rx_req;
-	req->length = count;
-	dev->rx_done = 0;
 	if(!dev->online){
 		USBSTACK_DBG("adb_read dev is offline\n");
 		r = -EIO;
 		goto done;
 	}
+	/* queue a request */
+	req = dev->rx_req;
+	req->length = count;
+	dev->rx_done = 0;
+
 		USBSTACK_DBG("adb_read waiting usb_ep_queue \n");
 	ret = usb_ep_queue(dev->ep_out, req, GFP_ATOMIC);
 	if (ret < 0) {
@@ -711,6 +712,7 @@
 	}
 #endif	
 	adb_request_free(dev->rx_req, dev->ep_out);
+	dev->rx_req = NULL;
 	while ((req = adb_req_get(dev, &dev->tx_idle)))
 		adb_request_free(req, dev->ep_in);
 }
diff --git a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/usb_netlink.c b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/usb_netlink.c
index c042a78..9aafd3b 100755
--- a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/usb_netlink.c
+++ b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/usb_netlink.c
@@ -32,8 +32,9 @@
 

 extern int adb_enable_rpmsg_agent(int flag);

 extern int adb_rpmsg_agent_state(void);

-	int switch_mode = 0;

-	int simulate_plug = 0;

+int switch_mode = 0;

+

+int simulate_plug = 0;

 	struct work_struct switch_usbmode;

 extern int usb_plug_notify_ap(e_usb_rpmsg_cmd_type plug_type);

 	struct delayed_work plug_notify_dwork;

@@ -1040,7 +1041,7 @@
 }

 EXPORT_SYMBOL_GPL(usb_set_rpmsg_resp);

 

-void usb_parse_cap_notify(int type)

+void usb_parse_cap_notify(int type, int param)

 {	

 	int cur_usbmode = 0;

 	

@@ -1146,8 +1147,27 @@
 #endif			

 			break;

 		case USB_RPMSG_SIMULATE_PLUG:

-			simulate_plug = 1;

-			usb_record_dbginfo(USB_SIMULATE_PLUG, 0, 0);

+			if(param != 0){

+				/*this is for vehicle   

+				 *on usermode,open/close net/adb need to take effect immediately,

+				 *so while param not 0, means we need to do this action.

+				 * and send netlink change sg to user thread   to reread the nv config

+				 * and reenum again

+				 */

+				cur_usbmode = get_usb_enum_mode();	

+				printk("USB_RPMSG_SIMULATE_PLUG, cur_mode:%d\n", cur_usbmode);

+				if(cur_usbmode == 1){	

+					//only user mode need to do so

+					switch_mode = USB_SWITCH_USER;

+					schedule_work(&switch_usbmode);

+					

+				}

+				break;

+			}else{

+				//here just send except to do simulate plug

+				simulate_plug = 1;

+			}

+			usb_record_dbginfo(USB_SIMULATE_PLUG, 0, param);

 			schedule_work(&switch_usbmode);

 			

 			break;

diff --git a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/usb_rpmsg_server.c b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/usb_rpmsg_server.c
index c7daeda..32719e1 100755
--- a/ap/os/linux/linux-3.4.x/drivers/usb/gadget/usb_rpmsg_server.c
+++ b/ap/os/linux/linux-3.4.x/drivers/usb/gadget/usb_rpmsg_server.c
@@ -35,7 +35,7 @@
 
 extern void usb_set_rpmsg_resp(int type, char*resp);
 extern void android_set_rpmsg_resp(int type, char*resp);
-extern void usb_parse_cap_notify(int type);
+extern void usb_parse_cap_notify(int type, int param);
 
 struct task_struct	*rpmsg_thread;
 wait_queue_head_t usb_agt_wq;
@@ -138,7 +138,7 @@
 {
 	int i;
 	unsigned char *data;
-	
+	int v_param = 0;
 	char*tmp= (char*)buf;
 	usb_rpmsg_cmd *msg = NULL; 
 
@@ -163,8 +163,10 @@
 	memcpy(usb_msg,buf, len);
 	//usb_rpmsg2ap((char *)buf, len);
 	msg = (usb_rpmsg_cmd *)usb_msg;
-	if(msg->cmd > USB_RPMSG_CMD_MAX){
-		usb_parse_cap_notify(msg->cmd);
+	if(msg->cmd > USB_RPMSG_CMD_MAX){		
+		v_param = simple_strtoul(msg->param, NULL, 10);
+		
+		usb_parse_cap_notify(msg->cmd, v_param);
 		return;
 	}
 	atomic_set(&rpmsg_flag, 1);