Root/target/linux/brcm63xx/patches-3.6/436-MTD-bcm63xxpart-allow-passing-a-caldata-offset.patch

1From 8ab86c5dc38ad4de1442e50e0adbc354d9184d71 Mon Sep 17 00:00:00 2001
2From: Jonas Gorski <jonas.gorski@gmail.com>
3Date: Tue, 1 May 2012 14:38:41 +0200
4Subject: [PATCH 68/79] MTD: bcm63xxpart: allow passing a caldata offset
5
6Allow bcm63xxpart to receive a caldata offset if calibration data is
7contained in flash.
8---
9 drivers/mtd/bcm63xxpart.c | 47 ++++++++++++++++++++++++++++++++++++++--
10 include/linux/mtd/partitions.h | 2 ++
11 2 files changed, 47 insertions(+), 2 deletions(-)
12
13--- a/drivers/mtd/bcm63xxpart.c
14+++ b/drivers/mtd/bcm63xxpart.c
15@@ -80,6 +80,8 @@ static int bcm63xx_parse_cfe_partitions(
16     unsigned int rootfslen, kernellen, sparelen, totallen;
17     unsigned int cfelen, nvramlen;
18     unsigned int cfe_erasesize;
19+ unsigned int caldatalen1 = 0, caldataaddr1 = 0;
20+ unsigned int caldatalen2 = 0, caldataaddr2 = 0;
21     int i;
22     u32 computed_crc;
23     bool rootfs_first = false;
24@@ -94,6 +96,23 @@ static int bcm63xx_parse_cfe_partitions(
25     nvramlen = bcm63xx_nvram_get_psi_size() * 1024;
26     nvramlen = roundup(nvramlen, cfe_erasesize);
27 
28+ if (data) {
29+ if (data->caldata[0]) {
30+ caldatalen1 = cfe_erasesize;
31+ caldataaddr1 = rounddown(data->caldata[0],
32+ cfe_erasesize);
33+ }
34+ if (data->caldata[1]) {
35+ caldatalen2 = cfe_erasesize;
36+ caldataaddr2 = rounddown(data->caldata[1],
37+ cfe_erasesize);
38+ }
39+ if (caldataaddr1 == caldataaddr2) {
40+ caldataaddr2 = 0;
41+ caldatalen2 = 0;
42+ }
43+ }
44+
45     /* Allocate memory for buffer */
46     buf = vmalloc(sizeof(struct bcm_tag));
47     if (!buf)
48@@ -144,7 +163,7 @@ static int bcm63xx_parse_cfe_partitions(
49         rootfsaddr = 0;
50         spareaddr = cfelen;
51     }
52- sparelen = master->size - spareaddr - nvramlen;
53+ sparelen = master->size - spareaddr - nvramlen - caldatalen1 - caldatalen2;
54 
55     /* Determine number of partitions */
56     if (rootfslen > 0)
57@@ -153,6 +172,12 @@ static int bcm63xx_parse_cfe_partitions(
58     if (kernellen > 0)
59         nrparts++;
60 
61+ if (caldatalen1 > 0)
62+ nrparts++;
63+
64+ if (caldatalen2 > 0)
65+ nrparts++;
66+
67     /* Ask kernel for more memory */
68     parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
69     if (!parts) {
70@@ -190,6 +215,23 @@ static int bcm63xx_parse_cfe_partitions(
71         curpart++;
72     }
73 
74+ if (caldatalen1 > 0) {
75+ if (caldatalen2 > 0)
76+ parts[curpart].name = "cal_data1";
77+ else
78+ parts[curpart].name = "cal_data";
79+ parts[curpart].offset = caldataaddr1;
80+ parts[curpart].size = caldatalen1;
81+ curpart++;
82+ }
83+
84+ if (caldatalen2 > 0) {
85+ parts[curpart].name = "cal_data2";
86+ parts[curpart].offset = caldataaddr2;
87+ parts[curpart].size = caldatalen2;
88+ curpart++;
89+ }
90+
91     parts[curpart].name = "nvram";
92     parts[curpart].offset = master->size - nvramlen;
93     parts[curpart].size = nvramlen;
94@@ -198,7 +240,8 @@ static int bcm63xx_parse_cfe_partitions(
95     /* Global partition "linux" to make easy firmware upgrade */
96     parts[curpart].name = "linux";
97     parts[curpart].offset = cfelen;
98- parts[curpart].size = master->size - cfelen - nvramlen;
99+ parts[curpart].size = master->size - cfelen - nvramlen
100+ - caldatalen1 - caldatalen2;
101 
102     for (i = 0; i < nrparts; i++)
103         pr_info("Partition %d is %s offset %llx and length %llx\n", i,
104--- a/include/linux/mtd/partitions.h
105+++ b/include/linux/mtd/partitions.h
106@@ -58,10 +58,12 @@ struct device_node;
107 /**
108  * struct mtd_part_parser_data - used to pass data to MTD partition parsers.
109  * @origin: for RedBoot, start address of MTD device
110+ * @caldata: for CFE, start address of wifi calibration data
111  * @of_node: for OF parsers, device node containing partitioning information
112  */
113 struct mtd_part_parser_data {
114     unsigned long origin;
115+ unsigned long caldata[2];
116     struct device_node *of_node;
117 };
118 
119

Archive Download this file



interactive