[MTD] OneNAND: Reduce internal BufferRAM operations
authorKyungmin Park <kyungmin.park@samsung.com>
Fri, 2 Feb 2007 00:29:36 +0000 (09:29 +0900)
committerKyungmin Park <kyungmin.park@samsung.com>
Fri, 2 Feb 2007 00:29:36 +0000 (09:29 +0900)
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>
drivers/mtd/onenand/onenand_base.c
include/linux/mtd/onenand.h

index eb94d94964463f0c1d2e78285961665c95977358..9f4fe73bc1292e62939186883dbae9a1ef382074 100644 (file)
@@ -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 blockpage;
-       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;
 }
@@ -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 blockpage;
-       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;
 }
 
 /**
index a5e6c4bf7af32263375c4f10e9f86b57abe9ee12..d8af8a95e58d86305227afb9a8385911b4b67b18 100644 (file)
@@ -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;
 };
 
 /**