OneNAND: Invalidate bufferRAM after erase
PATCH 1/1 OneNAND: Invalidate bufferRAM after erase
Quoted 1 line
From
df9f430fa8198c7d60acdcf0c237a34916b5ac5bMon Sep 17 00:00:00 2001
From: Adrian Hunter <[email protected]>
Date: Wed, 7 Feb 2007 13:55:19 +0200
Subject: [MTD] OneNAND: Invalidate bufferRAM after erase
OneNAND has internal bufferRAMs. The driver keeps track of what is in the bufferRAM to save having to load from the NAND core. After an erase operation, the driver must mark bufferRAM invalid if it refers to the erased block.
---drivers/mtd/onenand/onenand_base.c | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)
drivers/mtd/onenand/onenand_base.c +0 -0
@@ -628,6 +628,29 @@ static void onenand_update_bufferram(str
}
/**
+ * onenand_invalidate_bufferram_range - [GENERIC] Invalidate BufferRAM information
+ * @param mtd MTD data structure
+ * @param addr start address to invalidate
+ * @param len length to invalidate
+ *
+ * Invalidate BufferRAM information
+ */
+static void onenand_invalidate_bufferram_range(struct mtd_info *mtd, loff_t addr,
+ unsigned int len)
+{
+ struct onenand_chip *this = mtd->priv;
+ int i;
+ loff_t end_addr = addr + len;
+
+ /* Invalidate BufferRAM */
+ for (i = 0; i < MAX_BUFFERRAM; i++) {
+ loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift;
+ if (buf_addr >= addr && buf_addr < end_addr)
+ this->bufferram[i].blockpage = -1;
+ }
+}
+
+/**
* onenand_get_device - [GENERIC] Get chip for selected access
* @param mtd MTD device structure
* @param new_state the state which is requested
@@ -1466,6 +1489,8 @@ static int onenand_erase(struct mtd_info
goto erase_exit; }
+ onenand_invalidate_bufferram_range(mtd, addr, block_size);
+
this->command(mtd, ONENAND_CMD_ERASE, addr, block_size); ret = this->wait(mtd, FL_ERASING);
Signature · 1 line
1.4.3
Hi Adrian,
I checked it with pagetest module. Without the patch it failed. I have two minor comments.
Thank you,
Kyungmin Park
Review
Quoted 12 lines
/**
+ *onenand_invalidate_bufferram_range- [GENERIC] Invalidate BufferRAM information
+ * @param mtd MTD data structure
+ * @param addr start address to invalidate
+ * @param len length to invalidate
+ *
+ * Invalidate BufferRAM information
+ */
+static void onenand_invalidate_bufferram_range(structmtd_info*mtd,loff_taddr,(quoted diff) +1
-0+ unsigned int len)
It's name too long even though it invalidate with some range. How about just call "onenand_invalidate_bufferram"?
Review static int onenand_erase(struct mtd_info · line 1495
Quoted 12 lines
(quoted diff) +3
-0+/** * onenand_get_device - [GENERIC] Get chip for selected access * @param mtd MTD device structure * @param new_state the state which is requested@@ -1466,6 +1489,8 @@ static int onenand_erase(struct mtd_info goto erase_exit; } + onenand_invalidate_bufferram_range(mtd, addr, block_size); + this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
Place onenand_invalidate_bufferram_range here
Since erase command takes a long time, 2msec so we overlap the some cpu works and onenand physicall works between command and wait.
Quoted 2 lines
(quoted diff) +0
-0ret = this->wait(mtd, FL_ERASING);
Quoted 1 line
From
df9f430fa8198c7d60acdcf0c237a34916b5ac5bMon Sep 17 00:00:00 2001
From: Adrian Hunter <[email protected]>
Date: Wed, 7 Feb 2007 13:55:19 +0200
Subject: [MTD] OneNAND: Invalidate bufferRAM after erase
OneNAND has internal bufferRAMs. The driver keeps track of what is in the bufferRAM to save having to load from the NAND core. After an erase operation, the driver must mark bufferRAM invalid if it refers to the erased block.
--- drivers/mtd/onenand/onenand_base.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-)
drivers/mtd/onenand/onenand_base.c +25 -0
@@ -628,6 +628,29 @@ static void onenand_update_bufferram(str }/** +* onenand_invalidate_bufferram - [GENERIC] Invalidate BufferRAM information +* @param mtd MTD data structure +* @param addr start address to invalidate +* @param len length to invalidate +* +* Invalidate BufferRAM information +*/ +static void onenand_invalidate_bufferram (struct mtd_info *mtd,loff_t addr, +unsigned int len) +{ +struct onenand_chip *this = mtd->priv; +int i; +loff_t end_addr = addr + len; + +/* Invalidate BufferRAM */ +for (i =0 ; i <MAX_BUFFERRAM ; i++) { +loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift; +if (buf_addr >= addr && buf_addr < end_addr) + this->bufferram[i].blockpage =-1 ; + } +} + +/** * onenand_get_device - [GENERIC] Get chip for selected access * @param mtd MTD device structure * @param new_state the state which is requested
@@ -1466,6 +1489,8 @@ static int onenand_erase(struct mtd_info this->command (mtd,ONENAND_CMD_ERASE , addr, block_size); +onenand_invalidate_bufferram (mtd, addr, block_size); + ret = this->wait (mtd,FL_ERASING );/* Check, if it is write protected */ if (ret) {
Signature · 1 line
1.4.3
Quoted 6 lines · Adrian Hunter
OneNAND has internal bufferRAMs. The driver keeps track of what is in the bufferRAM to save having to load from the NAND core. After an erase operation, the driver must mark bufferRAM invalid if it refers to the erased block.
Signed-off-by Adrian Hunter <[email protected]>
I've pulled from the onenand git tree and applied this extra patch.
Signature · 1 line
dwmw2