From 60103e22070fa7edffa3b84b4f5e0b8ba4b9ef0f Mon Sep 17 00:00:00 2001 From: "ChangHee (Ryan) Lee" <32348354+chlee75@users.noreply.github.com> Date: Tue, 31 Mar 2020 23:50:40 +0900 Subject: [PATCH] ccgx: Use Silicon ID and Application type to set flash parameters Also remove unused instance id and fix application type matching as we now get the image type from the quirk file. --- plugins/ccgx/README.md | 1 - plugins/ccgx/ccgx.quirk | 6 ++- plugins/ccgx/fu-ccgx-hpi-device.c | 84 +++++++++++++------------------ 3 files changed, 40 insertions(+), 51 deletions(-) diff --git a/plugins/ccgx/README.md b/plugins/ccgx/README.md index 9ede1e290..82f0a3539 100644 --- a/plugins/ccgx/README.md +++ b/plugins/ccgx/README.md @@ -69,7 +69,6 @@ These devices use the standard USB DeviceInstanceId values, e.g. They additionally add other instance IDs which corresponds to the silicon ID, application ID and device mode, e.g. - * `USB\VID_17EF&PID_A38F&MODE_BOOT` * `USB\VID_17EF&PID_A38F&SID_1234` * `USB\VID_17EF&PID_A38F&SID_1234&APP_5678` * `USB\VID_17EF&PID_A38F&SID_1234&APP_5678&MODE_FW2` diff --git a/plugins/ccgx/ccgx.quirk b/plugins/ccgx/ccgx.quirk index f9f094150..6f218c787 100644 --- a/plugins/ccgx/ccgx.quirk +++ b/plugins/ccgx/ccgx.quirk @@ -7,10 +7,12 @@ ParentGuid = USB\VID_17EF&PID_A391 [DeviceInstanceId=USB\VID_04B4&PID_521A] Plugin = ccgx GType = FuCcgxHpiDevice + +[DeviceInstanceId=USB\VID_04B4&PID_521A&SID_1F00&APP_6D64] ImageKind = dual-asymmetric ParentGuid = USB\VID_17EF&PID_A391 -[DeviceInstanceId=USB\VID_04B4&PID_521A&MODE_FW2] +[DeviceInstanceId=USB\VID_04B4&PID_521A&SID_1F00&APP_6D64&MODE_FW1] UpdateMessage = Run firmware update again to upgrade the primary firmware. # Lenovo Hybrid Dock @@ -25,4 +27,6 @@ GType = FuCcgxHidDevice [DeviceInstanceId=USB\VID_04B4&PID_5218] Plugin = ccgx GType = FuCcgxHpiDevice + +[DeviceInstanceId=USB\VID_04B4&PID_5218&SID_1F00&APP_6462] ImageKind = dual-symmetric diff --git a/plugins/ccgx/fu-ccgx-hpi-device.c b/plugins/ccgx/fu-ccgx-hpi-device.c index ea5fd8c0d..22bfec75e 100644 --- a/plugins/ccgx/fu-ccgx-hpi-device.c +++ b/plugins/ccgx/fu-ccgx-hpi-device.c @@ -1214,7 +1214,6 @@ fu_ccgx_hpi_device_setup (FuDevice *device, GError **error) CyI2CConfig i2c_config = { 0x0 }; guint32 hpi_event = 0; guint8 mode = 0; - g_autofree gchar *instance_id = NULL; g_autoptr(GError) error_local = NULL; /* set the new config */ @@ -1238,13 +1237,6 @@ fu_ccgx_hpi_device_setup (FuDevice *device, GError **error) self->num_ports = (mode >> 2) & 0x03 ? 2 : 1; self->fw_mode = (FWMode) (mode & 0x03); - /* add extra instance ID */ - instance_id = g_strdup_printf ("USB\\VID_%04X&PID_%04X&MODE_%s", - fu_usb_device_get_vid (FU_USB_DEVICE (device)), - fu_usb_device_get_pid (FU_USB_DEVICE (device)), - fu_ccgx_fw_mode_to_string (self->fw_mode)); - fu_device_add_instance_id (device, instance_id); - /* get silicon ID */ if (!fu_ccgx_hpi_device_ensure_silicon_id (self, error)) return FALSE; @@ -1252,10 +1244,8 @@ fu_ccgx_hpi_device_setup (FuDevice *device, GError **error) /* get correct version if not in boot mode */ if (self->fw_mode != FW_MODE_BOOT) { guint16 bufsz; - guint32 version_raw = 0; guint32 versions[FW_MODE_LAST] = { 0x0 }; guint8 bufver[HPI_DEVICE_VERSION_SIZE_HPIV2] = { 0x0 }; - g_autofree gchar *version = NULL; bufsz = self->hpi_addrsz == 1 ? HPI_DEVICE_VERSION_SIZE_HPIV1 : HPI_DEVICE_VERSION_SIZE_HPIV2; @@ -1272,7 +1262,6 @@ fu_ccgx_hpi_device_setup (FuDevice *device, GError **error) 0x0c, &versions[FW_MODE_FW1], G_LITTLE_ENDIAN, error)) return FALSE; - self->fw_app_type = versions[FW_MODE_FW1] & 0xffff; /* fw2 */ if (!fu_common_read_uint32_safe (bufver, sizeof(bufver), @@ -1280,45 +1269,42 @@ fu_ccgx_hpi_device_setup (FuDevice *device, GError **error) G_LITTLE_ENDIAN, error)) return FALSE; - /* asymmetric these seem swapped, but we can only update the - * "other" image whilst running in the current image */ - if (self->fw_image_type == FW_IMAGE_TYPE_DUAL_SYMMETRIC) { - version_raw = versions[self->fw_mode]; - } else if (self->fw_image_type == FW_IMAGE_TYPE_DUAL_ASYMMETRIC) { - version_raw = versions[fu_ccgx_fw_mode_get_alternate (self->fw_mode)]; + self->fw_app_type = versions[self->fw_mode] & 0xffff; + + if (self->silicon_id != 0x0 && self->fw_app_type != 0x0) { + guint32 version_raw = 0; + g_autofree gchar *instance_id1 = NULL; + g_autofree gchar *instance_id2 = NULL; + g_autofree gchar *version = NULL; + + /* we get fw_image_type from the quirk */ + instance_id1 = g_strdup_printf ("USB\\VID_%04X&PID_%04X&SID_%04X&APP_%04X", + fu_usb_device_get_vid (FU_USB_DEVICE (device)), + fu_usb_device_get_pid (FU_USB_DEVICE (device)), + self->silicon_id, + self->fw_app_type); + fu_device_add_instance_id (device, instance_id1); + instance_id2 = g_strdup_printf ("USB\\VID_%04X&PID_%04X&SID_%04X&APP_%04X&MODE_%s", + fu_usb_device_get_vid (FU_USB_DEVICE (device)), + fu_usb_device_get_pid (FU_USB_DEVICE (device)), + self->silicon_id, + self->fw_app_type, + fu_ccgx_fw_mode_to_string (self->fw_mode)); + fu_device_add_instance_id (device, instance_id2); + + /* asymmetric these seem swapped, but we can only update the + * "other" image whilst running in the current image */ + if (self->fw_image_type == FW_IMAGE_TYPE_DUAL_SYMMETRIC) { + version_raw = versions[self->fw_mode]; + } else if (self->fw_image_type == FW_IMAGE_TYPE_DUAL_ASYMMETRIC) { + version_raw = versions[fu_ccgx_fw_mode_get_alternate (self->fw_mode)]; + } + + /* set device */ + version = fu_ccgx_version_to_string (version_raw); + fu_device_set_version_raw (device, version_raw); + fu_device_set_version (device, version); } - - /* set device */ - version = fu_ccgx_version_to_string (version_raw); - fu_device_set_version_raw (device, version_raw); - fu_device_set_version (device, version); - } - - /* add extra instance IDs */ - if (self->silicon_id != 0x0) { - g_autofree gchar *instance_id1 = NULL; - instance_id1 = g_strdup_printf ("USB\\VID_%04X&PID_%04X&SID_%04X", - fu_usb_device_get_vid (FU_USB_DEVICE (device)), - fu_usb_device_get_pid (FU_USB_DEVICE (device)), - self->silicon_id); - fu_device_add_instance_id (device, instance_id1); - } - if (self->silicon_id != 0x0 && self->fw_app_type != 0x0) { - g_autofree gchar *instance_id2 = NULL; - g_autofree gchar *instance_id3 = NULL; - instance_id2 = g_strdup_printf ("USB\\VID_%04X&PID_%04X&SID_%04X&APP_%04X", - fu_usb_device_get_vid (FU_USB_DEVICE (device)), - fu_usb_device_get_pid (FU_USB_DEVICE (device)), - self->silicon_id, - self->fw_app_type); - fu_device_add_instance_id (device, instance_id2); - instance_id3 = g_strdup_printf ("USB\\VID_%04X&PID_%04X&SID_%04X&APP_%04X&MODE_%s", - fu_usb_device_get_vid (FU_USB_DEVICE (device)), - fu_usb_device_get_pid (FU_USB_DEVICE (device)), - self->silicon_id, - self->fw_app_type, - fu_ccgx_fw_mode_to_string (self->fw_mode)); - fu_device_add_instance_id (device, instance_id3); } /* not supported in boot mode */