File mm-sierra.patch of Package ModemManager

Index: ModemManager-0.1/plugins/mm-modem-sierra.c
===================================================================
--- ModemManager-0.1.orig/plugins/mm-modem-sierra.c
+++ ModemManager-0.1/plugins/mm-modem-sierra.c
@@ -23,36 +23,89 @@ mm_modem_sierra_new (const char *data_de
                                    NULL));
 }
 
+/*****************************************************************************/
+/*    Modem class override functions                                         */
+/*****************************************************************************/
+
 static void
-parent_enable_done (MMModem *modem, GError *error, gpointer user_data)
+pin_check_done (MMModem *modem, GError *error, gpointer user_data)
 {
     MMCallbackInfo *info = (MMCallbackInfo *) user_data;
 
     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);
+}
+
+static gboolean
+sierra_enabled (gpointer 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);
+
+    return FALSE;
+}
+
+static void
+init_done (MMSerial *serial,
+           GString *response,
+           GError *error,
+           gpointer user_data)
+{
+    MMCallbackInfo *info = (MMCallbackInfo *) user_data;
+
+    if (error) {
+        info->error = g_error_copy (error);
+        mm_callback_info_schedule (info);
+    } else {
         /* Sierra returns OK on +CFUN=1 right away but needs some time
            to finish initialization */
-        sleep (10);
+        g_timeout_add_seconds (10, sierra_enabled, info);
     }
+}
 
-    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
 enable (MMModem *modem,
-        gboolean enable,
+        gboolean do_enable,
         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);
+    mm_callback_info_set_data (info, "sierra-enable", GINT_TO_POINTER (do_enable), NULL);
+
+    if (!do_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);
 
-    parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GET_INTERFACE (modem));
-    parent_modem_iface->enable (modem, enable, parent_enable_done, info);
+        if (info->error)
+            mm_callback_info_schedule (info);
+    }
 }
 
 /*****************************************************************************/
openSUSE Build Service is sponsored by