aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-03-14 17:37:50 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-16 14:53:25 +0100
commit39e0f953b003fed958d61682a2168805ec63f9cb (patch)
tree5448e60dc80f2ce5877a4389ce8f9e049b5944db
parent15e99430363fcaf7d2a3be6afb7961d2e3f7e8b3 (diff)
option: need to wait some seconds after power up
-rw-r--r--plugins/option/mm-broadband-modem-option.c64
-rw-r--r--plugins/option/mm-broadband-modem-option.h2
2 files changed, 65 insertions, 1 deletions
diff --git a/plugins/option/mm-broadband-modem-option.c b/plugins/option/mm-broadband-modem-option.c
index cfc7b59c..fddf9e05 100644
--- a/plugins/option/mm-broadband-modem-option.c
+++ b/plugins/option/mm-broadband-modem-option.c
@@ -37,6 +37,10 @@ static void iface_modem_init (MMIfaceModem *iface);
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemOption, mm_broadband_modem_option, MM_TYPE_BROADBAND_MODEM, 0,
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init));
+struct _MMBroadbandModemOptionPrivate {
+ guint after_power_up_wait_id;
+};
+
/*****************************************************************************/
/* Load access technologies (Modem interface) */
@@ -336,7 +340,6 @@ load_access_technologies_step (AccessTechnologiesContext *ctx)
/* Go on to next step */
ctx->step++;
-
case ACCESS_TECHNOLOGIES_STEP_LAST:
/* All done, set result and complete */
g_simple_async_result_set_op_res_gpointer (ctx->result,
@@ -369,6 +372,56 @@ load_access_technologies (MMIfaceModem *self,
}
/*****************************************************************************/
+/* After power up (Modem interface) */
+
+static gboolean
+modem_after_power_up_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
+}
+
+static gboolean
+after_power_up_wait_cb (GSimpleAsyncResult *result)
+{
+ MMBroadbandModemOption *option;
+
+ option = MM_BROADBAND_MODEM_OPTION (g_async_result_get_source_object (G_ASYNC_RESULT (result)));
+
+ g_simple_async_result_set_op_res_gboolean (result, TRUE);
+ g_simple_async_result_complete (result);
+ g_object_unref (result);
+
+ option->priv->after_power_up_wait_id = 0;
+ g_object_unref (option);
+
+ return FALSE;
+}
+
+static void
+modem_after_power_up (MMIfaceModem *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ MMBroadbandModemOption *option = MM_BROADBAND_MODEM_OPTION (self);
+ GSimpleAsyncResult *result;
+
+ /* Some Option devices return OK on +CFUN=1 right away but need some time
+ * to finish initialization.
+ */
+ result = g_simple_async_result_new (G_OBJECT (self),
+ callback,
+ user_data,
+ modem_after_power_up);
+ g_warn_if_fail (option->priv->after_power_up_wait_id == 0);
+ option->priv->after_power_up_wait_id =
+ g_timeout_add_seconds (10,
+ (GSourceFunc)after_power_up_wait_cb,
+ result);
+}
+
+/*****************************************************************************/
MMBroadbandModemOption *
mm_broadband_modem_option_new (const gchar *device,
@@ -389,11 +442,18 @@ mm_broadband_modem_option_new (const gchar *device,
static void
mm_broadband_modem_option_init (MMBroadbandModemOption *self)
{
+ /* Initialize private data */
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self),
+ MM_TYPE_BROADBAND_MODEM_OPTION,
+ MMBroadbandModemOptionPrivate);
+ self->priv->after_power_up_wait_id = 0;
}
static void
iface_modem_init (MMIfaceModem *iface)
{
+ iface->modem_after_power_up = modem_after_power_up;
+ iface->modem_after_power_up_finish = modem_after_power_up_finish;
iface->load_access_technologies = load_access_technologies;
iface->load_access_technologies_finish = load_access_technologies_finish;
}
@@ -401,4 +461,6 @@ iface_modem_init (MMIfaceModem *iface)
static void
mm_broadband_modem_option_class_init (MMBroadbandModemOptionClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ g_type_class_add_private (object_class, sizeof (MMBroadbandModemOptionPrivate));
}
diff --git a/plugins/option/mm-broadband-modem-option.h b/plugins/option/mm-broadband-modem-option.h
index ed32d3c1..83f679b7 100644
--- a/plugins/option/mm-broadband-modem-option.h
+++ b/plugins/option/mm-broadband-modem-option.h
@@ -29,9 +29,11 @@
typedef struct _MMBroadbandModemOption MMBroadbandModemOption;
typedef struct _MMBroadbandModemOptionClass MMBroadbandModemOptionClass;
+typedef struct _MMBroadbandModemOptionPrivate MMBroadbandModemOptionPrivate;
struct _MMBroadbandModemOption {
MMBroadbandModem parent;
+ MMBroadbandModemOptionPrivate *priv;
};
struct _MMBroadbandModemOptionClass{