aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/foxconn/mm-broadband-modem-mbim-foxconn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/foxconn/mm-broadband-modem-mbim-foxconn.c')
-rw-r--r--src/plugins/foxconn/mm-broadband-modem-mbim-foxconn.c88
1 files changed, 63 insertions, 25 deletions
diff --git a/src/plugins/foxconn/mm-broadband-modem-mbim-foxconn.c b/src/plugins/foxconn/mm-broadband-modem-mbim-foxconn.c
index 060194e1..c7965133 100644
--- a/src/plugins/foxconn/mm-broadband-modem-mbim-foxconn.c
+++ b/src/plugins/foxconn/mm-broadband-modem-mbim-foxconn.c
@@ -42,6 +42,8 @@
static void iface_modem_location_init (MMIfaceModemLocationInterface *iface);
#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED
static void iface_modem_firmware_init (MMIfaceModemFirmwareInterface *iface);
+
+static MMIfaceModemFirmwareInterface *iface_modem_firmware_parent;
#endif
static MMIfaceModemLocationInterface *iface_modem_location_parent;
@@ -121,23 +123,28 @@ needs_fastboot_and_qmi_pdc_mcfg_apps_version (MMIfaceModemFirmware *self)
return (vendor_id == 0x413c && (product_id == 0x81d7 || product_id == 0x81e0 || product_id == 0x81e4 || product_id == 0x81e6));
}
-static MMFirmwareUpdateSettings *
-create_update_settings (MMIfaceModemFirmware *self,
- const gchar *version_str)
+static void
+fill_update_settings (MMIfaceModemFirmware *self,
+ MMFirmwareUpdateSettings *update_settings,
+ const gchar *version_str)
{
- MMModemFirmwareUpdateMethod methods = MM_MODEM_FIRMWARE_UPDATE_METHOD_NONE;
- MMFirmwareUpdateSettings *update_settings = NULL;
+ MMModemFirmwareUpdateMethod methods;
- if (needs_qdu_and_mcfg_apps_version (self))
- methods = MM_MODEM_FIRMWARE_UPDATE_METHOD_MBIM_QDU;
- else
- methods = MM_MODEM_FIRMWARE_UPDATE_METHOD_FASTBOOT | MM_MODEM_FIRMWARE_UPDATE_METHOD_QMI_PDC;
+ methods = mm_firmware_update_settings_get_method (update_settings);
- update_settings = mm_firmware_update_settings_new (methods);
- if (methods & MM_MODEM_FIRMWARE_UPDATE_METHOD_FASTBOOT)
- mm_firmware_update_settings_set_fastboot_at (update_settings, "AT^FASTBOOT");
+ /* Prefer any parent's update method */
+ if (methods == MM_MODEM_FIRMWARE_UPDATE_METHOD_NONE) {
+ if (needs_qdu_and_mcfg_apps_version (self))
+ methods = MM_MODEM_FIRMWARE_UPDATE_METHOD_MBIM_QDU;
+ else
+ methods = MM_MODEM_FIRMWARE_UPDATE_METHOD_FASTBOOT | MM_MODEM_FIRMWARE_UPDATE_METHOD_QMI_PDC;
+
+ mm_firmware_update_settings_set_method (update_settings, methods);
+
+ if (methods & MM_MODEM_FIRMWARE_UPDATE_METHOD_FASTBOOT)
+ mm_firmware_update_settings_set_fastboot_at (update_settings, "AT^FASTBOOT");
+ }
mm_firmware_update_settings_set_version (update_settings, version_str);
- return update_settings;
}
static void
@@ -146,6 +153,7 @@ dms_foxconn_get_firmware_version_ready (QmiClientDms *client,
GTask *task)
{
g_autoptr(QmiMessageDmsFoxconnGetFirmwareVersionOutput) output = NULL;
+ MMFirmwareUpdateSettings *update_settings = NULL;
GError *error = NULL;
const gchar *str;
@@ -155,12 +163,12 @@ dms_foxconn_get_firmware_version_ready (QmiClientDms *client,
g_object_unref (task);
return;
}
+ update_settings = g_task_get_task_data (task);
qmi_message_dms_foxconn_get_firmware_version_output_get_version (output, &str, NULL);
- g_task_return_pointer (task,
- create_update_settings (g_task_get_source_object (task), str),
- g_object_unref);
+ fill_update_settings (g_task_get_source_object (task), update_settings, str);
+ g_task_return_pointer (task, g_object_ref (update_settings), g_object_unref);
g_object_unref (task);
}
@@ -170,6 +178,7 @@ fox_get_firmware_version_ready (QmiClientFox *client,
GTask *task)
{
g_autoptr(QmiMessageFoxGetFirmwareVersionOutput) output = NULL;
+ MMFirmwareUpdateSettings *update_settings = NULL;
GError *error = NULL;
const gchar *str;
@@ -179,12 +188,12 @@ fox_get_firmware_version_ready (QmiClientFox *client,
g_object_unref (task);
return;
}
+ update_settings = g_task_get_task_data (task);
qmi_message_fox_get_firmware_version_output_get_version (output, &str, NULL);
- g_task_return_pointer (task,
- create_update_settings (g_task_get_source_object (task), str),
- g_object_unref);
+ fill_update_settings (g_task_get_source_object (task), update_settings, str);
+ g_task_return_pointer (task, g_object_ref (update_settings), g_object_unref);
g_object_unref (task);
}
@@ -255,14 +264,22 @@ mbim_port_allocate_qmi_client_ready (MMPortMbim *mbim,
}
static void
-firmware_load_update_settings (MMIfaceModemFirmware *self,
- GAsyncReadyCallback callback,
- gpointer user_data)
+parent_load_update_settings_ready (MMIfaceModemFirmware *self,
+ GAsyncResult *res,
+ GTask *task)
{
- GTask *task;
- MMPortMbim *mbim;
+ MMPortMbim *mbim;
+ g_autoptr(GError) error = NULL;
+ g_autoptr(MMFirmwareUpdateSettings) update_settings;
- task = g_task_new (self, NULL, callback, user_data);
+ update_settings = iface_modem_firmware_parent->load_update_settings_finish (self, res, &error);
+ if (error) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ g_task_set_task_data (task, g_object_ref (update_settings), g_object_unref);
mbim = mm_broadband_modem_mbim_peek_port_mbim (MM_BROADBAND_MODEM_MBIM (self));
mm_port_mbim_allocate_qmi_client (mbim,
@@ -272,6 +289,25 @@ firmware_load_update_settings (MMIfaceModemFirmware *self,
task);
}
+static void
+firmware_load_update_settings (MMIfaceModemFirmware *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+
+ g_assert (iface_modem_firmware_parent);
+ g_assert (iface_modem_firmware_parent->load_update_settings);
+ g_assert (iface_modem_firmware_parent->load_update_settings_finish);
+
+ task = g_task_new (self, NULL, callback, user_data);
+
+ iface_modem_firmware_parent->load_update_settings (
+ self,
+ (GAsyncReadyCallback)parent_load_update_settings_ready,
+ task);
+}
+
#endif
/*****************************************************************************/
@@ -598,6 +634,8 @@ iface_modem_location_init (MMIfaceModemLocationInterface *iface)
static void
iface_modem_firmware_init (MMIfaceModemFirmwareInterface *iface)
{
+ iface_modem_firmware_parent = g_type_interface_peek_parent (iface);
+
iface->load_update_settings = firmware_load_update_settings;
iface->load_update_settings_finish = firmware_load_update_settings_finish;
}