diff --git a/plugins/ccgx/fu-ccgx-cyacd-firmware-image.c b/plugins/ccgx/fu-ccgx-cyacd-firmware-image.c index 3f7d8a2fa..60948c1ec 100644 --- a/plugins/ccgx/fu-ccgx-cyacd-firmware-image.c +++ b/plugins/ccgx/fu-ccgx-cyacd-firmware-image.c @@ -21,6 +21,7 @@ struct _FuCcgxCyacdFirmwareImage { FuFirmwareImageClass parent_instance; GPtrArray *records; guint16 app_type; + guint16 silicon_id; }; G_DEFINE_TYPE (FuCcgxCyacdFirmwareImage, fu_ccgx_cyacd_firmware_image, FU_TYPE_FIRMWARE_IMAGE) @@ -39,6 +40,13 @@ fu_ccgx_cyacd_firmware_image_get_app_type (FuCcgxCyacdFirmwareImage *self) return self->app_type; } +guint16 +fu_ccgx_cyacd_firmware_image_get_silicon_id (FuCcgxCyacdFirmwareImage *self) +{ + g_return_val_if_fail (FU_IS_CCGX_CYACD_FIRMWARE_IMAGE (self), 0); + return self->silicon_id; +} + static void fu_ccgx_cyacd_firmware_image_record_free (FuCcgxCyacdFirmwareImageRecord *rcd) { @@ -158,8 +166,7 @@ fu_ccgx_cyacd_firmware_image_parse_header (FuCcgxCyacdFirmwareImage *self, "invalid header, expected == 12 chars"); return FALSE; } - fu_firmware_image_set_addr (FU_FIRMWARE_IMAGE (self), - fu_firmware_strparse_uint32 (line)); + self->silicon_id = fu_firmware_strparse_uint32 (line) >> 16; return TRUE; } @@ -221,6 +228,10 @@ fu_ccgx_cyacd_firmware_image_add_record (FuCcgxCyacdFirmwareImage *self, return FALSE; } + /* first data entry */ + if (self->records->len == 0) + fu_firmware_image_set_addr (FU_FIRMWARE_IMAGE (self), rcd->row_number); + /* success */ g_ptr_array_add (self->records, g_steal_pointer (&rcd)); return TRUE; diff --git a/plugins/ccgx/fu-ccgx-cyacd-firmware-image.h b/plugins/ccgx/fu-ccgx-cyacd-firmware-image.h index fabbf4dfb..db469fc44 100644 --- a/plugins/ccgx/fu-ccgx-cyacd-firmware-image.h +++ b/plugins/ccgx/fu-ccgx-cyacd-firmware-image.h @@ -29,3 +29,4 @@ gboolean fu_ccgx_cyacd_firmware_image_add_record (FuCcgxCyacdFirmwareImage *sel GError **error); GPtrArray *fu_ccgx_cyacd_firmware_image_get_records (FuCcgxCyacdFirmwareImage *self); guint16 fu_ccgx_cyacd_firmware_image_get_app_type (FuCcgxCyacdFirmwareImage *self); +guint16 fu_ccgx_cyacd_firmware_image_get_silicon_id (FuCcgxCyacdFirmwareImage *self); diff --git a/plugins/ccgx/fu-ccgx-hpi-device.c b/plugins/ccgx/fu-ccgx-hpi-device.c index e02c927bc..f3a5648f2 100644 --- a/plugins/ccgx/fu-ccgx-hpi-device.c +++ b/plugins/ccgx/fu-ccgx-hpi-device.c @@ -573,15 +573,16 @@ fu_ccgx_hpi_device_prepare_firmware (FuDevice *device, images = fu_firmware_get_images (firmware); for (guint i = 0; i < images->len; i++) { FuFirmwareImage *img = g_ptr_array_index (images, i); - guint16 fw_app_type = fu_ccgx_cyacd_firmware_image_get_app_type (FU_CCGX_CYACD_FIRMWARE_IMAGE (img)); - if (fu_firmware_image_get_addr (img) != self->silicon_id) { + FuCcgxCyacdFirmwareImage *img_ccgx = FU_CCGX_CYACD_FIRMWARE_IMAGE (img); + guint16 fw_app_type = fu_ccgx_cyacd_firmware_image_get_app_type (img_ccgx); + guint16 fw_silicon_id = fu_ccgx_cyacd_firmware_image_get_silicon_id (img_ccgx); + if (fw_silicon_id != self->silicon_id) { g_set_error (error, FWUPD_ERROR, FWUPD_ERROR_NOT_SUPPORTED, "silicon id mismatch on image %u, " "expected 0x%x, got 0x%x", - i, self->silicon_id, - (guint) fu_firmware_image_get_addr (img)); + i, self->silicon_id, fw_silicon_id); return NULL; } if (fw_app_type != self->fw_app_type) {