source: trunk/target/linux/atheros/patches-2.6.32/141-redboot_various_erase_size_fix.patch @ 20213

Last change on this file since 20213 was 20213, checked in by juhosg, 7 years ago

atheros: fix FIS directory parsing on Top Boot flash chips

File size: 2.1 KB
  • drivers/mtd/redboot.c

    a b static inline int redboot_checksum(struc 
    3939        return 1; 
    4040} 
    4141 
     42static uint32_t mtd_get_offset_erasesize(struct mtd_info *mtd, uint64_t offset) 
     43{ 
     44        struct mtd_erase_region_info *regions = mtd->eraseregions; 
     45        int i; 
     46 
     47        for (i = 0; i < mtd->numeraseregions; i++) { 
     48                if (regions[i].offset + 
     49                    regions[i].numblocks * regions[i].erasesize <= offset) 
     50                        continue; 
     51 
     52                return regions[i].erasesize; 
     53        } 
     54 
     55        return mtd->erasesize; 
     56} 
     57 
    4258static int parse_redboot_partitions(struct mtd_info *master, 
    4359                             struct mtd_partition **pparts, 
    4460                             unsigned long fis_origin) 
    static int parse_redboot_partitions(stru 
    5571        int namelen = 0; 
    5672        int nulllen = 0; 
    5773        int numslots; 
     74        int first_slot; 
    5875        unsigned long offset; 
    5976#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED 
    6077        static char nullstring[] = "unallocated"; 
    static int parse_redboot_partitions(stru 
    168185                goto out; 
    169186        } 
    170187 
    171         for (i = 0; i < numslots; i++) { 
     188        first_slot = (buf[i].flash_base & (master->erasesize - 1)) / 
     189                     sizeof(struct fis_image_desc); 
     190 
     191        for (i = first_slot; i < first_slot + numslots; i++) { 
    172192                struct fis_list *new_fl, **prev; 
    173193 
    174194                if (buf[i].name[0] == 0xff) { 
    static int parse_redboot_partitions(stru 
    244264        } 
    245265#endif 
    246266        for ( ; i<nrparts; i++) { 
    247                 if(max_offset < buf[i].flash_base + buf[i].size) 
    248                         max_offset = buf[i].flash_base + buf[i].size; 
    249267                parts[i].size = fl->img->size; 
    250268                parts[i].offset = fl->img->flash_base; 
    251269                parts[i].name = names; 
    252270 
     271                if (max_offset < parts[i].offset + parts[i].size) 
     272                        max_offset = parts[i].offset + parts[i].size; 
     273 
    253274                strcpy(names, fl->img->name); 
    254275#ifdef CONFIG_MTD_REDBOOT_PARTS_READONLY 
    255276                if (!memcmp(names, "RedBoot", 8) || 
    static int parse_redboot_partitions(stru 
    279300                fl = fl->next; 
    280301                kfree(tmp_fl); 
    281302        } 
    282         if(master->size - max_offset >= master->erasesize) 
     303 
     304        if (master->size - max_offset >= 
     305            mtd_get_offset_erasesize(master, max_offset)) 
    283306        { 
    284307                parts[nrparts].size = master->size - max_offset; 
    285308                parts[nrparts].offset = max_offset; 
Note: See TracBrowser for help on using the repository browser.