diff options
Diffstat (limited to 'drivers/mtd/redboot.c')
| -rw-r--r-- | drivers/mtd/redboot.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c index 7b7ca5ab5ae4..d01b6a9198e0 100644 --- a/drivers/mtd/redboot.c +++ b/drivers/mtd/redboot.c | |||
| @@ -89,8 +89,34 @@ static int parse_redboot_partitions(struct mtd_info *master, | |||
| 89 | i = numslots; | 89 | i = numslots; |
| 90 | break; | 90 | break; |
| 91 | } | 91 | } |
| 92 | if (!memcmp(buf[i].name, "FIS directory", 14)) | 92 | if (!memcmp(buf[i].name, "FIS directory", 14)) { |
| 93 | /* This is apparently the FIS directory entry for the | ||
| 94 | * FIS directory itself. The FIS directory size is | ||
| 95 | * one erase block, if the buf[i].size field is | ||
| 96 | * swab32(erasesize) then we know we are looking at | ||
| 97 | * a byte swapped FIS directory - swap all the entries! | ||
| 98 | * (NOTE: this is 'size' not 'data_length', size is | ||
| 99 | * the full size of the entry.) | ||
| 100 | */ | ||
| 101 | if (swab32(buf[i].size) == master->erasesize) { | ||
| 102 | int j; | ||
| 103 | for (j = 0; j < numslots && buf[j].name[0] != 0xff; ++j) { | ||
| 104 | /* The unsigned long fields were written with the | ||
| 105 | * wrong byte sex, name and pad have no byte sex. | ||
| 106 | */ | ||
| 107 | # define do_swab32(x) (x) = swab32(x) | ||
| 108 | do_swab32(buf[j].flash_base); | ||
| 109 | do_swab32(buf[j].mem_base); | ||
| 110 | do_swab32(buf[j].size); | ||
| 111 | do_swab32(buf[j].entry_point); | ||
| 112 | do_swab32(buf[j].data_length); | ||
| 113 | do_swab32(buf[j].desc_cksum); | ||
| 114 | do_swab32(buf[j].file_cksum); | ||
| 115 | # undef do_swab32 | ||
| 116 | } | ||
| 117 | } | ||
| 93 | break; | 118 | break; |
| 119 | } | ||
| 94 | } | 120 | } |
| 95 | if (i == numslots) { | 121 | if (i == numslots) { |
| 96 | /* Didn't find it */ | 122 | /* Didn't find it */ |
