Browse Source

handle LOADER_MAGIC2 in ar7part

This is required for Actiontec PK5000 devices. Path from Daniel Gimpelevich.

SVN-Revision: 33753
Florian Fainelli 13 years ago
parent
commit
ec4e61e558
1 changed files with 70 additions and 8 deletions
  1. 70 8
      target/linux/ar7/patches-3.3/920-ar7part.patch

+ 70 - 8
target/linux/ar7/patches-3.3/920-ar7part.patch

@@ -15,7 +15,7 @@
  
  #ifndef SQUASHFS_MAGIC
  #define SQUASHFS_MAGIC	0x73717368
-@@ -45,6 +48,10 @@ struct ar7_bin_rec {
+@@ -45,12 +48,16 @@ struct ar7_bin_rec {
  	unsigned int address;
  };
  
@@ -26,23 +26,85 @@
  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;
 @@ -58,6 +65,16 @@ static int create_mtd_partitions(struct
  	int retries = 10;
  	struct mtd_partition *ar7_parts;
  
-+	const char *prod_id ;
-+	prod_id = prom_getenv("ProductID");
-+	if(prod_id &&
-+		(strcmp(prod_id, "CYWL")==0 ||
-+		strcmp(prod_id, "CYWM")==0 ||
-+		strcmp(prod_id, "CYLM")==0 ||
-+		strcmp(prod_id, "CYLL")==0)){
++	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;
+@@ -86,34 +103,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