From 83f8108defc8a01f01eb073e5722ec675b996833 Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Wed, 9 Oct 2019 08:26:58 -0500 Subject: [PATCH] thunderbolt: recognize new 'generation' sysfs attribute Use this attribute to determine whether or not to try to read 'native' from the Thunderbolt NVM image at probe time. This attribute is new to kernel 5.5. --- plugins/thunderbolt/fu-plugin-thunderbolt.c | 24 +++++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/plugins/thunderbolt/fu-plugin-thunderbolt.c b/plugins/thunderbolt/fu-plugin-thunderbolt.c index e422e8ba8..412123c1c 100644 --- a/plugins/thunderbolt/fu-plugin-thunderbolt.c +++ b/plugins/thunderbolt/fu-plugin-thunderbolt.c @@ -116,9 +116,9 @@ udev_device_get_sysattr_guint64 (GUdevDevice *device, } static guint16 -fu_plugin_thunderbolt_udev_get_id (GUdevDevice *device, - const gchar *name, - GError **error) +fu_plugin_thunderbolt_udev_get_uint16 (GUdevDevice *device, + const gchar *name, + GError **error) { guint64 id = 0; @@ -130,7 +130,8 @@ fu_plugin_thunderbolt_udev_get_id (GUdevDevice *device, g_set_error (error, FWUPD_ERROR, FWUPD_ERROR_INTERNAL, - "vendor id overflows"); + "%s overflows", + name); return 0x0; } @@ -280,6 +281,7 @@ fu_plugin_thunderbolt_add (FuPlugin *plugin, GUdevDevice *device) gboolean is_native = FALSE; guint16 did; guint16 vid; + guint16 gen; g_autofree gchar *id = NULL; g_autofree gchar *version = NULL; g_autofree gchar *vendor_id = NULL; @@ -287,6 +289,7 @@ fu_plugin_thunderbolt_add (FuPlugin *plugin, GUdevDevice *device) g_autoptr(FuDevice) dev = NULL; g_autoptr(GError) error_vid = NULL; g_autoptr(GError) error_did = NULL; + g_autoptr(GError) error_gen = NULL; g_autoptr(GError) error_setup = NULL; uuid = g_udev_device_get_sysfs_attr (device, "unique_id"); @@ -313,14 +316,19 @@ fu_plugin_thunderbolt_add (FuPlugin *plugin, GUdevDevice *device) return; } - vid = fu_plugin_thunderbolt_udev_get_id (device, "vendor", &error_vid); + vid = fu_plugin_thunderbolt_udev_get_uint16 (device, "vendor", &error_vid); if (vid == 0x0) g_warning ("failed to get Vendor ID: %s", error_vid->message); - did = fu_plugin_thunderbolt_udev_get_id (device, "device", &error_did); + did = fu_plugin_thunderbolt_udev_get_uint16 (device, "device", &error_did); if (did == 0x0) g_warning ("failed to get Device ID: %s", error_did->message); + /* requires kernel 5.5 or later, non-fatal if not available */ + gen = fu_plugin_thunderbolt_udev_get_uint16 (device, "generation", &error_gen); + if (gen == 0) + g_debug ("Unable to read generation: %s", error_gen->message); + dev = fu_device_new (); is_host = fu_plugin_thunderbolt_is_host (device); @@ -349,7 +357,9 @@ fu_plugin_thunderbolt_add (FuPlugin *plugin, GUdevDevice *device) } if (!is_safemode) { if (fu_plugin_thunderbolt_can_update (device)) { - if (is_host) { + /* USB4 controllers don't have a concept of legacy vs native + * so don't try to read a native attribute from their NVM */ + if (is_host && gen < 4) { g_autoptr(GError) native_error = NULL; if (!fu_plugin_thunderbolt_is_native (device, &is_native,