Merge "[BugFix][audio][API-1405] sos occasional call probability no sound problem" into GSW3.0-No-Connman
diff --git a/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch b/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
index d45f497..f2f06bb 100755
--- a/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
+++ b/meta-sdk/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
@@ -1,71 +1,260 @@
 --- busybox-1.29.3/sysklogd/syslogd.c	2018-07-02 19:23:06.000000000 +0800
 +++ busybox-1.29.3/sysklogd/syslogdnew.c	2022-09-29 13:47:26.318538618 +0800
-@@ -165,6 +165,8 @@
+@@ -165,6 +165,7 @@
  
  #include <sys/un.h>
  #include <sys/uio.h>
 +#include <dlfcn.h>
-+
  
  #if ENABLE_FEATURE_REMOTE_LOG
  #include <netinet/in.h>
-@@ -176,6 +178,10 @@
+@@ -175,8 +176,11 @@
+ #include <sys/sem.h>
  #include <sys/shm.h>
  #endif
- 
 +#define ENABLE_FEATURE_SYSLOGD_CFG 1
 +#define ENABLE_FEATURE_ROTATE_LOGFILE 1
+ 
+-
 +int (*lynq_get_value)(char *file, char *section, char *key, char *tmp);
 +int (*lynq_set_value)(char *section, char *key, char *value);
- 
  #define DEBUG 0
  
-@@ -1102,6 +1113,13 @@
+ /* MARK code is not very useful, is bloat, and broken:
+@@ -210,6 +214,7 @@
+ 
+ typedef struct logFile_t {
+ 	const char *path;
++	FILE * fp;
+ 	int fd;
+ 	time_t last_log_time;
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+@@ -677,6 +682,79 @@
+ static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
+ #endif /* FEATURE_KMSG_SYSLOG */
+ 
++int g_syslog_buffer_size=8*1024;
++char g_syslog_buffer[16*1024];
++
++int syslog_is_buffer_write()
++{
++	if(g_syslog_buffer_size>0 && g_syslog_buffer_size<= 16*1024)
++	{
++		return true;
++	}
++	else 
++	{
++		return false;
++	}
++}
++
++void syslog_close_fp_fd(FILE * fp, int* fd)
++{
++	if(syslog_is_buffer_write() && (*fd) > 1)
++    {   
++    	fclose(fp);	
++    }
++	else 
++	{
++		close(*fd);
++	}
++	(*fd) = -1;
++}
++
++void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
++{
++	if(syslog_is_buffer_write())
++	{
++		*fp = fopen(path, "a+");
++		if(*fp!=NULL)
++		{
++			*fd=fileno(*fp);
++			if(setvbuf(*fp,g_syslog_buffer,_IOFBF,g_syslog_buffer_size)!=0)
++			{
++				fclose(*fp);
++				*fd=-1;
++			}    
++            else
++            {
++                int flags = fcntl(*fd, F_GETFL, 0);
++                flags |= O_NONBLOCK;
++                fcntl(*fd, F_SETFL, flags);
++            }            
++		}
++		else
++		{
++			*fd=-1;
++		}            
++	}
++	else
++	{
++	 	*fd = open(path, O_WRONLY | O_CREAT
++		| O_NOCTTY | O_APPEND | O_NONBLOCK,
++		0666);
++	}
++}
++
++int syslog_write(FILE* fp, int fd, char *msg, int len)
++{
++	if(syslog_is_buffer_write() && fd > 1)
++	{
++	    return fwrite(msg,1,len,fp);
++	}	
++	else
++	{
++		return full_write(fd, msg, len);
++	}
++}
++
+ /* Print a message to the log file. */
+ static void log_locally(time_t now, char *msg, logFile_t *log_file)
+ {
+@@ -696,11 +774,14 @@
+ 		 */
+ 		if (!now)
+ 			now = time(NULL);
+-		if (log_file->last_log_time != now) {
+-			log_file->last_log_time = now;
+-			close(log_file->fd);
+-			goto reopen;
+-		}
++		if((!syslog_is_buffer_write()))
++		{
++			if (log_file->last_log_time != now) {
++				log_file->last_log_time = now;
++				close(log_file->fd);
++				goto reopen;	
++			}
++		}					
+ 	}
+ 	else if (log_file->fd == 1) {
+ 		/* We are logging to stdout: do nothing */
+@@ -710,10 +791,8 @@
+ 			log_file->fd = 1;
+ 			/* log_file->isRegular = 0; - already is */
+ 		} else {
+- reopen:
+-			log_file->fd = open(log_file->path, O_WRONLY | O_CREAT
+-					| O_NOCTTY | O_APPEND | O_NONBLOCK,
+-					0666);
++ reopen:    syslog_get_fp_fd(log_file->path, &(log_file->fp), &(log_file->fd));
++			
+ 			if (log_file->fd < 0) {
+ 				/* cannot open logfile? - print to /dev/console then */
+ 				int fd = device_open(DEV_CONSOLE, O_WRONLY | O_NOCTTY | O_NONBLOCK);
+@@ -759,6 +838,10 @@
+ 				rename(oldFile, newFile);
+ 			}
+ 			/* newFile == "f.0" now */
++			if(syslog_is_buffer_write() && log_file->fd > 1)
++			{
++				fflush(log_file->fp);
++			}			
+ 			rename(log_file->path, newFile);
+ 		}
+ 
+@@ -776,15 +859,16 @@
+ 		fl.l_type = F_UNLCK;
+ 		fcntl(log_file->fd, F_SETLKW, &fl);
+ #endif
+-		close(log_file->fd);
++        syslog_close_fp_fd(log_file->fp,&(log_file->fd));        
+ 		goto reopen;
+ 	}
+ /* TODO: what to do on write errors ("disk full")? */
+-	len = full_write(log_file->fd, msg, len);
++	len = syslog_write(log_file->fp,log_file->fd,msg,len);	
++	
+ 	if (len > 0)
+ 		log_file->size += len;
+ #else
+-	full_write(log_file->fd, msg, len);
++	syslog_write(log_file->fp,log_file->fd,msg,len);	
+ #endif
+ 
+ #ifdef SYSLOGD_WRLOCK
+@@ -974,6 +1058,11 @@
+ }
+ #endif
+ 
++static void syslog_signal_handler(int signum) {    
++	fflush_all();
++}
++
++
+ static void do_syslogd(void) NORETURN;
+ static void do_syslogd(void)
+ {
+@@ -997,6 +1086,7 @@
+ 	signal(SIGALRM, do_mark);
+ 	alarm(G.markInterval);
+ #endif
++    signal(SIGUSR1, syslog_signal_handler); 
+ 	xmove_fd(create_socket(), STDIN_FILENO);
+ 
+ 	if (option_mask32 & OPT_circularlog)
+@@ -1089,6 +1179,7 @@
+ 	} /* while (!bb_got_signal) */
+ 
+ 	timestamp_and_log_internal("syslogd exiting");
++	syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));    
+ 	remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
+ 	ipcsyslog_cleanup();
+ 	if (option_mask32 & OPT_kmsg)
+@@ -1097,11 +1188,45 @@
+ #undef recvbuf
+ }
+ 
++void syslog_get_uci_config_item(char* query_string, int* value)
++{
++    char get_propty_log_data[64];
++    memset(get_propty_log_data,0,64);
++    if(0 == lynq_get_value("lynq_uci","lynq_log",query_string,get_propty_log_data))
++    {
++        *value = atoi(get_propty_log_data);
++        printf("%s :%d\n",query_string,*value);
++    }
++    else
++    {            
++        snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",*value);
++        lynq_set_value("lynq_log",query_string, get_propty_log_data);
++    }
++}
++
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++{
++	if(NULL != lynq_get_value && (NULL != lynq_set_value))
++	{
++	    syslog_get_uci_config_item("syslog_flie_size",lynq_syslog_filesize);
++	    syslog_get_uci_config_item("syslog_flie_rotate",lynq_syslog_rotate); 
++           syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);         	
++	}
++}
++
+ int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int syslogd_main(int argc UNUSED_PARAM, char **argv)
  {
  	int opts;
  	char OPTION_DECL;
 +    
 +    void *handle_uci;
-+    static char get_propty_log_data[64] = {0};
++
 +    int lynq_syslog_filesize = 80*1024*1024;
 +    int lynq_syslog_rotate = 10;
 +    const char *lynq_libpath_uci = "/lib64/liblynq-uci.so";
++    int lynq_syslog_buffer_size = 8*1024;
 +    
  #if ENABLE_FEATURE_REMOTE_LOG
  	llist_t *remoteAddrList = NULL;
  #endif
-@@ -1157,6 +1175,38 @@
+@@ -1157,6 +1282,14 @@
  	//umask(0); - why??
  	write_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
  
 +    handle_uci = dlopen(lynq_libpath_uci,RTLD_NOW); 
 +    lynq_get_value = (int (*)(void))dlsym(handle_uci,"lynq_get_value");
 +    lynq_set_value = (int (*)(char *section, char *key, char *value))dlsym(handle_uci,"lynq_set_value");
-+    if(NULL != lynq_get_value && (NULL != lynq_set_value))
-+    {
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_size",get_propty_log_data))
-+        {
-+            lynq_syslog_filesize = atoi(get_propty_log_data);
-+            printf("lynq_syslog_filesize:%d\n",lynq_syslog_filesize);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_filesize);
-+            lynq_set_value("lynq_log","syslog_flie_size", get_propty_log_data);
-+        }
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_rotate",get_propty_log_data))
-+        {
-+            lynq_syslog_rotate = atoi(get_propty_log_data);
-+            printf("lynq_syslog_rotate:%d\n",lynq_syslog_rotate);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_rotate);
-+            lynq_set_value("lynq_log","syslog_flie_rotate", get_propty_log_data);
-+        }
-+    }
++    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
 +
 +	G.logFileSize = lynq_syslog_filesize;
 +	G.logFileRotate = lynq_syslog_rotate;
@@ -73,3 +262,10 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
+@@ -1171,3 +1304,6 @@
+ #undef OPTION_STR
+ #undef OPTION_DECL
+ #undef OPTION_PARAM
++
++
++
diff --git a/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch b/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
index d45f497..f2f06bb 100755
--- a/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
+++ b/meta/meta-mediatek-ivt/recipes-core/busybox/busybox/ring_buf.patch
@@ -1,71 +1,260 @@
 --- busybox-1.29.3/sysklogd/syslogd.c	2018-07-02 19:23:06.000000000 +0800
 +++ busybox-1.29.3/sysklogd/syslogdnew.c	2022-09-29 13:47:26.318538618 +0800
-@@ -165,6 +165,8 @@
+@@ -165,6 +165,7 @@
  
  #include <sys/un.h>
  #include <sys/uio.h>
 +#include <dlfcn.h>
-+
  
  #if ENABLE_FEATURE_REMOTE_LOG
  #include <netinet/in.h>
-@@ -176,6 +178,10 @@
+@@ -175,8 +176,11 @@
+ #include <sys/sem.h>
  #include <sys/shm.h>
  #endif
- 
 +#define ENABLE_FEATURE_SYSLOGD_CFG 1
 +#define ENABLE_FEATURE_ROTATE_LOGFILE 1
+ 
+-
 +int (*lynq_get_value)(char *file, char *section, char *key, char *tmp);
 +int (*lynq_set_value)(char *section, char *key, char *value);
- 
  #define DEBUG 0
  
-@@ -1102,6 +1113,13 @@
+ /* MARK code is not very useful, is bloat, and broken:
+@@ -210,6 +214,7 @@
+ 
+ typedef struct logFile_t {
+ 	const char *path;
++	FILE * fp;
+ 	int fd;
+ 	time_t last_log_time;
+ #if ENABLE_FEATURE_ROTATE_LOGFILE
+@@ -677,6 +682,79 @@
+ static void log_to_kmsg(int pri UNUSED_PARAM, const char *msg UNUSED_PARAM) {}
+ #endif /* FEATURE_KMSG_SYSLOG */
+ 
++int g_syslog_buffer_size=8*1024;
++char g_syslog_buffer[16*1024];
++
++int syslog_is_buffer_write()
++{
++	if(g_syslog_buffer_size>0 && g_syslog_buffer_size<= 16*1024)
++	{
++		return true;
++	}
++	else 
++	{
++		return false;
++	}
++}
++
++void syslog_close_fp_fd(FILE * fp, int* fd)
++{
++	if(syslog_is_buffer_write() && (*fd) > 1)
++    {   
++    	fclose(fp);	
++    }
++	else 
++	{
++		close(*fd);
++	}
++	(*fd) = -1;
++}
++
++void syslog_get_fp_fd(const char * path, FILE** fp, int* fd)
++{
++	if(syslog_is_buffer_write())
++	{
++		*fp = fopen(path, "a+");
++		if(*fp!=NULL)
++		{
++			*fd=fileno(*fp);
++			if(setvbuf(*fp,g_syslog_buffer,_IOFBF,g_syslog_buffer_size)!=0)
++			{
++				fclose(*fp);
++				*fd=-1;
++			}    
++            else
++            {
++                int flags = fcntl(*fd, F_GETFL, 0);
++                flags |= O_NONBLOCK;
++                fcntl(*fd, F_SETFL, flags);
++            }            
++		}
++		else
++		{
++			*fd=-1;
++		}            
++	}
++	else
++	{
++	 	*fd = open(path, O_WRONLY | O_CREAT
++		| O_NOCTTY | O_APPEND | O_NONBLOCK,
++		0666);
++	}
++}
++
++int syslog_write(FILE* fp, int fd, char *msg, int len)
++{
++	if(syslog_is_buffer_write() && fd > 1)
++	{
++	    return fwrite(msg,1,len,fp);
++	}	
++	else
++	{
++		return full_write(fd, msg, len);
++	}
++}
++
+ /* Print a message to the log file. */
+ static void log_locally(time_t now, char *msg, logFile_t *log_file)
+ {
+@@ -696,11 +774,14 @@
+ 		 */
+ 		if (!now)
+ 			now = time(NULL);
+-		if (log_file->last_log_time != now) {
+-			log_file->last_log_time = now;
+-			close(log_file->fd);
+-			goto reopen;
+-		}
++		if((!syslog_is_buffer_write()))
++		{
++			if (log_file->last_log_time != now) {
++				log_file->last_log_time = now;
++				close(log_file->fd);
++				goto reopen;	
++			}
++		}					
+ 	}
+ 	else if (log_file->fd == 1) {
+ 		/* We are logging to stdout: do nothing */
+@@ -710,10 +791,8 @@
+ 			log_file->fd = 1;
+ 			/* log_file->isRegular = 0; - already is */
+ 		} else {
+- reopen:
+-			log_file->fd = open(log_file->path, O_WRONLY | O_CREAT
+-					| O_NOCTTY | O_APPEND | O_NONBLOCK,
+-					0666);
++ reopen:    syslog_get_fp_fd(log_file->path, &(log_file->fp), &(log_file->fd));
++			
+ 			if (log_file->fd < 0) {
+ 				/* cannot open logfile? - print to /dev/console then */
+ 				int fd = device_open(DEV_CONSOLE, O_WRONLY | O_NOCTTY | O_NONBLOCK);
+@@ -759,6 +838,10 @@
+ 				rename(oldFile, newFile);
+ 			}
+ 			/* newFile == "f.0" now */
++			if(syslog_is_buffer_write() && log_file->fd > 1)
++			{
++				fflush(log_file->fp);
++			}			
+ 			rename(log_file->path, newFile);
+ 		}
+ 
+@@ -776,15 +859,16 @@
+ 		fl.l_type = F_UNLCK;
+ 		fcntl(log_file->fd, F_SETLKW, &fl);
+ #endif
+-		close(log_file->fd);
++        syslog_close_fp_fd(log_file->fp,&(log_file->fd));        
+ 		goto reopen;
+ 	}
+ /* TODO: what to do on write errors ("disk full")? */
+-	len = full_write(log_file->fd, msg, len);
++	len = syslog_write(log_file->fp,log_file->fd,msg,len);	
++	
+ 	if (len > 0)
+ 		log_file->size += len;
+ #else
+-	full_write(log_file->fd, msg, len);
++	syslog_write(log_file->fp,log_file->fd,msg,len);	
+ #endif
+ 
+ #ifdef SYSLOGD_WRLOCK
+@@ -974,6 +1058,11 @@
+ }
+ #endif
+ 
++static void syslog_signal_handler(int signum) {    
++	fflush_all();
++}
++
++
+ static void do_syslogd(void) NORETURN;
+ static void do_syslogd(void)
+ {
+@@ -997,6 +1086,7 @@
+ 	signal(SIGALRM, do_mark);
+ 	alarm(G.markInterval);
+ #endif
++    signal(SIGUSR1, syslog_signal_handler); 
+ 	xmove_fd(create_socket(), STDIN_FILENO);
+ 
+ 	if (option_mask32 & OPT_circularlog)
+@@ -1089,6 +1179,7 @@
+ 	} /* while (!bb_got_signal) */
+ 
+ 	timestamp_and_log_internal("syslogd exiting");
++	syslog_close_fp_fd(G.logFile.fp,&(G.logFile.fd));    
+ 	remove_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
+ 	ipcsyslog_cleanup();
+ 	if (option_mask32 & OPT_kmsg)
+@@ -1097,11 +1188,45 @@
+ #undef recvbuf
+ }
+ 
++void syslog_get_uci_config_item(char* query_string, int* value)
++{
++    char get_propty_log_data[64];
++    memset(get_propty_log_data,0,64);
++    if(0 == lynq_get_value("lynq_uci","lynq_log",query_string,get_propty_log_data))
++    {
++        *value = atoi(get_propty_log_data);
++        printf("%s :%d\n",query_string,*value);
++    }
++    else
++    {            
++        snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",*value);
++        lynq_set_value("lynq_log",query_string, get_propty_log_data);
++    }
++}
++
++void syslog_get_uci_config(int* lynq_syslog_filesize, int* lynq_syslog_rotate, int* lynq_syslog_buffer_size)
++{
++	if(NULL != lynq_get_value && (NULL != lynq_set_value))
++	{
++	    syslog_get_uci_config_item("syslog_flie_size",lynq_syslog_filesize);
++	    syslog_get_uci_config_item("syslog_flie_rotate",lynq_syslog_rotate); 
++           syslog_get_uci_config_item("syslog_flie_buffer_size",lynq_syslog_buffer_size);         	
++	}
++}
++
+ int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int syslogd_main(int argc UNUSED_PARAM, char **argv)
  {
  	int opts;
  	char OPTION_DECL;
 +    
 +    void *handle_uci;
-+    static char get_propty_log_data[64] = {0};
++
 +    int lynq_syslog_filesize = 80*1024*1024;
 +    int lynq_syslog_rotate = 10;
 +    const char *lynq_libpath_uci = "/lib64/liblynq-uci.so";
++    int lynq_syslog_buffer_size = 8*1024;
 +    
  #if ENABLE_FEATURE_REMOTE_LOG
  	llist_t *remoteAddrList = NULL;
  #endif
-@@ -1157,6 +1175,38 @@
+@@ -1157,6 +1282,14 @@
  	//umask(0); - why??
  	write_pidfile(CONFIG_PID_FILE_PATH "/syslogd.pid");
  
 +    handle_uci = dlopen(lynq_libpath_uci,RTLD_NOW); 
 +    lynq_get_value = (int (*)(void))dlsym(handle_uci,"lynq_get_value");
 +    lynq_set_value = (int (*)(char *section, char *key, char *value))dlsym(handle_uci,"lynq_set_value");
-+    if(NULL != lynq_get_value && (NULL != lynq_set_value))
-+    {
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_size",get_propty_log_data))
-+        {
-+            lynq_syslog_filesize = atoi(get_propty_log_data);
-+            printf("lynq_syslog_filesize:%d\n",lynq_syslog_filesize);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_filesize);
-+            lynq_set_value("lynq_log","syslog_flie_size", get_propty_log_data);
-+        }
-+        memset(get_propty_log_data,0,64);
-+        if(0 == lynq_get_value("lynq_uci","lynq_log","syslog_flie_rotate",get_propty_log_data))
-+        {
-+            lynq_syslog_rotate = atoi(get_propty_log_data);
-+            printf("lynq_syslog_rotate:%d\n",lynq_syslog_rotate);
-+        }
-+        else
-+        {		     
-+            snprintf(get_propty_log_data,sizeof(get_propty_log_data),"%d",lynq_syslog_rotate);
-+            lynq_set_value("lynq_log","syslog_flie_rotate", get_propty_log_data);
-+        }
-+    }
++    syslog_get_uci_config(&lynq_syslog_filesize, &lynq_syslog_rotate, &g_syslog_buffer_size);
 +
 +	G.logFileSize = lynq_syslog_filesize;
 +	G.logFileRotate = lynq_syslog_rotate;
@@ -73,3 +262,10 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
+@@ -1171,3 +1304,6 @@
+ #undef OPTION_STR
+ #undef OPTION_DECL
+ #undef OPTION_PARAM
++
++
++
diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb
index 49244e3..3304725 100755
--- a/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb
@@ -3,7 +3,7 @@
 DESCRIPTION = "lynq call"

 LICENSE = "MediaTekProprietary"

 LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"

-DEPENDS += "platform-libs audio-mixer-ctrl libpal gstreamer1.0 glib-2.0 dtmf libapn liblynq-log liblynq-shm"

+DEPENDS += "platform-libs audio-mixer-ctrl libpal gstreamer1.0 glib-2.0 dtmf libapn liblynq-log liblynq-shm liblynq-uci"

 inherit workonsrc

 WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-data"

 

diff --git a/src/bsp/lk/platform/mt2735/drivers/rtc/rtc.c b/src/bsp/lk/platform/mt2735/drivers/rtc/rtc.c
index df570c8..3620798 100644
--- a/src/bsp/lk/platform/mt2735/drivers/rtc/rtc.c
+++ b/src/bsp/lk/platform/mt2735/drivers/rtc/rtc.c
@@ -888,8 +888,10 @@
         check_mode_flag = true;
     }
 
+	/*
     RTC_LOG("%s#1 powerkey1 = 0x%x, powerkey2 = 0x%x, %s LPD\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2)
              , (RTC_Read(RTC_CON) & RTC_CON_LPSTA_RAW) ? "with" : "without" );
+			 */
 
     RTC_LOG("bbpu = 0x%x, con = 0x%x, osc32con = 0x%x, sec = 0x%x, yea = 0x%x\n", RTC_Read(RTC_BBPU), RTC_Read(RTC_CON), RTC_Read(RTC_OSC32CON)
              , RTC_Read(RTC_AL_SEC), RTC_Read(RTC_AL_YEA));
@@ -900,7 +902,7 @@
         }
     } else {
         /* normally HW reload is done in BROM but check again here */
-        RTC_LOG("%s#2 powerkey1 = 0x%x, powerkey2 = 0x%x\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2));
+        //RTC_LOG("%s#2 powerkey1 = 0x%x, powerkey2 = 0x%x\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2));
         RTC_Write(RTC_BBPU, RTC_Read(RTC_BBPU) | RTC_BBPU_KEY | RTC_BBPU_RELOAD);
         if (!Write_trigger()) {
             rtc_recovery_flow();
@@ -910,7 +912,7 @@
             } else {
                 RTC_LOG("%s Writeif_unlock\n", __func__);
                 if (RTC_Read(RTC_POWERKEY1) != RTC_POWERKEY1_KEY || RTC_Read(RTC_POWERKEY2) != RTC_POWERKEY2_KEY) {
-                    RTC_LOG("%s#3 powerkey1 = 0x%x, powerkey2 = 0x%x\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2));
+                    //RTC_LOG("%s#3 powerkey1 = 0x%x, powerkey2 = 0x%x\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2));
                     if (!rtc_first_boot_init(result)) {
                         rtc_recovery_flow();
                     }
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/seclib.c b/src/bsp/trustzone/teeloader/mt2735/src/security/seclib.c
index 59419d8..8aae8a5 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/seclib.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/seclib.c
@@ -43,7 +43,7 @@
 /**************************************************************************
  *  DEBUG FUNCTIONS
  **************************************************************************/
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #define DBG_INFO(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
@@ -97,4 +97,4 @@
 int seclib_get_hwid_key(u8 *key, u32 key_size)
 {
     return seclib_get_key(SOC_DATA, key, key_size, 2);
-}
\ No newline at end of file
+}
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_emi_mpu.c b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_emi_mpu.c
index d7e006b..9441d09 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_emi_mpu.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_emi_mpu.c
@@ -47,7 +47,7 @@
 #define writel(b,addr) __raw_writel(b,addr)
 #define IOMEM(reg) (reg)
 
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #define DBG_INFO(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_init.c b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_init.c
index fa9e374..b261180 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_init.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_init.c
@@ -53,7 +53,7 @@
  **************************************************************************/
 #define MOD "[TZ_INIT]"
 
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #define DBG_INFO(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_sec_cfg.c b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_sec_cfg.c
index dd49816..fc44ba0 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_sec_cfg.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_sec_cfg.c
@@ -39,7 +39,7 @@
 
 #define MOD "[TZ_SEC_CFG]"
 
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #else
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_tbase.c b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_tbase.c
index 8e14488..2311550 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_tbase.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_tbase.c
@@ -43,7 +43,7 @@
 
 #define MOD "[TZ_TBASE]"
 
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #else
diff --git a/src/lynq/framework/lynq-audio-service/src/lynq_audio_service.c b/src/lynq/framework/lynq-audio-service/src/lynq_audio_service.c
index 9e1957c..cdf425d 100755
--- a/src/lynq/framework/lynq-audio-service/src/lynq_audio_service.c
+++ b/src/lynq/framework/lynq-audio-service/src/lynq_audio_service.c
@@ -5,7 +5,8 @@
 
 int main()
 {
-    system("/usr/bin/pulseaudio -D");
+    RLOGD("Open the pulseaudio service\n");
+    system("/usr/bin/pulseaudio -D --system");
     while(1)
     {
         sleep(UINT32_MAX);
diff --git a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
index d6fb6cd..3ea7719 100755
--- a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
@@ -107,6 +107,18 @@
     }
     bool apnHasCreated = FALSE;
     Parcel p;
+    if(urc_response->pdnState == PDN_TIMEOUT_CANCEL)
+    {
+        p.writeInt32(1);
+        p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+        p.writeInt32(0);//temporary plan
+        p.writeInt32(urc_response->pdnState);
+        writeStringToParcel(p,urc_response->apnName);
+        writeStringToParcel(p,urc_response->apnType);
+        writeStringToParcel(p,urc_response->ifname);
+        android::LYNQ_RIL_urcBroadcast(p,LYNQ_URC_DATA_CALL_STATUS_IND);
+        return 0;
+    }
     if(urc_response->cId > 0)
     {
         if(urc_response->pdnState==PDN_DISCONNECTED)//if user disable data call,the pdn state wiil change to disconnected.
@@ -417,6 +429,8 @@
         return "PDN_RETRYING";
     case RIL_Data_Call_PdnState::PDN_SCANNING:
         return "PDN_SCANNING";
+    case RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL:
+        return "PDN_TIMEOUT_CANCEL";
     default:
         return "UNKNOWN";
     }
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index facd0fe..248000d 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -62,6 +62,18 @@
     LYNQ_E_NULL_ANONALY=9001
 }LYNQ_E;
 
+typedef enum {
+    PDN_IDLE,
+    PDN_CONNECTING,
+    PDN_CONNECTED,
+    PDN_DISCONNECTING,
+    PDN_DISCONNECTED,
+    PDN_RETRYING,
+    PDN_FAILED,
+    PDN_SCANNING,
+    PDN_TIMEOUT_CANCEL,
+} RIL_Data_Call_PdnState;
+
 int lynq_client_sockfd = 0;
 int Global_uToken = 0;
 struct sockaddr_in lynq_data_socket_server_addr;
@@ -102,6 +114,7 @@
 * @brief temp of apn result info
 */
 char g_lynq_apn_result[1024] = {};
+int g_data_call_timeout_value = LYNQ_DATA_TIME_OUT;
 
 static std::vector<int> s_data_urc_wait_list;
 
@@ -627,7 +640,7 @@
             bzero(apn,LYNQ_APN_MAX_LEN);
             bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);
             bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
-            if(pdnState!=4)//PDN_DISCONNECTED
+            if(pdnState != RIL_Data_Call_PdnState::PDN_DISCONNECTED)//PDN_DISCONNECTED
             {
                 urc_msg = strdupReadString_p(p);
                 int len = strlen(urc_msg);
@@ -709,8 +722,15 @@
                         LYERRLOG("client still without res");
                         break;
                     }
+                    if(pdnState == RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL)
+                    {
+                        lynq_data_call = LYNQ_E_TIME_OUT;
+                    }
+                    else
+                    {
+                        lynq_data_call = 0;
+                    }
                     sendSignalDataCallStateChange();
-                    lynq_data_call = 0;
                     data_timelimit = 0;
                 }
                 printf_apn_table_debug(__FUNCTION__,__LINE__);
@@ -842,6 +862,7 @@
 int get_imsi();
 int check_apn_status();
 
+int get_timeout_value();
 int lynq_init_data(int uToken)
 {
     if (g_lynq_data_init_flag == 1)
@@ -854,6 +875,15 @@
     Global_uToken = uToken;
     LYLOGSET(LOG_INFO);
     LYLOGEINIT(USER_LOG_TAG);
+    int ret = get_timeout_value();
+    if(ret >= 30000)
+    {
+        g_data_call_timeout_value = ret;
+    }
+    else
+    {
+        LYERRLOG("timeout must greater or equal to 30s!!!");
+    }
     result = lynq_socket_client_start();
     pthread_mutex_init(&g_lynq_data_sendto_mutex, NULL);
     if(result!=0)
@@ -952,6 +982,11 @@
 int lynq_setup_data_call(int *handle)
 {
     int error = -1;
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return error;
+    }
     #ifdef GSW_RIL_CFG  //becuase gsw not have connman,data can not be triggered by connman.
     LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
     error = lynq_setup_data_call_sp(handle,NULL,"default",NULL,NULL,NULL,NULL,NULL);
@@ -1005,7 +1040,7 @@
     if(error==0)
     {
         data_timelimit = 1;
-        if (waitDataCallstateChange(LYNQ_DATA_TIME_OUT) == ETIMEDOUT)
+        if (waitDataCallstateChange(g_data_call_timeout_value) == ETIMEDOUT)
         {
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
@@ -1019,6 +1054,13 @@
             printf_apn_table_debug(__FUNCTION__,__LINE__);
             return error;
         }
+        if(lynq_data_call == LYNQ_E_TIME_OUT)
+        {
+            error = LYNQ_E_TIME_OUT;
+            LYERRLOG("PDN_TIMEOUT_CANCLE:wait data Call state fail!!!");
+            printf_apn_table_debug(__FUNCTION__,__LINE__);
+            return error;
+        }
     }
     printf_apn_table_debug(__FUNCTION__,__LINE__);
     #endif //GSW_RIL_CFG
@@ -1035,6 +1077,11 @@
     int error = -1;
     int lynq_data_call_id = -1;
     int ret = 0;
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return error;
+    }
     if(handle==NULL)
     {
         LYERRLOG("handle is null!!!");
@@ -1106,6 +1153,11 @@
     int error = -1;
     int lynq_data_call_id = -1;
     char *argv[10] = {};
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return error;
+    }
     #ifdef GSW_RIL_CFG
     LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
     if(handle==NULL||apnType==NULL)
@@ -1209,7 +1261,7 @@
     if(error==0)
     {
         data_timelimit = 1;
-        if(waitDataCallstateChange(LYNQ_DATA_TIME_OUT)==ETIMEDOUT)
+        if(waitDataCallstateChange(g_data_call_timeout_value)==ETIMEDOUT)
         {
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
@@ -1223,6 +1275,13 @@
             printf_apn_table_debug(__FUNCTION__,__LINE__);
             return error;
         }
+        if(lynq_data_call == LYNQ_E_TIME_OUT)
+        {
+            error = LYNQ_E_TIME_OUT;
+            LYERRLOG("PDN_TIMEOUT_CANCLE:wait data Call state fail!!!");
+            printf_apn_table_debug(__FUNCTION__,__LINE__);
+            return error;
+        }
     }
     printf_apn_table_debug(__FUNCTION__,__LINE__);
     return error;
@@ -1390,6 +1449,11 @@
     int number = 0;
     int lynq_data_call_id = 0;
     int error = 0;
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return -1;
+    }
     lynq_data_call_id = *handle;
     if((handle==NULL) || (dataCallList==NULL))
     {
@@ -1930,6 +1994,24 @@
     }
     return 0;
 }
+int get_timeout_value()
+{
+    LYINFLOG("get_timeout_value enter");
+    int ret = -1;
+    char timeout_value[8] ={0};//get get_timeout_value
+    ret = lynq_get_value("lynq_uci","data_call","timeout",timeout_value);
+    if(ret == 0)
+    {
+        LYINFLOG("data_call.timeout is %s",timeout_value);
+        return atoi(timeout_value);
+    }
+    else
+    {
+        LYERRLOG("get_timeout_value");
+        return -1;
+    }
+}
+
 int radio_switch(int status)
 {
     Parcel *p =NULL;
diff --git a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
index ba7c1f4..00c5669 100755
--- a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
+++ b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
@@ -78,6 +78,9 @@
 int lynq_set_ims(const int ims_mode);

 int lynq_wait_signalchanges(int *handle);

 int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id);

+int lynq_set_feature_config_sbp(int sbp_flag);

+int lynq_query_feature_config_sbp(int *sbp_status );

+

 

 typedef enum {

     NETWORK_STATE_BUFFER_TYPE_VOICE_REG,

diff --git a/src/lynq/lib/liblynq-network/lynq_network.cpp b/src/lynq/lib/liblynq-network/lynq_network.cpp
index c025404..ec580e2 100755
--- a/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -25,6 +25,12 @@
 /*in CR AUTO00207414, in modem, 23G detach need 10s, 5g ims detach need 5s, so set length to 12s */

 #define WAIT_TIME_LENGTH_FOR_SET_PREFFERRED_NETWORK_TYPE (12) 

 

+#define SET_SBP_OPEN    " AT+ESBP=5,\"SBP_NRRC_BAR_CELL_WITH_CONNECTION_FAILURE\",1 "

+#define SET_SBP_CLOSE   " AT+ESBP=5,\"SBP_NRRC_BAR_CELL_WITH_CONNECTION_FAILURE\",0 "

+#define QUERY_SBP_STATUS    "AT+ESBP=7,\"SBP_NRRC_BAR_CELL_WITH_CONNECTION_FAILURE\""

+#define OPEN    1

+#define CLOSE    0

+

 

 using ::android::Parcel;

 

@@ -1109,6 +1115,106 @@
     return RESULT_OK;   

 }

 

+

+/*****************************************

+* @brief:sned at request ,close or open SBP

+* @param count [IN]:sbp_flag 0:close 1:open

+* @param sum [OUT]:NA

+* @return :NA

+* @todo:

+* @see:NA

+* @warning:NA

+******************************************/

+int lynq_set_feature_config_sbp(int sbp_flag)

+{

+    int ret = 0;

+     Parcel* p=NULL;

+     

+    if(sbp_flag != OPEN && sbp_flag != CLOSE)

+    {

+         LYERRLOG("Bad input paramater ,you need input 0 or 1 !!!");

+         return RESULT_ERROR;

+    }

+    if(sbp_flag == OPEN)

+    {

+        ret = lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s",SET_SBP_OPEN);

+    }

+    else if(sbp_flag == CLOSE)

+    {

+        ret = lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s",SET_SBP_CLOSE);

+    }

+    if(ret != RESULT_OK)

+    {

+

+        LYERRLOG("%s  lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }     

+       return 0;

+}

+

+/*****************************************

+* @brief:send at request,get sbp status

+* @param count [IN]:NA

+* @param sum [OUT]:sbp_status

+* @return :NA

+* @todo:

+* @see:NA

+* @warning:NA

+******************************************/

+int lynq_query_feature_config_sbp(int *sbp_status )

+{

+    int ret = 0;

+    Parcel* p=NULL;

+    

+    ret = lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s",QUERY_SBP_STATUS);

+    if(ret != RESULT_OK)

+    {

+

+       LYERRLOG("%s  lynq_send_common_request failure, ret is %d",__func__,ret);

+       return ret;  

+    }     

+    

+   

+    const char* data;

+    int data_len;

+    char* data_str;

+    char* start;

+    char status[8] = {'0'};

+    data = lynq_get_raw_data(p,&data_len);

+    if(data==NULL || data_len == 0)

+    {

+        LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);    

+        delete p;

+        return LYNQ_E_INNER_ERROR; 

+    }

+    data_str = (char*) calloc(1,data_len+1);

+    if (NULL == data_str) 

+    {

+         LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);         

+         delete p;

+         return LYNQ_E_MALLOC_ERROR;

+    }

+    memmove(data_str, data, data_len);     

+    data_str[data_len]='\0';           

+    LYINFLOG("%s return string is %s",__func__,data_str);  

+    start = strchr(data_str,':');

+    if(start != NULL)

+    {

+        strncpy(status,start+1,4);

+        *sbp_status = atoi(status);

+        LYINFLOG("Query sbp status is %d",*sbp_status);

+        return RESULT_OK;

+        

+    }

+    else 

+    {

+        LYERRLOG("Query sbp status Failed");

+        return LYNQ_E_INNER_ERROR;

+    }

+    

+}

+  

+

 static pthread_mutex_t urc_signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

 static pthread_cond_t urc_signal_state_change_cond = PTHREAD_COND_INITIALIZER;

 

diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index 221170c..0a5a4e3 100755
--- a/src/lynq/lib/liblynq-wifi6/libwifi6.c
+++ b/src/lynq/lib/liblynq-wifi6/libwifi6.c
@@ -2246,6 +2246,10 @@
     DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
     DO_OK_FAIL_REQUEST(lynq_cmd_mode);
     DO_OK_FAIL_REQUEST(cmd_save_config);
+//@ tmp do down/up to fix 5G AP turn to 2.4G cannot be conenct
+    system("wl down");
+    system("wl up");
+    RLOGD("[%s] -- run cmd down/up --%d",__func__,__LINE__);
 
     return 0;
 }
diff --git a/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h b/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
index dad33d5..dfc2f46 100644
--- a/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
+++ b/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
@@ -405,6 +405,7 @@
     PDN_RETRYING,
     PDN_FAILED,
     PDN_SCANNING,
+    PDN_TIMEOUT_CANCEL,
 } RIL_Data_Call_PdnState;
 /// @}
 
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
index 4cb9bd2..758f54a 100644
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
@@ -365,7 +365,19 @@
             ApnContext::mRpDataController->notifyWorld(urc);
         }
         break;
+    case RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL:
+    {
+        urcParcel = urc->getParcel();
+        urcParcel->setDataPosition(sizeof(int32_t) * 2);
 
+        RpDataUtils::fillDataCallResponse(urcParcel, Data_Call_Response_v1);
+
+        RFX_LOG_D(RFX_LOG_TAG, "ApnContext(%s) ::notifyStateChange with newState = %s, with Urc: %s",
+                   mApnType.c_str(), RpDataUtils::apnState2string(newState), RpDataUtils::requestOrUrcToString(urc->getId()));
+
+        ApnContext::mRpDataController->notifyWorld(urc);
+        break;
+    }
     case RIL_Data_Call_PdnState::PDN_IDLE:
     default:
         RFX_LOG_D(RFX_LOG_TAG, "ApnContext(%s)::notifyStateChange: unknown state.", mApnType.c_str());
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
index e39f4be..aeb0699 100755
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
@@ -1210,6 +1210,10 @@
             }
             return;
         }
+        apnContext->setSate(RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL);
+        RFX_LOG_D(RFX_LOG_TAG, "reTrySetupData, retry with apnType: %s,RIL_Data_Call_PdnState::PDN_FAILED, delay time: %ld",
+                apnType.c_str(),
+                delay);
     } else {
         string str;
         if (!apnContext->isEnabled()) {
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp
index df79299..7f2a987 100644
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp
@@ -354,6 +354,8 @@
         return "PDN_RETRYING";
     case RIL_Data_Call_PdnState::PDN_SCANNING:
         return "PDN_SCANNING";
+    case RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL:
+        return "PDN_TIMEOUT_CANCEL";
     }
 }