[bug][T108-suolin][bug-view-2420][ril] when in 3G,  sometimes call all ril api fail

 Only Configure:No
 Affected branchmaster
 Affected module:ril
 Is it affected on:asr
 Doc Update:No

Change-Id: I27c70295e6bff6a56faa33ff4cfd59bdf65f45c1
diff --git a/mbtk/mbtk_rild_v2/src/atchannel.c b/mbtk/mbtk_rild_v2/src/atchannel.c
index 3a69ad9..264ea2a 100755
--- a/mbtk/mbtk_rild_v2/src/atchannel.c
+++ b/mbtk/mbtk_rild_v2/src/atchannel.c
@@ -271,25 +271,34 @@
 
 static void processLine(ATPortId_enum port, const char *line)
 {
+    LOGD("lynq read process begin process line port %d %s", port,line);
     pthread_mutex_lock(&s_commandmutex[port]);
 //    LOGD("LINE : %s", line);
+    LOGD("lynq read process get lock port %d", port);
+
     if (sp_response[port] == NULL)
     {
+        LOGD("lynq read 2 port %d", port);
         /* no command pending */
         handleUnsolicited(port, line);
+       
     }
     else if (isFinalResponseSuccess(line))
     {
+        LOGD("lynq read 3 port %d", port);
         sp_response[port]->success = 1;
         handleFinalResponse(port, line);
+        
     }
     else if (isFinalResponseError(port, line))
     {
+        LOGD("lynq read 4 port %d", port);
         sp_response[port]->success = 0;
         handleFinalResponse(port, line);
     }
     else if (s_smsPDU[port] != NULL && 0 == strcmp(line, "> "))
     {
+         LOGD("lynq read 5 port %d", port);
         // See eg. TS 27.005 4.3
         // Commands like AT+CMGS have a "> " prompt
         writeCtrlZ(port, s_smsPDU[port]);
@@ -298,9 +307,11 @@
     else switch (s_type[port])
         {
             case NO_RESULT:
+                LOGD("lynq read 6 port %d", port);
                 handleUnsolicited(port, line);
                 break;
             case NUMERIC:
+                LOGD("lynq read 7 port %d", port);
                 if (sp_response[port]->p_intermediates == NULL
                     && isdigit(line[0])
                    )
@@ -315,6 +326,7 @@
                 }
                 break;
             case SINGLELINE:
+                LOGD("lynq read 8 port %d", port);
                 if (sp_response[port]->p_intermediates == NULL
                     && strStartsWith (line, s_responsePrefix[port])
                    )
@@ -348,8 +360,10 @@
                 }
                 break;
             case MULTILINE:
+                LOGD("lynq read 9 port %d", port);
                 if (strStartsWith (line, s_responsePrefix[port]))
                 {
+                    LOGD("lynq read 10 port %d", port);
                     addIntermediate(port, line);
                 }
                 else
@@ -359,11 +373,12 @@
                 break;
 
             default: /* this should never be reached */
+                LOGD("lynq read 11 port %d", port);
                 LOGE("Unsupported AT command type %d\n", s_type[port]);
                 handleUnsolicited(port, line);
                 break;
         }
-
+    LOGD("lynq read 12 port %d", port);
     pthread_mutex_unlock(&s_commandmutex[port]);
 }
 
@@ -647,6 +662,7 @@
         {
             //usleep(50000);
             //continue;
+            LOGD("lynq read 1 port %d", *port);
             break;
         }
 
@@ -736,6 +752,7 @@
 
     if (s_at_fd[port] < 0 || s_readerClosed > 0)
     {
+        LOGE("lynq 12, port %d %d %d",port,s_at_fd[port],s_readerClosed);
         return AT_ERROR_CHANNEL_CLOSED;
     }
 
@@ -856,6 +873,9 @@
     s_responsePrefix[port] = NULL;
     s_smsPDU[port] = NULL;
     sp_response[port] = NULL;
+    pthread_mutex_init(&s_commandmutex[port], NULL);
+    pthread_cond_init(&(s_commandcond[port]), NULL);
+    at_state_set(port,RIL_AT_STATE_READY);
 
     ATPortId_enum *at_port_ptr = (ATPortId_enum*)malloc(sizeof(ATPortId_enum));
     ATPortId_enum *urc_port_ptr = (ATPortId_enum*)malloc(sizeof(ATPortId_enum));
@@ -958,7 +978,7 @@
 
 static long long at_timeout_get(const char *at_command, bool *timeout_close)
 {
-    long long timeout = 0;
+    long long timeout = 15000;
     int i;
     for(i = 0; i <  ARRAY_SIZE(at_timeout_list); i++)
     {
@@ -986,21 +1006,19 @@
     int err = 0;
     bool tiemout_close = true;
     struct timespec ts;
+
+    LOGD("lynq 9, port %d %d",port,at_state[port]);
+    if(sp_response[port] != NULL)
+    {
+        LOGE("lynq 10, port %d %p",port,sp_response[port]);
+        err = AT_ERROR_COMMAND_PENDING;
+        return err;
+    }
+
     if(at_state[port] == RIL_AT_STATE_READY)
         at_state[port] = RIL_AT_STATE_BUSY;
 
-    if(sp_response[port] != NULL)
-    {
-        err = AT_ERROR_COMMAND_PENDING;
-        goto error;
-    }
-
-    err = writeline (port, command);
-
-    if (err < 0)
-    {
-        goto error;
-    }
+    LOGD("lynq 11, port %d",port);
 
     s_type[port] = type;
     s_responsePrefix[port] = responsePrefix;
@@ -1011,21 +1029,30 @@
     {
         timeoutMsec = at_timeout_get(command, &tiemout_close);
     }
+    err = writeline (port, command);
+
+    if (err < 0)
+    {
+        goto error;
+    }
 
     if (timeoutMsec != 0)
     {
         setTimespecRelative(&ts, timeoutMsec);
     }
 
+    LOGD("lynq before loop, port %d %d",port,s_readerClosed);
     while (sp_response[port]->finalResponse == NULL && s_readerClosed == 0)
     {
         //LOGD("AT wait time:%lld",timeoutMsec);
         if (timeoutMsec != 0)
         {
+            LOGD("lynq 12, port %d %lld",port,timeoutMsec);
             err = pthread_cond_timedwait(&s_commandcond[port], &s_commandmutex[port], &ts);
         }
         else
         {
+            LOGD("lynq 13, port %d",port);
             err = pthread_cond_wait(&s_commandcond[port], &s_commandmutex[port]);
         }
 
@@ -1034,10 +1061,12 @@
         {
             if(tiemout_close)
             {
+                LOGE("lynq 15, port %d",port);
                 err = AT_ERROR_TIMEOUT_CLOSE;
             }
             else
             {
+                LOGE("lynq 16, port %d",port);
                 err = AT_ERROR_TIMEOUT;
             }
             goto error;
@@ -1046,29 +1075,35 @@
 
     if (pp_outResponse == NULL)
     {
+        LOGD("lynq 18, port %d",port);
         at_response_free(sp_response[port]);
     }
     else
     {
+        LOGD("lynq 19, port %d",port);
         /* line reader stores intermediate responses in reverse order */
         reverseIntermediates(sp_response[port]);
         *pp_outResponse = sp_response[port];
     }
 
+
     sp_response[port] = NULL;
 
     if(s_readerClosed > 0)
     {
+        
+        LOGE("lynq 21, port %d %d",port,s_readerClosed);
         err = AT_ERROR_CHANNEL_CLOSED;
         goto error;
     }
+	LOGD("lynq 22, port %d",port);
 
     err = 0;
 error:
     if(at_state[port] == RIL_AT_STATE_BUSY)
         at_state[port] = RIL_AT_STATE_READY;
+    LOGD("lynq 23, port %d %d",port, at_state[port]);
     clearPendingCommand(port);
-
     return err;
 }
 
@@ -1083,6 +1118,8 @@
 {
     int err;
 
+    
+    LOGD("lynq 0, port %d,%lld,%s",port,timeoutMsec,command);
     if (0 != pthread_equal(s_tid_reader[port], pthread_self()))
     {
         /* cannot be called from reader thread */
@@ -1090,25 +1127,46 @@
         return AT_ERROR_INVALID_THREAD;
     }
 
+    LOGD("lynq 1, port %d",port);
+
     // Waitting for previous AT complete.
+    int count=0;
     while(at_state[port] == RIL_AT_STATE_BUSY)
     {
-        usleep(10000);
+        sleep(1);
+        count++;
+        if(count%2==0)
+        {
+           LOGE("lynq 2, port %d",port);
+        }
+
+        if(count==8)
+        {
+           err= AT_ERROR_COMMAND_PENDING;
+           goto out;
+        }
     }
 
+    LOGD("lynq 3, port %d",port);
     pthread_mutex_lock(&s_commandmutex[port]);
+    LOGD("lynq 4, port %d",port);
 
     err = at_send_command_full_nolock(port, command, type,
                                       responsePrefix, smspdu,
                                       timeoutMsec, pp_outResponse);
 
+    LOGD("lynq 5, port %d",port);
     pthread_mutex_unlock(&s_commandmutex[port]);
+    LOGD("lynq 6, port %d",port);
 
     if (err == AT_ERROR_TIMEOUT_CLOSE && s_onTimeout != NULL)
     {
+        LOGE("lynq 7, port %d",port);
         s_onTimeout();
     }
+    LOGD("lynq 8, port %d",port);
 
+out:
     return err;
 }
 
diff --git a/mbtk/mbtk_rild_v2/src/main.c b/mbtk/mbtk_rild_v2/src/main.c
index 1c55e2c..ce74dd9 100755
--- a/mbtk/mbtk_rild_v2/src/main.c
+++ b/mbtk/mbtk_rild_v2/src/main.c
@@ -2069,8 +2069,8 @@
         || strStartsWith(s, "+EEMNRINTERRAT:")

         || strStartsWith(s, "+EEMLTESVC:") || strStartsWith(s, "+EEMLTEINTER:")

         || strStartsWith(s, "+EEMLTEINTRA:") || strStartsWith(s, "+EEMLTEINTERRAT:")

-        || strStartsWith(s, "+EEMUMTSSVC:") || strStartsWith(s, "+EEMUMTSINTRA:")

-        || strStartsWith(s, "+EEMUMTSINTERRAT:") || strStartsWith(s, "+EEMGINFOBASIC:")

+        || strStartsWith(s, "+EEMUMTSSVC:") /*|| strStartsWith(s, "+EEMUMTSINTRA:")

+        || strStartsWith(s, "+EEMUMTSINTERRAT:")*/ || strStartsWith(s, "+EEMGINFOBASIC:")

         || strStartsWith(s, "+EEMGINFOSVC:") || strStartsWith(s, "+EEMGINFOPS:")

         || strStartsWith(s, "+EEMGINFONC:")) {

         urc_cell_info_process(sim_id, s, sms_pdu);

@@ -2654,7 +2654,8 @@
 // Return MBTK_INFO_ERR_SUCCESS,will call pack_error_send() to send RSP.
 // Otherwise, do not call pack_error_send().
 static mbtk_ril_err_enum pack_req_process(sock_cli_info_t* cli_info, ril_msg_pack_info_t* pack)

-{
+{

+    LOGD("lynq rild 1, simid %d port %d %d",cli_info->sim_id,cli_info->port,pack->msg_id);

     if(pack->msg_id > RIL_MSG_ID_DEV_BEGIN && pack->msg_id < RIL_MSG_ID_DEV_END) {

         return dev_pack_req_process(cli_info, pack);

     } else if(pack->msg_id > RIL_MSG_ID_SIM_BEGIN && pack->msg_id < RIL_MSG_ID_SIM_END) {

@@ -2917,32 +2918,32 @@
     return NULL;
 }

 

-static int check_device_info(void)
-{
-    mbtk_device_info_basic_t info_basic;
-    memset(&info_basic,0,sizeof(mbtk_device_info_basic_t));
-    int result = mbtk_dev_info_read(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));
-    if(result != 0)
-    {
-        LOGE("mbtk_dev_info_read(BASIC) fail. reset \n");
-	return -1;
-    }
-    return 0;
-}
-
-static int config_file_exists(void)
-{
-    ATResponse *response = NULL;
-
-    int err = at_send_command(portType_2_portId(MBTK_SIM_1, ATPORTTYPE_0), "AT*MRD_CDF=Q,TTPCom_NRAM2_CUSTOMIZATION_DATA.gki", &response);
-    if(err < 0 || response->success == 0)
-    {
-        LOGD("config_file gki check fail \n");
-        return 0;
-    }
-    return -1;
-}
-
+static int check_device_info(void)

+{

+    mbtk_device_info_basic_t info_basic;

+    memset(&info_basic,0,sizeof(mbtk_device_info_basic_t));

+    int result = mbtk_dev_info_read(MBTK_DEVICE_INFO_ITEM_BASIC, &info_basic, sizeof(mbtk_device_info_basic_t));

+    if(result != 0)

+    {

+        LOGE("mbtk_dev_info_read(BASIC) fail. reset \n");

+	return -1;

+    }

+    return 0;

+}

+

+static int config_file_exists(void)

+{

+    ATResponse *response = NULL;

+

+    int err = at_send_command(portType_2_portId(MBTK_SIM_1, ATPORTTYPE_0), "AT*MRD_CDF=Q,TTPCom_NRAM2_CUSTOMIZATION_DATA.gki", &response);

+    if(err < 0 || response->success == 0)

+    {

+        LOGD("config_file gki check fail \n");

+        return 0;

+    }

+    return -1;

+}

+

 static void band_support_init()

 {

     mbtk_device_info_modem_t info_modem;

@@ -3041,7 +3042,8 @@
         {
             if(item->cli_info) { // REQ form client.
                 ril_msg_pack_info_t *pack = (ril_msg_pack_info_t*)item->pack;

-                LOGD("Process REQ %s.", id2str(pack->msg_id));

+                LOGD("hq Process REQ %s.  port %d", id2str(pack->msg_id),*port);

+                LOGD("lynq rild 0, simid %d port %d %d",item->cli_info->sim_id,item->cli_info->port,*port);

                 ril_info.at_process[*port] = true;

                 err = pack_req_process(item->cli_info, pack);
                 if(err != MBTK_RIL_ERR_SUCCESS)

@@ -3075,7 +3077,7 @@
 
 OK
 */
-
+

 static void* band_config_thread()
 {
     band_info.band_set_success = FALSE;

@@ -3109,11 +3111,11 @@
     LOGD("Set Band thread exit.");
     return NULL;
 }
-
+

 

 

 int ril_server_start()

-{
+{

     signal(SIGPIPE, SIG_IGN);

 

     memset(&ril_info, 0, sizeof(ril_info_t));

@@ -3122,13 +3124,13 @@
 
     //check cfun and sim card status
     ril_at_ready_process();
-
-    // check device info
-    int check_res = check_device_info();
-
-    // check gki config 
-    int file_res = config_file_exists();
-
+

+    // check device info

+    int check_res = check_device_info();

+

+    // check gki config 

+    int file_res = config_file_exists();

+

     // Init support band.

     band_support_init();

     //any AT instruction that is not sent through pack_process_thread needs to precede the thread
@@ -3184,10 +3186,18 @@
         goto error;
     }

 

-    mbtk_queue_init(&(ril_info.msg_queue[ATPORTTYPE_0]));

-    pthread_mutex_init(&(ril_info.msg_mutex[ATPORTTYPE_0]), NULL);

-    pthread_cond_init(&(ril_info.msg_cond[ATPORTTYPE_0]), NULL);

-
+

+  

+    for(int i=0;i<ATPORTTYPE_NUM;i++)

+    {

+        mbtk_queue_init(&(ril_info.msg_queue[i]));

+        pthread_mutex_init(&(ril_info.msg_mutex[i]), NULL);

+        pthread_cond_init(&(ril_info.msg_cond[i]), NULL);

+    }

+

+	

+

+

     pthread_t info_pid, pack_pid/*, monitor_pid, urc_pid, bootconn_pid*/;

     pthread_attr_t thread_attr;
     pthread_attr_init(&thread_attr);
@@ -3232,7 +3242,7 @@
     char buff[10];
     memset(buff, 0, 10);
     property_get("persist.mbtk.band_config", buff, "");
-    
+    

     if(strlen(buff) == 0 && check_res == 0 && file_res == 0) {
         pthread_t band_pid;
         if(pthread_create(&band_pid, &thread_attr, band_config_thread, NULL))
diff --git a/mbtk/mbtk_rild_v2/src/ril_data_call.c b/mbtk/mbtk_rild_v2/src/ril_data_call.c
index 2a0994b..f03885d 100755
--- a/mbtk/mbtk_rild_v2/src/ril_data_call.c
+++ b/mbtk/mbtk_rild_v2/src/ril_data_call.c
@@ -352,7 +352,7 @@
 //        info_list[cid - 1].act_state = RIL_ACT_STATE_DISCONNECTED;
         memcpy(&(info_list[cid - 1].apn_info), &(apns.apns[i]), sizeof(mbtk_apn_info_t));
 
-        LOGD("[sim_id - %d] CID - %d, ip_type - %d, auth - %d, auto_save - %d, auto_boot_call - %d, def_route - %d, as_dns - %d, apn - %s",
+        LOGE("[sim_id - %d] CID - %d, ip_type - %d, auth - %d, auto_save - %d, auto_boot_call - %d, def_route - %d, as_dns - %d, apn - %s",
             sim_id, cid, info_list[cid - 1].apn_info.ip_type,
             info_list[cid - 1].apn_info.auth, info_list[cid - 1].apn_info.auto_save,
             info_list[cid - 1].apn_info.auto_boot_call, info_list[cid - 1].apn_info.def_route,
@@ -1148,6 +1148,7 @@
     int index = 0;
     int err = 0;
 
+    LOGD("lynq rild 9, simid %d port %d",sim_id,port);
     // Delete apn
     if(str_empty(apn->apn)) {
         sprintf(cmd, "AT+CGDCONT=%d", apn->cid);
@@ -1182,6 +1183,7 @@
             index += sprintf(cmd + index,"\"%s\"", apn->apn);
         }
 
+        LOGD("lynq rild 10, simid %d port %d",sim_id,port);
         err = at_send_command(portType_2_portId(sim_id, port), cmd, &response);
         if (err < 0 || response->success == 0){
             if(cme_err) {
@@ -1346,8 +1348,10 @@
     char *line = NULL;
     int tmp_int;
     char *tmp_ptr = NULL;
+    bool set_v4_v6_v4;
     while(lines_ptr)
     {
+        set_v4_v6_v4=false;
         line = lines_ptr->line;
         err = at_tok_start(&line);
         if (err < 0)
@@ -1384,6 +1388,7 @@
             }
 
             ip_info->ipv4.valid = true;
+            set_v4_v6_v4=true;
             //log_hex("IPv4", &(ipv4->IPAddr), sizeof(struct in_addr));
         } else {
             if(str_2_ipv6(tmp_ptr, &(ip_info->ipv6.IPV6Addr))) {
@@ -1422,12 +1427,12 @@
         }
         else
         {
-            if(ip_info->ipv4.valid)
+            if(set_v4_v6_v4)
             {
                 get_gate_way_v4(ip_info->ipv4.IPAddr,&(ip_info->ipv4.GateWay));
                 ip_info->ipv4.NetMask=0xffffff;
             }
-            else if(ip_info->ipv6.valid)
+            else
             {
                 get_gate_way_v6(ip_info->ipv6.IPV6Addr,ip_info->ipv6.GateWay);
             }
@@ -1608,10 +1613,12 @@
 {
     mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
     int cme_err = MBTK_RIL_ERR_CME_NON;
+    LOGD("lynq rild 2, simid %d port %d %d",cli_info->sim_id,cli_info->port,pack->msg_id);
     switch(pack->msg_id)
     {
         case RIL_MSG_ID_DATA_CALL_APN:
         {
+            LOGD("lynq rild 3, simid %d port %d",cli_info->sim_id,cli_info->port);
             if(pack->data_len == 0 || pack->data == NULL)
             {
                 mbtk_apn_info_array_t apns;
@@ -1630,9 +1637,11 @@
                     LOGD("size - %d", sizeof(mbtk_apn_info_array_t));
                     ril_rsp_pack_send(cli_info->sim_id, cli_info->port, cli_info->fd, pack->msg_id, pack->msg_index, &apns, sizeof(mbtk_apn_info_array_t));
                 }
+                LOGD("lynq rild 4, simid %d port %d",cli_info->sim_id,cli_info->port);
             }
             else     // Set
             {
+                LOGD("lynq rild 5, simid %d port %d",cli_info->sim_id,cli_info->port);
                 mbtk_apn_info_t *apn = (mbtk_apn_info_t*)pack->data;
                 if(apn->b_initial_attach_apn)
                 {
@@ -1640,10 +1649,13 @@
                     break;
                 }
                 mbtk_ril_cid_enum return_cid = apn->cid;
+               LOGD("lynq rild 6, simid %d port %d",cli_info->sim_id,cli_info->port);
                 if(apn_check_and_cid_reset(cli_info->sim_id, cli_info->port, apn)) {
                     err = MBTK_RIL_ERR_CID;
                 } else {
+                    LOGD("lynq rild 7, simid %d port %d",cli_info->sim_id,cli_info->port);
                     if(apn_conf_support(apn->cid)) {
+                         LOGD("lynq rild 8, simid %d port %d",cli_info->sim_id,cli_info->port);
                         if(req_apn_set(cli_info->sim_id, cli_info->port, apn, &cme_err) || cme_err != MBTK_RIL_ERR_CME_NON)
                         {
                             if(cme_err != MBTK_RIL_ERR_CME_NON) {
@@ -1741,7 +1753,8 @@
                                 }
                                 else
                                 {
-                                    // Config network informations.
+
+                                   // Config network informations.
                                     if(net_ifc_reconfig(cli_info->sim_id, call_info->cid, info_list[call_info->cid - 1].apn_info.def_route,
                                                         info_list[call_info->cid - 1].apn_info.as_dns, &ip_info)) {
                                         err = MBTK_RIL_ERR_NET_CONF;
diff --git a/mbtk/mbtk_rild_v2/src/ril_dev.c b/mbtk/mbtk_rild_v2/src/ril_dev.c
index 941f5eb..60bd502 100755
--- a/mbtk/mbtk_rild_v2/src/ril_dev.c
+++ b/mbtk/mbtk_rild_v2/src/ril_dev.c
@@ -535,6 +535,7 @@
 {
     mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
     int cme_err = MBTK_RIL_ERR_CME_NON;
+    LOGD("lynq rild 61, simid %d port %d %d",cli_info->sim_id,cli_info->port,pack->msg_id);
     switch(pack->msg_id)
     {
         case RIL_MSG_ID_DEV_IMEI:
diff --git a/mbtk/mbtk_rild_v2/src/ril_net.c b/mbtk/mbtk_rild_v2/src/ril_net.c
index 8808f3b..258ea66 100755
--- a/mbtk/mbtk_rild_v2/src/ril_net.c
+++ b/mbtk/mbtk_rild_v2/src/ril_net.c
@@ -1495,6 +1495,7 @@
 {
     mbtk_ril_err_enum err = MBTK_RIL_ERR_SUCCESS;
     int cme_err = MBTK_RIL_ERR_CME_NON;
+    LOGD("lynq rild 51, simid %d port %d %d",cli_info->sim_id,cli_info->port,pack->msg_id);
     switch(pack->msg_id)
     {
         case RIL_MSG_ID_NET_AVAILABLE: