From c255034574c725583afac4a6c7eed901b8ac2d7f Mon Sep 17 00:00:00 2001 From: memily Date: Tue, 30 Mar 2021 20:06:49 +0800 Subject: [PATCH] vli: Add VL822 device+share-spi-pd Co-authored-by: Emily Miller --- .../devices/bizlink-no-sku-vli-tier1.json | 16 ++++++++++ .../devices/bizlink-no-sku-vli-tier3.json | 16 ++++++++++ plugins/vli/fu-vli-common.c | 6 ++++ plugins/vli/fu-vli-common.h | 1 + plugins/vli/fu-vli-pd-firmware.c | 2 ++ plugins/vli/fu-vli-usbhub-device.c | 18 +++++++++--- plugins/vli/fu-vli-usbhub-firmware.c | 29 ++++++++++++++----- plugins/vli/meson.build | 1 + plugins/vli/vli-usbhub-bizlink.quirk | 16 ++++++++++ 9 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 data/device-tests/devices/bizlink-no-sku-vli-tier1.json create mode 100644 data/device-tests/devices/bizlink-no-sku-vli-tier3.json create mode 100644 plugins/vli/vli-usbhub-bizlink.quirk diff --git a/data/device-tests/devices/bizlink-no-sku-vli-tier1.json b/data/device-tests/devices/bizlink-no-sku-vli-tier1.json new file mode 100644 index 000000000..5d3cb630b --- /dev/null +++ b/data/device-tests/devices/bizlink-no-sku-vli-tier1.json @@ -0,0 +1,16 @@ +{ + "name": "BizLink Cayenne Hub [VL822+VL103]", + "guids": [ + "a0eff862-6b0b-5571-91ec-a0c4bb25b539" + ], + "releases": [ + { + "version": "A6.83", + "file": "4b71550a59348053430bb4da8939eb24739617f5f03ff0551c4f3331056cfabf-BizLink-Cayenne_New.cab" + }, + { + "version": "06.83", + "file": "071cb1ecd11fed54438541d447d2289cf87ee1cb8c8e342b8e7bc28fcd8d70be-BizLink-Cayenne_Old.cab" + } + ] +} diff --git a/data/device-tests/devices/bizlink-no-sku-vli-tier3.json b/data/device-tests/devices/bizlink-no-sku-vli-tier3.json new file mode 100644 index 000000000..d44cf6812 --- /dev/null +++ b/data/device-tests/devices/bizlink-no-sku-vli-tier3.json @@ -0,0 +1,16 @@ +{ + "name": "BizLink Cayenne Hub [VL822+VL103]", + "guids": [ + "f04ecda7-f2ff-5574-8736-d83c520639f1" + ], + "releases": [ + { + "version": "138.2.5.18", + "file": "4b71550a59348053430bb4da8939eb24739617f5f03ff0551c4f3331056cfabf-BizLink-Cayenne_New.cab" + }, + { + "version": "122.2.5.18", + "file": "071cb1ecd11fed54438541d447d2289cf87ee1cb8c8e342b8e7bc28fcd8d70be-BizLink-Cayenne_Old.cab" + } + ] +} diff --git a/plugins/vli/fu-vli-common.c b/plugins/vli/fu-vli-common.c index 036a5b4ac..e7102ccdd 100644 --- a/plugins/vli/fu-vli-common.c +++ b/plugins/vli/fu-vli-common.c @@ -50,6 +50,8 @@ fu_vli_common_device_kind_to_string (FuVliDeviceKind device_kind) return "VL820Q7"; if (device_kind == FU_VLI_DEVICE_KIND_VL820Q8) return "VL820Q8"; + if (device_kind == FU_VLI_DEVICE_KIND_VL822) + return "VL822"; if (device_kind == FU_VLI_DEVICE_KIND_VL120) return "VL120"; if (device_kind == FU_VLI_DEVICE_KIND_VL210) @@ -108,6 +110,8 @@ fu_vli_common_device_kind_from_string (const gchar *device_kind) return FU_VLI_DEVICE_KIND_VL820Q7; if (g_strcmp0 (device_kind, "VL820Q8") == 0) return FU_VLI_DEVICE_KIND_VL820Q8; + if (g_strcmp0 (device_kind, "VL822") == 0) + return FU_VLI_DEVICE_KIND_VL822; if (g_strcmp0 (device_kind, "VL120") == 0) return FU_VLI_DEVICE_KIND_VL120; if (g_strcmp0 (device_kind, "VL210") == 0) @@ -172,6 +176,8 @@ fu_vli_common_device_kind_get_size (FuVliDeviceKind device_kind) return 0x20000 * 2; if (device_kind == FU_VLI_DEVICE_KIND_VL820Q8) return 0x20000 * 2; + if (device_kind == FU_VLI_DEVICE_KIND_VL822) + return 0x20000 * 2; if (device_kind == FU_VLI_DEVICE_KIND_PS186) return 0x40000; return 0x0; diff --git a/plugins/vli/fu-vli-common.h b/plugins/vli/fu-vli-common.h index c81dfdbfe..dfc0d34bc 100644 --- a/plugins/vli/fu-vli-common.h +++ b/plugins/vli/fu-vli-common.h @@ -34,6 +34,7 @@ typedef enum { FU_VLI_DEVICE_KIND_VL819 = 0x0819, FU_VLI_DEVICE_KIND_VL820Q7 = 0xa820, FU_VLI_DEVICE_KIND_VL820Q8 = 0xb820, + FU_VLI_DEVICE_KIND_VL822 = 0x0822, FU_VLI_DEVICE_KIND_MSP430 = 0xf430, /* guessed */ FU_VLI_DEVICE_KIND_PS186 = 0xf186, /* guessed */ FU_VLI_DEVICE_KIND_RTD21XX = 0xff00, /* guessed */ diff --git a/plugins/vli/fu-vli-pd-firmware.c b/plugins/vli/fu-vli-pd-firmware.c index 5be6e9596..e2ba02473 100644 --- a/plugins/vli/fu-vli-pd-firmware.c +++ b/plugins/vli/fu-vli-pd-firmware.c @@ -50,6 +50,8 @@ fu_vli_pd_firmware_validate_header (FuVliPdFirmware *self) return TRUE; if (GUINT16_FROM_LE (self->hdr.vid) == 0x2D01) return TRUE; + if (GUINT16_FROM_LE (self->hdr.vid) == 0x06C4) + return TRUE; return FALSE; } diff --git a/plugins/vli/fu-vli-usbhub-device.c b/plugins/vli/fu-vli-usbhub-device.c index 4e2cccb57..8b9e09560 100644 --- a/plugins/vli/fu-vli-usbhub-device.c +++ b/plugins/vli/fu-vli-usbhub-device.c @@ -379,6 +379,7 @@ fu_vli_usbhub_device_guess_kind (FuVliUsbhubDevice *self, GError **error) GUsbDevice *usb_device = fu_usb_device_get_dev (FU_USB_DEVICE (self)); guint8 b811P812 = 0x0; guint8 b820Q7Q8 = 0x0; + guint8 b820822 = 0x0; guint8 chipid1 = 0x0; guint8 chipid2 = 0x0; guint8 chipid12 = 0x0; @@ -419,6 +420,10 @@ fu_vli_usbhub_device_guess_kind (FuVliUsbhubDevice *self, GError **error) g_prefix_error (error, "Read_820Q7Q8 failed: "); return FALSE; } + if (!fu_vli_usbhub_device_read_reg (self, 0xf88c, &b820822, error)) { + g_prefix_error (error, "Read_820822 failed: "); + return FALSE; + } if (g_getenv ("FWUPD_VLI_USBHUB_VERBOSE") != NULL) { g_debug ("chipver = 0x%02x", chipver); g_debug ("chipver2 = 0x%02x", chipver2); @@ -428,15 +433,20 @@ fu_vli_usbhub_device_guess_kind (FuVliUsbhubDevice *self, GError **error) g_debug ("chipid12 = 0x%02x", chipid12); g_debug ("chipid22 = 0x%02x", chipid22); g_debug ("b820Q7Q8 = 0x%02x", b820Q7Q8); + g_debug ("b820822 = 0x%02x", b820822); } if (chipid2 == 0x35 && chipid1 == 0x07) { fu_vli_device_set_kind (FU_VLI_DEVICE (self), FU_VLI_DEVICE_KIND_VL210); } else if (chipid2 == 0x35 && chipid1 == 0x18) { - if (b820Q7Q8 & (1 << 2)) - fu_vli_device_set_kind (FU_VLI_DEVICE (self), FU_VLI_DEVICE_KIND_VL820Q8); - else - fu_vli_device_set_kind (FU_VLI_DEVICE (self), FU_VLI_DEVICE_KIND_VL820Q7); + if (b820822 == 0xF0) { + fu_vli_device_set_kind (FU_VLI_DEVICE (self), FU_VLI_DEVICE_KIND_VL822); + } else { + if (b820Q7Q8 & (1 << 2)) + fu_vli_device_set_kind (FU_VLI_DEVICE (self), FU_VLI_DEVICE_KIND_VL820Q8); + else + fu_vli_device_set_kind (FU_VLI_DEVICE (self), FU_VLI_DEVICE_KIND_VL820Q7); + } } else if (chipid2 == 0x35 && chipid1 == 0x31) { fu_vli_device_set_kind (FU_VLI_DEVICE (self), FU_VLI_DEVICE_KIND_VL815); } else if (chipid2 == 0x35 && chipid1 == 0x38) { diff --git a/plugins/vli/fu-vli-usbhub-firmware.c b/plugins/vli/fu-vli-usbhub-firmware.c index 6cf1332e2..db82285d3 100644 --- a/plugins/vli/fu-vli-usbhub-firmware.c +++ b/plugins/vli/fu-vli-usbhub-firmware.c @@ -174,15 +174,30 @@ fu_vli_usbhub_firmware_parse (FuFirmware *firmware, self->device_kind = FU_VLI_DEVICE_KIND_VL211; break; case 0x0518: - /* VL820 == VT3518 */ - if (!fu_common_read_uint8_safe (buf, bufsz, 0xf000, &tmp, error)) { - g_prefix_error (error, "failed to get Q7/Q8 difference: "); + if (!fu_common_read_uint8_safe (buf, bufsz, 0x8021, &tmp, error)) { + g_prefix_error (error, "failed to get 820/822 byte: "); return FALSE; } - if (tmp & (1 << 0)) - self->device_kind = FU_VLI_DEVICE_KIND_VL820Q8; - else - self->device_kind = FU_VLI_DEVICE_KIND_VL820Q7; + /* VL820/VL822 == VT3518 */ + if (tmp == 0xF0) { + self->device_kind = FU_VLI_DEVICE_KIND_VL822; + } else { + /* Q7/Q8 requires searching two addresses for offset value */ + if (!fu_common_read_uint16_safe (buf, bufsz, 0x8018, + &adr_ofs,G_BIG_ENDIAN, error)) { + g_prefix_error (error, "failed to get Q7/Q8 offset mapping: "); + return FALSE; + } + if (!fu_common_read_uint8_safe (buf, bufsz, adr_ofs + 0x2000 + 0x05, + &tmp, error)) { + g_prefix_error (error, "failed to get offset version: "); + return FALSE; + } + if (tmp & (1 << 0)) + self->device_kind = FU_VLI_DEVICE_KIND_VL820Q8; + else + self->device_kind = FU_VLI_DEVICE_KIND_VL820Q7; + } break; case 0x0538: /* VL817 == VT3538 */ diff --git a/plugins/vli/meson.build b/plugins/vli/meson.build index 10274760f..1040b0b21 100644 --- a/plugins/vli/meson.build +++ b/plugins/vli/meson.build @@ -6,6 +6,7 @@ install_data([ 'vli-usbhub.quirk', 'vli-usbhub-lenovo.quirk', 'vli-usbhub-hyper.quirk', + 'vli-usbhub-bizlink.quirk', ], install_dir: join_paths(datadir, 'fwupd', 'quirks.d') ) diff --git a/plugins/vli/vli-usbhub-bizlink.quirk b/plugins/vli/vli-usbhub-bizlink.quirk new file mode 100644 index 000000000..606ac0e3b --- /dev/null +++ b/plugins/vli/vli-usbhub-bizlink.quirk @@ -0,0 +1,16 @@ +# BizLink USB-C Cayenne +[DeviceInstanceId=USB\VID_06C4&PID_C304] +Plugin = vli +GType = FuVliUsbhubDevice +Flags = usb3,has-shared-spi-pd +CounterpartGuid = USB\VID_06C4&PID_C303 +[DeviceInstanceId=USB\VID_06C4&PID_C303] +Plugin = vli +GType = FuVliUsbhubDevice +Flags = usb2 +ParentGuid = USB\VID_06C4&PID_C304 +[DeviceInstanceId=USB\VID_06C4&PID_C305] +Plugin = vli +GType = FuVliUsbhubDevice +Flags = usb2 +ParentGuid = USB\VID_06C4&PID_C304