diff options
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 45 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 64 | ||||
-rw-r--r-- | src/mm-shared-qmi.c | 60 | ||||
-rw-r--r-- | src/mm-shared-qmi.h | 6 |
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); |