[MTD] OneNAND: Reduce internal BufferRAM operations

It use blockpage instead of a pair (block, page). It can also cover a small chunk access. 0x00, 0x20, 0x40 and so on.

And in JFFS2 behavior, sometimes it reads two pages alternatively.
e.g., It first reads A page, B page and A page.
So we check another bufferram to find requested page.

Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
This commit is contained in:
Kyungmin Park 2007-02-02 09:29:36 +09:00
parent 4f4fad27ac
commit abf3c0f23d
2 changed files with 26 additions and 31 deletions

View file

@ -577,20 +577,23 @@ static int onenand_write_bufferram(struct mtd_info *mtd, int area,
static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr) static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
{ {
struct onenand_chip *this = mtd->priv; struct onenand_chip *this = mtd->priv;
int block, page; int blockpage;
int i; unsigned int i;
block = (int) (addr >> this->erase_shift); blockpage = (int) (addr >> this->page_shift);
page = (int) (addr >> this->page_shift) & this->page_mask;
i = ONENAND_CURRENT_BUFFERRAM(this);
/* Is there valid data? */ /* Is there valid data? */
if (this->bufferram[i].block == block && i = ONENAND_CURRENT_BUFFERRAM(this);
this->bufferram[i].page == page && if (this->bufferram[i].blockpage == blockpage)
this->bufferram[i].valid)
return 1; return 1;
/* Check another BufferRAM */
i = ONENAND_NEXT_BUFFERRAM(this);
if (this->bufferram[i].blockpage == blockpage) {
ONENAND_SET_NEXT_BUFFERRAM(this);
return 1;
}
return 0; return 0;
} }
@ -602,30 +605,26 @@ static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
* *
* Update BufferRAM information * Update BufferRAM information
*/ */
static int onenand_update_bufferram(struct mtd_info *mtd, loff_t addr, static void onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
int valid) int valid)
{ {
struct onenand_chip *this = mtd->priv; struct onenand_chip *this = mtd->priv;
int block, page; int blockpage;
int i; unsigned int i;
block = (int) (addr >> this->erase_shift); blockpage = (int) (addr >> this->page_shift);
page = (int) (addr >> this->page_shift) & this->page_mask;
/* Invalidate BufferRAM */ /* Invalidate another BufferRAM */
for (i = 0; i < MAX_BUFFERRAM; i++) { i = ONENAND_NEXT_BUFFERRAM(this);
if (this->bufferram[i].block == block && if (this->bufferram[i].blockpage == blockpage) {
this->bufferram[i].page == page) this->bufferram[i].blockpage = -1;
this->bufferram[i].valid = 0;
}
/* Update BufferRAM */ /* Update BufferRAM */
i = ONENAND_CURRENT_BUFFERRAM(this); i = ONENAND_CURRENT_BUFFERRAM(this);
this->bufferram[i].block = block; if (valid)
this->bufferram[i].page = page; this->bufferram[i].blockpage = blockpage;
this->bufferram[i].valid = valid; else
this->bufferram[i].blockpage = -1;
return 0;
} }
/** /**

View file

@ -42,14 +42,10 @@ typedef enum {
/** /**
* struct onenand_bufferram - OneNAND BufferRAM Data * struct onenand_bufferram - OneNAND BufferRAM Data
* @block: block address in BufferRAM * @blockpage: block & page address in BufferRAM
* @page: page address in BufferRAM
* @valid: valid flag
*/ */
struct onenand_bufferram { struct onenand_bufferram {
int block; int blockpage;
int page;
int valid;
}; };
/** /**