diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index c731388..70d66cb 100755
--- a/src/lynq/lib/liblynq-wifi6/libwifi6.c
+++ b/src/lynq/lib/liblynq-wifi6/libwifi6.c
@@ -96,7 +96,7 @@
     pthread_mutex_t mutex;
 };
 
-int g_history_disconnect_valid_num = 0;
+volatile int g_history_disconnect_valid_num = 0;
 int g_history_disconnect_net[128];
 
 static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -143,6 +143,73 @@
 static int s_service_invoke_timeout_cnt=0;
 const int FAKE_MAX_INT_VALUE = 99999;
 
+static void print_disconnect_list()
+{
+    int i;
+    for( i = 0; i < g_history_disconnect_valid_num; i++ )
+    {
+        RLOGD(" list of g_history_disconnect_valid_num is  %d histroy_list[%d]:%d --------- %d",g_history_disconnect_valid_num,i,g_history_disconnect_net[i],__LINE__);
+    }
+
+    return;
+}
+
+// idex  ----> history_disconnect_list[x]  index
+static int removeElement(int idex)
+{
+    RLOGD("into removeElement");
+    if( index < 0 )
+    {
+        RLOGD("WIFI [removeElement] input idex < 0,idex is %d: ",idex);
+        return -1;
+    }
+    RLOGD("%s line: %d  g_history_disconnect_net[%d]: %d  end g_history_disconnect_net[%d]:%d",__func__,__LINE__,idex,g_history_disconnect_net[idex],g_history_disconnect_valid_num-1, g_history_disconnect_net[g_history_disconnect_valid_num-1]);
+    g_history_disconnect_net[idex] = g_history_disconnect_net[g_history_disconnect_valid_num-1];    //g_history_disconnect_vaild_num  -1 for get last index
+    g_history_disconnect_valid_num --;
+    RLOGD("end removeElement");
+    return 0;
+}
+static int check_history_disconenct_ap_list(int val)
+{
+    print_disconnect_list();
+    RLOGD("WIFI[check_history_disconenct_ap_list]into check_history_disconenct_ap_list && input val is %d g_history_disconnect_valid_num is %d line",val,g_history_disconnect_valid_num,__LINE__);
+    int i;
+    for( i = 0; i < g_history_disconnect_valid_num; i++)
+    {
+        if( val == g_history_disconnect_net[i] )
+        {
+             RLOGD("[wifi]-----input val is %d,g_history_disconnect_net[%d]:%d",val,i,g_history_disconnect_net[i]);
+             RLOGD("end check_history_disconenct_ap_list && return network index");
+             return i;
+        }
+    }
+    RLOGD("end check_history_disconenct_ap_list && return fail,didn't need remove networkid %d from list  g_history_disconnect_valid_num is %d line %d",val,g_history_disconnect_valid_num,__LINE__);
+    return -1;
+}
+
+
+static void lynq_sta_removeElement(int net_no)
+{
+    int ret;
+
+    ret = check_history_disconenct_ap_list(net_no);
+    if( ret == -1 )
+    {
+        RLOGD("curr_net_no not in history_disconenct_lsit,return 0 %s %d",__func__,__LINE__);
+        return;
+    }else
+    {
+        ret = removeElement(ret);
+        if( ret == 0 )
+        {
+            RLOGD("removeElement pass %s %d",__func__,__LINE__);
+            return;
+        }
+    }
+
+    return;
+}
+
 static void notify_service_invoke_fail(int error)
 {
     struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
@@ -837,19 +904,27 @@
 */
 static void lynq_two_arr_merge(int dis_net_list[],int valid_num,int out[],int * outlen)
 {
+    RLOGD("enter %s %d",__func__,__LINE__);
+    print_disconnect_list();
     int count,ncount,index;
     int flag = 0;
     int merge_index = 0;
     int net_no_list[128];
 
+    for(ncount = 0;ncount < valid_num; ncount++ )
+    {
+        RLOGD("input history disconenct_list[%d] %d %d",ncount,dis_net_list[ncount],__LINE__);
+    }
+
     index =lynq_get_network_number_list(0, 0, net_no_list,NULL);
     for( count = 0; count < index; count++)
     {
         for(ncount = 0; ncount < valid_num; ncount++)
         {
+            RLOGD(" %s dis_net_list[%d]->%d %d",__func__,ncount,dis_net_list[ncount],__LINE__);
             if(net_no_list[count] == dis_net_list[ncount])
             {
-                RLOGD("[wifi]this is history disconnect idx ----> ",net_no_list[count]);
+                RLOGD("[wifi]this is history disconnect idx ----> %d %d",net_no_list[count],__LINE__);
                 flag = 1;
                 break;
             }
@@ -857,6 +932,7 @@
         if( flag != 1 )
         {
             out[merge_index] = net_no_list[count];
+            RLOGD("out[%d]: %d    net_no_list[%d]: %d %d",merge_index,out[merge_index],count,net_no_list[count],__LINE__);
             merge_index ++;
         }
         flag = 0;
@@ -891,7 +967,7 @@
     if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
     {
         *state = LYNQ_WIFI_STA_STATUS_CONNECT;
-        RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
+        RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d",*state,*error);
         g_sta_conncet_status_flag = 0;
         return;
     }
@@ -1252,6 +1328,7 @@
                         system_call_v("%s %s", sta_status_change_script, "disconnect");
                     }
                 }
+
                 last_state = state;
             }
         }
@@ -3566,6 +3643,7 @@
 
                 pthread_mutex_lock(&s_global_check_mutex);
                 s_sta_status = INNER_STA_STATUS_CONNECTED;
+                lynq_sta_removeElement(net_no);
                 pthread_cond_signal(&s_global_check_cond);
                 pthread_mutex_unlock(&s_global_check_mutex);
                 return 0;
@@ -3620,6 +3698,10 @@
     system("echo \"\" > /tmp/wlan0_dhcpcd_router");
     usleep(200*1000);
 
+    pthread_mutex_lock(&s_global_check_mutex);
+    lynq_sta_removeElement(net_no);
+    pthread_mutex_unlock(&s_global_check_mutex);
+
     ret = inner_sta_start_stop(net_no, 1, 1);
 
     pthread_mutex_lock(&s_global_check_mutex);
@@ -3674,9 +3756,11 @@
 
 int lynq_wifi_sta_disconnect_ap(lynq_wifi_index_e idx, char *ssid)
 {
+    int i,check_history_idx_flag;
     ap_info_s ap;
     curr_status_info curr_state;
     ap.ap_ssid[0] = '\0';
+    check_history_idx_flag = 0;
 
     if (ssid == NULL || *ssid == '\0')
     {
@@ -3702,8 +3786,25 @@
 
     pthread_mutex_lock(&s_global_check_mutex);
     s_sta_status = INNER_STA_STATUS_DISCONNECTING;
-    g_history_disconnect_net[g_history_disconnect_valid_num] = curr_state.net_no;
-    g_history_disconnect_valid_num++;
+    RLOGD("WIFI[lynq_wifi_sta_disconnect_ap]g_history_disconnect_valid_num is %d",g_history_disconnect_valid_num);
+    for( i = 0; i< g_history_disconnect_valid_num ; i++)
+    {
+        RLOGD("WIFI[lynq_wifi_sta_disconnect_ap]g_history_disconnect_net[%d] is %d,current disconnet network is %d",i,g_history_disconnect_net[i],curr_state.net_no);
+        if( g_history_disconnect_net[i] == curr_state.net_no)
+        {
+            RLOGD("current disconenct ap idx is %d && last aready into g_history_disconenct_net",curr_state.net_no);
+            check_history_idx_flag = 1;
+            break;
+        }
+    }
+    if ( check_history_idx_flag == 0)
+    {
+        RLOGD("current need add ap idx is %d ,g_history_disconnect_valid_num is %d line %d",curr_state.net_no,g_history_disconnect_valid_num,__LINE__);
+        g_history_disconnect_net[g_history_disconnect_valid_num] = curr_state.net_no;
+        g_history_disconnect_valid_num++;
+    }
+    RLOGD("%s %d",__func__,__LINE__);
+    print_disconnect_list();
     pthread_mutex_unlock(&s_global_check_mutex);
     return lynq_wifi_sta_stop_network(idx, curr_state.net_no);
 
@@ -3999,6 +4100,7 @@
     int count, net_no, index;
     int net_no_list[128];
     lynq_wifi_auth_s net_auth;
+
     char lynq_remove_cmd[MAX_CMD];
 
     if (ssid == NULL || *ssid == '\0')
@@ -4032,6 +4134,15 @@
     sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
 
     DO_OK_FAIL_REQUEST(lynq_remove_cmd);
+
+    RLOGD("WIFI[lynq_sta_forget_ap][check_history_disconenct_ap_list] input net_no is %d",net_no);
+
+    pthread_mutex_lock(&s_global_check_mutex);
+    lynq_sta_removeElement(net_no);
+    pthread_mutex_unlock(&s_global_check_mutex);
+
+    RLOGD("%s %d",__func__,__LINE__);
+    print_disconnect_list();
     DO_OK_FAIL_REQUEST(cmd_save_config);
 
     return 0;
