diff --git a/src/lynq/lib/liblynq-wifi6/include/libwifi6.h b/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
index a337fef..0a2771d 100755
--- a/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
+++ b/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
@@ -18,9 +18,11 @@
 
 typedef enum {
     LYNQ_WIFI_AUTH_OPEN = 0,
-    LYNQ_WIFI_AUTH_WEP,
+    LYNQ_WIFI_AUTH_WEP,            // not support WEP
     LYNQ_WIFI_AUTH_WPA_PSK,
     LYNQ_WIFI_AUTH_WPA2_PSK,
+    LYNQ_WIFI_AUTH_WPA2_WPA3_PSK,
+    LYNQ_WIFI_AUTH_WPA3_PSK,
 }lynq_wifi_auth_s;
 
 typedef enum {
diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index 25e429b..2903075 100755
--- a/src/lynq/lib/liblynq-wifi6/libwifi6.c
+++ b/src/lynq/lib/liblynq-wifi6/libwifi6.c
@@ -21,6 +21,7 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <ifaddrs.h>
+#include "log/log.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -29,6 +30,8 @@
 }
 #endif
 
+#undef LOG_TAG
+#define LOG_TAG "LYNQ_WIFI"
 #define MAX_CMD 128
 #define MAX_RET 4096
 #define MODE_LEN 10
@@ -89,7 +92,7 @@
 {
     int ret;
     if (ctrl->ctrl == NULL) {
-        printf("local_wpa_ctrl_request ctrl is null\n");
+        RLOGE("local_wpa_ctrl_request ctrl is null\n");
         return -1;
     }
     pthread_mutex_lock(&ctrl->mutex);
@@ -102,7 +105,7 @@
     int repeat_cnt;
     struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
     pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
-    printf("inner_get_wpa_ctrl\n");
+    RLOGD("inner_get_wpa_ctrl\n");
     for (repeat_cnt = 0; repeat_cnt < 5 && NULL == g_lynq_wpa_ctrl[index]; repeat_cnt++) {
         pthread_mutex_unlock(&s_check_wpa_ctrl_mutex);
 //        printf("wait enable finish\n");
@@ -110,13 +113,13 @@
         pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
     }
     if (NULL == g_lynq_wpa_ctrl[index]) {
-        printf("NULL == g_lynq_wpa_ctrl[index]\n");
+        RLOGE("NULL == g_lynq_wpa_ctrl[index]");
         goto out_addr;
     }
     if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
         g_lynq_wpa_ctrl[index]->ctrl = wpa_ctrl_open(CTRL_PATH[index]);
         if (NULL == g_lynq_wpa_ctrl[index]->ctrl) {
-            printf("wpa_ctrl_open fail\n");
+            RLOGE("wpa_ctrl_open fail\n");
             goto out_addr;
         }
         pthread_mutex_init(&g_lynq_wpa_ctrl[index]->mutex, NULL);
@@ -136,7 +139,7 @@
 #define CHECK_IDX(idx, type) do { \
         if ( (idx == LYNQ_WIFI_INTERFACE_0 && type != CTRL_STA) || (idx == LYNQ_WIFI_INTERFACE_1 && type != CTRL_AP) \
                 || idx < LYNQ_WIFI_INTERFACE_0 || idx > LYNQ_WIFI_INTERFACE_1 ) { \
-            printf("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
+            RLOGE("not support create [%s] on interface [%d]\n", (type == CTRL_STA ? "station" : "ap"), idx); \
             return -1; \
         } \
     }while (0)
@@ -153,23 +156,23 @@
 #define DO_REQUEST(cmd_str) do { \
         reply_len = MAX_RET;\
         cmd_reply[0] = '\0'; \
-        printf("to call [%s]\n", cmd_str);  \
+        RLOGD("to call [%s]\n", cmd_str);  \
         ret = local_wpa_ctrl_request(lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL); \
         if (ret != 0) { \
-            printf("call "#cmd_str" fail %d\n", ret); \
+            RLOGE("call "#cmd_str" fail %d\n", ret); \
             return ret; \
         } \
         cmd_reply[reply_len+1] = '\0'; \
-        printf("cmd replay [ %s ]\n", cmd_reply); \
+        RLOGD("cmd replay [ %s ]\n", cmd_reply); \
     }while(0)
 
 #define DO_OK_FAIL_REQUEST(cmd_str) do { \
         DO_REQUEST(cmd_str); \
         if (reply_len >=4 && memcmp(cmd_reply, "FAIL", 4) == 0 ) {\
-            printf("cmd "#cmd_str" return FAIL\n"); \
+            RLOGE("cmd "#cmd_str" return FAIL\n"); \
             return -1; \
         } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) { \
-            printf("cmd "#cmd_str" return not OK|FAIL\n"); \
+            RLOGE("cmd "#cmd_str" return not OK|FAIL\n"); \
             return -1; \
         } \
     }while (0)
@@ -184,10 +187,13 @@
     struct wpa_ctrl *lynq_wpa_ctrl = NULL;
     g_ap_watcher_stop_flag = 0;
 
-    while (g_ap_watcher_stop_flag == 0) {
-        if (lynq_wpa_ctrl == NULL) {
+    while (g_ap_watcher_stop_flag == 0)
+    {
+        if (lynq_wpa_ctrl == NULL)
+	{
             lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[CTRL_AP]); //@todo temp change
-            if (lynq_wpa_ctrl == NULL) {
+            if (lynq_wpa_ctrl == NULL)
+	    {
                 usleep(100*1000);
                 continue;
             }
@@ -196,32 +202,40 @@
             g_ap_watcher_started_flag = 1;
         }
 
-        if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl)) {
+        if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl))
+	{
             usleep(100*1000);
             continue;
         }
         memset(msg_notify, 0, MAX_RET);
         len = MAX_RET;
-        if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len)) {
+        if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
+	{
             msg_notify[len+1] = '\0';
-            printf("ap------> %s\n", msg_notify);
+            RLOGD("STAWatcherThreadProc ap------> %s\n", msg_notify);
 //you.chen change for tv-box start
-            if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL) {
+            if (strstr(msg_notify, "AP-STA-DISCONNECTED") != NULL)
+	    {
                 if (g_ap_callback_func != NULL)
                     g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_DISCONNECT);
-                if (g_gbw_enabled == 1 && g_gbw_mac != NULL) {
-                    printf("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
-                    if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL) {
+                if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
+		{
+                    RLOGD("disconect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
+                    if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
+		    {
                         stopGBW();
                     }
                 }
             }
-            else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL) {
+            else if (strstr(msg_notify, "AP-STA-CONNECTED") != NULL)
+	    {
                 if (g_ap_callback_func != NULL)
                     g_ap_callback_func(g_ap_callback_priv, LYNQ_WIFI_STATUS_CONNECT);
-                if (g_gbw_enabled == 1 && g_gbw_mac != NULL) {
-                    printf("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
-                    if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL) {
+                if (g_gbw_enabled == 1 && g_gbw_mac != NULL)
+		{
+                    RLOGD("conect %d, %s ,%s\n", g_gbw_enabled, g_gbw_mac, strstr(msg_notify, (const char*)g_gbw_mac));
+                    if (strstr(msg_notify, (const char*)g_gbw_mac) != NULL)
+		    {
                         startGBW();
                     }
                 }
@@ -229,7 +243,8 @@
 //you.chen add for tv-box end
         } // end if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
     } // end while (g_ap_watcher_stop_flag == 0)
-    if (lynq_wpa_ctrl != NULL) {
+    if (lynq_wpa_ctrl != NULL)
+    {
         wpa_ctrl_detach(lynq_wpa_ctrl);
         wpa_ctrl_close(lynq_wpa_ctrl);
     }
@@ -244,10 +259,13 @@
     struct wpa_ctrl *lynq_wpa_ctrl = NULL;
     g_sta_watcher_stop_flag = 0;
 
-    while (g_sta_watcher_stop_flag == 0) {
-        if (lynq_wpa_ctrl == NULL) {
+    while (g_sta_watcher_stop_flag == 0)
+    {
+        if (lynq_wpa_ctrl == NULL)
+	{
             lynq_wpa_ctrl = wpa_ctrl_open(CTRL_PATH[CTRL_STA]);
-            if (lynq_wpa_ctrl == NULL) {
+            if (lynq_wpa_ctrl == NULL)
+	    {
                 usleep(100*1000);
                 continue;
             }
@@ -256,51 +274,64 @@
             g_sta_watcher_started_flag = 1;
         }
 
-        if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl)) {
+        if ( 0 == wpa_ctrl_pending(lynq_wpa_ctrl))
+	{
             usleep(100*1000);
             continue;
         }
         memset(msg_notify, 0, MAX_RET);
         len = MAX_RET;
-        if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len)) {
+        if (!wpa_ctrl_recv(lynq_wpa_ctrl, msg_notify, &len))
+	{
             msg_notify[len+1] = '\0';
-            printf("sta ------> %s\n", msg_notify);
-            if (strstr(msg_notify, state_scan_result) != NULL) {
+            RLOGD("STAWatcherThreadProc sta ------> %s\n", msg_notify);
+            if (strstr(msg_notify, state_scan_result) != NULL)
+	    {
                 g_sta_scan_finish_flag = 1;
             }
 
-            if (g_sta_callback_func == NULL) {
+            if (g_sta_callback_func == NULL)
+	    {
                 continue;
             }
             error = -1;
-            if (strstr(msg_notify, "CTRL-EVENT-SCAN-RESULTS") != NULL) {
+            if (strstr(msg_notify, "CTRL-EVENT-SCAN-RESULTS") != NULL)
+	    {
                 g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_SCAN_RESULT, error);
             }
-            else if (strstr(msg_notify, "CTRL-EVENT-CONNECTED") != NULL) {
+            else if (strstr(msg_notify, "CTRL-EVENT-CONNECTED") != NULL)
+	    {
                 g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_CONNECT, error);
             }
-            else if (strstr(msg_notify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL) {
+            else if (strstr(msg_notify, "CTRL-EVENT-SSID-TEMP-DISABLED") != NULL)
+	    {
                 pReason = strstr(msg_notify, "reason=");
-                if (pReason != NULL) {
+                if (pReason != NULL)
+		{
                     pReason += strlen("reason=");
-                    if (memcmp(pReason, "CONN_FAILED", 11) == 0) {
+                    if (memcmp(pReason, "CONN_FAILED", 11) == 0)
+		    {
                         error = LYNQ_TIME_OUT;
                     }
-                    else if (memcmp(pReason, "WRONG_KEY", 9) == 0) {
+                    else if (memcmp(pReason, "WRONG_KEY", 9) == 0)
+		    {
                         error = LYNQ_PSW_ERROR;
                     }
                     g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_DISCONNECT, error);
                 }
             }
-            else if (strstr(msg_notify, "CTRL-EVENT-DISCONNECTED") != NULL) {
+            else if (strstr(msg_notify, "CTRL-EVENT-DISCONNECTED") != NULL)
+	    {
                 g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_DISCONNECT, error);
             }
-            else if (strstr(msg_notify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL) {
+            else if (strstr(msg_notify, "CTRL-EVENT-NETWORK-NOT-FOUND") != NULL)
+	    {
                 g_sta_callback_func(g_ap_callback_priv, LYNQ_WIFI_STA_STATUS_DISCONNECT, LYNQ_NOT_FIND_AP);
             }
         }
     }
-    if (lynq_wpa_ctrl != NULL) {
+    if (lynq_wpa_ctrl != NULL)
+    {
         wpa_ctrl_detach(lynq_wpa_ctrl);
         wpa_ctrl_close(lynq_wpa_ctrl);
     }
@@ -310,13 +341,14 @@
 {
     int ret = 0;
     int i;
+    RLOGD("enter lynq_wifi_enable");
     pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
 
-    if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL) {
+    if (g_lynq_wpa_ctrl[0] != NULL && g_lynq_wpa_ctrl[1] != NULL)
+    {
         goto out_enable;
     }
 
-    printf("lynq_wifi_enable1\n");
     const char * cmd_check_service =
             "state=`systemctl is-active wg870_drv_insmod.service`\n"
             "[ \"\"$state == \"active\" ] && exit 0\n"
@@ -326,20 +358,26 @@
 //    }
 
     ret = system(cmd_check_service);
-    if (ret != 0) {
-        printf("service state %d\n", ret);
+    if (ret != 0)
+    {
+        //printf("service state %d\n", ret);
+        RLOGE("[wifi error]service state %d",ret);
         ret = -1;
         goto out_enable;
     }
 
-    for (i=0; i<10; i++) {
+    RLOGD("check service state is OK");
+    for (i=0; i<10; i++)
+    {
         if (system("connmanctl technologies | grep -q \"/net/connman/technology/wifi\"") == 0) {
             break;
         }
         usleep(300*1000);
     }
 
-    if (i >= 10) {
+    if (i >= 10)
+    {
+	RLOGE("[wifi error] check connman technologies no wifi");
         ret = -1;
         goto out_enable;
     }
@@ -360,7 +398,8 @@
     }
     //@todo delete add temp check for socket avilable end (20220606)
 
-    if (0 != system("ifconfig | grep -q ap0")) {
+    if (0 != system("ifconfig | grep -q ap0"))
+    {
         system("connmanctl enable wifi");
         usleep(300*1000);
         system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 disconnect");
@@ -370,30 +409,34 @@
         usleep(300*1000);
         system("wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=ap0 disconnect");
     }
-    ret = system("wl -i wlan0 PM 0");
-    if( ret != 0)
+    if (g_ap_watcher_pid == 0 )
     {
-        printf("Set sta PM work mode to 0 fail,ret is%d",ret);
-    }
-    if (g_ap_watcher_pid == 0 ) {
         ret=pthread_create(&g_ap_watcher_pid,NULL,APWatcherThreadProc,NULL);
-        if(ret<0){
+        if(ret<0)
+	{
+            RLOGE("[wifi error]creat APWatcherThreadProc fail");
             ret = -1;
             goto out_enable;
         }
     }
-
+    
+    RLOGD("creat APWatcherTheradProc susccs");
     if (g_sta_watcher_pid == 0 ) {
         ret=pthread_create(&g_sta_watcher_pid,NULL,STAWatcherThreadProc,NULL);
-        if(ret<0){
+        if(ret<0)
+	{
+            RLOGE("[wifi error]creat STAWatcherThreadProc fail");
             ret = -1;
             goto out_enable;
         }
     }
 
-    for (i=0; i<10; i++) {
+    RLOGD("creat STAWatcherTheradProc susccs");
+    for (i=0; i<10; i++)
+    {
         usleep(300*1000);
-        if (g_ap_watcher_started_flag == 1 && g_sta_watcher_started_flag == 1) {
+        if (g_ap_watcher_started_flag == 1 && g_sta_watcher_started_flag == 1)
+	{
             break;
         }
     }
@@ -409,6 +452,7 @@
 
 int lynq_wifi_disable(void)
 {
+    RLOGD("enter lynq_wifi_disable");
     pthread_mutex_lock(&s_check_wpa_ctrl_mutex);
     g_ap_watcher_stop_flag = 1;
     g_sta_watcher_stop_flag = 1;
@@ -515,17 +559,20 @@
 static int inner_get_param(int interface, int net_no, char* param_name, char * out_put) {
     int i, ssid_len;
     char lynq_cmd_get[128]={0};
-
-    if (out_put == NULL) {
-        printf("output ptr is null\n");
+    RLOGD("enter inner_get_param");
+    if (out_put == NULL)
+    {
+        RLOGE("output ptr is null");
         return -1;
     }
-    if (param_name == NULL) {
-        printf("param ptr is null");
+    if (param_name == NULL)
+    {
+        RLOGE("param ptr is null");
         return -1;
     }
-    if (param_name[0] == '\0') {
-        printf("param is empty");
+    if (param_name[0] == '\0')
+    {
+        RLOGE("param is empty");
         return -1;
     }
 
@@ -535,14 +582,17 @@
 
     DO_REQUEST(lynq_cmd_get);
 
-    if (memcmp(cmd_reply, "FAIL", 4) == 0) {
+    if (memcmp(cmd_reply, "FAIL", 4) == 0)
+    {
+        RLOGE("wpa_supplicant return cmd_reply is FAIL");
         return -1;
     }
 
 //    printf("reply len %d, %08x\n", reply_len, (int)out_put);
     if (strcmp(param_name, "ssid") == 0)
     {
-        if (cmd_reply[0] == '\"') {
+        if (cmd_reply[0] == '\"')
+	{
             ssid_len = reply_len - 1;
             memcpy(out_put, cmd_reply + 1, ssid_len);
             if (out_put[ssid_len-1] == '\"')
@@ -554,7 +604,8 @@
                 out_put[ssid_len] = '\0';
             }
         }
-        else{
+        else
+	{
             ssid_len = reply_len / 2;
             for(i=0; i<ssid_len; i++)
             {
@@ -574,15 +625,18 @@
     int ret = 0;
     char * end = str + len - 1;
     results[ret++] = str;
-    while(str < end) {
-        if (*str == delimiter) {
+    while(str < end)
+    {
+        if (*str == delimiter)
+	{
             *str++ = '\0';
             results[ret++] = str;
             continue;
         }
         str++;
     }
-    if (*str == delimiter) {
+    if (*str == delimiter)
+    {
         *str = '\0';
     }
 
@@ -604,7 +658,7 @@
     {
         *p = '\0';
     }
-    printf("inner_get_ip_by_mac %s\n", ip);
+    RLOGD("inner_get_ip_by_mac %s\n", ip);
     return ret;
 }
 
@@ -612,20 +666,24 @@
     struct in_addr addr ={0};
     struct hostent *ht;
 
-    if (ip == NULL || *ip == '\0' || hostname == NULL) {
-        return -1;
+    if (ip == NULL || *ip == '\0' || hostname == NULL)
+    {
+        RLOGE("ip == NULL or hostname == NULL");
+	return -1;
     }
 
     *hostname = '\0';
-    if (inet_aton(ip, &addr) == 0) {
+    if (inet_aton(ip, &addr) == 0)
+    {
         printf("---inet_aton fail\n");
         return -1;
     }
 
     ht = gethostbyaddr(&addr, sizeof(struct in_addr), AF_INET);
 
-    if (ht == NULL) {
-        printf("---gethostbyaddr fail\n");
+    if (ht == NULL)
+    {
+        RLOGE("---gethostbyaddr fail\n");
         herror(NULL);
         return -1;
     }
@@ -642,6 +700,7 @@
     char * split_words[128] = {0};
     char local_ssid[128] = {0};
     const char *lynq_wifi_list_networks = "LIST_NETWORKS";
+    RLOGD("[lynq_get_network_number_list] enter lynq_get_network_number_list api");
 
     CHECK_WPA_CTRL(ap_sta);
 
@@ -652,16 +711,19 @@
     //@todo check ssid field to compatible
 
     ret = 0;
-    for(index=1; index < count; index++) {
+    for(index=1; index < count; index++)
+    {
         words_count = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
-        if (words_count > 2) {
+        if (words_count > 2)
+	{
             inner_copy_ssid(local_ssid, split_words[1], sizeof (local_ssid));
-            if (ssid == NULL || strcmp(local_ssid, ssid) == 0) {
+            if (ssid == NULL || strcmp(local_ssid, ssid) == 0)
+	    {
                 net_no_list[ret++] = atoi(split_words[0]);
             }
         }
     }
-
+    RLOGD("[lynq_get_network_number_list] lynq_get_network_number_list return ok");
     return ret;
 }
 
@@ -670,13 +732,18 @@
     CHECK_WPA_CTRL(ap_sta);
     const char *lynq_wifi_add_network = "ADD_NETWORK";
 
+    RLOGD("[lynq_add_network] enter lynq_add_network");
     DO_REQUEST(lynq_wifi_add_network);
-    if (memcmp(cmd_reply, "FAIL", 4) == 0) {
+    if (memcmp(cmd_reply, "FAIL", 4) == 0)
+    {
+        RLOGE("[wifi error]lynq_add_network  cmd_reply FAIL");
         return -1;
     }
 
-    for(i=0;i<reply_len;i++) {
-        if(cmd_reply[i] == '\n') {
+    for(i=0;i<reply_len;i++)
+    {
+        if(cmd_reply[i] == '\n')
+	{
             cmd_reply[i] = '\0';
             break;
         }
@@ -689,10 +756,12 @@
     int count, index;
     int net_no_list[128];
 
-
+    RLOGD("[lynq_check_network_number] enter lynq_check_network_number api");
     count = lynq_get_network_number_list(idx, ap_sta, net_no_list, NULL);
-    for (index=0; index < count; index++) {
-        if (net_no_list[index] == net_no) {
+    for (index=0; index < count; index++)
+    {
+        if (net_no_list[index] == net_no)
+	{
             return 0;
         }
     }
@@ -702,45 +771,59 @@
     else
         index = -1;
 
-    while (index < net_no ) {
+    while (index < net_no )
+    {
         index = lynq_add_network(ap_sta);
-        if (index >= net_no) { // required network no created
+        if (index >= net_no)
+	{ // required network no created
+            RLOGD("required network no created\n");;
             return 0;
         }
-        else if( index < 0) {
-            printf("add network fail\n");
+        else if( index < 0)
+	{
+            RLOGE("[lynq_check_network_number] add network fail");
             return -1;
         }
     }
 
     if (index < 0)
-        return -1;
-
+    {
+        RLOGE("[lynq_check_network_number] network index < 0");
+	return -1;
+    }
+    RLOGD("[lynq_check_network_number] work finished &state is ok");
     return 0;
 }
 
 static lynq_wifi_band_m convert_band_from_freq(int freq) { //@todo
-    if (freq > 5000 && freq < 6000) {
+    if (freq > 5000 && freq < 6000)
+    {
         return LYNQ_WIFI_5G_band;
     }
-    else if (freq > 2000 && freq <  3000) {
+    else if (freq > 2000 && freq <  3000)
+    {
         return LYNQ_WIFI_2G_band;
     }
     return LYNQ_WIFI_2_and_5G_band;
 }
 
 static lynq_wifi_auth_s convert_auth_from_key_mgmt(char * key_mgmt) {
-    if (key_mgmt != NULL) {
-        if (memcmp( key_mgmt, "NONE", 4) == 0) {
+    if (key_mgmt != NULL)
+    {
+        if (memcmp( key_mgmt, "NONE", 4) == 0)
+	{
             return LYNQ_WIFI_AUTH_OPEN;
         }
-        else if (memcmp( key_mgmt, "WEP", 3) == 0){
+        else if (memcmp( key_mgmt, "WEP", 3) == 0)
+	{
             return LYNQ_WIFI_AUTH_WEP;
         }
-        else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0){
+        else if (memcmp( key_mgmt, "WPA-PSK", 7) == 0)
+	{
             return LYNQ_WIFI_AUTH_WPA_PSK;
         }
-        else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0){
+        else if (memcmp( key_mgmt, "WPA2-PSK", 8) == 0)
+	{
             return LYNQ_WIFI_AUTH_WPA2_PSK;
         }
     }
@@ -749,20 +832,26 @@
 }
 
 static lynq_wifi_auth_s convert_max_auth_from_flag(char * flag) {
-    if (flag != NULL) {
-        if (strstr( flag, "WPA2-PSK") != NULL){
+    if (flag != NULL)
+    {
+        if (strstr( flag, "WPA2-PSK") != NULL)
+	{
             return LYNQ_WIFI_AUTH_WPA2_PSK;
         }
-        else if (strstr( flag, "WPA-PSK") != NULL){
+        else if (strstr( flag, "WPA-PSK") != NULL)
+	{
             return LYNQ_WIFI_AUTH_WPA_PSK;
         }
-        else if (strstr( flag, "WEP") != NULL){
+        else if (strstr( flag, "WEP") != NULL)
+	{
             return LYNQ_WIFI_AUTH_WEP;
         }
-        else if (strstr( flag, "NONE") != NULL) {
+        else if (strstr( flag, "NONE") != NULL)
+	{
             return LYNQ_WIFI_AUTH_OPEN;
         }
-        else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0) {
+        else if (strcmp( flag, "[ESS]") == 0 || strcmp( flag,"[WPS][ESS]") == 0)
+	{
             return LYNQ_WIFI_AUTH_OPEN;
         }
     }
@@ -806,7 +895,9 @@
 
     CHECK_WPA_CTRL(interface);
 
-    if (curr_state == NULL) {
+    if (curr_state == NULL)
+    {
+        RLOGE("[wifi error][inner_get_status_info]curr_state is NULL");
         return -1;
     }
 
@@ -816,53 +907,63 @@
 
     curr_state->net_no = -1;
     ret = -1;
-    for(i=0; i < count; i++) {
-        if (curr_state->ap != NULL) {
+    for(i=0; i < count; i++)
+    {
+        if (curr_state->ap != NULL)
+	{
             p = strstr(split_lines[i], FLAG_SBSID);
-            if (p != NULL) {
+            if (p != NULL)
+	    {
                 strncpy(curr_state->ap->ap_mac, p + strlen(FLAG_SBSID), sizeof(curr_state->ap->ap_mac));
                 ret = 0;
                 continue;
             }
             p = strstr(split_lines[i], FLAG_SSID);
-            if (p != NULL) {
+            if (p != NULL)
+	    {
                 inner_copy_ssid(curr_state->ap->ap_ssid, p + strlen(FLAG_SSID), sizeof (curr_state->ap->ap_ssid));
                 ret = 0;
                 continue;
             }
             p = strstr(split_lines[i], FLAG_KEY_MGMT);
-            if (p != NULL) {
+            if (p != NULL)
+	    {
                 curr_state->ap->auth = convert_auth_from_key_mgmt(p + strlen(FLAG_KEY_MGMT));
-                printf("key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
+                RLOGD("inner_get_status_info: key_mgmt %d, -- %s\n", curr_state->ap->auth, p);
                 ret = 0;
                 continue;
             }
             p = strstr(split_lines[i], FLAG_FREQ);
-            if (p != NULL) {
+            if (p != NULL)
+	    {
                 curr_state->ap->band = convert_band_from_freq(atoi( p + strlen(FLAG_FREQ)));
                 ret = 0;
                 continue;
             }
             p = strstr(split_lines[i], FLAG_IPADDR);
-            if (p != NULL) {
+            if (p != NULL)
+	    {
                 strncpy(curr_state->ap->ap_ip, p + strlen(FLAG_IPADDR), sizeof(curr_state->ap->ap_ip));
                 ret = 0;
                 continue;
             }
         } // end  if (ap != NULL)
-        if (curr_state->state != NULL) {
+        if (curr_state->state != NULL)
+	{
             p = strstr(split_lines[i], FLAG_STATE);
-            if (p != NULL) {
+            if (p != NULL)
+	    {
                 strcpy(curr_state->state, p + strlen(FLAG_STATE));
                 ret = 0;
                 continue;
             }
 
         } //end else if (state != NULL)
-        if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i]) {
+        if ((p = strstr(split_lines[i], FLAG_ID)) == split_lines[i])
+	{
             ret = 0;
             curr_state->net_no = atoi(p + strlen(FLAG_ID));
-            printf("net_no %d, -- %s\n", curr_state->net_no, p);
+            RLOGD("inner_get_status_info:net_no %d, -- %s\n", curr_state->net_no, p);
         }
     }
 
@@ -872,17 +973,22 @@
 
 int lynq_wifi_ap_ssid_set(lynq_wifi_index_e idx,char *ap_ssid)
 {
+    RLOGD("enter lynq_wifi_ap_ssid_set");
     char lynq_wifi_ssid_cmd[80]={0};
 
-    if (ap_ssid == NULL) {
-        printf("ap_ssid is null\n");
+    if (ap_ssid == NULL)
+    {
+        RLOGE("Input ap_ssid is NULL");
         return -1;
     }
-    else {
-        printf("idx:%d ap_ssid : %s\n", idx, ap_ssid);
+    else
+    {
+        RLOGD("[lynq_wifi_ap_ssid_set]idx:%d ap_ssid : %s\n", idx, ap_ssid);
     }
 
-    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0) {
+    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
+    {
+        RLOGE("Do check ap network_number fail");
         return -1;
     }
 
@@ -894,13 +1000,14 @@
 
     DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
     DO_OK_FAIL_REQUEST(cmd_save_config);
-
-	return 0;
+    RLOGD("[lynq_wifi_ap_ssid_set] set ssid sucss");
+    return 0;
 
 }
 
 int lynq_wifi_ap_ssid_get(lynq_wifi_index_e idx, char* ap_ssid)
 {
+    RLOGD("enter lynq_wifi_ap_ssid_get");
     CHECK_IDX(idx, CTRL_AP);
     return inner_get_param(CTRL_AP, AP_NETWORK_0, "ssid", ap_ssid);
 }
@@ -928,7 +1035,7 @@
 
     if(i == arr_len)
     {
-        printf("input frequency is eero--->%d,please check it\n", input_frequency);
+        RLOGE("[lynq_check_set_frequency]input frequency is --->%d,please check it\n", input_frequency);
         return -1;
     }
 
@@ -942,7 +1049,7 @@
 
     if( lynq_get_country_code(1,str_dest) != 0 )
     {
-        printf("get country_code error\n");
+        RLOGE("get country_code error\n");
 	return -1;
     }
     if( strncmp(str_dest,str_cnc,2) != 0 )
@@ -950,7 +1057,7 @@
         return 0;
     }else if( 2473 < input_frequency && input_frequency < 5744)
     {
-        printf("input frequency is bad\n");
+        RLOGE("input frequency is bad\n");
 	return -1;
     } 
     return 0;
@@ -961,23 +1068,24 @@
     char lynq_wifi_frequency_cmd[128]={0};
     char lynq_cmd_mode[128]={0};
     char lynq_cmd_slect[128]={0};
-
+    RLOGD("enter lynq_wifi_ap_frequency_set and input frequency is:%d", lynq_wifi_frequency);
     //@do check input frequency
     check = lynq_check_set_frequency(lynq_wifi_frequency);
     if(check != 0)
     {
-        printf("do check frequency error\n");
+        RLOGE("do check frequency error");
         return -1;
     }
     check = lynq_check_frequencyby_country_code(lynq_wifi_frequency);
     if(check != 0)
     {
-        printf("do check frequency error\n");
+        RLOGE("do check frequency error");
         return -1;
     }
 
     if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
     {
+        RLOGE("[set ap frequecny][lynq_check_network_number] error");
         return -1;
     }
 
@@ -994,67 +1102,76 @@
     DO_OK_FAIL_REQUEST(lynq_cmd_mode);
     DO_OK_FAIL_REQUEST(cmd_save_config);
 
-	return 0;
+    return 0;
 }
 
 int lynq_wifi_ap_frequency_get(lynq_wifi_index_e idx,int *lynq_wifi_frequency)
 {
     char lynq_frequency_str[MAX_RET] = {0};
-
+    RLOGD("enter lynq_wifi_ap_frequency_get and input idx is %d",idx);
     CHECK_IDX(idx, CTRL_AP);
 
-    if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0) {
+    if (inner_get_param(CTRL_AP, AP_NETWORK_0, "frequency", lynq_frequency_str) != 0)
+    {
+        RLOGE("[wifi error][lynq_wifi_ap_frequency_get]get frequency from device fail");
         return -1;
     }
     *lynq_wifi_frequency = atoi(lynq_frequency_str);
 
-	return 0;
+    return 0;
 }
 
 int lynq_wifi_ap_bandwidth_set(lynq_wifi_index_e idx,lynq_wifi_bandwidth_type_m bandwidth)
 {
+    RLOGD("enter lynq_wifi_ap_bandwidth_set");
     CHECK_IDX(idx, CTRL_AP);
     switch(bandwidth){
-		case LYNQ_WIFI_BANDWIDTH_HT10:
-		{
-            printf("bandwith  [%d] not support now\n", bandwidth);
-			return -1;
-		}
-		case LYNQ_WIFI_BANDWIDTH_HT20:
+        case LYNQ_WIFI_BANDWIDTH_HT10:
+	{
+            RLOGE("bandwith  [%d] not support now\n", bandwidth);
+	    return -1;
+	}
+        case LYNQ_WIFI_BANDWIDTH_HT20:
         {
             char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 6";
             system("wl down");
-            if (system(lynq_cmd_bandwith) != 0 ){
+            if (system(lynq_cmd_bandwith) != 0 )
+	    {
+                RLOGE("lynq_wifi_ap_bandwidth_set erro");
                 return -1;
             }
             system("wl up");
             break;
         }
         case LYNQ_WIFI_BANDWIDTH_HT40:
-		{
+        {
             char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/40";
             sprintf(lynq_cmd_bandwith, "wl chanspec ");
             system("wl down");
-            if (system(lynq_cmd_bandwith) != 0 ){
+            if (system(lynq_cmd_bandwith) != 0 )
+	    {
+                RLOGE("lynq_wifi_ap_bandwidth_set erro");
                 return -1;
             }
             system("wl up");
             break;
-		}
+        }
         case LYNQ_WIFI_BANDWIDTH_HT80:
-		{
+        {
             char lynq_cmd_bandwith[MAX_CMD]="wl chanspec 149/80";
             system("wl down");
-            if (system(lynq_cmd_bandwith) != 0 ){
+            if (system(lynq_cmd_bandwith) != 0 )
+	    {
+                RLOGE("lynq_wifi_ap_bandwidth_set erro");
                 return -1;
             }
             system("wl up");
             break;
-		}				
-		default:
+        }				
+        default:
         {
-            printf("auth type [%d] not support now\n", bandwidth);
-			return -1;
+            RLOGE("auth type [%d] not support now\n", bandwidth);
+            return -1;
         }
     }
 
@@ -1068,7 +1185,7 @@
     int index = 0;
     char *split_words[128] = {0};
     const char *lynq_chanspec_cmd = "DRIVER chanspec\n";
-
+    RLOGD("enter lynq_wifi_ap_bandwidth_get");
     CHECK_IDX(idx, CTRL_AP);
 
     CHECK_WPA_CTRL(CTRL_AP);
@@ -1086,28 +1203,30 @@
             return -1;
         }
 
-        printf("bw %s\n", split_words[index]);
+        RLOGD("bw %s\n", split_words[index]);
         *bandwidth = convert_bandwidth_from_bw(atoi(split_words[index]));
         return 0;
     }
-
+    RLOGE("[wifi error]lynq_wifi_ap_bandwidth_get");
     return -1;
 }
 
 int lynq_wifi_ap_channel_set( lynq_wifi_index_e idx,int channel)
 {
     char lynq_cmd_channel[MAX_CMD]={0};
-
+    RLOGD("enter lynq_wifi_ap_channel_set and input channel is %d",channel);
     CHECK_IDX(idx, CTRL_AP);
 
     sprintf(lynq_cmd_channel, "wl channel %d", channel);
 
-    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0) {
+    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0) 
+    {
         return -1;
     }
 
     system("wl down");
     if (system(lynq_cmd_channel) != 0 ){
+        RLOGE("lynq_wifi_ap_channel_set erro");
         return -1;
     }
     system("wl up");
@@ -1120,7 +1239,7 @@
     int index = 0;
     char *split_words[128] = {0};
     char lynq_chanspec_cmd[]="DRIVER chanspec\n";
-
+    RLOGD("enter lynq_wifi_ap_channel_get");
     CHECK_IDX(idx, CTRL_AP);
 
     CHECK_WPA_CTRL(CTRL_AP);
@@ -1128,21 +1247,23 @@
     DO_REQUEST(lynq_chanspec_cmd);
 
     count = lynq_split(cmd_reply, reply_len, ' ', split_words);
-    for(;index < count; index++) {
-        printf("---- %s\n",split_words[index]);
+    for(;index < count; index++) 
+    {
+        RLOGD("[lynq_wifi_ap_channel_get]---- %s\n",split_words[index]);
         if (strncmp(split_words[index], "channel", 2) != 0) {
             continue;
         }
 
         index++;
-        if (index >= count) {
+        if (index >= count) 
+	{
             return -1;
         }
 
         *channel = atoi(split_words[index]);
         return 0;
     }
-
+    RLOGE("[lynq_wifi_ap_channel_get] function fail");
     return -1;
 }
 
@@ -1155,12 +1276,16 @@
     char lynq_auth_alg_cmd[64]={0};
     char lynq_psk_cmd[64]={0};
     char lynq_pairwise_cmd[64]={0};
+    char lynq_ieee80211_cmd[64]={0};
+    RLOGD("enter lynq_wifi_ap_auth_set and input idx is:%d,auth is:%d",idx,auth);
     lynq_wifi_auth_s org_auth;
     CHECK_IDX(idx, CTRL_AP);
 
     CHECK_WPA_CTRL(CTRL_AP);
 
-    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0) {
+    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != AP_NETWORK_0) 
+    {
+        RLOGE("[wifi error][lynq_wifi_ap_auth_set] check network fail\n");
         return -1;
     }
 
@@ -1185,15 +1310,15 @@
         }
     }
 
-	switch(auth){
-		case LYNQ_WIFI_AUTH_OPEN:
+    switch(auth){
+	case LYNQ_WIFI_AUTH_OPEN:
         {
             sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
             sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise NONE", AP_NETWORK_0);
 
             DO_OK_FAIL_REQUEST(lynq_auth_cmd);
-			break;
-		}
+	    break;
+	}
         case LYNQ_WIFI_AUTH_WEP:
         {
             sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", AP_NETWORK_0);
@@ -1204,14 +1329,16 @@
             DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
             break;
         }
-		case LYNQ_WIFI_AUTH_WPA_PSK:
+	case LYNQ_WIFI_AUTH_WPA_PSK:
         case LYNQ_WIFI_AUTH_WPA2_PSK:
-		{
-            if (auth == LYNQ_WIFI_AUTH_WPA_PSK) {
+	{
+            if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
+	    {
                 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", AP_NETWORK_0);
                 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
             }
-            else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK) {
+            else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
+	    {
                 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", AP_NETWORK_0);
                 sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", AP_NETWORK_0);
             }
@@ -1222,17 +1349,43 @@
             DO_OK_FAIL_REQUEST(lynq_auth_cmd);
             DO_OK_FAIL_REQUEST(lynq_psk_cmd);
             DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
-			break;
-		}		
-		default:
+	    break;
+	}		
+        case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
+	{
+            sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
+            sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 1", AP_NETWORK_0);
+            sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
+            sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
+
+            DO_OK_FAIL_REQUEST(lynq_auth_cmd);
+            DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
+            DO_OK_FAIL_REQUEST(lynq_psk_cmd);
+            DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
+	    break;
+	}		
+        case LYNQ_WIFI_AUTH_WPA3_PSK:
+	{
+            sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA2", AP_NETWORK_0);
+            sprintf(lynq_ieee80211_cmd,"SET_NETWORK %d ieee80211w 2", AP_NETWORK_0);
+            sprintf(lynq_psk_cmd,"SET_NETWORK %d key_mgmt WPA-PSK SAE", AP_NETWORK_0);
+            sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
+
+            DO_OK_FAIL_REQUEST(lynq_auth_cmd);
+            DO_OK_FAIL_REQUEST(lynq_ieee80211_cmd);
+            DO_OK_FAIL_REQUEST(lynq_psk_cmd);
+            DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
+	    break;
+	}		
+	default:
         {
-            printf("auth type [%d] not support now\n", auth);
-			return -1;
+            RLOGE("auth type [%d] not support now\n", auth);
+            return -1;
         }
     }
     DO_OK_FAIL_REQUEST(cmd_save_config);
 
-	return 0;
+    return 0;
 }
 
 int lynq_wifi_ap_auth_get(lynq_wifi_index_e idx, lynq_wifi_auth_s *auth)
@@ -1240,36 +1393,63 @@
     char lynq_auth_str[MAX_RET] = {0};
     char lynq_auth_alg_str[MAX_RET] = {0};
     char lynq_proto_str[MAX_RET] = {0};
-
+    RLOGD("enter lynq_wifi_ap_auth_get");
     CHECK_IDX(idx, CTRL_AP);
 
-    if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0) {
+    if (inner_get_param(CTRL_AP, AP_NETWORK_0, "key_mgmt", lynq_auth_str) != 0)
+    {
+        RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network fail");
         return -1;
     }
 
-    if (memcmp( lynq_auth_str, "NONE", 4) == 0) {
-        if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0) {
+    if (memcmp( lynq_auth_str, "NONE", 4) == 0)
+    {
+        if (inner_get_param(CTRL_AP, AP_NETWORK_0, "auth_alg", lynq_auth_alg_str) != 0)
+	{
             *auth = LYNQ_WIFI_AUTH_OPEN;
         }
-        else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0){
+        else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
+	{
             *auth = LYNQ_WIFI_AUTH_WEP;
         }
-        else {
+        else
+	{
             *auth = LYNQ_WIFI_AUTH_OPEN;
         }
     }
-    else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 ) {
-        if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0) {
+    else if(strcmp( lynq_auth_str, "WPA-PSK") == 0 )
+    {
+        if (inner_get_param(CTRL_AP, AP_NETWORK_0, "proto", lynq_proto_str) != 0)
+	{
             *auth = -1;
         }
-        else if (memcmp(lynq_proto_str, "RSN", 3) == 0) {
+        else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
+	{
             *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
         }
-        else {
+        else
+	{
             *auth = LYNQ_WIFI_AUTH_WPA_PSK;
         }
     }
-    else {
+    
+    if (inner_get_param(CTRL_AP, AP_NETWORK_0, "ieee80211w", lynq_auth_str) != 0)
+    {
+        RLOGE("[wifi error][lynq_wifi_ap_auth_get] check network auth ieee80211w fail");
+        return -1;
+    }
+    
+    if (memcmp(lynq_auth_str,"1",1) == 0 )
+    {
+	RLOGD("auth : LYNQ_WIFI_AUTH_WPA2_WPA3_PSK\n");
+        *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
+    }else if (memcmp(lynq_auth_str,"2",1) == 0 )
+    {
+	RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
+        *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
+    }
+    else
+    {
         *auth = -1;
     }
 
@@ -1282,7 +1462,7 @@
     char LYNQ_WIFI_CMD[128]={0};
     //const char *lynq_remove_all_cmd = "REMOVE_NETWORK all";
     //const char *lynq_reconfig_cmd = "RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
-
+    RLOGD("enter lynq_wifi_ap_channel_get");
     CHECK_IDX(idx, CTRL_AP);
 
     CHECK_WPA_CTRL(CTRL_AP);
@@ -1299,7 +1479,7 @@
     sprintf(LYNQ_WIFI_CMD,"SELECT_NETWORK %d",AP_NETWORK_0);
     DO_OK_FAIL_REQUEST(LYNQ_WIFI_CMD);
 
-	return 0;
+    return 0;
 }
 
 int lynq_wifi_ap_restart(lynq_wifi_index_e idx)
@@ -1321,7 +1501,7 @@
 
 //    system("connmanctl tether wifi off");
 	
-	return 0;
+    return 0;
 }
 
 int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
@@ -1329,11 +1509,10 @@
     char lynq_disable_cmd[128] = {0};
     char lynq_select_cmd[128] = {0};
     const char *lynq_hide_cmd = "SET HIDE_SSID 1";
-
+    RLOGD("enter lynq_wifi_ap_hide_ssid");
     CHECK_IDX(idx, CTRL_AP);
 
     CHECK_WPA_CTRL(CTRL_AP);
-	
     sprintf(lynq_disable_cmd,"DISABLE_NETWORK %d", AP_NETWORK_0);
     sprintf(lynq_select_cmd,"SELECT_NETWORK %d", AP_NETWORK_0);
 
@@ -1341,7 +1520,7 @@
     DO_OK_FAIL_REQUEST(lynq_hide_cmd);
     DO_OK_FAIL_REQUEST(lynq_select_cmd);
 
-	return 0;
+    return 0;
 }
 
 int lynq_wifi_ap_unhide_ssid(lynq_wifi_index_e idx)
@@ -1349,7 +1528,7 @@
     char lynq_disable_cmd[128] = {0};
     char lynq_select_cmd[128] = {0};
     const char *lynq_unhide_cmd = "SET HIDE_SSID 0";
-
+    RLOGD("enter lynq_wifi_ap_unhide_ssid");
     CHECK_IDX(idx, CTRL_AP);
 
     CHECK_WPA_CTRL(CTRL_AP);
@@ -1361,51 +1540,74 @@
     DO_OK_FAIL_REQUEST(lynq_unhide_cmd);
     DO_OK_FAIL_REQUEST(lynq_select_cmd);
 
-	return 0;
+    return 0;
 }
 
 int lynq_ap_password_set(lynq_wifi_index_e idx,char *password)
 {
-	int pass_len;
+    int pass_len;
     char lynq_tmp_cmd[MAX_CMD] = {0};
+    char lynq_wpa2_wpa3[64] = {0};
     char lynq_wep_tx_keyidx_cmd[MAX_CMD] = {0};
-    if( password == NULL ){
+    RLOGD("enter lynq_ap_password_set");
+    if( password == NULL )
+    {
+        RLOGE("[lynq_ap_password_set]input password is NULL");
         return -1;
     }
     pass_len=strlen(password);
     lynq_wifi_auth_s auth = -1;
-    if(pass_len < 8 || pass_len >= 64){
-		return -1;
+    if(pass_len < 8 || pass_len >= 64)
+    {
+        RLOGE("[lynq_ap_password_set]input password len not in rage");
+        return -1;
     }
 
     CHECK_IDX(idx, CTRL_AP);
 
-    if (0 != lynq_wifi_ap_auth_get(idx, &auth)) {
+    if (0 != lynq_wifi_ap_auth_get(idx, &auth))
+    {
         return -1;
     }
-    else if (auth == LYNQ_WIFI_AUTH_OPEN) {
+    else if (auth == LYNQ_WIFI_AUTH_OPEN)
+    {
+        RLOGE("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
         return -1;
     }
 
     CHECK_WPA_CTRL(CTRL_AP);
 
-    if (auth == LYNQ_WIFI_AUTH_WEP) {
+    if (auth == LYNQ_WIFI_AUTH_WEP)
+    {
+        RLOGD("ap auth : LYNQ_WIFI_AUTH_WEP\n");
         sprintf(lynq_tmp_cmd,"SET_NETWORK %d wep_key0 \"%s\"",AP_NETWORK_0, password);
         sprintf(lynq_wep_tx_keyidx_cmd,"SET_NETWORK %d wep_tx_keyidx 0",AP_NETWORK_0);
         DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
         DO_OK_FAIL_REQUEST(lynq_wep_tx_keyidx_cmd);
     }
-    else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK) {
+    else if (auth == LYNQ_WIFI_AUTH_WPA_PSK || auth == LYNQ_WIFI_AUTH_WPA2_PSK)
+    {
+	RLOGD("ap auth :LYNQ_WIFI_AUTH_WPA_PSK  LYNQ_WIFI_AUTH_WPA2_PSK\n");
         sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
         DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
     }
-    else {
+    else if (auth == LYNQ_WIFI_AUTH_WPA2_WPA3_PSK || auth == LYNQ_WIFI_AUTH_WPA3_PSK)
+    {
+        
+        sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
+        sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d psk sae_password \"%s\"",AP_NETWORK_0, password);
+        DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
+        DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
+
+    }
+    else
+    {
         return -1;
     }
 
     DO_OK_FAIL_REQUEST(cmd_save_config);
 
-	return 0;
+    return 0;
 }
 
 int lynq_ap_password_get(lynq_wifi_index_e idx, char *password)
@@ -1415,13 +1617,15 @@
     int count, index;
     char *split_lines[128] = {0};
     char *buff, *p;
+    RLOGD("enter lynq_ap_password_get");
 
     CHECK_IDX(idx, CTRL_AP);
 
     fp = fopen("/data/wifi/wg870/wpa_supplicant_ap.conf", "rb");
 //    fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
-    if (NULL == fp) {
-        printf("open file fail\n");
+    if (NULL == fp)
+    {
+        RLOGE("open file fail\n");
         return  -1;
     }
 
@@ -1430,13 +1634,17 @@
     len = fread(buff, 1, MAX_RET, fp);
     fclose(fp);
 
-    for(index=0; index < len; index ++) {
-        if (memcmp(buff + index, "network={", 9) != 0) {
+    for(index=0; index < len; index ++)
+    {
+        if (memcmp(buff + index, "network={", 9) != 0)
+	{
             continue;
         }
          p = buff + index + 9;
-         for (; index < len; index ++ ) {
-             if (buff[index] != '}') {
+         for (; index < len; index ++ )
+	 {
+             if (buff[index] != '}')
+	     {
                  continue;
              }
              buff[index] = '\0';
@@ -1448,28 +1656,36 @@
     count = lynq_split(p, len, '\n', split_lines);
 
     ret = -1;
-    for(index=0; index < count; index++) {
+    for(index=0; index < count; index++)
+    {
         p = strstr(split_lines[index], "psk=");
-        if (p != NULL) {
+        if (p != NULL)
+	{
             p += 4;
-            if (*p == '\"') {
+            if (*p == '\"')
+	    {
                 p++;
             }
         }
-        else if (NULL != (p = strstr(split_lines[index], "wep_key0="))) {
+        else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
+	{
             p += 9;
-            if (*p == '\"') {
+            if (*p == '\"')
+	    {
                 p++;
             }
         }
-        else {
+        else
+	{
             continue;
         }
 
         strcpy(password, p);
 
-        while(*password != '\0') {
-            if (*password == '\"') {
+        while(*password != '\0')
+	{
+            if (*password == '\"')
+	    {
                 *password = '\0';
                 break;
             }
@@ -1486,30 +1702,55 @@
     char lynq_auth_str[MAX_RET] = {0};
     char lynq_proto_str[MAX_RET] = {0};
 
-    if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0) {
+    if (inner_get_param(interface, net_no, "key_mgmt", lynq_auth_str) != 0)
+    {
         return -1;
     }
 
     *auth = convert_auth_from_key_mgmt(lynq_auth_str);
 
-    if (*auth == LYNQ_WIFI_AUTH_WPA_PSK) {
-        if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0) {
-            if (strcmp(lynq_proto_str, "RSN") == 0) {
+    if (*auth == LYNQ_WIFI_AUTH_WPA_PSK)
+    {
+        if (inner_get_param(interface, net_no, "proto", lynq_proto_str) == 0)
+	{
+            if (strcmp(lynq_proto_str, "RSN") == 0)
+	    {
                 *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
             }
         }
     }
+    if (inner_get_param(interface, net_no,"ieee80211w",lynq_auth_str) !=0)
+    {
+	RLOGE("check ieee80211w error\n");
+        return -1;
+    }
+    if ( strncmp(lynq_auth_str,"1",1) == 0 )
+    {
+
+       *auth = LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
+    }else if( strncmp(lynq_auth_str,"2",1) == 0 )
+    {
+
+        *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
+    }else
+    {
+        *auth = -1;
+        return -1;
+    }
     return 0;
 }
 
 int lynq_sta_ssid_password_set(lynq_wifi_index_e idx, ap_info_s *ap, char *password)
 {
+    RLOGD("enter lynq_sta_ssid_password_set");
     int pass_len, net_no, count, index;
     char lynq_tmp_cmd[300]={0};
     int net_no_list[128];
     lynq_wifi_auth_s net_auth;
     pass_len=strlen(password);
-    if(pass_len < 8 || pass_len >= 64){
+    if(pass_len < 8 || pass_len >= 64)
+    {
+        RLOGE("[lynq_sta_ssid_password_set]input psw error");
         return -1;
     }
 
@@ -1518,15 +1759,18 @@
     net_no = -1;
     count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ap->ap_ssid);
 
-    for (index=0; index < count; index++) {
+    for (index=0; index < count; index++)
+    {
         net_auth = -1;
-        if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth) {
+        if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == ap->auth)
+	{
             net_no = net_no_list[index];
             break;
         }
     }
 
-    if (net_no < 0) {
+    if (net_no < 0)
+    {
         return -1;
     }
 
@@ -1548,20 +1792,23 @@
     char *split_lines[128] = {0};
     char *buff, *p, *ssid, *ssid_end_flag;
     char tmp_ssid[128]={0};
+	RLOGD("enter lynq_sta_ssid_password_get");
 
     network_len = 0;
     p = NULL;
 
     CHECK_IDX(idx, CTRL_STA);
 
-    if (NULL == password) {
-        printf("bad param\n");
+    if (NULL == password)
+    {
+        RLOGE("bad param\n");
         return -1;
     }
 
     fp = fopen("/data/wifi/wg870/wpa_supplicant.conf", "rb");
-    if (NULL == fp) {
-        printf("open file fail\n");
+    if (NULL == fp)
+    {
+        RLOGE("[lynq_sta_ssid_password_get] open file fail\n");
         return  -1;
     }
 
@@ -1570,14 +1817,19 @@
     len = fread(buff, 1, MAX_RET, fp);
     fclose(fp);
 
-    for(index=0; index < len; index ++) {
-        for(; index < len; index ++) {
-            if (memcmp(buff + index, "network={", 9) != 0) {
+    for(index=0; index < len; index ++)
+    {
+        for(; index < len; index ++)
+	{
+            if (memcmp(buff + index, "network={", 9) != 0)
+	    {
                 continue;
             }
              p = buff + index + 9;
-             for (; index < len; index ++ ) {
-                 if (buff[index] != '}') {
+             for (; index < len; index ++ )
+	     {
+                 if (buff[index] != '}')
+		 {
                      continue;
                  }
                  buff[index] = '\0';
@@ -1593,11 +1845,13 @@
         ssid = strstr(p, "ssid=");
         if (ssid != NULL) {
             ssid += strlen("ssid=");
-            if (ssid[0] == '\"') {
+            if (ssid[0] == '\"')
+	    {
                 if (memcmp(ssid + 1, ap->ap_ssid, strlen(ap->ap_ssid)) == 0 && ssid[strlen(ap->ap_ssid) + 1] == '\"')
                     break;
             }
-            else{
+            else
+	    {
                 ssid_end_flag = strstr(ssid, "\n");
                 if (ssid_end_flag != NULL)
                 {
@@ -1614,28 +1868,35 @@
 
     }
 
-    if (index >= len || NULL == p || network_len <= 0) {
+    if (index >= len || NULL == p || network_len <= 0)
+    {
         return -1;
     }
 
     count = lynq_split(p, network_len, '\n', split_lines);
 
     ret = -1;
-    for(index=0; index < count; index++) {
+    for(index=0; index < count; index++)
+    {
         p = strstr(split_lines[index], "psk=");
-        if (p != NULL) {
+        if (p != NULL)
+	{
             p += 4;
-            if (*p == '\"') {
+            if (*p == '\"')
+	    {
                 p++;
             }
         }
-        else if (NULL != (p = strstr(split_lines[index], "wep_key0="))) {
+        else if (NULL != (p = strstr(split_lines[index], "wep_key0=")))
+	{
             p += 9;
-            if (*p == '\"') {
+            if (*p == '\"')
+	    {
                 p++;
             }
         }
-        else {
+        else
+	{
             continue;
         }
 
@@ -1644,8 +1905,10 @@
         strncpy(password, p, 64);
 
         p = password;
-        while(password - p < 64 && *password != '\0') {
-            if (*password == '\"') {
+        while(password - p < 64 && *password != '\0')
+	{
+            if (*password == '\"')
+	    {
                 *password = '\0';
                 break;
             }
@@ -1660,21 +1923,22 @@
 
 static int inner_set_sta_ssid(int net_no, char *sta_ssid)
 {
-	char lynq_wifi_ssid_cmd[80]={0};
+    char lynq_wifi_ssid_cmd[80]={0};
 
-	if (sta_ssid == NULL) {
-		printf("sta_ssid is null\n");
-		return -1;
+    if (sta_ssid == NULL)
+    {
+        RLOGE("sta_ssid is null\n");
+        return -1;
     }
 
-	CHECK_WPA_CTRL(CTRL_STA);
+    CHECK_WPA_CTRL(CTRL_STA);
 
     sprintf(lynq_wifi_ssid_cmd,"SET_NETWORK %d ssid \"%s\"", net_no, sta_ssid);
 
     DO_OK_FAIL_REQUEST(lynq_wifi_ssid_cmd);
 //    DO_OK_FAIL_REQUEST(cmd_save_config);
 
-	return 0;
+    return 0;
 
 }
 
@@ -1685,7 +1949,8 @@
 
     CHECK_WPA_CTRL(CTRL_STA);
 
-    if (save != 0) {
+    if (save != 0)
+    {
         if (start_flag != 0)
         {
             sprintf(lynq_select_cmd,"ENABLE_NETWORK %d", net_no);
@@ -1699,11 +1964,13 @@
         DO_OK_FAIL_REQUEST(cmd_save_config);
     }
 
-    if (start_flag == 0) {
+    if (start_flag == 0)
+    {
         sprintf(lynq_disable_cmd,"DISCONNECT");
         DO_OK_FAIL_REQUEST(lynq_disable_cmd);
     }
-    else {
+    else
+    {
         sprintf(lynq_select_cmd,"SELECT_NETWORK %d", net_no);
         DO_OK_FAIL_REQUEST(lynq_select_cmd);
     }
@@ -1713,6 +1980,7 @@
 
 int lynq_wifi_get_sta_ssid(lynq_wifi_index_e idx, char* sta_ssid)
 {
+    RLOGD("enter lynq_sta_ssid_password_set");
     CHECK_IDX(idx, CTRL_STA);
 
     curr_status_info curr_state;
@@ -1720,7 +1988,8 @@
     curr_state.ap = &ap_info;
     curr_state.state = NULL;
 
-    if (0 == inner_get_status_info(CTRL_STA, &curr_state)) {
+    if (0 == inner_get_status_info(CTRL_STA, &curr_state))
+    {
         strncpy(sta_ssid, ap_info.ap_ssid, sizeof (ap_info.ap_ssid));
         return 0;
     }
@@ -1742,7 +2011,8 @@
     ret = -1;
 
     CHECK_IDX(idx, CTRL_STA);
-    if (info == NULL) {
+    if (info == NULL)
+    {
         return -1;
     }
 
@@ -1756,7 +2026,8 @@
     curr_state.ap = &ap_info;
     curr_state.state = status;
 
-    if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0) {
+    if (0 == inner_get_status_info(CTRL_STA, &curr_state) && curr_state.net_no >= 0)
+    {
         memcpy(&info->base_info, &ap_info, sizeof (ap_info_s));
         if (strcmp(status, STATE_COMPLETED) == 0)
         {
@@ -1773,7 +2044,8 @@
 
     lynq_wifi_sta_start_scan(idx);
 
-    if (0 != lynq_get_scan_list(0, &scan_list, &scan_len)) {
+    if (0 != lynq_get_scan_list(0, &scan_list, &scan_len))
+    {
         if (NULL != scan_list)
         {
             free(scan_list);
@@ -1781,7 +2053,8 @@
         return -1;
     }
 
-    if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len)) {
+    if (0 != lynq_get_sta_saved_ap(0, &save_list, &save_len))
+    {
         if (NULL != scan_list)
         {
             free(scan_list);
@@ -1793,15 +2066,20 @@
         return -1;
     }
 
-    for (i=0; i < save_len; i++) {
-        for (j=0; j < scan_len; j++) {
+    for (i=0; i < save_len; i++)
+    {
+        for (j=0; j < scan_len; j++)
+	{
             if (strcmp(save_list[i].base_info.ap_ssid, scan_list[j].ssid) == 0 //@todo not finished
-                    && save_list[i].base_info.auth == scan_list[j].auth) {
-                if (best_rssi == 0) {
+                    && save_list[i].base_info.auth == scan_list[j].auth)
+	    {
+                if (best_rssi == 0)
+		{
                     best_index = i;
                     best_rssi = scan_list[j].rssi;
                 }
-                else if (best_rssi > scan_list[j].rssi) {
+                else if (best_rssi > scan_list[j].rssi)
+		{
                     best_index = i;
                     best_scan_index = j;
                     best_rssi = scan_list[j].rssi;
@@ -1812,7 +2090,8 @@
         }
     }
 
-    if (best_index >= 0) {
+    if (best_index >= 0)
+    {
         memcpy(&info->base_info, &save_list[best_index].base_info, sizeof (ap_info_s));
         inner_get_ip_by_mac( info->base_info.ap_mac, info->base_info.ap_ip, sizeof (info->base_info.ap_ip));
         info->status = LYNQ_WIFI_AP_STATUS_DISABLE;
@@ -1841,22 +2120,25 @@
 
     CHECK_WPA_CTRL(CTRL_STA);
 
-	switch(auth){
-		case LYNQ_WIFI_AUTH_OPEN:
+    switch(auth)
+    {
+        case LYNQ_WIFI_AUTH_OPEN:
         {
             sprintf(lynq_auth_cmd,"SET_NETWORK %d key_mgmt NONE", net_no);
 
             DO_OK_FAIL_REQUEST(lynq_auth_cmd);
-//            DO_OK_FAIL_REQUEST(cmd_save_config);
-			break;
-		}
-		case LYNQ_WIFI_AUTH_WPA_PSK:
+//          DO_OK_FAIL_REQUEST(cmd_save_config);
+            break;
+        }
+        case LYNQ_WIFI_AUTH_WPA_PSK:
         case LYNQ_WIFI_AUTH_WPA2_PSK:
-		{
-            if (auth == LYNQ_WIFI_AUTH_WPA_PSK) {
+	{
+            if (auth == LYNQ_WIFI_AUTH_WPA_PSK)
+	    {
                 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto WPA", net_no);
             }
-            else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK) {
+            else if (auth == LYNQ_WIFI_AUTH_WPA2_PSK)
+	    {
                 sprintf(lynq_auth_cmd,"SET_NETWORK %d proto RSN", net_no);
             }
             sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %d key_mgmt WPA-PSK", net_no);
@@ -1866,19 +2148,49 @@
             DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
             DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
 
-            if (password != NULL) {
+            if (password != NULL)
+	    {
                 sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
                 DO_OK_FAIL_REQUEST(lynq_psk_cmd);
+                sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
             }
 
 //            DO_OK_FAIL_REQUEST(cmd_save_config);
-			break;
-		}		
-		default:
-			return -1;
+            break;
+        }	
+	case LYNQ_WIFI_AUTH_WPA2_WPA3_PSK:
+	{
+            sprintf(lynq_auth_cmd,"SET_NETWORJ %d ieee80211w 1",net_no);
+            sprintf(lynq_ket_mgmt_cmd,"SET_NETWORJ %d key_mgmt SAE WPA-PSK",net_no);
+            sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
+            sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
+            
+	    DO_OK_FAIL_REQUEST(lynq_auth_cmd);
+            DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
+            DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
+            DO_OK_FAIL_REQUEST(lynq_psk_cmd);
+
+	    break;
+	}
+	case LYNQ_WIFI_AUTH_WPA3_PSK:
+	{
+            sprintf(lynq_auth_cmd,"SET_NETWORJ %d ieee80211w 2",net_no);
+            sprintf(lynq_ket_mgmt_cmd,"SET_NETWORJ %d key_mgmt SAE",net_no);
+            sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", net_no);
+            sprintf(lynq_psk_cmd, "SET_NETWORK %d psk \"%s\"", net_no, password);
+            
+	    DO_OK_FAIL_REQUEST(lynq_auth_cmd);
+            DO_OK_FAIL_REQUEST(lynq_ket_mgmt_cmd);
+            DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
+            DO_OK_FAIL_REQUEST(lynq_psk_cmd);
+
+	    break;
+	}
+	default:
+            return -1;
     }
 
-	return 0;
+    return 0;
 }
 
 static int inner_get_curr_net_no(int interface) {
@@ -1886,7 +2198,8 @@
     curr_state.ap = NULL;
     curr_state.state = NULL;
 
-    if (0 != inner_get_status_info(interface, &curr_state)) {
+    if (0 != inner_get_status_info(interface, &curr_state))
+    {
         return -1;
     }
 
@@ -1900,7 +2213,8 @@
 
     net_no = inner_get_curr_net_no(CTRL_STA);
 
-    if (net_no < 0) {
+    if (net_no < 0)
+    {
         return -1;
     }
 
@@ -1913,14 +2227,17 @@
     int net_no_list[128];
     lynq_wifi_auth_s net_auth;
 
-    if (ssid == NULL || *ssid == '\0') {
-        printf("bad ssid\n");
+    if (ssid == NULL || *ssid == '\0')
+    {
+        RLOGE("bad ssid\n");
         return -1;
     }
 
-    if (LYNQ_WIFI_AUTH_OPEN != auth) {
-        if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64) {
-            printf("bad password\n");
+    if (LYNQ_WIFI_AUTH_OPEN != auth)
+    {
+        if (psw == NULL || strlen(psw) < 8 || strlen(psw) >= 64)
+	{
+            RLOGE("bad password\n");
             return -1;
         }
     }
@@ -1930,27 +2247,33 @@
     net_no = -1;
     count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
 
-    for (index=0; index < count; index++) {
+    for (index=0; index < count; index++)
+    {
         net_auth = -1;
-        if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth) {
+        if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
+	{
             net_no = net_no_list[index];
             break;
         }
     }
 
-    if (net_no < 0) {
+    if (net_no < 0)
+    {
         net_no = lynq_add_network(CTRL_STA);
-        if (net_no == -1) {
+        if (net_no == -1)
+	{
             return -1;
         }
 
-        printf("net no is %d\n", net_no);
-        if (0 != inner_set_sta_ssid(net_no, ssid)) {
+        RLOGD("net no is %d\n", net_no);
+        if (0 != inner_set_sta_ssid(net_no, ssid))
+	{
             return -1;
         }
     }
 
-    if (0 != inner_set_sta_auth_psw(net_no, auth, psw)) {
+    if (0 != inner_set_sta_auth_psw(net_no, auth, psw))
+    {
         return -1;
     }
 
@@ -1963,7 +2286,9 @@
     curr_status_info curr_state;
     ap.ap_ssid[0] = '\0';
 
-    if (ssid == NULL || *ssid == '\0') {
+    if (ssid == NULL || *ssid == '\0')
+    {
+        RLOGE("input ssid is NULL\n");
         return -1;
     }
 
@@ -1972,11 +2297,13 @@
     curr_state.ap = &ap;
     curr_state.state = NULL;
 
-    if (inner_get_status_info(CTRL_STA, &curr_state) != 0) {
+    if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
+    {
         return 0;
     }
 
-    if (strcmp(ap.ap_ssid, ssid) != 0) {
+    if (strcmp(ap.ap_ssid, ssid) != 0)
+    {
         return 0;
     }
 
@@ -2091,8 +2418,9 @@
 
 //    ap_info_s * tmp_ap;
 //    device_info_s * tmp_list;
-    if (ap == NULL || list == NULL || len == NULL) {
-        printf("bad input param");
+    if (ap == NULL || list == NULL || len == NULL)
+    {
+        RLOGE("bad input param");
         return -1;
     }
 
@@ -2100,7 +2428,9 @@
 //    list = &tmp_list;
     *ap = malloc(sizeof (ap_info_s));
 
-    if (inner_get_status_info_ap (CTRL_AP, *ap) != 0) {
+    if (inner_get_status_info_ap (CTRL_AP, *ap) != 0)
+    {
+	RLOGE("inner_get_status_info_ap !=0\n");
         return -1;
     }
 
@@ -2110,8 +2440,10 @@
     DO_REQUEST(lynq_first_sta_cmd);
 
     index = 0;
-    while (reply_len > 0) {
-        if (memcmp(cmd_reply, "FAIL", 4) == 0) {
+    while (reply_len > 0)
+    {
+        if (memcmp(cmd_reply, "FAIL", 4) == 0)
+	{
             break;
         }
         line_count = lynq_split(cmd_reply, reply_len, '\n', split_lines);
@@ -2122,8 +2454,9 @@
         reply_len = MAX_RET;
         cmd_reply[0] = '\0';
         ret = local_wpa_ctrl_request(lynq_wpa_ctrl, lynq_next_sta_cmd, strlen(lynq_next_sta_cmd), cmd_reply, &reply_len, NULL);
-        if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0) {
-            printf("run %s fail \n", lynq_next_sta_cmd);
+        if (ret != 0 || memcmp(cmd_reply, "FAIL", 4) == 0)
+	{
+            RLOGD("run %s fail \n", lynq_next_sta_cmd);
             break;
         }
     }
@@ -2131,7 +2464,8 @@
     *len = index;
 
     *list = malloc(sizeof(device_info_s) * (*len));
-    for (index=0; index < *len; index++) {
+    for (index=0; index < *len; index++)
+    {
         dev_info = &(*list)[index];
         memset(dev_info, 0, sizeof(device_info_s));
         strncpy(dev_info->sta_mac, bssid[index], sizeof (dev_info->sta_mac));
@@ -2152,7 +2486,8 @@
     char *split_words[128] = {0};
     scan_info_s * p;
 
-    if (list == NULL || len == NULL) {
+    if (list == NULL || len == NULL)
+    {
         return -1;
     }
 
@@ -2172,16 +2507,18 @@
     *list = malloc(sizeof (scan_info_s) * *len);
 
     count_words = lynq_split(split_lines[0], strlen(split_lines[0]), '/', split_words); //@todo get with header
-    for (index=0; index <count_words; index++) {
-        printf("----header: %s\n", split_words[index]);
+    for (index=0; index <count_words; index++)
+    {
+        RLOGD("----header: %s\n", split_words[index]);
     }
 
-    for(index = 1;index < count; index++) {
-        printf("---- %s\n",split_lines[index]);
+    for(index = 1;index < count; index++)
+    {
+        RLOGD("---- %s\n",split_lines[index]);
         count_words = lynq_split(split_lines[index], strlen(split_lines[index]), '\t', split_words);
         if (count_words < 4)
             continue;
-        printf("count: %d, %s\n", count_words, split_words[0]);
+        RLOGD("count: %d, %s\n", count_words, split_words[0]);
         //bssid / frequency / signal level / flags / ssid
         p = (*list) + index - 1;
         strcpy(p->mac, split_words[0]);
@@ -2201,8 +2538,9 @@
     lynq_wifi_auth_s net_auth;
     char lynq_remove_cmd[MAX_CMD];
 
-    if (ssid == NULL || *ssid == '\0') {
-        printf("bad ssid\n");
+    if (ssid == NULL || *ssid == '\0')
+    {
+        RLOGD("bad ssid\n");
         return -1;
     }
 
@@ -2213,15 +2551,18 @@
     net_no = -1;
     count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, ssid);
 
-    for (index=0; index < count; index++) {
+    for (index=0; index < count; index++)
+    {
         net_auth = -1;
-        if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth) {
+        if (0 == inner_get_network_auth(CTRL_STA, net_no_list[index], &net_auth) && net_auth == auth)
+	{
             net_no = net_no_list[index];
             break;
         }
     }
 
-    if (net_no < 0) {
+    if (net_no < 0)
+    {
         return 0;
     }
 
@@ -2234,13 +2575,14 @@
 }
 
 int lynq_get_sta_saved_ap(lynq_wifi_index_e idx, saved_ap_info_s ** list, int * len)
-{    
+{
     int count, index;
     int net_no_list[128];
     char freq[16];
-
-    if (list == NULL || len == NULL) {
-        printf("bad param\n");
+    RLOGD("enter lynq_get_sta_saved_ap api\n");
+    if (list == NULL || len == NULL)
+    {
+        RLOGE("bad param,please check!");
         return -1;
     }
 
@@ -2249,27 +2591,34 @@
 //    CHECK_WPA_CTRL(CTRL_STA);
 
     count = lynq_get_network_number_list(idx, CTRL_STA, net_no_list, NULL);
-    printf("count is %d\n", count);
+    RLOGD("[lynq_get_sta_saved_ap]count is %d\n", count);
 
     *list = malloc(sizeof (saved_ap_info_s) * count);
     memset(*list, 0, sizeof (saved_ap_info_s) * count);
     *len = count;
 
-    for (index=0; index < count; index++) {
-        printf("to get ssid %d\n", index);
+    for (index=0; index < count; index++)
+    {
+	RLOGD("[lynq_get_sta_saved_ap]to get ssid %d", index);
+	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get ssid");
         inner_get_param(CTRL_STA, net_no_list[index], "ssid", (*list)[index].base_info.ap_ssid);
+	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get mac");
         inner_get_param(CTRL_STA, net_no_list[index], "bssid", (*list)[index].base_info.ap_mac);
+	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get auth");
         inner_get_network_auth(CTRL_STA, net_no_list[index], &(*list)[index].base_info.auth);
-        if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0) {
+	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get band");
+        if (inner_get_param(CTRL_STA, net_no_list[index], "frequency", freq) == 0)
+	{
             (*list)[index].base_info.band = convert_band_from_freq(atoi(freq));
         }
-        else {
+        else
+	{
             (*list)[index].base_info.band = -1;
         }
-
+	RLOGD("[lynq_get_sta_saved_ap][inner_get_param]to get psw");
         lynq_sta_ssid_password_get(idx, & (*list)[index].base_info, (*list)[index].base_info.psw);
     }
-
+    RLOGD("[lynq_get_sta_saved_ap] return ok");
     return 0;
 }
 
@@ -2283,9 +2632,11 @@
 
     g_sta_scan_finish_flag = 0;
     DO_REQUEST(lynq_scan_cmd);
-    if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 ) {
+    if (reply_len >=9 && memcmp(cmd_reply, "FAIL-BUSY", 9) == 0 )
+    {
         return 0;
-    } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0) {
+    } else if (reply_len >=2 && memcmp(cmd_reply, "OK", 2) != 0)
+    {
         g_sta_scan_finish_flag = 1;
         return -1;
     }
@@ -2294,7 +2645,9 @@
 }
 
 int lynq_reg_ap_event_callback(void * priv, AP_CALLBACK_FUNC_PTR cb) {
-    if (cb == NULL) {
+    if (cb == NULL) 
+    {
+        RLOGE("lynq_reg_ap_event_callback ptr is NULL,plese check!\n");
         return -1;
     }
 
@@ -2305,7 +2658,8 @@
 }
 
 int lynq_unreg_ap_event_callback(void * priv) {
-    if (g_ap_callback_priv == priv) {
+    if (g_ap_callback_priv == priv)
+    {
         g_ap_callback_func = NULL;
         g_ap_callback_priv = NULL;
         return 0;
@@ -2314,7 +2668,9 @@
 }
 
 int lynq_reg_sta_event_callback(void * priv, STA_CALLBACK_FUNC_PTR cb){
-    if (cb == NULL) {
+    if (cb == NULL) 
+    {
+        RLOGE("lynq_reg_sta_event_callback ptr is NULL,plese check!\n");
         return -1;
     }
 
@@ -2325,7 +2681,8 @@
 }
 
 int lynq_unreg_sta_event_callback(void * priv) {
-    if (g_sta_callback_priv == priv) {
+    if (g_sta_callback_priv == priv)
+    {
         g_sta_callback_func = NULL;
         g_sta_callback_priv = NULL;
         return 0;
@@ -2344,17 +2701,21 @@
 int lynq_get_ap_status(lynq_wifi_index_e idx, lynq_wifi_ap_run_status_s * ap_status)
 {
     char state[MAX_CMD];
+    RLOGD("enter lynq_get_ap_status\n");
     CHECK_IDX(idx, CTRL_AP);
 
-    if (inner_get_status_info_state(CTRL_AP, state) != 0) {
+    if (inner_get_status_info_state(CTRL_AP, state) != 0)
+    {
         *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
         return 0;
     }
 
-    if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0) {
+    if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
+    {
         *ap_status = LYNQ_WIFI_AP_STATUS_ENABLE;
     }
-    else {
+    else
+    {
         *ap_status = LYNQ_WIFI_AP_STATUS_DISABLE;
     }
 
@@ -2363,17 +2724,21 @@
 
 int lynq_get_sta_status(lynq_wifi_index_e idx, lynq_wifi_sta_run_status_s * sta_status) {
     char state[MAX_CMD];
+    RLOGD("enter lynq_get_sta_status\n");
     CHECK_IDX(idx, CTRL_STA);
 
-    if (inner_get_status_info_state(CTRL_STA, state) != 0) {
+    if (inner_get_status_info_state(CTRL_STA, state) != 0)
+    {
         *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
         return 0;
     }
 
-    if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0) {
+    if (memcmp(state, STATE_COMPLETED, strlen (STATE_COMPLETED)) == 0)
+    {
         *sta_status = LYNQ_WIFI_STA_STATUS_ENABLE;
     }
-    else {
+    else
+    {
         *sta_status = LYNQ_WIFI_STA_STATUS_DISABLE;
     }
 
@@ -2403,11 +2768,11 @@
 //        printf("to call [%s]\n", cmd_str);
 //        ret = local_wpa_ctrl_request(s_lynq_wpa_ctrl, cmd_str, strlen(cmd_str), cmd_reply, &reply_len, NULL);
 //        if (ret != 0) {
-//            printf("call ##cmd_str fail %d\n", ret);
+//            RLOGE("call ##cmd_str fail %d\n", ret);
 //            return ret;
 //        }
 //        cmd_reply[reply_len+1] = '\0';
-//        printf("cmd replay [ %s ]\n", cmd_reply);
+//        RLOGD("cmd replay [ %s ]\n", cmd_reply);
 //    }while(0);
 
     FILE *fp;
@@ -2417,25 +2782,27 @@
 //    CHECK_IDX(idx, CTRL_AP);
 
     if((fp=popen("wl country","r"))==NULL)
-        {
-            perror("popen error!");
-            return -1;
-        }
+    {
+        perror("popen error!");
+        return -1;
+    }
     if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
     {
         perror("fread fail!");
         return -1;
     }
 
-    for(i=0; i < strlen(lynq_cmd_ret); i++) {
-        if (lynq_cmd_ret[i] == ' ') {
+    for(i=0; i < strlen(lynq_cmd_ret); i++)
+    {
+        if (lynq_cmd_ret[i] == ' ')
+	{
             lynq_cmd_ret[i] = '\0';
             break;
         }
     }
 
     strcpy(country_code,lynq_cmd_ret);
-    printf("---country code %s\n", country_code);
+    RLOGD("---country code %s\n", country_code);
 
     int ret=pclose(fp);
     if(ret==-1)
@@ -2454,14 +2821,16 @@
 //    DO_REQUEST(cmd_str);
 //    printf("result %s\n", cmd_reply);
 
-    if (country_code == NULL || *country_code == '\0') {
-        printf("bad country code\n");
+    if (country_code == NULL || *country_code == '\0')
+    {
+        RLOGD("bad country code\n");
         return -1;
     }
 
     char lynq_country_cmd[MAX_CMD];
     sprintf(lynq_country_cmd, "wl country %s", country_code);
-    if (system(lynq_country_cmd) == 0) {
+    if (system(lynq_country_cmd) == 0)
+    {
         return 0;
     }
 
@@ -2470,7 +2839,10 @@
 
 int lynq_get_connect_ap_mac(lynq_wifi_index_e idx,char *mac)
 {
-    if (mac == NULL) {
+    RLOGD("enter lynq_get_connect_ap_mac\n");
+    if (mac == NULL) 
+    {
+        RLOGE("input ptr is NULL,please check\n");
         return -1;
     }
 
@@ -2478,7 +2850,8 @@
     ap_info_s ap;
     ap.ap_mac[0] = '\0';
 
-    if (inner_get_status_info_ap(CTRL_STA, &ap) != 0) {
+    if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
+    {
         return -1;
     }
     strcpy(mac, ap.ap_mac);
@@ -2488,18 +2861,22 @@
 
 int lynq_get_interface_ip(lynq_wifi_index_e idx, char *ip)
 {
+    RLOGD("enter lynq_get_interface_ip\n");
     struct ifaddrs *ifaddr_header, *ifaddr;
     struct in_addr * ifa;
     const char * ifaName = "wlan0";
     if (ip == NULL)
     {
+       RLOGE("[lynq_get_interface_ip]input erro,input is NULL ptr,please check\n");
        return -1;
     }
 
-    if (idx == 1) {
+    if (idx == 1)
+    {
        ifaName = "tether";
     }
-    else if (idx != 0) {
+    else if (idx != 0)
+    {
        return -1;
     }
 
@@ -2522,19 +2899,21 @@
                // is a valid IP4 Address
                ifa=&((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr;
                inet_ntop(AF_INET, ifa, ip, INET_ADDRSTRLEN);
-               printf("%s IP Address %s/n", ifaddr->ifa_name, ip);
+               RLOGD("[lynq_get_interface_ip]:%s IP Address %s/n", ifaddr->ifa_name, ip);
                freeifaddrs(ifaddr_header);
-               printf("ip %s\n", ip);
+               RLOGD("ip %s\n", ip);
                return 0;
             }
         }
     }
     freeifaddrs(ifaddr_header);
+    RLOGE("[lynq_get_interface_ip] can't find interface | other erro\n");
     return -1;
 }
 
 int lynq_get_interface_mac(lynq_wifi_index_e idx,char *mac)
 {
+    RLOGD("enter lynq_get_interface_mac\n");
     int count;
     size_t i;
     char *split_words[128] = {0};
@@ -2544,18 +2923,23 @@
 
     DO_REQUEST(lynq_get_mac_cmd);
 
-    if (memcmp(cmd_reply, "FAIL", 4) == 0) {
+    if (memcmp(cmd_reply, "FAIL", 4) == 0)
+    {
+        RLOGE("[lynq_get_interface_mac]do request cmd --DRIVER MACADDR-- reply FAIL\n");
         return -1;
     }
 
     count = lynq_split(cmd_reply, reply_len, '=', split_words);
 
-    if (count < 2) {
+    if (count < 2)
+    {
         return -1;
     }
 
-    for (i=0; i < strlen(split_words[1]); i++ ) {
-        if (split_words[1][i] != ' ') {
+    for (i=0; i < strlen(split_words[1]); i++ )
+    {
+        if (split_words[1][i] != ' ')
+	{
             break;
         }
     }
@@ -2604,10 +2988,10 @@
  *
  ***** change by qs.xiong 20221011*******/
     if((fp=popen("wl -i wlan0 rssi","r"))==NULL)
-        {
-            perror("popen error!");
-            return -1;
-        }
+    {
+        perror("popen error!");
+        return -1;
+    }
     if((fread(lynq_cmd_ret,sizeof(lynq_cmd_ret),1,fp))<0)
     {
         perror("fread fail!");
@@ -2617,7 +3001,8 @@
 /****** if got rssi is 0,means sta didn't connected any device****/
     if(*rssi == 0)
     {
-        printf("sta didn't connected any ap device,please check connection\n");
+        RLOGE("[lynq_get_connect_ap_rssi]sta didn't connected any ap device,please check connection\n");
+	return -1;
     }
 
     return 0;
@@ -2625,7 +3010,9 @@
 
 int lynq_get_connect_ap_band(lynq_wifi_index_e idx, lynq_wifi_band_m * band)
 {
-    if (band == NULL) {
+    RLOGD("enter lynq_get_connect_ap_band\n");
+    if (band == NULL)
+    {
         return -1;
     }
 
@@ -2633,7 +3020,8 @@
     ap_info_s ap;
     ap.band = -1;
 
-    if (inner_get_status_info_ap(CTRL_STA, &ap) != 0) {
+    if (inner_get_status_info_ap(CTRL_STA, &ap) != 0)
+    {
         return -1;
     }
     *band = ap.band;
@@ -2647,7 +3035,7 @@
 
     if (ip == NULL)
     {
-        printf("invalid param");
+        RLOGE("[lynq_get_connect_ap_ip]invalid param ptr ip,input ptr is NULL\n");
         return -1;
     }
 
@@ -2665,14 +3053,16 @@
 {
     char lynq_limit_cmd[32]={0};
     int ret;
-    if((sta_number < 1 ) && (sta_number > 15)){
-        printf("sta_number: not in range\n",sta_number);
+    if((sta_number < 1 ) && (sta_number > 15))
+    {
+        RLOGE("sta_number: not in range\n",sta_number);
         return -1;
     }
     sprintf(lynq_limit_cmd,"wl maxassoc  %d", sta_number);
     ret = system(lynq_limit_cmd);
-    if(ret != 0){
-        printf("cmd of limit ap devices number error\n");
+    if(ret != 0)
+    {
+        RLOGE("cmd of limit ap devices number error\n");
     }
     return 0;
 }
@@ -2684,11 +3074,13 @@
     char lynq_cmd_mode[128]={0};
     char lynq_cmd_slect[128]={0};
 
-    if((acs_mode != 2) && (acs_mode != 5)){
+    if((acs_mode != 2) && (acs_mode != 5))
+    {
         PRINT_AND_RETURN_VALUE("set acs_mode is error",-1);
     }
 
-    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0) {
+    if (lynq_check_network_number(idx, CTRL_AP, AP_NETWORK_0) != 0)
+    {
         return -1;
     }
 
@@ -2741,7 +3133,8 @@
     if( inet_aton(mask, &ip_addr) )
     {
         netmask = ntohl(ip_addr.s_addr);
-    }else{
+    }else
+    {
         netmask = 0;
         return 0;
     }
@@ -2796,7 +3189,7 @@
     nmax = 6;
     ncheckcount = nidlecount = 0;
 
-    printf("------gbw thread run\n");
+    RLOGD("------gbw thread run\n");
     sprintf(str_cmd, "ip neigh | grep %s | awk '{print $1}'", g_gbw_mac);
     while (dest_ip[0] == '\0') {
         sleep(1);
@@ -2819,7 +3212,7 @@
     system("tc class add dev tether parent 1:  classid 1:1  htb rate 50Mbit ceil 70Mbit prio 2 quantum 3000");
     if (get_tether_route_str(str_cmd_ret, sizeof (str_cmd_ret)) != 0)
     {
-        printf("not get tether info\n");
+        RLOGD("not get tether info\n");
         return;
     }
     sprintf(str_cmd, "tc filter add dev tether parent 1: protocol ip prio 16 u32 match ip dst %s flowid 1:1", str_cmd_ret);
