diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2018-12-17 17:37:36 +0100 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2019-01-03 18:53:52 +0000 |
commit | 67b3b830c87e79827a9934362e673e1a23116026 (patch) | |
tree | 615ecd0c362ae7d99eddecef0e1f9b82dda40d91 /src/mm-iface-modem-firmware.c | |
parent | bc39201f761bd667bcd0c5eb53643a180ce53327 (diff) |
api,firmware: expose device ids
Diffstat (limited to 'src/mm-iface-modem-firmware.c')
-rw-r--r-- | src/mm-iface-modem-firmware.c | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/src/mm-iface-modem-firmware.c b/src/mm-iface-modem-firmware.c index 571758a7..11eff7c3 100644 --- a/src/mm-iface-modem-firmware.c +++ b/src/mm-iface-modem-firmware.c @@ -282,6 +282,51 @@ mm_iface_modem_firmware_initialize_finish (MMIfaceModemFirmware *self, return g_task_propagate_boolean (G_TASK (res), error); } +static gboolean +add_generic_device_ids (MMBaseModem *self, + MMFirmwareUpdateSettings *update_settings, + GError **error) +{ + guint16 vid; + guint16 pid; + guint16 rid; + GPtrArray *ids; + MMPort *primary = NULL; + const gchar *subsystem; + + vid = mm_base_modem_get_vendor_id (self); + pid = mm_base_modem_get_product_id (self); + +#if defined WITH_QMI + primary = MM_PORT (mm_base_modem_peek_port_qmi (self)); +#endif +#if defined WITH_MBIM + if (!primary) + primary = MM_PORT (mm_base_modem_peek_port_mbim (self)); +#endif + if (!primary) + primary = MM_PORT (mm_base_modem_peek_port_primary (self)); + g_assert (primary != NULL); + rid = mm_kernel_device_get_physdev_revision (mm_port_peek_kernel_device (primary)); + + subsystem = mm_kernel_device_get_physdev_subsystem (mm_port_peek_kernel_device (primary)); + if (g_strcmp0 (subsystem, "usb")) { + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Unsupported subsystem: %s", subsystem); + return FALSE; + } + + ids = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free); + g_ptr_array_add (ids, g_strdup_printf ("USB\\VID_%04X&PID_%04X&REV_%04X", vid, pid, rid)); + g_ptr_array_add (ids, g_strdup_printf ("USB\\VID_%04X&PID_%04X", vid, pid)); + g_ptr_array_add (ids, g_strdup_printf ("USB\\VID_%04X", vid)); + g_ptr_array_add (ids, NULL); + + mm_firmware_update_settings_set_device_ids (update_settings, (const gchar **)ids->pdata); + g_ptr_array_unref (ids); + return TRUE; +} + static void load_update_settings_ready (MMIfaceModemFirmware *self, GAsyncResult *res, @@ -299,8 +344,15 @@ load_update_settings_ready (MMIfaceModemFirmware *self, mm_dbg ("Couldn't load update settings: '%s'", error->message); g_error_free (error); } else { - variant = mm_firmware_update_settings_get_variant (update_settings); - g_object_unref (update_settings); + /* If the plugin didn't specify custom device ids, add the default ones ourselves */ + if (!mm_firmware_update_settings_get_device_ids (update_settings) && + !add_generic_device_ids (MM_BASE_MODEM (self), update_settings, &error)) { + mm_warn ("Couldn't build device ids: '%s'", error->message); + g_error_free (error); + } else { + variant = mm_firmware_update_settings_get_variant (update_settings); + g_object_unref (update_settings); + } } mm_gdbus_modem_firmware_set_update_settings (ctx->skeleton, variant); |