Changeset 36163


Ignore:
Timestamp:
2013-04-03T11:59:10+02:00 (5 years ago)
Author:
blogic
Message:

[ramips] add patches for v3.8

Signed-off-by: John Crsipin <blogic@…>

Location:
trunk/target/linux/ramips/patches-3.8
Files:
47 added
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ramips/patches-3.8/0208-owrt-mtd-split.patch

    r36162 r36163  
    1111 4 files changed, 184 insertions(+), 1 deletions(-) 
    1212 
    13 --- a/drivers/mtd/Kconfig 
    14 +++ b/drivers/mtd/Kconfig 
    15 @@ -31,6 +31,10 @@ config MTD_ROOTFS_SPLIT 
     13Index: linux-3.9-rc4/drivers/mtd/Kconfig 
     14=================================================================== 
     15--- linux-3.9-rc4.orig/drivers/mtd/Kconfig      2013-03-27 09:26:32.005789709 +0100 
     16+++ linux-3.9-rc4/drivers/mtd/Kconfig   2013-03-27 09:26:35.669789796 +0100 
     17@@ -31,6 +31,10 @@ 
    1618        bool "Automatically split 'rootfs' partition for squashfs" 
    1719        default y 
     
    2426        tristate "RedBoot partition table parsing" 
    2527        ---help--- 
    26 --- a/drivers/mtd/mtdpart.c 
    27 +++ b/drivers/mtd/mtdpart.c 
    28 @@ -844,6 +844,168 @@ static int refresh_rootfs_split(struct m 
     28Index: linux-3.9-rc4/drivers/mtd/mtdpart.c 
     29=================================================================== 
     30--- linux-3.9-rc4.orig/drivers/mtd/mtdpart.c    2013-03-27 09:26:32.281789715 +0100 
     31+++ linux-3.9-rc4/drivers/mtd/mtdpart.c 2013-03-27 17:20:12.874466937 +0100 
     32@@ -844,6 +844,99 @@ 
    2933 } 
    3034 #endif /* CONFIG_MTD_ROOTFS_SPLIT */ 
     
    5155+               return 0; 
    5256+ 
    53 +       return temp + 0x40; 
    54 +} 
    55 + 
    56 +static unsigned long find_eva_size(struct mtd_info *mtd, 
    57 +                                     unsigned long offset) 
    58 +{ 
    59 +#define EVA_MAGIC      0xfeed1281 
    60 +       unsigned long magic = 0; 
    61 +       unsigned long temp; 
    62 +       size_t len; 
    63 +       int ret; 
    64 + 
    65 +       ret = mtd_read(mtd, offset, 4, &len, (void *)&magic); 
    66 +       if (ret || len != sizeof(magic)) 
    67 +               return 0; 
    68 + 
    69 +       if (le32_to_cpu(magic) != EVA_MAGIC) 
    70 +               return 0; 
    71 + 
    72 +       ret = mtd_read(mtd, offset + 4, 4, &len, (void *)&temp); 
    73 +       if (ret || len != sizeof(temp)) 
    74 +               return 0; 
    75 + 
    76 +       /* add eva header size */ 
    77 +       temp = le32_to_cpu(temp) + 0x18; 
    78 + 
    79 +       temp &= ~0xffff; 
    80 +       temp += 0x10000; 
    81 +       return temp; 
     57+       return be32_to_cpu(temp) + 0x40; 
    8258+} 
    8359+ 
     
    9268+               return 0; 
    9369+ 
    94 + 
    9570+       return le32_to_cpu(temp) == SQUASHFS_MAGIC; 
    9671+} 
    9772+ 
    98 +static int detect_eva_squashfs_partition(struct mtd_info *mtd, unsigned long offset) 
     73+static unsigned long find_squashfs_offset(struct mtd_info *mtd, unsigned long _offset) 
    9974+{ 
    100 +       unsigned long temp; 
    101 +       size_t len; 
    102 +       int ret; 
     75+       /* scan the first 2MB at 64K offsets */ 
     76+       int i; 
    10377+ 
    104 +       ret = mtd_read(mtd, offset, 4, &len, (void *)&temp); 
    105 +       if (ret || len != sizeof(temp)) 
    106 +               return 0; 
    107 + 
    108 +       return be32_to_cpu(temp) == SQUASHFS_MAGIC; 
    109 +} 
    110 + 
    111 +static unsigned long find_brnimage_size(struct mtd_info *mtd, 
    112 +                                       unsigned long offset) 
    113 +{ 
    114 +       unsigned long buf[4]; 
    115 +       // Assume at most 2MB of kernel image 
    116 +       unsigned long end = offset + (2 << 20); 
    117 +       unsigned long ptr = offset + 0x400 - 12; 
    118 +       size_t len; 
    119 +       int ret; 
    120 + 
    121 +       while (ptr < end) { 
    122 +               long size_min = ptr - 0x400 - 12 - offset; 
    123 +               long size_max = ptr + 12 - offset; 
    124 +               ret = mtd_read(mtd, ptr, 16, &len, (void *)buf); 
    125 +               if (ret || len != 16) 
    126 +                       return 0; 
    127 + 
    128 +               if (le32_to_cpu(buf[0]) < size_min || 
    129 +                   le32_to_cpu(buf[0]) > size_max) { 
    130 +                       ptr += 0x400; 
    131 +                       continue; 
    132 +               } 
    133 + 
    134 +               if (le32_to_cpu(buf[3]) == SQUASHFS_MAGIC) 
    135 +                       return ptr + 12 - offset; 
    136 + 
    137 +               ptr += 0x400; 
     78+       for (i = 0; i < 32; i++) { 
     79+               unsigned long offset = i * 64 * 1024; 
     80+               if (detect_squashfs_partition(mtd, _offset + offset)) 
     81+                       return offset; 
    13882+       } 
    139 + 
    14083+       return 0; 
    14184+} 
     
    158101+       split_partitions[0].size = find_uimage_size(mtd, part->offset); 
    159102+       if (!split_partitions[0].size) { 
    160 +               split_partitions[0].size = find_eva_size(mtd, part->offset); 
     103+               split_partitions[0].size = find_squashfs_offset(mtd, part->offset); 
    161104+               if (!split_partitions[0].size) { 
    162 +                       split_partitions[0].size = find_brnimage_size(mtd, part->offset); 
    163 +                       if (!split_partitions[0].size) { 
    164 +                               printk(KERN_NOTICE "no uImage or brnImage or eva found in linux partition\n"); 
    165 +                               return -1; 
    166 +                       } 
     105+                       pr_err("failed to split firmware partition\n"); 
     106+                       return -1; 
    167107+               } 
    168108+       } 
    169109+ 
    170 +       if (detect_eva_squashfs_partition(mtd, 
    171 +                                      part->offset 
    172 +                                      + split_partitions[0].size)) { 
    173 +               split_partitions[0].size += 0x100; 
    174 +               pr_info("found eva dummy squashfs behind kernel\n"); 
    175 +       } else if (!detect_squashfs_partition(mtd, 
     110+       if (!detect_squashfs_partition(mtd, 
    176111+                                      part->offset 
    177112+                                      + split_partitions[0].size)) { 
     
    195130  * This function, given a master MTD object and a partition table, creates 
    196131  * and registers slave MTD objects which are bound to the master according to 
    197 @@ -860,7 +1022,7 @@ int add_mtd_partitions(struct mtd_info * 
     132@@ -860,7 +953,7 @@ 
    198133        struct mtd_part *slave; 
    199134        uint64_t cur_offset = 0; 
     
    204139 #endif 
    205140  
    206 @@ -877,6 +1039,15 @@ int add_mtd_partitions(struct mtd_info * 
     141@@ -877,6 +970,14 @@ 
    207142  
    208143                add_mtd_device(&slave->mtd); 
    209144  
    210145+#ifdef CONFIG_MTD_UIMAGE_SPLIT 
    211 +               if (!strcmp(parts[i].name, "linux")) { 
     146+               if (!strcmp(parts[i].name, "firmware")) { 
    212147+                       ret = split_uimage(master, &parts[i]); 
    213 + 
    214148+                       if (ret) 
    215 +                               printk(KERN_WARNING "Can't split linux partition\n"); 
     149+                               printk(KERN_WARNING "Can't split firmware partition\n"); 
    216150+               } 
    217151+#endif 
Note: See TracChangeset for help on using the changeset viewer.