Only netboot tested. Flash at your own risk. Signed-off-by: Jonas Gorski <jogo@openwrt.org> SVN-Revision: 47702
		
			
				
	
	
		
			121 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
Allow bcm63xxpart to receive a caldata offset if calibration data is
 | 
						|
contained in flash.
 | 
						|
---
 | 
						|
 drivers/mtd/bcm63xxpart.c      |   51 ++++++++++++++++++++++++++++++++++++---
 | 
						|
 include/linux/mtd/partitions.h |    2 +
 | 
						|
 2 files changed, 49 insertions(+), 4 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/mtd/bcm63xxpart.c
 | 
						|
+++ b/drivers/mtd/bcm63xxpart.c
 | 
						|
@@ -53,10 +53,12 @@ static int bcm63xx_parse_cfe_partitions(
 | 
						|
 	struct mtd_partition *parts;
 | 
						|
 	int ret;
 | 
						|
 	size_t retlen;
 | 
						|
-	unsigned int rootfsaddr, kerneladdr, spareaddr;
 | 
						|
+	unsigned int rootfsaddr, kerneladdr, spareaddr, nvramaddr;
 | 
						|
 	unsigned int rootfslen, kernellen, sparelen, totallen;
 | 
						|
 	unsigned int cfelen, nvramlen;
 | 
						|
 	unsigned int cfe_erasesize;
 | 
						|
+	unsigned int caldatalen1 = 0, caldataaddr1 = 0;
 | 
						|
+	unsigned int caldatalen2 = 0, caldataaddr2 = 0;
 | 
						|
 	int i;
 | 
						|
 	u32 computed_crc;
 | 
						|
 	bool rootfs_first = false;
 | 
						|
@@ -70,6 +72,24 @@ static int bcm63xx_parse_cfe_partitions(
 | 
						|
 	cfelen = cfe_erasesize;
 | 
						|
 	nvramlen = bcm63xx_nvram_get_psi_size() * SZ_1K;
 | 
						|
 	nvramlen = roundup(nvramlen, cfe_erasesize);
 | 
						|
+	nvramaddr = master->size - nvramlen;
 | 
						|
+
 | 
						|
+	if (data) {
 | 
						|
+		if (data->caldata[0]) {
 | 
						|
+			caldatalen1 = cfe_erasesize;
 | 
						|
+			caldataaddr1 = rounddown(data->caldata[0],
 | 
						|
+						 cfe_erasesize);
 | 
						|
+		}
 | 
						|
+		if (data->caldata[1]) {
 | 
						|
+			caldatalen2 = cfe_erasesize;
 | 
						|
+			caldataaddr2 = rounddown(data->caldata[1],
 | 
						|
+						 cfe_erasesize);
 | 
						|
+		}
 | 
						|
+		if (caldataaddr1 == caldataaddr2) {
 | 
						|
+			caldataaddr2 = 0;
 | 
						|
+			caldatalen2 = 0;
 | 
						|
+		}
 | 
						|
+	}
 | 
						|
 
 | 
						|
 	/* Allocate memory for buffer */
 | 
						|
 	buf = vmalloc(sizeof(struct bcm_tag));
 | 
						|
@@ -121,7 +141,7 @@ static int bcm63xx_parse_cfe_partitions(
 | 
						|
 		rootfsaddr = 0;
 | 
						|
 		spareaddr = cfelen;
 | 
						|
 	}
 | 
						|
-	sparelen = master->size - spareaddr - nvramlen;
 | 
						|
+	sparelen = min_not_zero(nvramaddr, caldataaddr1) - spareaddr;
 | 
						|
 
 | 
						|
 	/* Determine number of partitions */
 | 
						|
 	if (rootfslen > 0)
 | 
						|
@@ -130,6 +150,12 @@ static int bcm63xx_parse_cfe_partitions(
 | 
						|
 	if (kernellen > 0)
 | 
						|
 		nrparts++;
 | 
						|
 
 | 
						|
+	if (caldatalen1 > 0)
 | 
						|
+		nrparts++;
 | 
						|
+
 | 
						|
+	if (caldatalen2 > 0)
 | 
						|
+		nrparts++;
 | 
						|
+
 | 
						|
 	/* Ask kernel for more memory */
 | 
						|
 	parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
 | 
						|
 	if (!parts) {
 | 
						|
@@ -167,15 +193,32 @@ static int bcm63xx_parse_cfe_partitions(
 | 
						|
 		curpart++;
 | 
						|
 	}
 | 
						|
 
 | 
						|
+	if (caldatalen1 > 0) {
 | 
						|
+		if (caldatalen2 > 0)
 | 
						|
+			parts[curpart].name = "cal_data1";
 | 
						|
+		else
 | 
						|
+			parts[curpart].name = "cal_data";
 | 
						|
+		parts[curpart].offset = caldataaddr1;
 | 
						|
+		parts[curpart].size = caldatalen1;
 | 
						|
+		curpart++;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	if (caldatalen2 > 0) {
 | 
						|
+		parts[curpart].name = "cal_data2";
 | 
						|
+		parts[curpart].offset = caldataaddr2;
 | 
						|
+		parts[curpart].size = caldatalen2;
 | 
						|
+		curpart++;
 | 
						|
+	}
 | 
						|
+
 | 
						|
 	parts[curpart].name = "nvram";
 | 
						|
-	parts[curpart].offset = master->size - nvramlen;
 | 
						|
+	parts[curpart].offset = nvramaddr;
 | 
						|
 	parts[curpart].size = nvramlen;
 | 
						|
 	curpart++;
 | 
						|
 
 | 
						|
 	/* Global partition "linux" to make easy firmware upgrade */
 | 
						|
 	parts[curpart].name = "linux";
 | 
						|
 	parts[curpart].offset = cfelen;
 | 
						|
-	parts[curpart].size = master->size - cfelen - nvramlen;
 | 
						|
+	parts[curpart].size = min_not_zero(nvramaddr, caldataaddr1) - cfelen;
 | 
						|
 
 | 
						|
 	for (i = 0; i < nrparts; i++)
 | 
						|
 		pr_info("Partition %d is %s offset %llx and length %llx\n", i,
 | 
						|
--- a/include/linux/mtd/partitions.h
 | 
						|
+++ b/include/linux/mtd/partitions.h
 | 
						|
@@ -56,10 +56,12 @@ struct device_node;
 | 
						|
 /**
 | 
						|
  * struct mtd_part_parser_data - used to pass data to MTD partition parsers.
 | 
						|
  * @origin: for RedBoot, start address of MTD device
 | 
						|
+ * @caldata: for CFE, start address of wifi calibration data
 | 
						|
  * @of_node: for OF parsers, device node containing partitioning information
 | 
						|
  */
 | 
						|
 struct mtd_part_parser_data {
 | 
						|
 	unsigned long origin;
 | 
						|
+	unsigned long caldata[2];
 | 
						|
 	struct device_node *of_node;
 | 
						|
 };
 | 
						|
 
 |