From 7ef94d7a313a4aee7e7fbac1f38bb839b7124c95 Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Tue, 22 Feb 2022 12:34:03 +0000 Subject: [PATCH] vli: Skip probing the Dell DA300 device Although 2109:2820 and 2109:0820 is the generic reference firmware, firmware revision 3003 is specific to this device. Fixes https://github.com/fwupd/fwupd/issues/4305 --- libfwupdplugin/fu-device.c | 24 ++++++++++++++++++++++++ libfwupdplugin/fu-device.h | 9 +++++++++ plugins/vli/meson.build | 1 + plugins/vli/vli-usbhub-dell.quirk | 5 +++++ 4 files changed, 39 insertions(+) create mode 100644 plugins/vli/vli-usbhub-dell.quirk diff --git a/libfwupdplugin/fu-device.c b/libfwupdplugin/fu-device.c index 0387d5208..345692ec1 100644 --- a/libfwupdplugin/fu-device.c +++ b/libfwupdplugin/fu-device.c @@ -237,6 +237,8 @@ fu_device_internal_flag_to_string(FuDeviceInternalFlags flag) return "md-set-vendor"; if (flag == FU_DEVICE_INTERNAL_FLAG_NO_LID_CLOSED) return "no-lid-closed"; + if (flag == FU_DEVICE_INTERNAL_FLAG_NO_PROBE) + return "no-probe"; return NULL; } @@ -297,6 +299,8 @@ fu_device_internal_flag_from_string(const gchar *flag) return FU_DEVICE_INTERNAL_FLAG_MD_SET_VENDOR; if (g_strcmp0(flag, "no-lid-closed") == 0) return FU_DEVICE_INTERNAL_FLAG_NO_LID_CLOSED; + if (g_strcmp0(flag, "no-probe") == 0) + return FU_DEVICE_INTERNAL_FLAG_NO_PROBE; return FU_DEVICE_INTERNAL_FLAG_UNKNOWN; } @@ -4162,11 +4166,25 @@ fu_device_probe(FuDevice *self, GError **error) if (priv->done_probe) return TRUE; + /* device self-assigned */ + if (fu_device_has_internal_flag(self, FU_DEVICE_INTERNAL_FLAG_NO_PROBE)) { + g_set_error_literal(error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED, "not probing"); + return FALSE; + } + /* subclassed */ if (klass->probe != NULL) { if (!klass->probe(self, error)) return FALSE; } + + /* vfunc skipped device */ + if (fu_device_has_internal_flag(self, FU_DEVICE_INTERNAL_FLAG_NO_PROBE)) { + g_set_error_literal(error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED, "not probing"); + return FALSE; + } + + /* success */ priv->done_probe = TRUE; return TRUE; } @@ -4297,6 +4315,12 @@ fu_device_setup(FuDevice *self, GError **error) return FALSE; } + /* vfunc skipped device */ + if (fu_device_has_internal_flag(self, FU_DEVICE_INTERNAL_FLAG_NO_PROBE)) { + g_set_error_literal(error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED, "not probing"); + return FALSE; + } + /* run setup on the children too (unless done already) */ children = fu_device_get_children(self); for (guint i = 0; i < children->len; i++) { diff --git a/libfwupdplugin/fu-device.h b/libfwupdplugin/fu-device.h index 406f2d5b3..afcf6da9c 100644 --- a/libfwupdplugin/fu-device.h +++ b/libfwupdplugin/fu-device.h @@ -429,6 +429,15 @@ typedef guint64 FuDeviceInternalFlags; */ #define FU_DEVICE_INTERNAL_FLAG_NO_LID_CLOSED (1ull << 21) +/** + * FU_DEVICE_INTERNAL_FLAG_NO_PROBE: + * + * Do not probe this device. + * + * Since: 1.7.6 + */ +#define FU_DEVICE_INTERNAL_FLAG_NO_PROBE (1ull << 22) + /* accessors */ gchar * fu_device_to_string(FuDevice *self); diff --git a/plugins/vli/meson.build b/plugins/vli/meson.build index 68a0f9011..f171a2972 100644 --- a/plugins/vli/meson.build +++ b/plugins/vli/meson.build @@ -4,6 +4,7 @@ cargs = ['-DG_LOG_DOMAIN="FuPluginVliUsbhub"'] install_data([ 'vli-pd.quirk', 'vli-usbhub.quirk', + 'vli-usbhub-dell.quirk', 'vli-usbhub-lenovo.quirk', 'vli-usbhub-hyper.quirk', 'vli-usbhub-bizlink.quirk', diff --git a/plugins/vli/vli-usbhub-dell.quirk b/plugins/vli/vli-usbhub-dell.quirk new file mode 100644 index 000000000..ced686eed --- /dev/null +++ b/plugins/vli/vli-usbhub-dell.quirk @@ -0,0 +1,5 @@ +# Dell DA300 +[USB\VID_2109&PID_0820&REV_3003] +Flags = no-probe +[USB\VID_2109&PID_2820&REV_3003] +Flags = no-probe