aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2010-03-04 20:09:54 -0800
committerDan Williams <dcbw@redhat.com>2010-03-04 20:09:54 -0800
commitd94ca3d310f11d98589a76a3d864efe613f4d515 (patch)
treeb0a54cb54664da25fa7c49137f0d04a632bec526 /plugins
parentc915de5512f69678d0062ceec4cc69fefcdf8fd3 (diff)
sierra: fix power-on delay
Since the modem states patch the delay for power-on wasn't honored for Sierra devices. Fix that using the new power-on-done handler and also fix the bug where if the modem was removed, the plugin would crash because it wasn't handling the timeout removal. Also remove the explicit PIN check since that's now handled by the generic GSM code before the modem is even exported over DBus.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/mm-modem-sierra-gsm.c73
1 files changed, 42 insertions, 31 deletions
diff --git a/plugins/mm-modem-sierra-gsm.c b/plugins/mm-modem-sierra-gsm.c
index 3ed699ca..ce4bca6d 100644
--- a/plugins/mm-modem-sierra-gsm.c
+++ b/plugins/mm-modem-sierra-gsm.c
@@ -27,6 +27,11 @@ static void modem_init (MMModem *modem_class);
G_DEFINE_TYPE_EXTENDED (MMModemSierraGsm, mm_modem_sierra_gsm, MM_TYPE_GENERIC_GSM, 0,
G_IMPLEMENT_INTERFACE (MM_TYPE_MODEM, modem_init))
+#define MM_MODEM_SIERRA_GSM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_MODEM_SIERRA_GSM, MMModemSierraGsmPrivate))
+
+typedef struct {
+ guint enable_wait_id;
+} MMModemSierraGsmPrivate;
MMModem *
mm_modem_sierra_gsm_new (const char *device,
@@ -48,51 +53,42 @@ mm_modem_sierra_gsm_new (const char *device,
/* Modem class override functions */
/*****************************************************************************/
-static void
-pin_check_done (MMModem *modem, GError *error, gpointer user_data)
-{
- MMCallbackInfo *info = (MMCallbackInfo *) user_data;
-
- mm_generic_gsm_enable_complete (MM_GENERIC_GSM (modem), error, info);
-}
-
static gboolean
-sierra_enabled (gpointer data)
+sierra_enabled (gpointer user_data)
{
- MMCallbackInfo *info = (MMCallbackInfo *) data;
-
- /* Now check the PIN explicitly, sierra doesn't seem to report
- * that it needs it otherwise.
- */
- mm_generic_gsm_check_pin (MM_GENERIC_GSM (info->modem), pin_check_done, info);
+ MMCallbackInfo *info = user_data;
+ MMGenericGsm *modem;
+ MMModemSierraGsmPrivate *priv;
+
+ /* Make sure we don't use an invalid modem that may have been removed */
+ if (info->modem) {
+ modem = MM_GENERIC_GSM (info->modem);
+ priv = MM_MODEM_SIERRA_GSM_GET_PRIVATE (modem);
+ priv->enable_wait_id = 0;
+ MM_GENERIC_GSM_CLASS (mm_modem_sierra_gsm_parent_class)->do_enable_power_up_done (modem, NULL, NULL, info);
+ }
return FALSE;
}
static void
-parent_enable_done (MMModem *modem, GError *error, gpointer user_data)
+real_do_enable_power_up_done (MMGenericGsm *gsm,
+ GString *response,
+ GError *error,
+ MMCallbackInfo *info)
{
- MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+ MMModemSierraGsmPrivate *priv = MM_MODEM_SIERRA_GSM_GET_PRIVATE (gsm);
if (error) {
- mm_generic_gsm_enable_complete (MM_GENERIC_GSM (modem), error, info);
+ /* Chain up to parent */
+ MM_GENERIC_GSM_CLASS (mm_modem_sierra_gsm_parent_class)->do_enable_power_up_done (gsm, NULL, error, info);
return;
}
/* Some Sierra devices return OK on +CFUN=1 right away but need some time
* to finish initialization.
*/
- g_timeout_add_seconds (10, sierra_enabled, info);
-}
-
-static void
-enable (MMModem *modem, MMModemFn callback, gpointer user_data)
-{
- MMModem *parent_modem_iface;
- MMCallbackInfo *info;
-
- info = mm_callback_info_new (modem, callback, user_data);
- parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GET_INTERFACE (modem));
- parent_modem_iface->enable (modem, parent_enable_done, info);
+ g_warn_if_fail (priv->enable_wait_id == 0);
+ priv->enable_wait_id = g_timeout_add_seconds (10, sierra_enabled, info);
}
static gboolean
@@ -135,7 +131,6 @@ grab_port (MMModem *modem,
static void
modem_init (MMModem *modem_class)
{
- modem_class->enable = enable;
modem_class->grab_port = grab_port;
}
@@ -145,8 +140,24 @@ mm_modem_sierra_gsm_init (MMModemSierraGsm *self)
}
static void
+dispose (GObject *object)
+{
+ MMModemSierraGsmPrivate *priv = MM_MODEM_SIERRA_GSM_GET_PRIVATE (object);
+
+ if (priv->enable_wait_id)
+ g_source_remove (priv->enable_wait_id);
+}
+
+static void
mm_modem_sierra_gsm_class_init (MMModemSierraGsmClass *klass)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ MMGenericGsmClass *gsm_class = MM_GENERIC_GSM_CLASS (klass);
+
mm_modem_sierra_gsm_parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (object_class, sizeof (MMModemSierraGsmPrivate));
+
+ object_class->dispose = dispose;
+ gsm_class->do_enable_power_up_done = real_do_enable_power_up_done;
}