diff --git a/src/fu-device.c b/src/fu-device.c index 9720830e4..080611eeb 100644 --- a/src/fu-device.c +++ b/src/fu-device.c @@ -88,6 +88,24 @@ fu_device_set_alternate (FuDevice *device, FuDevice *alternate) g_set_object (&priv->alternate, alternate); } +/** + * fu_device_add_guid: + **/ +void +fu_device_add_guid (FuDevice *device, const gchar *guid) +{ + /* make valid */ + if (!as_utils_guid_is_valid (guid)) { + g_autofree gchar *tmp = as_utils_guid_from_string (guid); + g_debug ("using %s for %s", tmp, guid); + fwupd_result_add_guid (FWUPD_RESULT (device), tmp); + return; + } + + /* already valid */ + fwupd_result_add_guid (FWUPD_RESULT (device), guid); +} + /** * fu_device_get_metadata: **/ diff --git a/src/fu-device.h b/src/fu-device.h index 76acfd4f7..809bae0f1 100644 --- a/src/fu-device.h +++ b/src/fu-device.h @@ -48,7 +48,6 @@ FuDevice *fu_device_new (void); #define fu_device_set_created(d,v) fwupd_result_set_device_created(FWUPD_RESULT(d),v) #define fu_device_set_description(d,v) fwupd_result_set_device_description(FWUPD_RESULT(d),v) #define fu_device_set_flags(d,v) fwupd_result_set_device_flags(FWUPD_RESULT(d),v) -#define fu_device_add_guid(d,v) fwupd_result_add_guid(FWUPD_RESULT(d),v) #define fu_device_has_guid(d,v) fwupd_result_has_guid(FWUPD_RESULT(d),v) #define fu_device_set_id(d,v) fwupd_result_set_device_id(FWUPD_RESULT(d),v) #define fu_device_set_modified(d,v) fwupd_result_set_device_modified(FWUPD_RESULT(d),v) @@ -92,6 +91,8 @@ FuDevice *fu_device_new (void); const gchar *fu_device_get_equivalent_id (FuDevice *device); void fu_device_set_equivalent_id (FuDevice *device, const gchar *equivalent_id); +void fu_device_add_guid (FuDevice *device, + const gchar *guid); FuDevice *fu_device_get_alternate (FuDevice *device); void fu_device_set_alternate (FuDevice *device, FuDevice *alternate); diff --git a/src/fu-provider-dfu.c b/src/fu-provider-dfu.c index 457b1778f..25354eddd 100644 --- a/src/fu-provider-dfu.c +++ b/src/fu-provider-dfu.c @@ -63,7 +63,8 @@ fu_provider_dfu_device_update (FuProviderDfu *provider_dfu, guint16 release; g_autofree gchar *guid = NULL; g_autofree gchar *version = NULL; - g_autofree gchar *vid_pid = NULL; + g_autofree gchar *devid1 = NULL; + g_autofree gchar *devid2 = NULL; /* check mode */ platform_id = dfu_device_get_platform_id (device); @@ -86,12 +87,18 @@ fu_provider_dfu_device_update (FuProviderDfu *provider_dfu, fu_device_set_version (dev, version); } - vid_pid = g_strdup_printf ("USB\\VID_%04X&PID_%04X", + /* add USB\VID_0000&PID_0000 */ + devid1 = g_strdup_printf ("USB\\VID_%04X&PID_%04X", dfu_device_get_runtime_vid (device), dfu_device_get_runtime_pid (device)); - guid = as_utils_guid_from_string (vid_pid); - g_debug ("using %s for %s", guid, vid_pid); - fu_device_add_guid (dev, guid); + fu_device_add_guid (dev, devid1); + + /* add more specific USB\VID_0000&PID_0000&REV_0000 */ + devid2 = g_strdup_printf ("USB\\VID_%04X&PID_%04X&REV_%04X", + dfu_device_get_runtime_vid (device), + dfu_device_get_runtime_pid (device), + dfu_device_get_runtime_release (device)); + fu_device_add_guid (dev, devid2); } /** diff --git a/src/fu-provider-rpi.c b/src/fu-provider-rpi.c index 550efad30..55c5b94f3 100644 --- a/src/fu-provider-rpi.c +++ b/src/fu-provider-rpi.c @@ -282,7 +282,6 @@ fu_provider_rpi_coldplug (FuProvider *provider, GError **error) FuProviderRpiPrivate *priv = GET_PRIVATE (provider_rpi); g_autofree gchar *fwfn = NULL; g_autofree gchar *fwver = NULL; - g_autofree gchar *guid = NULL; g_autoptr(FuDevice) device = NULL; /* anything interesting */ @@ -295,8 +294,7 @@ fu_provider_rpi_coldplug (FuProvider *provider, GError **error) /* create fake device */ device = fu_device_new (); fu_device_set_id (device, "raspberry-pi"); - guid = as_utils_guid_from_string ("raspberrypi"); - fu_device_add_guid (device, guid); + fu_device_add_guid (device, "raspberrypi"); fu_device_set_name (device, "Raspberry Pi"); fu_device_add_flag (device, FU_DEVICE_FLAG_INTERNAL); fu_device_add_flag (device, FU_DEVICE_FLAG_ALLOW_OFFLINE); diff --git a/src/fu-provider-udev.c b/src/fu-provider-udev.c index 7141094f5..94234590e 100644 --- a/src/fu-provider-udev.c +++ b/src/fu-provider-udev.c @@ -152,7 +152,6 @@ fu_provider_udev_client_add (FuProviderUdev *provider_udev, GUdevDevice *device) const gchar *guid; const gchar *product; const gchar *vendor; - g_autofree gchar *guid_new = NULL; g_autofree gchar *id = NULL; g_autofree gchar *rom_fn = NULL; g_autofree gchar *version = NULL; @@ -188,19 +187,11 @@ fu_provider_udev_client_add (FuProviderUdev *provider_udev, GUdevDevice *device) version = g_strdup (split[2]); } - /* no GUID from the ROM, so fix up the VID:PID */ - if (!as_utils_guid_is_valid (guid)) { - guid_new = as_utils_guid_from_string (guid); - g_debug ("fixing GUID %s->%s", guid, guid_new); - } else { - guid_new = g_strdup (guid); - } - /* did we get enough data */ dev = fu_device_new (); fu_device_add_flag (dev, FU_DEVICE_FLAG_INTERNAL); fu_device_set_id (dev, id); - fu_device_add_guid (dev, guid_new); + fu_device_add_guid (dev, guid); display_name = g_udev_device_get_property (device, "FWUPD_MODEL"); if (display_name == NULL) display_name = g_udev_device_get_property (device, "ID_MODEL_FROM_DATABASE"); diff --git a/src/fu-provider-usb.c b/src/fu-provider-usb.c index fd796334d..f6398ea8c 100644 --- a/src/fu-provider-usb.c +++ b/src/fu-provider-usb.c @@ -61,7 +61,8 @@ fu_provider_usb_device_added (FuProviderUsb *provider_usb, GUsbDevice *device) FuProviderUsbPrivate *priv = GET_PRIVATE (provider_usb); const gchar *platform_id = NULL; guint8 idx = 0x00; - g_autofree gchar *guid = NULL; + g_autofree gchar *devid1 = NULL; + g_autofree gchar *devid2 = NULL; g_autofree gchar *product = NULL; g_autofree gchar *version = NULL; g_autoptr(AsProfile) profile = as_profile_new (); @@ -121,20 +122,26 @@ fu_provider_usb_device_added (FuProviderUsb *provider_usb, GUsbDevice *device) } fu_device_set_version (dev, version); - /* get GUID, falling back to the USB VID:PID hash */ + /* get GUID from the descriptor if set */ idx = g_usb_device_get_custom_index (device, G_USB_DEVICE_CLASS_VENDOR_SPECIFIC, 'G', 'U', NULL); - if (idx != 0x00) + if (idx != 0x00) { + g_autofree gchar *guid = NULL; guid = g_usb_device_get_string_descriptor (device, idx, NULL); - if (guid == NULL) { - g_autofree gchar *vid_pid = NULL; - vid_pid = g_strdup_printf ("USB\\VID_%04X&PID_%04X", - g_usb_device_get_vid (device), - g_usb_device_get_pid (device)); - guid = as_utils_guid_from_string (vid_pid); + fu_device_add_guid (dev, guid); } - fu_device_add_guid (dev, guid); + + /* also fall back to the USB VID:PID hash */ + devid1 = g_strdup_printf ("USB\\VID_%04X&PID_%04X", + g_usb_device_get_vid (device), + g_usb_device_get_pid (device)); + fu_device_add_guid (dev, devid1); + devid2 = g_strdup_printf ("USB\\VID_%04X&PID_%04X&REV_%04X", + g_usb_device_get_vid (device), + g_usb_device_get_pid (device), + g_usb_device_get_release (device)); + fu_device_add_guid (dev, devid2); /* we're done here */ if (!g_usb_device_close (device, &error))