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:
Freedom Liu
2021-05-04 14:49:25 +08:00
committed by Aleksander Morgado
parent bb928dbf74
commit 76e700f4fd
4 changed files with 110 additions and 67 deletions

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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) */

View File

@@ -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);