diff options
Diffstat (limited to 'target/linux/brcm63xx/patches-3.8/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch')
| -rw-r--r-- | target/linux/brcm63xx/patches-3.8/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch | 120 | 
1 files changed, 120 insertions, 0 deletions
diff --git a/target/linux/brcm63xx/patches-3.8/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch b/target/linux/brcm63xx/patches-3.8/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch new file mode 100644 index 000000000..3b34eec6b --- /dev/null +++ b/target/linux/brcm63xx/patches-3.8/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch @@ -0,0 +1,120 @@ +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 +@@ -76,10 +76,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; +@@ -93,6 +95,24 @@ static int bcm63xx_parse_cfe_partitions( + 	cfelen = cfe_erasesize; + 	nvramlen = bcm63xx_nvram_get_psi_size() * 1024; + 	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)); +@@ -144,7 +164,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) +@@ -153,6 +173,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) { +@@ -190,15 +216,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 +@@ -58,10 +58,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; + }; +   | 
