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..61e662b 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,235 @@
 --- 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,73 @@
+ 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
++		{
++			*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 +768,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 +785,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 +832,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 +853,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
+@@ -1089,6 +1167,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 +1176,46 @@
+ #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;
++    int lynq_syslog_flush_wait_time = 120;    
 +    
  #if ENABLE_FEATURE_REMOTE_LOG
  	llist_t *remoteAddrList = NULL;
  #endif
-@@ -1157,6 +1175,38 @@
+@@ -1157,6 +1271,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 +237,10 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
+@@ -1171,3 +1293,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..61e662b 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,235 @@
 --- 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,73 @@
+ 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
++		{
++			*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 +768,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 +785,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 +832,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 +853,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
+@@ -1089,6 +1167,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 +1176,46 @@
+ #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;
++    int lynq_syslog_flush_wait_time = 120;    
 +    
  #if ENABLE_FEATURE_REMOTE_LOG
  	llist_t *remoteAddrList = NULL;
  #endif
-@@ -1157,6 +1175,38 @@
+@@ -1157,6 +1271,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 +237,10 @@
  	do_syslogd();
  	/* return EXIT_SUCCESS; */
  }
+@@ -1171,3 +1293,6 @@
+ #undef OPTION_STR
+ #undef OPTION_DECL
+ #undef OPTION_PARAM
++
++
++
