broadband-modem-mbim: get model through QMI-over-MBIM
move the modem_load_model() async method from mm-broadband-modem-qmi.c to mm-shared-qmi.c, and then make use of the method from both the QMI and MBIM implementations.
This commit is contained in:

committed by
Aleksander Morgado

parent
bb928dbf74
commit
76e700f4fd
@@ -675,6 +675,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,
|
||||
@@ -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 (!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));
|
||||
#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 = 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);
|
||||
}
|
||||
|
@@ -432,66 +432,6 @@ modem_load_manufacturer (MMIfaceModem *self,
|
||||
g_task_new (self, NULL, callback, user_data));
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* 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) */
|
||||
|
||||
@@ -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;
|
||||
|
@@ -1153,6 +1153,66 @@ mm_shared_qmi_load_supported_capabilities (MMIfaceModem *self,
|
||||
g_object_unref (task);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* 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) */
|
||||
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user