[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;
}