Hi Denis, On 12/04/2012 21:36, Denis Kenzior wrote: > Hi Guillaume, > > On 04/12/2012 09:28 AM, Guillaume Zajac wrote: >> For some modem like ZTE MF180/190, we need to do some >> polling to check SIM state when it returns +CME ERROR: 14 busy. >> --- >> drivers/atmodem/sim.c | 59 +++++++++++++++++++++++++++++++++++++++--------- >> 1 files changed, 48 insertions(+), 11 deletions(-) >> > > >> @@ -874,9 +878,22 @@ static void at_cpin_cb(gboolean ok, GAtResult *result, gpointer user_data) >> else >> decode_at_error(&error, final); >> >> - if (!ok) { >> + switch (error.type) { >> + case OFONO_ERROR_TYPE_NO_ERROR: >> + break; >> + case OFONO_ERROR_TYPE_CME: >> + /* Check for SIM busy - try again later */ >> + if (error.error == 14) { >> + if (sd->poll_count++< 12) { >> + sd->poll_source = g_timeout_add_seconds(2, >> + sim_state_check, cbd); >> + return; >> + } >> + } >> + /* fall through */ >> + default: >> cb(&error, -1, cbd->data); >> - return; >> + goto done; >> } >> >> if (sd->vendor == OFONO_VENDOR_WAVECOM) { > Is there a reason we are not using at_util_sim_state_query_new? This function is only giving sim present information through its callback, however I also need to parse the answer from AT+CPIN? So it means we would send once the AT+CPIN? using atutil helper and once to parse the answer. I thought about implementing a new atutil helper function or a new g_at_chat_send_recursive() function but I saw in drivers/atmodem/phonebook.c on AT+CPBS=? command that polling mechanism is integrated into the driver itself. That's why I have chosen this solution. > > > Regards, > -Denis Kind regards, Guillaume