[MTD] DiskOnChip: Scan the entire device for Media Headers.
Add a new module param, show_firmware_partition. Signed-off-by: Dan Brown <dan_brown@ieee.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
15fc108606
commit
1a78ff6b41
1 changed files with 30 additions and 24 deletions
|
@ -16,7 +16,7 @@
|
||||||
*
|
*
|
||||||
* Interface to generic NAND code for M-Systems DiskOnChip devices
|
* Interface to generic NAND code for M-Systems DiskOnChip devices
|
||||||
*
|
*
|
||||||
* $Id: diskonchip.c,v 1.49 2005/02/22 21:48:21 gleixner Exp $
|
* $Id: diskonchip.c,v 1.50 2005/03/29 20:57:45 dbrown Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
@ -81,11 +81,6 @@ struct doc_priv {
|
||||||
struct mtd_info *nextdoc;
|
struct mtd_info *nextdoc;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Max number of eraseblocks to scan (from start of device) for the (I)NFTL
|
|
||||||
MediaHeader. The spec says to just keep going, I think, but that's just
|
|
||||||
silly. */
|
|
||||||
#define MAX_MEDIAHEADER_SCAN 8
|
|
||||||
|
|
||||||
/* This is the syndrome computed by the HW ecc generator upon reading an empty
|
/* This is the syndrome computed by the HW ecc generator upon reading an empty
|
||||||
page, one with all 0xff for data and stored ecc code. */
|
page, one with all 0xff for data and stored ecc code. */
|
||||||
static u_char empty_read_syndrome[6] = { 0x26, 0xff, 0x6d, 0x47, 0x73, 0x7a };
|
static u_char empty_read_syndrome[6] = { 0x26, 0xff, 0x6d, 0x47, 0x73, 0x7a };
|
||||||
|
@ -114,6 +109,9 @@ module_param(no_ecc_failures, int, 0);
|
||||||
#ifdef CONFIG_MTD_PARTITIONS
|
#ifdef CONFIG_MTD_PARTITIONS
|
||||||
static int no_autopart=0;
|
static int no_autopart=0;
|
||||||
module_param(no_autopart, int, 0);
|
module_param(no_autopart, int, 0);
|
||||||
|
|
||||||
|
static int show_firmware_partition=0;
|
||||||
|
module_param(show_firmware_partition, int, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MTD_NAND_DISKONCHIP_BBTWRITE
|
#ifdef MTD_NAND_DISKONCHIP_BBTWRITE
|
||||||
|
@ -1071,12 +1069,11 @@ static int __init find_media_headers(struct mtd_info *mtd, u_char *buf,
|
||||||
{
|
{
|
||||||
struct nand_chip *this = mtd->priv;
|
struct nand_chip *this = mtd->priv;
|
||||||
struct doc_priv *doc = this->priv;
|
struct doc_priv *doc = this->priv;
|
||||||
unsigned offs, end = (MAX_MEDIAHEADER_SCAN << this->phys_erase_shift);
|
unsigned offs;
|
||||||
int ret;
|
int ret;
|
||||||
size_t retlen;
|
size_t retlen;
|
||||||
|
|
||||||
end = min(end, mtd->size); // paranoia
|
for (offs = 0; offs < mtd->size; offs += mtd->erasesize) {
|
||||||
for (offs = 0; offs < end; offs += mtd->erasesize) {
|
|
||||||
ret = mtd->read(mtd, offs, mtd->oobblock, &retlen, buf);
|
ret = mtd->read(mtd, offs, mtd->oobblock, &retlen, buf);
|
||||||
if (retlen != mtd->oobblock) continue;
|
if (retlen != mtd->oobblock) continue;
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -1118,6 +1115,7 @@ static inline int __init nftl_partscan(struct mtd_info *mtd,
|
||||||
u_char *buf;
|
u_char *buf;
|
||||||
struct NFTLMediaHeader *mh;
|
struct NFTLMediaHeader *mh;
|
||||||
const unsigned psize = 1 << this->page_shift;
|
const unsigned psize = 1 << this->page_shift;
|
||||||
|
int numparts = 0;
|
||||||
unsigned blocks, maxblocks;
|
unsigned blocks, maxblocks;
|
||||||
int offs, numheaders;
|
int offs, numheaders;
|
||||||
|
|
||||||
|
@ -1183,19 +1181,28 @@ static inline int __init nftl_partscan(struct mtd_info *mtd,
|
||||||
offs <<= this->page_shift;
|
offs <<= this->page_shift;
|
||||||
offs += mtd->erasesize;
|
offs += mtd->erasesize;
|
||||||
|
|
||||||
parts[0].name = " DiskOnChip BDTL partition";
|
if (show_firmware_partition == 1) {
|
||||||
parts[0].offset = offs;
|
parts[0].name = " DiskOnChip Firmware / Media Header partition";
|
||||||
parts[0].size = (mh->NumEraseUnits - numheaders) << this->bbt_erase_shift;
|
parts[0].offset = 0;
|
||||||
|
parts[0].size = offs;
|
||||||
offs += parts[0].size;
|
numparts = 1;
|
||||||
if (offs < mtd->size) {
|
|
||||||
parts[1].name = " DiskOnChip Remainder partition";
|
|
||||||
parts[1].offset = offs;
|
|
||||||
parts[1].size = mtd->size - offs;
|
|
||||||
ret = 2;
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
ret = 1;
|
|
||||||
|
parts[numparts].name = " DiskOnChip BDTL partition";
|
||||||
|
parts[numparts].offset = offs;
|
||||||
|
parts[numparts].size = (mh->NumEraseUnits - numheaders) << this->bbt_erase_shift;
|
||||||
|
|
||||||
|
offs += parts[numparts].size;
|
||||||
|
numparts++;
|
||||||
|
|
||||||
|
if (offs < mtd->size) {
|
||||||
|
parts[numparts].name = " DiskOnChip Remainder partition";
|
||||||
|
parts[numparts].offset = offs;
|
||||||
|
parts[numparts].size = mtd->size - offs;
|
||||||
|
numparts++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = numparts;
|
||||||
out:
|
out:
|
||||||
kfree(buf);
|
kfree(buf);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1289,14 +1296,13 @@ static inline int __init inftl_partscan(struct mtd_info *mtd,
|
||||||
ip->lastUnit, ip->flags,
|
ip->lastUnit, ip->flags,
|
||||||
ip->spareUnits);
|
ip->spareUnits);
|
||||||
|
|
||||||
#if 0
|
if ((show_firmware_partition == 1) &&
|
||||||
if ((i == 0) && (ip->firstUnit > 0)) {
|
(i == 0) && (ip->firstUnit > 0)) {
|
||||||
parts[0].name = " DiskOnChip IPL / Media Header partition";
|
parts[0].name = " DiskOnChip IPL / Media Header partition";
|
||||||
parts[0].offset = 0;
|
parts[0].offset = 0;
|
||||||
parts[0].size = mtd->erasesize * ip->firstUnit;
|
parts[0].size = mtd->erasesize * ip->firstUnit;
|
||||||
numparts = 1;
|
numparts = 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ip->flags & INFTL_BINARY)
|
if (ip->flags & INFTL_BINARY)
|
||||||
parts[numparts].name = " DiskOnChip BDK partition";
|
parts[numparts].name = " DiskOnChip BDK partition";
|
||||||
|
|
Loading…
Reference in a new issue