mtd: nand: add 'oob_required' argument to NAND {read,write}_page interfaces
New NAND controllers can perform read/write via HW engines which don't expose OOB data in their DMA mode. To reflect this, we should rework the nand_chip / nand_ecc_ctrl interfaces that assume that drivers will always read/write OOB data in the nand_chip.oob_poi buffer. A better interface includes a boolean argument that explicitly tells the callee when OOB data is requested by the calling layer (for reading/writing to/from nand_chip.oob_poi). This patch adds the 'oob_required' parameter to each relevant {read,write}_page interface; all 'oob_required' parameters are left unused for now. The next patch will set the parameter properly in the nand_base.c callers, and follow-up patches will make use of 'oob_required' in some of the callee functions. Note that currently, there is no harm in ignoring the 'oob_required' parameter and *always* utilizing nand_chip.oob_poi, but there can be performance/complexity/design benefits from avoiding filling oob_poi in the common case. I will try to implement this for some drivers which can be ported easily. Note: I couldn't compile-test all of these easily, as some had ARCH dependencies. [dwmw2: Merge later 1/0 vs. true/false cleanup] Signed-off-by: Brian Norris <computersforpeace@gmail.com> Reviewed-by: Shmulik Ladkani <shmulik.ladkani@gmail.com> Acked-by: Jiandong Zheng <jdzheng@broadcom.com> Acked-by: Mike Dunn <mikedunn@newsguy.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:

committed by
David Woodhouse

parent
b4f7aa84d6
commit
1fbb938dff
@@ -787,13 +787,13 @@ static int read_page(struct mtd_info *mtd, struct nand_chip *nand,
|
||||
|
||||
|
||||
static int docg4_read_page_raw(struct mtd_info *mtd, struct nand_chip *nand,
|
||||
uint8_t *buf, int page)
|
||||
uint8_t *buf, int oob_required, int page)
|
||||
{
|
||||
return read_page(mtd, nand, buf, page, false);
|
||||
}
|
||||
|
||||
static int docg4_read_page(struct mtd_info *mtd, struct nand_chip *nand,
|
||||
uint8_t *buf, int page)
|
||||
uint8_t *buf, int oob_required, int page)
|
||||
{
|
||||
return read_page(mtd, nand, buf, page, true);
|
||||
}
|
||||
@@ -953,13 +953,13 @@ static void write_page(struct mtd_info *mtd, struct nand_chip *nand,
|
||||
}
|
||||
|
||||
static void docg4_write_page_raw(struct mtd_info *mtd, struct nand_chip *nand,
|
||||
const uint8_t *buf)
|
||||
const uint8_t *buf, int oob_required)
|
||||
{
|
||||
return write_page(mtd, nand, buf, false);
|
||||
}
|
||||
|
||||
static void docg4_write_page(struct mtd_info *mtd, struct nand_chip *nand,
|
||||
const uint8_t *buf)
|
||||
const uint8_t *buf, int oob_required)
|
||||
{
|
||||
return write_page(mtd, nand, buf, true);
|
||||
}
|
||||
@@ -1003,7 +1003,7 @@ static int __init read_factory_bbt(struct mtd_info *mtd)
|
||||
return -ENOMEM;
|
||||
|
||||
read_page_prologue(mtd, g4_addr);
|
||||
status = docg4_read_page(mtd, nand, buf, DOCG4_FACTORY_BBT_PAGE);
|
||||
status = docg4_read_page(mtd, nand, buf, 0, DOCG4_FACTORY_BBT_PAGE);
|
||||
if (status)
|
||||
goto exit;
|
||||
|
||||
@@ -1080,7 +1080,7 @@ static int docg4_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
||||
|
||||
/* write first page of block */
|
||||
write_page_prologue(mtd, g4_addr);
|
||||
docg4_write_page(mtd, nand, buf);
|
||||
docg4_write_page(mtd, nand, buf, 1);
|
||||
ret = pageprog(mtd);
|
||||
if (!ret)
|
||||
mtd->ecc_stats.badblocks++;
|
||||
|
Reference in New Issue
Block a user