aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/cinterion/mm-broadband-modem-cinterion.c35
-rw-r--r--plugins/cinterion/mm-broadband-modem-mbim-cinterion.c20
-rw-r--r--plugins/cinterion/mm-broadband-modem-qmi-cinterion.c20
-rw-r--r--plugins/cinterion/mm-shared-cinterion.c87
-rw-r--r--plugins/cinterion/mm-shared-cinterion.h13
5 files changed, 148 insertions, 27 deletions
diff --git a/plugins/cinterion/mm-broadband-modem-cinterion.c b/plugins/cinterion/mm-broadband-modem-cinterion.c
index 12187164..d512b855 100644
--- a/plugins/cinterion/mm-broadband-modem-cinterion.c
+++ b/plugins/cinterion/mm-broadband-modem-cinterion.c
@@ -442,30 +442,6 @@ messaging_check_support (MMIfaceModemMessaging *self,
}
/*****************************************************************************/
-/* Reset (Modem interface) */
-
-static gboolean
-modem_reset_finish (MMIfaceModem *self,
- GAsyncResult *res,
- GError **error)
-{
- return !!mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error);
-}
-
-static void
-modem_reset (MMIfaceModem *self,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- mm_base_modem_at_command (MM_BASE_MODEM (self),
- "+CFUN=1,1",
- 3,
- FALSE,
- callback,
- user_data);
-}
-
-/*****************************************************************************/
/* Power down */
static gboolean
@@ -2984,8 +2960,8 @@ iface_modem_init (MMIfaceModem *iface)
iface->modem_after_sim_unlock_finish = after_sim_unlock_finish;
iface->load_unlock_retries = load_unlock_retries;
iface->load_unlock_retries_finish = load_unlock_retries_finish;
- iface->reset = modem_reset;
- iface->reset_finish = modem_reset_finish;
+ iface->reset = mm_shared_cinterion_modem_reset;
+ iface->reset_finish = mm_shared_cinterion_modem_reset_finish;
iface->modem_power_down = modem_power_down;
iface->modem_power_down_finish = modem_power_down_finish;
iface->modem_power_off = modem_power_off;
@@ -2994,6 +2970,12 @@ iface_modem_init (MMIfaceModem *iface)
iface->setup_sim_hot_swap_finish = modem_setup_sim_hot_swap_finish;
}
+static MMIfaceModem *
+peek_parent_interface (MMSharedCinterion *self)
+{
+ return iface_modem_parent;
+}
+
static void
iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
{
@@ -3091,6 +3073,7 @@ peek_parent_time_interface (MMSharedCinterion *self)
static void
shared_cinterion_init (MMSharedCinterion *iface)
{
+ iface->peek_parent_interface = peek_parent_interface;
iface->peek_parent_location_interface = peek_parent_location_interface;
iface->peek_parent_voice_interface = peek_parent_voice_interface;
iface->peek_parent_time_interface = peek_parent_time_interface;
diff --git a/plugins/cinterion/mm-broadband-modem-mbim-cinterion.c b/plugins/cinterion/mm-broadband-modem-mbim-cinterion.c
index 19c1ddb9..f601d678 100644
--- a/plugins/cinterion/mm-broadband-modem-mbim-cinterion.c
+++ b/plugins/cinterion/mm-broadband-modem-mbim-cinterion.c
@@ -24,21 +24,25 @@
#include "ModemManager.h"
#include "mm-log.h"
#include "mm-errors-types.h"
+#include "mm-iface-modem.h"
#include "mm-iface-modem-location.h"
#include "mm-iface-modem-voice.h"
#include "mm-broadband-modem-mbim-cinterion.h"
#include "mm-shared-cinterion.h"
+static void iface_modem_init (MMIfaceModem *iface);
static void iface_modem_location_init (MMIfaceModemLocation *iface);
static void iface_modem_voice_init (MMIfaceModemVoice *iface);
static void iface_modem_time_init (MMIfaceModemTime *iface);
static void shared_cinterion_init (MMSharedCinterion *iface);
+static MMIfaceModem *iface_modem_parent;
static MMIfaceModemLocation *iface_modem_location_parent;
static MMIfaceModemVoice *iface_modem_voice_parent;
static MMIfaceModemTime *iface_modem_time_parent;
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemMbimCinterion, mm_broadband_modem_mbim_cinterion, MM_TYPE_BROADBAND_MODEM_MBIM, 0,
+ G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_LOCATION, iface_modem_location_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_VOICE, iface_modem_voice_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_TIME, iface_modem_time_init)
@@ -73,6 +77,21 @@ mm_broadband_modem_mbim_cinterion_init (MMBroadbandModemMbimCinterion *self)
}
static void
+iface_modem_init (MMIfaceModem *iface)
+{
+ iface_modem_parent = g_type_interface_peek_parent (iface);
+
+ iface->reset = mm_shared_cinterion_modem_reset;
+ iface->reset_finish = mm_shared_cinterion_modem_reset_finish;
+}
+
+static MMIfaceModem *
+peek_parent_interface (MMSharedCinterion *self)
+{
+ return iface_modem_parent;
+}
+
+static void
iface_modem_location_init (MMIfaceModemLocation *iface)
{
iface_modem_location_parent = g_type_interface_peek_parent (iface);
@@ -136,6 +155,7 @@ peek_parent_time_interface (MMSharedCinterion *self)
static void
shared_cinterion_init (MMSharedCinterion *iface)
{
+ iface->peek_parent_interface = peek_parent_interface;
iface->peek_parent_location_interface = peek_parent_location_interface;
iface->peek_parent_voice_interface = peek_parent_voice_interface;
iface->peek_parent_time_interface = peek_parent_time_interface;
diff --git a/plugins/cinterion/mm-broadband-modem-qmi-cinterion.c b/plugins/cinterion/mm-broadband-modem-qmi-cinterion.c
index 2d7f1bd2..c3f5e05c 100644
--- a/plugins/cinterion/mm-broadband-modem-qmi-cinterion.c
+++ b/plugins/cinterion/mm-broadband-modem-qmi-cinterion.c
@@ -25,21 +25,25 @@
#include "ModemManager.h"
#include "mm-log.h"
#include "mm-errors-types.h"
+#include "mm-iface-modem.h"
#include "mm-iface-modem-location.h"
#include "mm-iface-modem-voice.h"
#include "mm-broadband-modem-qmi-cinterion.h"
#include "mm-shared-cinterion.h"
+static void iface_modem_init (MMIfaceModem *iface);
static void iface_modem_location_init (MMIfaceModemLocation *iface);
static void iface_modem_voice_init (MMIfaceModemVoice *iface);
static void iface_modem_time_init (MMIfaceModemTime *iface);
static void shared_cinterion_init (MMSharedCinterion *iface);
+static MMIfaceModem *iface_modem_parent;
static MMIfaceModemLocation *iface_modem_location_parent;
static MMIfaceModemVoice *iface_modem_voice_parent;
static MMIfaceModemTime *iface_modem_time_parent;
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemQmiCinterion, mm_broadband_modem_qmi_cinterion, MM_TYPE_BROADBAND_MODEM_QMI, 0,
+ G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_LOCATION, iface_modem_location_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_VOICE, iface_modem_voice_init)
G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_TIME, iface_modem_time_init)
@@ -74,6 +78,21 @@ mm_broadband_modem_qmi_cinterion_init (MMBroadbandModemQmiCinterion *self)
}
static void
+iface_modem_init (MMIfaceModem *iface)
+{
+ iface_modem_parent = g_type_interface_peek_parent (iface);
+
+ iface->reset = mm_shared_cinterion_modem_reset;
+ iface->reset_finish = mm_shared_cinterion_modem_reset_finish;
+}
+
+static MMIfaceModem *
+peek_parent_interface (MMSharedCinterion *self)
+{
+ return iface_modem_parent;
+}
+
+static void
iface_modem_location_init (MMIfaceModemLocation *iface)
{
iface_modem_location_parent = g_type_interface_peek_parent (iface);
@@ -137,6 +156,7 @@ peek_parent_time_interface (MMSharedCinterion *self)
static void
shared_cinterion_init (MMSharedCinterion *iface)
{
+ iface->peek_parent_interface = peek_parent_interface;
iface->peek_parent_location_interface = peek_parent_location_interface;
iface->peek_parent_voice_interface = peek_parent_voice_interface;
iface->peek_parent_time_interface = peek_parent_time_interface;
diff --git a/plugins/cinterion/mm-shared-cinterion.c b/plugins/cinterion/mm-shared-cinterion.c
index 5b7a360f..b650321e 100644
--- a/plugins/cinterion/mm-shared-cinterion.c
+++ b/plugins/cinterion/mm-shared-cinterion.c
@@ -44,6 +44,8 @@ typedef enum {
} FeatureSupport;
typedef struct {
+ /* modem */
+ MMIfaceModem *iface_modem_parent;
/* location */
MMIfaceModemLocation *iface_modem_location_parent;
MMModemLocationSource supported_sources;
@@ -87,7 +89,11 @@ get_private (MMSharedCinterion *self)
priv->slcc_regex = mm_cinterion_get_slcc_regex ();
priv->ctzu_regex = mm_cinterion_get_ctzu_regex ();
- /* Setup parent class' MMIfaceModemLocation, MMIfaceModemVoice and MMIfaceModemTime */
+ /* Setup parent class' MMIfaceModem, MMIfaceModemLocation, MMIfaceModemVoice
+ * and MMIfaceModemTime */
+
+ g_assert (MM_SHARED_CINTERION_GET_INTERFACE (self)->peek_parent_interface);
+ priv->iface_modem_parent = MM_SHARED_CINTERION_GET_INTERFACE (self)->peek_parent_interface (self);
g_assert (MM_SHARED_CINTERION_GET_INTERFACE (self)->peek_parent_location_interface);
priv->iface_modem_location_parent = MM_SHARED_CINTERION_GET_INTERFACE (self)->peek_parent_location_interface (self);
@@ -105,6 +111,85 @@ get_private (MMSharedCinterion *self)
}
/*****************************************************************************/
+/* Modem interface */
+
+gboolean
+mm_shared_cinterion_modem_reset_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_boolean (G_TASK (res), error);
+}
+
+static void
+modem_reset_at_ready (MMBaseModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ GError *error = NULL;
+
+ if (!mm_base_modem_at_command_finish (self, res, &error))
+ g_task_return_error (task, error);
+ else
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+}
+
+static void
+modem_reset_at (GTask *task)
+{
+ MMSharedCinterion *self;
+
+ self = g_task_get_source_object (task);
+
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "+CFUN=1,1",
+ 3,
+ FALSE,
+ (GAsyncReadyCallback) modem_reset_at_ready,
+ task);
+}
+
+static void
+parent_modem_reset_ready (MMIfaceModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ Private *priv;
+
+ priv = get_private (MM_SHARED_CINTERION (self));
+ if (!priv->iface_modem_parent->reset_finish (self, res, NULL)) {
+ modem_reset_at (task);
+ return;
+ }
+
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+}
+
+void
+mm_shared_cinterion_modem_reset (MMIfaceModem *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+ Private *priv;
+
+ priv = get_private (MM_SHARED_CINTERION (self));
+ task = g_task_new (self, NULL, callback, user_data);
+
+ if (priv->iface_modem_parent->reset &&
+ priv->iface_modem_parent->reset_finish) {
+ priv->iface_modem_parent->reset (self,
+ (GAsyncReadyCallback) parent_modem_reset_ready,
+ task);
+ return;
+ }
+
+ modem_reset_at (task);
+}
+
+/*****************************************************************************/
/* GPS trace received */
static void
diff --git a/plugins/cinterion/mm-shared-cinterion.h b/plugins/cinterion/mm-shared-cinterion.h
index 6500dd49..eb6beac8 100644
--- a/plugins/cinterion/mm-shared-cinterion.h
+++ b/plugins/cinterion/mm-shared-cinterion.h
@@ -40,6 +40,9 @@ typedef struct _MMSharedCinterion MMSharedCinterion;
struct _MMSharedCinterion {
GTypeInterface g_iface;
+ /* Peek modem interface of the parent class of the object */
+ MMIfaceModem * (* peek_parent_interface) (MMSharedCinterion *self);
+
/* Peek location interface of the parent class of the object */
MMIfaceModemLocation * (* peek_parent_location_interface) (MMSharedCinterion *self);
@@ -53,6 +56,16 @@ struct _MMSharedCinterion {
GType mm_shared_cinterion_get_type (void);
/*****************************************************************************/
+/* Modem interface */
+
+void mm_shared_cinterion_modem_reset (MMIfaceModem *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean mm_shared_cinterion_modem_reset_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error);
+
+/*****************************************************************************/
/* Location interface */
void mm_shared_cinterion_location_load_capabilities (MMIfaceModemLocation *self,