diff --git a/src/lynq/lib/liblynq-wifi6/include/libwifi6.h b/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
index 7e429bc..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 {
@@ -53,7 +55,7 @@
 {
     char ap_ip[32];
     char ap_mac[32];
-    char ap_ssid[32];
+    char ap_ssid[64];
     char psw[64];                      //password 
     lynq_wifi_auth_s auth;
     lynq_wifi_band_m band;
@@ -70,7 +72,7 @@
 typedef struct scan_info
 {
     char mac[32];
-    char ssid[32];
+    char ssid[64];
     lynq_wifi_band_m band;
     lynq_wifi_auth_s auth;
     int rssi;
diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index 25e429b..70f7ac2 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,21 +832,33 @@
 }
 
 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;
+	}else if ( strstr(flag, "SHA256") == 0 )
+        {
+            return LYNQ_WIFI_AUTH_WPA3_PSK;
+        }else if ( strstr( flag,"SAE-CCMP") == 0 )
+        {
+            return LYNQ_WIFI_AUTH_WPA2_WPA3_PSK;
         }
     }
 
@@ -806,7 +901,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 +913,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 +979,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 +1006,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 +1041,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 +1055,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 +1063,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 +1074,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 +1108,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 +1191,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 +1209,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 +1245,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 +1253,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,17 +1282,22 @@
     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;
     }
 
     if (0 == lynq_wifi_ap_auth_get(idx, &org_auth) && org_auth != -1) {
         if (org_auth == auth) {
+            RLOGD("org_auth --- is %d\n",org_auth);
             return 0;
         }
         else {
@@ -1185,17 +1317,18 @@
         }
     }
 
-	switch(auth){
-		case LYNQ_WIFI_AUTH_OPEN:
+    switch(auth){
+	case LYNQ_WIFI_AUTH_OPEN:
         {
+            RLOGD("auth == is LYNQ_WIFI_AUTH_OPEN\n");
             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:
         {
+            RLOGD("auth == is LYNQ_WIFI_AUTH_WEP\n");
             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);
             sprintf(lynq_auth_alg_cmd,"SET_NETWORK %d auth_alg  SHARED", AP_NETWORK_0);
@@ -1204,14 +1337,27 @@
             DO_OK_FAIL_REQUEST(lynq_auth_alg_cmd);
             break;
         }
-		case LYNQ_WIFI_AUTH_WPA_PSK:
+	case 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);
+            sprintf(lynq_pairwise_cmd,"SET_NETWORK %d pairwise CCMP", AP_NETWORK_0);
+
+            DO_OK_FAIL_REQUEST(lynq_auth_cmd);
+            DO_OK_FAIL_REQUEST(lynq_psk_cmd);
+            DO_OK_FAIL_REQUEST(lynq_pairwise_cmd);
+            break;
+
+	}
         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 +1368,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 +1412,77 @@
     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)
+	{
+            RLOGD("---auth is OPEN\n");
             *auth = LYNQ_WIFI_AUTH_OPEN;
+            return 0;
         }
-        else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0){
+        else if (memcmp(lynq_auth_alg_str, "SHARED", 6) == 0)
+	{
+            RLOGD("---auth is WEP\n");
             *auth = LYNQ_WIFI_AUTH_WEP;
+            return 0;
         }
-        else {
+        else
+	{
+            RLOGD("---auth is OPEN\n");
             *auth = LYNQ_WIFI_AUTH_OPEN;
+            return 0;
         }
     }
-    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)
+	{
+            RLOGE("---auth is -1\n");
             *auth = -1;
         }
-        else if (memcmp(lynq_proto_str, "RSN", 3) == 0) {
+        else if (memcmp(lynq_proto_str, "RSN", 3) == 0)
+	{
+            RLOGD("---auth WPA2_PSK\n");
             *auth = LYNQ_WIFI_AUTH_WPA2_PSK;
+            return 0;
         }
-        else {
+        else
+	{
+            RLOGD("---auth WPA_PSK\n");
             *auth = LYNQ_WIFI_AUTH_WPA_PSK;
+	    return 0;
         }
     }
-    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;
+        return 0;
+    }else if (memcmp(lynq_auth_str,"2",1) == 0 )
+    {
+	RLOGD("auth : LYNQ_WIFI_AUTH_WPA3_PSK\n");
+        *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
+        return 0;
+    }
+    else
+    {
+	RLOGE("---auth -- -1\n");
         *auth = -1;
     }
 
@@ -1282,7 +1495,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 +1512,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 +1534,7 @@
 
 //    system("connmanctl tether wifi off");
 	
-	return 0;
+    return 0;
 }
 
 int lynq_wifi_ap_hide_ssid(lynq_wifi_index_e idx)
@@ -1329,11 +1542,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 +1553,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 +1561,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 +1573,77 @@
     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))
+    {
+        RLOGE("[lynq_ap_password_set] get ap auth info error\n");
         return -1;
     }
-    else if (auth == LYNQ_WIFI_AUTH_OPEN) {
-        return -1;
+    else if (auth == LYNQ_WIFI_AUTH_OPEN)
+    {
+        RLOGD("ap auth :LYNQ_WIFI_AUTH_OPEN\n");
+        return 0;
     }
 
     CHECK_WPA_CTRL(CTRL_AP);
 
-    if (auth == LYNQ_WIFI_AUTH_WEP) {
+    if (auth == LYNQ_WIFI_AUTH_WEP)
+    {
+        RLOGD("[lynq_ap_password_set]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("[lynq_ap_password_set]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)
+    {
+        
+        RLOGD("[lynq_ap_password_set]ap auth :LYNQ_WIFI_AUTH_WPA2_WPA3  LYNQ_WIFI_AUTH_WPA3_PSK\n");
+        sprintf(lynq_tmp_cmd,"SET_NETWORK %d psk \"%s\"",AP_NETWORK_0, password);
+        sprintf(lynq_wpa2_wpa3,"SET_NETWORK %d sae_password \"%s\"",AP_NETWORK_0, password);
+        DO_OK_FAIL_REQUEST(lynq_tmp_cmd);
+        DO_OK_FAIL_REQUEST(lynq_wpa2_wpa3);
+
+    }
+    else
+    {   
+        RLOGD("[lynq_ap_password_set]ap auth :get ap auth error\n");
         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 +1653,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 +1670,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 +1692,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 +1738,58 @@
     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;
+                return 0;
             }
         }
     }
+    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;
+       return 0;
+    }else if( strncmp(lynq_auth_str,"2",1) == 0 )
+    {
+
+        *auth = LYNQ_WIFI_AUTH_WPA3_PSK;
+        return 0;
+    }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 +1798,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 +1831,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 +1856,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 +1884,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 +1907,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 +1944,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 +1962,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 +1988,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 +2003,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 +2019,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 +2027,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 +2050,8 @@
     ret = -1;
 
     CHECK_IDX(idx, CTRL_STA);
-    if (info == NULL) {
+    if (info == NULL)
+    {
         return -1;
     }
 
@@ -1756,7 +2065,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 +2083,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 +2092,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 +2105,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 +2129,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;
@@ -1834,29 +2152,32 @@
 
 static int inner_set_sta_auth_psw(int net_no, lynq_wifi_auth_s auth, char *password)
 {
-    char lynq_auth_cmd[64]={0};
+    char lynq_auth_cmd[128]={0};
     char lynq_ket_mgmt_cmd[64]={0};
     char lynq_pairwise_cmd[64]={0};
     char lynq_psk_cmd[64]={0};
 
     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 +2187,53 @@
             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_NETWORK %d ieee80211w 1",net_no);
+            sprintf(lynq_auth_cmd,"wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 set_network %d ieee80211w 1",net_no);
+            sprintf(lynq_ket_mgmt_cmd,"SET_NETWORK %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);
+	    system(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_NETWORK %d ieee80211w 2",net_no);
+            sprintf(lynq_auth_cmd,"wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 set_network %d ieee80211w 1",net_no);
+            sprintf(lynq_ket_mgmt_cmd,"SET_NETWORk %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);
+            system(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 +2241,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 +2256,8 @@
 
     net_no = inner_get_curr_net_no(CTRL_STA);
 
-    if (net_no < 0) {
+    if (net_no < 0)
+    {
         return -1;
     }
 
@@ -1913,14 +2270,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 +2290,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 +2329,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 +2340,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 +2461,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 +2471,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 +2483,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 +2497,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 +2507,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 +2529,8 @@
     char *split_words[128] = {0};
     scan_info_s * p;
 
-    if (list == NULL || len == NULL) {
+    if (list == NULL || len == NULL)
+    {
         return -1;
     }
 
@@ -2172,16 +2550,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 +2581,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 +2594,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 +2618,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,43 +2634,54 @@
 //    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;
 }
 
 int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
 {
+    const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
     const char *lynq_scan_cmd = "SCAN";
 
     CHECK_IDX(idx, CTRL_STA);
 
     CHECK_WPA_CTRL(CTRL_STA);
 
+    system(clean_last_re);
     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 +2690,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 +2703,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 +2713,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 +2726,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 +2746,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 +2769,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 +2813,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 +2827,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 +2866,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 +2884,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 +2895,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 +2906,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 +2944,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 +2968,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 +3033,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 +3046,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 +3055,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 +3065,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 +3080,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 +3098,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 +3119,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 +3178,8 @@
     if( inet_aton(mask, &ip_addr) )
     {
         netmask = ntohl(ip_addr.s_addr);
-    }else{
+    }else
+    {
         netmask = 0;
         return 0;
     }
@@ -2796,7 +3234,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 +3257,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);
