| From 7a69ff9c9bde03a690ea783970f664782fc303d8 Mon Sep 17 00:00:00 2001 |
| From: Christian Lamparter <chunkeey@gmail.com> |
| Date: Fri, 4 Nov 2022 17:52:03 +0100 |
| Subject: [PATCH] nvmem: u-boot-env: fix crc32_data_offset on redundant |
| u-boot-env |
| |
| The Western Digital MyBook Live (PowerPC 464/APM82181) |
| has a set of redundant u-boot-env. Loading up the driver |
| the following error: |
| |
| | u_boot_env: Invalid calculated CRC32: 0x4f8f2c86 (expected: 0x98b14514) |
| | u_boot_env: probe of partition@1e000 failed with error -22 |
| |
| Looking up the userspace libubootenv utilities source [0], |
| it looks like the "mark" or "flag" is not part of the |
| crc32 sum... which is unfortunate :( |
| |
| |static int libuboot_load(struct uboot_ctx *ctx) |
| |{ |
| |[...] |
| | if (ctx->redundant) { |
| | [...] |
| | offsetdata = offsetof(struct uboot_env_redund, data); |
| | [...] //-----^^ |
| | } |
| | usable_envsize = ctx->size - offsetdata; |
| | buf[0] = malloc(bufsize); |
| |[...] |
| | for (i = 0; i < copies; i++) { |
| | data = (uint8_t *)(buf[i] + offsetdata); |
| | uint32_t crc; |
| | |
| | ret = devread(ctx, i, buf[i]); |
| | [...] |
| | crc = *(uint32_t *)(buf[i] + offsetcrc); |
| | dev->crc = crc32(0, (uint8_t *)data, usable_envsize); |
| | |
| |
| [0] https://github.com/sbabic/libubootenv/blob/master/src/uboot_env.c#L951 |
| Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables") |
| Signed-off-by: Christian Lamparter <chunkeey@gmail.com> |
| --- |
| drivers/nvmem/u-boot-env.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/nvmem/u-boot-env.c |
| +++ b/drivers/nvmem/u-boot-env.c |
| @@ -135,7 +135,7 @@ static int u_boot_env_parse(struct u_boo |
| break; |
| case U_BOOT_FORMAT_REDUNDANT: |
| crc32_offset = offsetof(struct u_boot_env_image_redundant, crc32); |
| - crc32_data_offset = offsetof(struct u_boot_env_image_redundant, mark); |
| + crc32_data_offset = offsetof(struct u_boot_env_image_redundant, data); |
| data_offset = offsetof(struct u_boot_env_image_redundant, data); |
| break; |
| } |