aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2013-03-27 18:20:34 -0500
committerDan Williams <dcbw@redhat.com>2013-03-28 12:35:32 -0500
commitfea5b7a670ac64775771ccd3d3b635d4878d6ba9 (patch)
tree307a15c1eba0d7e77f0e20b3cc74d6dfd2cbe59b
parentd6ac6508d95aeab49f7ed9a5fe225c7685107f73 (diff)
broadband-modem-icera: make CME 3 errors fail power-up (bgo #696742)
+CME ERROR: 3 (Not Allowed) means airplane mode, at least for the Samsung Yxxxx devices that I've got. And if we get this error on any other devices, chances are they'll fail to power up too.
-rw-r--r--plugins/icera/mm-broadband-modem-icera.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/plugins/icera/mm-broadband-modem-icera.c b/plugins/icera/mm-broadband-modem-icera.c
index 5446fe68..d8877e15 100644
--- a/plugins/icera/mm-broadband-modem-icera.c
+++ b/plugins/icera/mm-broadband-modem-icera.c
@@ -756,6 +756,58 @@ modem_create_bearer (MMIfaceModem *self,
}
/*****************************************************************************/
+/* Modem power up (Modem interface) */
+
+static gboolean
+modem_power_up_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error);
+}
+
+static void
+cfun_enable_ready (MMBaseModem *self,
+ GAsyncResult *res,
+ GSimpleAsyncResult *simple)
+{
+ GError *error = NULL;
+
+ if (!mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error)) {
+ /* Ignore all errors except NOT_ALLOWED, which means Airplane Mode */
+ if (g_error_matches (error,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_NOT_ALLOWED))
+ g_simple_async_result_take_error (simple, error);
+ else
+ g_error_free (error);
+ }
+
+ g_simple_async_result_complete (simple);
+ g_object_unref (simple);
+}
+
+static void
+modem_power_up (MMIfaceModem *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *result;
+
+ result = g_simple_async_result_new (G_OBJECT (self),
+ callback,
+ user_data,
+ modem_power_up);
+
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "+CFUN=1",
+ 10,
+ FALSE,
+ (GAsyncReadyCallback)cfun_enable_ready,
+ result);
+}
+
+/*****************************************************************************/
/* Modem power down (Modem interface) */
static gboolean
@@ -1648,6 +1700,8 @@ iface_modem_init (MMIfaceModem *iface)
iface->load_supported_bands_finish = modem_load_supported_bands_finish;
iface->load_current_bands = modem_load_current_bands;
iface->load_current_bands_finish = modem_load_current_bands_finish;
+ iface->modem_power_up = modem_power_up;
+ iface->modem_power_up_finish = modem_power_up_finish;
/* Note: don't implement modem_init_power_down, as CFUN=4 here may take
* looong to reply */
iface->modem_power_down = modem_power_down;