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);
