aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/telit/mm-broadband-modem-telit.c94
-rw-r--r--plugins/telit/mm-broadband-modem-telit.h2
2 files changed, 80 insertions, 16 deletions
diff --git a/plugins/telit/mm-broadband-modem-telit.c b/plugins/telit/mm-broadband-modem-telit.c
index fb169fd2..95eeb71c 100644
--- a/plugins/telit/mm-broadband-modem-telit.c
+++ b/plugins/telit/mm-broadband-modem-telit.c
@@ -42,6 +42,15 @@ G_DEFINE_TYPE_EXTENDED (MMBroadbandModemTelit, mm_broadband_modem_telit, MM_TYPE
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_3GPP, iface_modem_3gpp_init));
+typedef enum {
+ FEATURE_SUPPORT_UNKNOWN,
+ FEATURE_NOT_SUPPORTED,
+ FEATURE_SUPPORTED
+} FeatureSupport;
+
+struct _MMBroadbandModemTelitPrivate {
+ FeatureSupport csim_lock_support;
+};
/*****************************************************************************/
/* After Sim Unlock (Modem interface) */
@@ -521,10 +530,19 @@ csim_unlock_ready (MMBaseModem *self,
/* Ignore errors */
response = mm_base_modem_at_command_finish (self, res, &error);
if (!response) {
+ if (g_error_matches (error,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_NOT_SUPPORTED)) {
+ ctx->self->priv->csim_lock_support = FEATURE_NOT_SUPPORTED;
+ }
mm_warn ("Couldn't unlock SIM card: %s", error->message);
g_error_free (error);
}
+ if (ctx->self->priv->csim_lock_support != FEATURE_NOT_SUPPORTED) {
+ ctx->self->priv->csim_lock_support = FEATURE_SUPPORTED;
+ }
+
ctx->step++;
load_unlock_retries_step (ctx);
}
@@ -591,10 +609,22 @@ csim_lock_ready (MMBaseModem *self,
response = mm_base_modem_at_command_finish (self, res, &error);
if (!response) {
- g_prefix_error (&error, "Couldn't lock SIM card: ");
- g_simple_async_result_take_error (ctx->result, error);
- load_unlock_retries_context_complete_and_free (ctx);
- return;
+ if (g_error_matches (error,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_NOT_SUPPORTED)) {
+ ctx->self->priv->csim_lock_support = FEATURE_NOT_SUPPORTED;
+ mm_warn ("Couldn't lock SIM card: %s. Continuing without CSIM lock.", error->message);
+ g_error_free (error);
+ } else {
+ g_prefix_error (&error, "Couldn't lock SIM card: ");
+ g_simple_async_result_take_error (ctx->result, error);
+ load_unlock_retries_context_complete_and_free (ctx);
+ return;
+ }
+ }
+
+ if (ctx->self->priv->csim_lock_support != FEATURE_NOT_SUPPORTED) {
+ ctx->self->priv->csim_lock_support = FEATURE_SUPPORTED;
}
ctx->step++;
@@ -602,6 +632,40 @@ csim_lock_ready (MMBaseModem *self,
}
static void
+handle_csim_locking (LoadUnlockRetriesContext *ctx, gboolean is_lock)
+{
+ switch (ctx->self->priv->csim_lock_support) {
+ case FEATURE_SUPPORT_UNKNOWN:
+ case FEATURE_SUPPORTED:
+ if (is_lock) {
+ mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
+ CSIM_LOCK_STR,
+ CSIM_QUERY_TIMEOUT,
+ FALSE,
+ (GAsyncReadyCallback) csim_lock_ready,
+ ctx);
+ } else {
+ mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
+ CSIM_UNLOCK_STR,
+ CSIM_QUERY_TIMEOUT,
+ FALSE,
+ (GAsyncReadyCallback) csim_unlock_ready,
+ ctx);
+ }
+ break;
+ case FEATURE_NOT_SUPPORTED:
+ mm_dbg ("CSIM lock not supported by this modem. Skipping %s command",
+ is_lock ? "lock" : "unlock");
+ ctx->step++;
+ load_unlock_retries_step (ctx);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+static void
load_unlock_retries_step (LoadUnlockRetriesContext *ctx)
{
switch (ctx->step) {
@@ -609,12 +673,7 @@ load_unlock_retries_step (LoadUnlockRetriesContext *ctx)
/* Fall back on next step */
ctx->step++;
case LOAD_UNLOCK_RETRIES_STEP_LOCK:
- mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
- CSIM_LOCK_STR,
- CSIM_QUERY_TIMEOUT,
- FALSE,
- (GAsyncReadyCallback) csim_lock_ready,
- ctx);
+ handle_csim_locking (ctx, TRUE);
break;
case LOAD_UNLOCK_RETRIES_STEP_PIN:
mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
@@ -649,12 +708,7 @@ load_unlock_retries_step (LoadUnlockRetriesContext *ctx)
ctx);
break;
case LOAD_UNLOCK_RETRIES_STEP_UNLOCK:
- mm_base_modem_at_command (MM_BASE_MODEM (ctx->self),
- CSIM_UNLOCK_STR,
- CSIM_QUERY_TIMEOUT,
- FALSE,
- (GAsyncReadyCallback) csim_unlock_ready,
- ctx);
+ handle_csim_locking (ctx, FALSE);
break;
case LOAD_UNLOCK_RETRIES_STEP_LAST:
if (ctx->succeded_requests == 0) {
@@ -1265,6 +1319,11 @@ mm_broadband_modem_telit_new (const gchar *device,
static void
mm_broadband_modem_telit_init (MMBroadbandModemTelit *self)
{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+ MM_TYPE_BROADBAND_MODEM_TELIT,
+ MMBroadbandModemTelitPrivate);
+
+ self->priv->csim_lock_support = FEATURE_SUPPORT_UNKNOWN;
}
static void
@@ -1310,4 +1369,7 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
static void
mm_broadband_modem_telit_class_init (MMBroadbandModemTelitClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (object_class, sizeof (MMBroadbandModemTelitPrivate));
}
diff --git a/plugins/telit/mm-broadband-modem-telit.h b/plugins/telit/mm-broadband-modem-telit.h
index 50e6365f..f68465e7 100644
--- a/plugins/telit/mm-broadband-modem-telit.h
+++ b/plugins/telit/mm-broadband-modem-telit.h
@@ -29,9 +29,11 @@
typedef struct _MMBroadbandModemTelit MMBroadbandModemTelit;
typedef struct _MMBroadbandModemTelitClass MMBroadbandModemTelitClass;
+typedef struct _MMBroadbandModemTelitPrivate MMBroadbandModemTelitPrivate;
struct _MMBroadbandModemTelit {
MMBroadbandModem parent;
+ MMBroadbandModemTelitPrivate *priv;
};
struct _MMBroadbandModemTelitClass{