diff options
-rw-r--r-- | plugins/mm-modem-sierra.c | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/plugins/mm-modem-sierra.c b/plugins/mm-modem-sierra.c index 95ffe779..cb5b92c0 100644 --- a/plugins/mm-modem-sierra.c +++ b/plugins/mm-modem-sierra.c @@ -23,6 +23,10 @@ mm_modem_sierra_new (const char *data_device, NULL)); } +/*****************************************************************************/ +/* Modem class override functions */ +/*****************************************************************************/ + static void pin_check_done (MMModem *modem, GError *error, gpointer user_data) { @@ -46,20 +50,33 @@ sierra_enabled (gpointer data) } static void -parent_enable_done (MMModem *modem, GError *error, gpointer user_data) +init_done (MMSerial *serial, + GString *response, + GError *error, + gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - if (error) + if (error) { info->error = g_error_copy (error); - else if (GPOINTER_TO_INT (mm_callback_info_get_data (info, "sierra-enable"))) { + mm_callback_info_schedule (info); + } else /* Sierra returns OK on +CFUN=1 right away but needs some time to finish initialization */ g_timeout_add_seconds (10, sierra_enabled, info); - return; - } +} - mm_callback_info_schedule (info); +static void +enable_flash_done (MMSerial *serial, gpointer user_data) +{ + mm_serial_queue_command (serial, "Z E0 V1 X4 &C1 +CMEE=1", 3, init_done, user_data); +} + +static void +disable_flash_done (MMSerial *serial, gpointer user_data) +{ + mm_serial_close (serial); + mm_callback_info_schedule ((MMCallbackInfo *) user_data); } static void @@ -68,16 +85,27 @@ enable (MMModem *modem, MMModemFn callback, gpointer user_data) { - MMModem *parent_modem_iface; MMCallbackInfo *info; + /* First, reset the previously used CID */ + mm_generic_gsm_set_cid (MM_GENERIC_GSM (modem), 0); + info = mm_callback_info_new (modem, callback, user_data); mm_callback_info_set_data (info, "sierra-enable", GINT_TO_POINTER (enable), NULL); - parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GET_INTERFACE (modem)); - parent_modem_iface->enable (modem, enable, parent_enable_done, info); + if (!enable) { + if (mm_serial_is_connected (MM_SERIAL (modem))) + mm_serial_flash (MM_SERIAL (modem), 1000, disable_flash_done, info); + else + disable_flash_done (MM_SERIAL (modem), info); + } else { + if (mm_serial_open (MM_SERIAL (modem), &info->error)) + mm_serial_flash (MM_SERIAL (modem), 100, enable_flash_done, info); + + if (info->error) + mm_callback_info_schedule (info); + } } - /*****************************************************************************/ static void |