source: trunk/target/linux/atheros/patches-2.6.36/141-redboot_various_erase_size_fix.patch @ 23454

Last change on this file since 23454 was 23454, checked in by acoul, 6 years ago

linux/atheros: add preliminary 2.6.36 kernel support (refresh patches)

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

    a b static inline int redboot_checksum(struc 
    5757        return 1; 
    5858} 
    5959 
     60static uint32_t mtd_get_offset_erasesize(struct mtd_info *mtd, uint64_t offset) 
     61{ 
     62        struct mtd_erase_region_info *regions = mtd->eraseregions; 
     63        int i; 
     64 
     65        for (i = 0; i < mtd->numeraseregions; i++) { 
     66                if (regions[i].offset + 
     67                    regions[i].numblocks * regions[i].erasesize <= offset) 
     68                        continue; 
     69 
     70                return regions[i].erasesize; 
     71        } 
     72 
     73        return mtd->erasesize; 
     74} 
     75 
    6076static int parse_redboot_partitions(struct mtd_info *master, 
    6177                             struct mtd_partition **pparts, 
    6278                             unsigned long fis_origin) 
    static int parse_redboot_partitions(stru 
    7389        int namelen = 0; 
    7490        int nulllen = 0; 
    7591        int numslots; 
     92        int first_slot; 
    7693        unsigned long offset; 
    7794#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED 
    7895        static char nullstring[] = "unallocated"; 
    static int parse_redboot_partitions(stru 
    186203                goto out; 
    187204        } 
    188205 
    189         for (i = 0; i < numslots; i++) { 
     206        first_slot = (buf[i].flash_base & (master->erasesize - 1)) / 
     207                     sizeof(struct fis_image_desc); 
     208 
     209        for (i = first_slot; i < first_slot + numslots; i++) { 
    190210                struct fis_list *new_fl, **prev; 
    191211 
    192212                if (buf[i].name[0] == 0xff) { 
    static int parse_redboot_partitions(stru 
    262282        } 
    263283#endif 
    264284        for ( ; i<nrparts; i++) { 
    265                 if(max_offset < buf[i].flash_base + buf[i].size) 
    266                         max_offset = buf[i].flash_base + buf[i].size; 
    267285                parts[i].size = fl->img->size; 
    268286                parts[i].offset = fl->img->flash_base; 
    269287                parts[i].name = names; 
    270288 
     289                if (max_offset < parts[i].offset + parts[i].size) 
     290                        max_offset = parts[i].offset + parts[i].size; 
     291 
    271292                strcpy(names, fl->img->name); 
    272293#ifdef CONFIG_MTD_REDBOOT_PARTS_READONLY 
    273294                if (!memcmp(names, "RedBoot", 8) || 
    static int parse_redboot_partitions(stru 
    297318                fl = fl->next; 
    298319                kfree(tmp_fl); 
    299320        } 
    300         if(master->size - max_offset >= master->erasesize) 
     321 
     322        if (master->size - max_offset >= 
     323            mtd_get_offset_erasesize(master, max_offset)) 
    301324        { 
    302325                parts[nrparts].size = master->size - max_offset; 
    303326                parts[nrparts].offset = max_offset; 
Note: See TracBrowser for help on using the repository browser.