| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | From 7a69ff9c9bde03a690ea783970f664782fc303d8 Mon Sep 17 00:00:00 2001 |
| 2 | From: Christian Lamparter <chunkeey@gmail.com> |
| 3 | Date: Fri, 4 Nov 2022 17:52:03 +0100 |
| 4 | Subject: [PATCH] nvmem: u-boot-env: fix crc32_data_offset on redundant |
| 5 | u-boot-env |
| 6 | |
| 7 | The Western Digital MyBook Live (PowerPC 464/APM82181) |
| 8 | has a set of redundant u-boot-env. Loading up the driver |
| 9 | the following error: |
| 10 | |
| 11 | | u_boot_env: Invalid calculated CRC32: 0x4f8f2c86 (expected: 0x98b14514) |
| 12 | | u_boot_env: probe of partition@1e000 failed with error -22 |
| 13 | |
| 14 | Looking up the userspace libubootenv utilities source [0], |
| 15 | it looks like the "mark" or "flag" is not part of the |
| 16 | crc32 sum... which is unfortunate :( |
| 17 | |
| 18 | |static int libuboot_load(struct uboot_ctx *ctx) |
| 19 | |{ |
| 20 | |[...] |
| 21 | | if (ctx->redundant) { |
| 22 | | [...] |
| 23 | | offsetdata = offsetof(struct uboot_env_redund, data); |
| 24 | | [...] //-----^^ |
| 25 | | } |
| 26 | | usable_envsize = ctx->size - offsetdata; |
| 27 | | buf[0] = malloc(bufsize); |
| 28 | |[...] |
| 29 | | for (i = 0; i < copies; i++) { |
| 30 | | data = (uint8_t *)(buf[i] + offsetdata); |
| 31 | | uint32_t crc; |
| 32 | | |
| 33 | | ret = devread(ctx, i, buf[i]); |
| 34 | | [...] |
| 35 | | crc = *(uint32_t *)(buf[i] + offsetcrc); |
| 36 | | dev->crc = crc32(0, (uint8_t *)data, usable_envsize); |
| 37 | | |
| 38 | |
| 39 | [0] https://github.com/sbabic/libubootenv/blob/master/src/uboot_env.c#L951 |
| 40 | Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables") |
| 41 | Signed-off-by: Christian Lamparter <chunkeey@gmail.com> |
| 42 | --- |
| 43 | drivers/nvmem/u-boot-env.c | 2 +- |
| 44 | 1 file changed, 1 insertion(+), 1 deletion(-) |
| 45 | |
| 46 | --- a/drivers/nvmem/u-boot-env.c |
| 47 | +++ b/drivers/nvmem/u-boot-env.c |
| 48 | @@ -135,7 +135,7 @@ static int u_boot_env_parse(struct u_boo |
| 49 | break; |
| 50 | case U_BOOT_FORMAT_REDUNDANT: |
| 51 | crc32_offset = offsetof(struct u_boot_env_image_redundant, crc32); |
| 52 | - crc32_data_offset = offsetof(struct u_boot_env_image_redundant, mark); |
| 53 | + crc32_data_offset = offsetof(struct u_boot_env_image_redundant, data); |
| 54 | data_offset = offsetof(struct u_boot_env_image_redundant, data); |
| 55 | break; |
| 56 | } |