Skip to content

Commit

Permalink
[MTD] OneNAND: Reduce internal BufferRAM operations
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kyungmin Park committed Feb 2, 2007
1 parent 4f4fad2 commit abf3c0f
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 30 deletions.
47 changes: 23 additions & 24 deletions drivers/mtd/onenand/onenand_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -577,19 +577,22 @@ static int onenand_write_bufferram(struct mtd_info *mtd, int area,
static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
{
struct onenand_chip *this = mtd->priv;
int block, page;
int i;
int blockpage;
unsigned int i;

block = (int) (addr >> this->erase_shift);
page = (int) (addr >> this->page_shift) & this->page_mask;
blockpage = (int) (addr >> this->page_shift);

/* Is there valid data? */
i = ONENAND_CURRENT_BUFFERRAM(this);
if (this->bufferram[i].blockpage == blockpage)
return 1;

/* Is there valid data? */
if (this->bufferram[i].block == block &&
this->bufferram[i].page == page &&
this->bufferram[i].valid)
/* Check another BufferRAM */
i = ONENAND_NEXT_BUFFERRAM(this);
if (this->bufferram[i].blockpage == blockpage) {
ONENAND_SET_NEXT_BUFFERRAM(this);
return 1;
}

return 0;
}
Expand All @@ -602,30 +605,26 @@ static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
*
* 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)
{
struct onenand_chip *this = mtd->priv;
int block, page;
int i;
int blockpage;
unsigned int i;

block = (int) (addr >> this->erase_shift);
page = (int) (addr >> this->page_shift) & this->page_mask;
blockpage = (int) (addr >> this->page_shift);

/* Invalidate BufferRAM */
for (i = 0; i < MAX_BUFFERRAM; i++) {
if (this->bufferram[i].block == block &&
this->bufferram[i].page == page)
this->bufferram[i].valid = 0;
}
/* Invalidate another BufferRAM */
i = ONENAND_NEXT_BUFFERRAM(this);
if (this->bufferram[i].blockpage == blockpage) {
this->bufferram[i].blockpage = -1;

/* Update BufferRAM */
i = ONENAND_CURRENT_BUFFERRAM(this);
this->bufferram[i].block = block;
this->bufferram[i].page = page;
this->bufferram[i].valid = valid;

return 0;
if (valid)
this->bufferram[i].blockpage = blockpage;
else
this->bufferram[i].blockpage = -1;
}

/**
Expand Down
8 changes: 2 additions & 6 deletions include/linux/mtd/onenand.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,10 @@ typedef enum {

/**
* struct onenand_bufferram - OneNAND BufferRAM Data
* @block: block address in BufferRAM
* @page: page address in BufferRAM
* @valid: valid flag
* @blockpage: block & page address in BufferRAM
*/
struct onenand_bufferram {
int block;
int page;
int valid;
int blockpage;
};

/**
Expand Down

0 comments on commit abf3c0f

Please sign in to comment.