aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-broadband-modem-mbim.c45
-rw-r--r--src/mm-broadband-modem-qmi.c64
-rw-r--r--src/mm-shared-qmi.c60
-rw-r--r--src/mm-shared-qmi.h6
4 files changed, 109 insertions, 66 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index fe5e7534..c7769cdc 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -676,6 +676,14 @@ modem_load_manufacturer (MMIfaceModem *self,
/* Model loading (Modem interface) */
static gchar *
+modem_load_model_default (MMIfaceModem *self)
+{
+ return g_strdup_printf ("MBIM [%04X:%04X]",
+ (mm_base_modem_get_vendor_id (MM_BASE_MODEM (self)) & 0xFFFF),
+ (mm_base_modem_get_product_id (MM_BASE_MODEM (self)) & 0xFFFF));
+}
+
+static gchar *
modem_load_model_finish (MMIfaceModem *self,
GAsyncResult *res,
GError **error)
@@ -683,6 +691,29 @@ modem_load_model_finish (MMIfaceModem *self,
return g_task_propagate_pointer (G_TASK (res), error);
}
+#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED
+
+static void
+qmi_load_model_ready (MMIfaceModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ gchar *model = NULL;
+ GError *error = NULL;
+
+ model = mm_shared_qmi_load_model_finish (self, res, &error);
+ if (!model) {
+ mm_obj_dbg (self, "couldn't load model using QMI over MBIM: %s", error->message);
+ model = modem_load_model_default (self);
+ g_clear_error (&error);
+ }
+
+ g_task_return_pointer (task, model, g_free);
+ g_object_unref (task);
+}
+
+#endif
+
static void
modem_load_model (MMIfaceModem *self,
GAsyncReadyCallback callback,
@@ -692,18 +723,24 @@ modem_load_model (MMIfaceModem *self,
GTask *task;
MMPortMbim *port;
+ task = g_task_new (self, NULL, callback, user_data);
+
port = mm_broadband_modem_mbim_peek_port_mbim (MM_BROADBAND_MODEM_MBIM (self));
if (port) {
model = g_strdup (mm_kernel_device_get_physdev_product (
mm_port_peek_kernel_device (MM_PORT (port))));
}
+#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED
+ if (!model) {
+ mm_shared_qmi_load_model (self, (GAsyncReadyCallback)qmi_load_model_ready, task);
+ return;
+ }
+#endif
+
if (!model)
- model = g_strdup_printf ("MBIM [%04X:%04X]",
- (mm_base_modem_get_vendor_id (MM_BASE_MODEM (self)) & 0xFFFF),
- (mm_base_modem_get_product_id (MM_BASE_MODEM (self)) & 0xFFFF));
+ model = modem_load_model_default (self);
- task = g_task_new (self, NULL, callback, user_data);
g_task_return_pointer (task, model, g_free);
g_object_unref (task);
}
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index aaffe2c6..973cd954 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -433,66 +433,6 @@ modem_load_manufacturer (MMIfaceModem *self,
}
/*****************************************************************************/
-/* Model loading (Modem interface) */
-
-static gchar *
-modem_load_model_finish (MMIfaceModem *self,
- GAsyncResult *res,
- GError **error)
-{
- return g_task_propagate_pointer (G_TASK (res), error);
-}
-
-static void
-dms_get_model_ready (QmiClientDms *client,
- GAsyncResult *res,
- GTask *task)
-{
- QmiMessageDmsGetModelOutput *output = NULL;
- GError *error = NULL;
-
- output = qmi_client_dms_get_model_finish (client, res, &error);
- if (!output) {
- g_prefix_error (&error, "QMI operation failed: ");
- g_task_return_error (task, error);
- } else if (!qmi_message_dms_get_model_output_get_result (output, &error)) {
- g_prefix_error (&error, "Couldn't get Model: ");
- g_task_return_error (task, error);
- } else {
- const gchar *str;
-
- qmi_message_dms_get_model_output_get_model (output, &str, NULL);
- g_task_return_pointer (task, g_strdup (str), g_free);
- }
-
- if (output)
- qmi_message_dms_get_model_output_unref (output);
-
- g_object_unref (task);
-}
-
-static void
-modem_load_model (MMIfaceModem *self,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- QmiClient *client = NULL;
-
- if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self),
- QMI_SERVICE_DMS, &client,
- callback, user_data))
- return;
-
- mm_obj_dbg (self, "loading model...");
- qmi_client_dms_get_model (QMI_CLIENT_DMS (client),
- NULL,
- 5,
- NULL,
- (GAsyncReadyCallback)dms_get_model_ready,
- g_task_new (self, NULL, callback, user_data));
-}
-
-/*****************************************************************************/
/* Revision loading (Modem interface) */
static gchar *
@@ -11187,8 +11127,8 @@ iface_modem_init (MMIfaceModem *iface)
iface->set_current_capabilities_finish = mm_shared_qmi_set_current_capabilities_finish;
iface->load_manufacturer = modem_load_manufacturer;
iface->load_manufacturer_finish = modem_load_manufacturer_finish;
- iface->load_model = modem_load_model;
- iface->load_model_finish = modem_load_model_finish;
+ iface->load_model = mm_shared_qmi_load_model;
+ iface->load_model_finish = mm_shared_qmi_load_model_finish;
iface->load_revision = modem_load_revision;
iface->load_revision_finish = modem_load_revision_finish;
iface->load_hardware_revision = modem_load_hardware_revision;
diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c
index 35911713..b4c27b5e 100644
--- a/src/mm-shared-qmi.c
+++ b/src/mm-shared-qmi.c
@@ -1154,6 +1154,66 @@ mm_shared_qmi_load_supported_capabilities (MMIfaceModem *self,
}
/*****************************************************************************/
+/* Load model (Modem interface) */
+
+gchar *
+mm_shared_qmi_load_model_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (res), error);
+}
+
+static void
+dms_get_model_ready (QmiClientDms *client,
+ GAsyncResult *res,
+ GTask *task)
+{
+ QmiMessageDmsGetModelOutput *output = NULL;
+ GError *error = NULL;
+
+ output = qmi_client_dms_get_model_finish (client, res, &error);
+ if (!output) {
+ g_prefix_error (&error, "QMI operation failed: ");
+ g_task_return_error (task, error);
+ } else if (!qmi_message_dms_get_model_output_get_result (output, &error)) {
+ g_prefix_error (&error, "Couldn't get Model: ");
+ g_task_return_error (task, error);
+ } else {
+ const gchar *str;
+
+ qmi_message_dms_get_model_output_get_model (output, &str, NULL);
+ g_task_return_pointer (task, g_strdup (str), g_free);
+ }
+
+ if (output)
+ qmi_message_dms_get_model_output_unref (output);
+
+ g_object_unref (task);
+}
+
+void
+mm_shared_qmi_load_model (MMIfaceModem *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ QmiClient *client = NULL;
+
+ if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self),
+ QMI_SERVICE_DMS, &client,
+ callback, user_data))
+ return;
+
+ mm_obj_dbg (self, "loading model...");
+ qmi_client_dms_get_model (QMI_CLIENT_DMS (client),
+ NULL,
+ 5,
+ NULL,
+ (GAsyncReadyCallback)dms_get_model_ready,
+ g_task_new (self, NULL, callback, user_data));
+}
+
+/*****************************************************************************/
/* Allowed modes setting (Modem interface) */
typedef struct {
diff --git a/src/mm-shared-qmi.h b/src/mm-shared-qmi.h
index 9af00b9d..dc95078d 100644
--- a/src/mm-shared-qmi.h
+++ b/src/mm-shared-qmi.h
@@ -94,6 +94,12 @@ void mm_shared_qmi_set_current_capabilities (MMIfaceMode
gboolean mm_shared_qmi_set_current_capabilities_finish (MMIfaceModem *self,
GAsyncResult *res,
GError **error);
+void mm_shared_qmi_load_model (MMIfaceModem *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gchar *mm_shared_qmi_load_model_finish (MMIfaceModem *self,
+ GAsyncResult *res,
+ GError **error);
void mm_shared_qmi_load_supported_modes (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data);