aboutsummaryrefslogtreecommitdiffstats
path: root/config
Commit message (Expand)AuthorAgeFilesLines
* config: lxc: enable KERNEL_POSIX_MQUEUELuka Perkov2014-01-241-1/+1
* add x86_64 target supportImre Kaloz2014-01-071-3/+3
* virtualbox emulates the e1000 for a long time nowImre Kaloz2014-01-071-1/+1
* move most of the x86 image generation options to the main fileImre Kaloz2014-01-071-1/+80
* config: add KERNEL_DYNAMIC_DEBUG optionLuka Perkov2013-12-091-0/+12
* move menuconfig options into separate filesImre Kaloz2013-11-224-0/+923
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 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
@@ -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;
 };