mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 16:31:13 +00:00
0ddae04c22
Should fix parser data containing uninitialized values for of probed physmap flashes, which could break e.g. the redboot parser. Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
120 lines
3.4 KiB
Diff
120 lines
3.4 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,9 +56,11 @@ 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
|
|
*/
|
|
struct mtd_part_parser_data {
|
|
unsigned long origin;
|
|
+ unsigned long caldata[2];
|
|
};
|
|
|
|
|