123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- --- a/drivers/mtd/ar7part.c
- +++ b/drivers/mtd/ar7part.c
- @@ -30,11 +30,14 @@
-
- #include <uapi/linux/magic.h>
-
- +#include <asm/mach-ar7/prom.h>
- +
- #define AR7_PARTS 4
- #define ROOT_OFFSET 0xe0000
-
- #define LOADER_MAGIC1 le32_to_cpu(0xfeedfa42)
- #define LOADER_MAGIC2 le32_to_cpu(0xfeed1281)
- +#define LOADER_MAGIC3 le32_to_cpu(0x434d4d4c)
-
- struct ar7_bin_rec {
- unsigned int checksum;
- @@ -42,12 +45,16 @@ struct ar7_bin_rec {
- unsigned int address;
- };
-
- +int create_titan_partitions(struct mtd_info *master,
- + struct mtd_partition **pparts,
- + struct mtd_part_parser_data *data);
- +
- static int create_mtd_partitions(struct mtd_info *master,
- struct mtd_partition **pparts,
- struct mtd_part_parser_data *data)
- {
- struct ar7_bin_rec header;
- - unsigned int offset;
- + unsigned int offset, mtd_start, mtd_end;
- size_t len;
- unsigned int pre_size = master->erasesize, post_size = 0;
- unsigned int root_offset = ROOT_OFFSET;
- @@ -55,6 +62,16 @@ static int create_mtd_partitions(struct
- int retries = 10;
- struct mtd_partition *ar7_parts;
-
- + const char *prom_str = prom_getenv("ProductID");
- + char mtd_name[] = "mtd1";
- + if(prom_str &&
- + (strcmp(prom_str, "CYWL")==0 ||
- + strcmp(prom_str, "CYWM")==0 ||
- + strcmp(prom_str, "CYLM")==0 ||
- + strcmp(prom_str, "CYLL")==0)){
- + return create_titan_partitions(master, pparts, data);
- + }
- +
- ar7_parts = kzalloc(sizeof(*ar7_parts) * AR7_PARTS, GFP_KERNEL);
- if (!ar7_parts)
- return -ENOMEM;
- @@ -83,34 +100,39 @@ static int create_mtd_partitions(struct
-
- pre_size = offset;
-
- - if (!ar7_parts[1].offset) {
- - ar7_parts[1].offset = master->size - master->erasesize;
- - post_size = master->erasesize;
- - }
- -
- switch (header.checksum) {
- - case LOADER_MAGIC1:
- - while (header.length) {
- - offset += sizeof(header) + header.length;
- - mtd_read(master, offset, sizeof(header), &len,
- - (uint8_t *)&header);
- - }
- - root_offset = offset + sizeof(header) + 4;
- - break;
- case LOADER_MAGIC2:
- + for (retries = 0; retries <= 9; retries++) {
- + mtd_name[3] = '0' + retries;
- + prom_str = prom_getenv(mtd_name);
- + if (prom_str == NULL)
- + continue;
- + sscanf(prom_str, "%i,%i", &mtd_start, &mtd_end);
- + if (pre_size == (mtd_start & 0x1ffffff)) {
- + ar7_parts[1].offset = mtd_end &= 0x1ffffff;
- + ar7_parts[1].size = post_size = master->size - mtd_end;
- + break;
- + }
- + }
- + case LOADER_MAGIC1:
- + root_offset = (header.checksum == LOADER_MAGIC1) ? 4 : 0;
- while (header.length) {
- offset += sizeof(header) + header.length;
- mtd_read(master, offset, sizeof(header), &len,
- (uint8_t *)&header);
- }
- - root_offset = offset + sizeof(header) + 4 + 0xff;
- - root_offset &= ~(uint32_t)0xff;
- + root_offset += offset + sizeof(header);
- break;
- default:
- printk(KERN_WARNING "Unknown magic: %08x\n", header.checksum);
- break;
- }
-
- + if (!ar7_parts[1].offset) {
- + post_size = master->erasesize;
- + ar7_parts[1].offset = master->size - post_size;
- + }
- +
- mtd_read(master, root_offset, sizeof(header), &len, (u8 *)&header);
- if (header.checksum != SQUASHFS_MAGIC) {
- root_offset += master->erasesize - 1;
- --- a/drivers/mtd/titanpart.c
- +++ b/drivers/mtd/titanpart.c
- @@ -149,7 +149,7 @@ static void titan_add_partition(char * e
- }
- int create_titan_partitions(struct mtd_info *master,
- struct mtd_partition **pparts,
- - unsigned long origin)
- + struct mtd_part_parser_data *data)
- {
- struct nsp_img_hdr_head hdr;
- struct nsp_img_hdr_section_info sect_info;
|