aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Van Assche <me@dylanvanassche.be>2022-02-06 18:49:16 +0100
committerDylan Van Assche <dylan.vanassche@ugent.be>2022-02-09 11:07:49 +0100
commitb70fd64417d8fbed10aa1eb5e5c720fcf1074782 (patch)
tree3790de73baf726fe107ad4af2d29c6632397bf08
parent90397fa1bbae2297aca169f8fbfa981fa0f5d4e6 (diff)
quectel: add name to device IDs
fwupd expects device IDs which are unique for each device and its variants. However, Quectel re-uses the same USB VID & PID among different variants such as EG25, EC25, EC20, etc. Moreover, each variant may have subvariants such as EG25GGB, EG25GGC, EG25AFF, EG25AFX, etc. Add the name of the modem to the device IDs to build more unique device IDs such as USB\VID_2C7C&PID_0125&REV_0001&NAME_EC25GGB.
-rw-r--r--plugins/quectel/mm-shared-quectel.c101
1 files changed, 74 insertions, 27 deletions
diff --git a/plugins/quectel/mm-shared-quectel.c b/plugins/quectel/mm-shared-quectel.c
index 4874bf5c..547775bd 100644
--- a/plugins/quectel/mm-shared-quectel.c
+++ b/plugins/quectel/mm-shared-quectel.c
@@ -226,14 +226,15 @@ qfastboot_test_ready (MMBaseModem *self,
{
MMFirmwareUpdateSettings *update_settings;
+ update_settings = g_task_get_task_data (task);
+
/* Set update method */
if (mm_base_modem_at_command_finish (self, res, NULL)) {
- update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_FASTBOOT);
+ mm_firmware_update_settings_set_method (update_settings, MM_MODEM_FIRMWARE_UPDATE_METHOD_FASTBOOT);
mm_firmware_update_settings_set_fastboot_at (update_settings, "AT+QFASTBOOT");
} else
- update_settings = mm_firmware_update_settings_new (MM_MODEM_FIRMWARE_UPDATE_METHOD_NONE);
+ mm_firmware_update_settings_set_method (update_settings, MM_MODEM_FIRMWARE_UPDATE_METHOD_NONE);
- g_task_set_task_data (task, update_settings, g_object_unref);
/* Fetch full firmware info */
mm_base_modem_at_command (MM_BASE_MODEM (self),
"+QGMR?",
@@ -243,15 +244,71 @@ qfastboot_test_ready (MMBaseModem *self,
task);
}
+static void
+quectel_at_port_get_firmware_revision_ready (MMBaseModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ MMFirmwareUpdateSettings *update_settings;
+ MMModemFirmwareUpdateMethod update_methods;
+ const gchar *revision;
+ const gchar *name;
+ const gchar *id;
+ g_autoptr(GPtrArray) ids = NULL;
+ GError *error = NULL;
+
+ update_settings = g_task_get_task_data (task);
+ update_methods = mm_firmware_update_settings_get_method (update_settings);
+
+ /* Set device ids */
+ ids = mm_iface_firmware_build_generic_device_ids (MM_IFACE_MODEM_FIRMWARE (self), &error);
+ if (error) {
+ mm_obj_warn (self, "failed to build generic device ids: %s", error->message);
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ /* Add device id based on modem name */
+ revision = mm_base_modem_at_command_finish (self, res, NULL);
+ if (revision && g_utf8_validate (revision, -1, NULL)) {
+ name = g_strndup (revision, 7);
+ mm_obj_dbg (self, "revision %s converted to modem name %s", revision, name);
+ id = (const gchar *) g_ptr_array_index (ids, 0);
+ g_ptr_array_insert (ids, 0, g_strdup_printf ("%s&NAME_%s", id, name));
+ }
+
+ mm_firmware_update_settings_set_device_ids (update_settings, (const gchar **)ids->pdata);
+
+ /* Set update methods */
+ if (update_methods & MM_MODEM_FIRMWARE_UPDATE_METHOD_FIREHOSE) {
+ /* Fetch full firmware info */
+ mm_base_modem_at_command (self,
+ "+QGMR?",
+ 3,
+ TRUE,
+ (GAsyncReadyCallback) quectel_at_port_get_firmware_version_ready,
+ task);
+ } else {
+ /* Check fastboot support */
+ mm_base_modem_at_command (self,
+ "AT+QFASTBOOT=?",
+ 3,
+ TRUE,
+ (GAsyncReadyCallback) qfastboot_test_ready,
+ task);
+ }
+}
+
void
mm_shared_quectel_firmware_load_update_settings (MMIfaceModemFirmware *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
GTask *task;
- MMFirmwareUpdateSettings *update_settings;
- MMModemFirmwareUpdateMethod update_methods;
MMPortSerialAt *at_port;
+ MMModemFirmwareUpdateMethod update_methods;
+ MMFirmwareUpdateSettings *update_settings;
#if defined WITH_MBIM
MMPortMbim *mbim;
#endif
@@ -260,28 +317,18 @@ mm_shared_quectel_firmware_load_update_settings (MMIfaceModemFirmware *self,
at_port = mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self), NULL);
if (at_port) {
- update_methods = quectel_get_firmware_update_methods (MM_BASE_MODEM (self), MM_PORT (at_port));
-
- if (update_methods & MM_MODEM_FIRMWARE_UPDATE_METHOD_FIREHOSE) {
- /* Firehose modems */
- update_settings = mm_firmware_update_settings_new (update_methods);
- g_task_set_task_data (task, update_settings, g_object_unref);
- /* Fetch full firmware info */
- mm_base_modem_at_command (MM_BASE_MODEM (self),
- "+QGMR?",
- 3,
- FALSE,
- (GAsyncReadyCallback) quectel_at_port_get_firmware_version_ready,
- task);
- } else {
- /* Check fastboot support */
- mm_base_modem_at_command (MM_BASE_MODEM (self),
- "AT+QFASTBOOT=?",
- 3,
- TRUE,
- (GAsyncReadyCallback)qfastboot_test_ready,
- task);
- }
+ update_methods = quectel_get_firmware_update_methods (MM_BASE_MODEM (self), MM_PORT (at_port));
+ update_settings = mm_firmware_update_settings_new (update_methods);
+ g_task_set_task_data (task, update_settings, g_object_unref);
+
+ /* Fetch modem name */
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "+CGMR",
+ 3,
+ TRUE,
+ (GAsyncReadyCallback) quectel_at_port_get_firmware_revision_ready,
+ task);
+
return;
}