diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2013-01-06 10:08:36 -0500 |
---|---|---|
committer | Artem Bityutskiy <artem.bityutskiy@linux.intel.com> | 2013-02-04 02:26:30 -0500 |
commit | 396afe553bd607dca4d28b00b6cab2ea826acba2 (patch) | |
tree | 00035515e57af158b93944a48d3779255c8fd15b /drivers/mtd/bcm47xxpart.c | |
parent | 648bdbee5d2cc3ff27370d05e7577ade8496bfd0 (diff) |
mtd: bcm47xxpart: register extra "firmware" partition
It's required for accessing trx header (usually re-calculating a
checksum) and for writing a new firmware.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Diffstat (limited to 'drivers/mtd/bcm47xxpart.c')
-rw-r--r-- | drivers/mtd/bcm47xxpart.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/mtd/bcm47xxpart.c b/drivers/mtd/bcm47xxpart.c index 06125eb59f14..3411bc2a1482 100644 --- a/drivers/mtd/bcm47xxpart.c +++ b/drivers/mtd/bcm47xxpart.c | |||
@@ -61,6 +61,8 @@ static int bcm47xxpart_parse(struct mtd_info *master, | |||
61 | uint32_t offset; | 61 | uint32_t offset; |
62 | uint32_t blocksize = 0x10000; | 62 | uint32_t blocksize = 0x10000; |
63 | struct trx_header *trx; | 63 | struct trx_header *trx; |
64 | int trx_part = -1; | ||
65 | int last_trx_part = -1; | ||
64 | 66 | ||
65 | /* Alloc */ | 67 | /* Alloc */ |
66 | parts = kzalloc(sizeof(struct mtd_partition) * BCM47XXPART_MAX_PARTS, | 68 | parts = kzalloc(sizeof(struct mtd_partition) * BCM47XXPART_MAX_PARTS, |
@@ -131,6 +133,10 @@ static int bcm47xxpart_parse(struct mtd_info *master, | |||
131 | if (buf[0x000 / 4] == TRX_MAGIC) { | 133 | if (buf[0x000 / 4] == TRX_MAGIC) { |
132 | trx = (struct trx_header *)buf; | 134 | trx = (struct trx_header *)buf; |
133 | 135 | ||
136 | trx_part = curr_part; | ||
137 | bcm47xxpart_add_part(&parts[curr_part++], "firmware", | ||
138 | offset, 0); | ||
139 | |||
134 | i = 0; | 140 | i = 0; |
135 | /* We have LZMA loader if offset[2] points to sth */ | 141 | /* We have LZMA loader if offset[2] points to sth */ |
136 | if (trx->offset[2]) { | 142 | if (trx->offset[2]) { |
@@ -154,6 +160,8 @@ static int bcm47xxpart_parse(struct mtd_info *master, | |||
154 | offset + trx->offset[i], 0); | 160 | offset + trx->offset[i], 0); |
155 | i++; | 161 | i++; |
156 | 162 | ||
163 | last_trx_part = curr_part - 1; | ||
164 | |||
157 | /* | 165 | /* |
158 | * We have whole TRX scanned, skip to the next part. Use | 166 | * We have whole TRX scanned, skip to the next part. Use |
159 | * roundown (not roundup), as the loop will increase | 167 | * roundown (not roundup), as the loop will increase |
@@ -174,6 +182,9 @@ static int bcm47xxpart_parse(struct mtd_info *master, | |||
174 | parts[i + 1].offset : master->size; | 182 | parts[i + 1].offset : master->size; |
175 | 183 | ||
176 | parts[i].size = next_part_offset - parts[i].offset; | 184 | parts[i].size = next_part_offset - parts[i].offset; |
185 | if (i == last_trx_part && trx_part >= 0) | ||
186 | parts[trx_part].size = next_part_offset - | ||
187 | parts[trx_part].offset; | ||
177 | } | 188 | } |
178 | 189 | ||
179 | *pparts = parts; | 190 | *pparts = parts; |