[MM] [PATCH] broadband-modem: retry +CPIN? when SIM is busy
- From: Ben Chan <benchan chromium org>
- To: networkmanager-list gnome org
- Subject: [MM] [PATCH] broadband-modem: retry +CPIN? when SIM is busy
- Date: Wed, 8 Aug 2012 23:56:45 -0700
When the modem checks if a SIM requires unlock, the SIM may not be
ready. This patch modifies modem_load_unlock_required to retry +CPIN?
under that scenario.
---
src/mm-broadband-modem.c | 70 +++++++++++++++++++++++++++++++++++++--------
1 files changed, 57 insertions(+), 13 deletions(-)
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index edc9507..53bce9b 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -816,6 +816,21 @@ static CPinResult unlock_results[] = {
{ NULL }
};
+typedef struct {
+ MMIfaceModem *self;
+ GSimpleAsyncResult *result;
+ guint retries;
+} ModemLoadUnlockRequiredContext;
+
+static void
+modem_load_unlock_required_context_complete_and_free (ModemLoadUnlockRequiredContext *ctx)
+{
+ g_simple_async_result_complete (ctx->result);
+ g_object_unref (ctx->result);
+ g_object_unref (ctx->self);
+ g_free (ctx);
+}
+
static MMModemLock
modem_load_unlock_required_finish (MMIfaceModem *self,
GAsyncResult *res,
@@ -828,10 +843,20 @@ modem_load_unlock_required_finish (MMIfaceModem *self,
G_SIMPLE_ASYNC_RESULT (res)));
}
+static void modem_load_unlock_required_context_step (ModemLoadUnlockRequiredContext *ctx);
+
+static gboolean
+cpin_timeout_cb (ModemLoadUnlockRequiredContext *ctx)
+{
+ ctx->retries--;
+ modem_load_unlock_required_context_step (ctx);
+ return FALSE;
+}
+
static void
cpin_query_ready (MMIfaceModem *self,
GAsyncResult *res,
- GSimpleAsyncResult *simple)
+ ModemLoadUnlockRequiredContext *ctx)
{
MMModemLock lock = MM_MODEM_LOCK_UNKNOWN;
@@ -840,9 +865,17 @@ cpin_query_ready (MMIfaceModem *self,
result = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error);
if (error) {
- g_simple_async_result_take_error (simple, error);
- g_simple_async_result_complete (simple);
- g_object_unref (simple);
+ if (ctx->retries > 0 &&
+ g_error_matches (error,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_SIM_BUSY)) {
+ g_error_free (error);
+ /* Retry in 2 seconds */
+ g_timeout_add_seconds (2, (GSourceFunc)cpin_timeout_cb, ctx);
+ } else {
+ g_simple_async_result_take_error (ctx->result, error);
+ modem_load_unlock_required_context_complete_and_free (ctx);
+ }
return;
}
@@ -870,11 +903,21 @@ cpin_query_ready (MMIfaceModem *self,
}
}
- g_simple_async_result_set_op_res_gpointer (simple,
+ g_simple_async_result_set_op_res_gpointer (ctx->result,
GUINT_TO_POINTER (lock),
NULL);
- g_simple_async_result_complete (simple);
- g_object_unref (simple);
+ modem_load_unlock_required_context_complete_and_free (ctx);
+}
+
+static void
+modem_load_unlock_required_context_step (ModemLoadUnlockRequiredContext *ctx)
+{
+ mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
+ "+CPIN?",
+ 3,
+ FALSE,
+ (GAsyncReadyCallback)cpin_query_ready,
+ ctx);
}
static void
@@ -882,6 +925,7 @@ modem_load_unlock_required (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ ModemLoadUnlockRequiredContext *ctx;
GSimpleAsyncResult *result;
result = g_simple_async_result_new (G_OBJECT (self),
@@ -900,13 +944,13 @@ modem_load_unlock_required (MMIfaceModem *self,
return;
}
+ ctx = g_new0 (ModemLoadUnlockRequiredContext, 1);
+ ctx->self = g_object_ref (self);
+ ctx->retries = 3;
+ ctx->result = result;
+
mm_dbg ("checking if unlock required...");
- mm_base_modem_at_command (MM_BASE_MODEM (self),
- "+CPIN?",
- 3,
- FALSE,
- (GAsyncReadyCallback)cpin_query_ready,
- result);
+ modem_load_unlock_required_context_step (ctx);
}
/*****************************************************************************/
--
1.7.7.3
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]