Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[MTD] [NAND] pxa3xx: fix non-page-aligned reads

Reads from non-page-aligned addresses were broken because while the
address to read from was correctly written to NDCB*, a full page was
always read. Fix this by ignoring the column and only using the page
address.

I suspect this whole-page behavior is due to the controller's need to
read the entire page in order to generate correct ECC. In the non-ECC
case this could be optimized to use the column address, and to set the
read length to what is being requested rather than the length of an
entire page.

Signed-off-by: Matt Reimer <mreimer@vpop.net>
Signed-off-by: Eric Miao <eric.miao@marvell.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>

authored by

Matt Reimer and committed by
David Woodhouse
7f9938d0 a5cce42f

+2 -2
+2 -2
drivers/mtd/nand/pxa3xx_nand.c
··· 368 368 /* large block, 2 cycles for column address 369 369 * row address starts from 3rd cycle 370 370 */ 371 - info->ndcb1 |= (page_addr << 16) | (column & 0xffff); 371 + info->ndcb1 |= page_addr << 16; 372 372 if (info->row_addr_cycles == 3) 373 373 info->ndcb2 = (page_addr >> 16) & 0xff; 374 374 } else 375 375 /* small block, 1 cycles for column address 376 376 * row address starts from 2nd cycle 377 377 */ 378 - info->ndcb1 = (page_addr << 8) | (column & 0xff); 378 + info->ndcb1 = page_addr << 8; 379 379 380 380 if (cmd == cmdset->program) 381 381 info->ndcb0 |= NDCB0_CMD_TYPE(1) | NDCB0_AUTO_RS;