Message ID | 1417746968-28747-2-git-send-email-computersforpeace@gmail.com |
---|---|
State | Accepted |
Commit | 72ea403669c7d49e8c407c61205b6d52438d39ab |
Headers | show |
On 14-12-04 06:36 PM, Brian Norris wrote: > From: Scott Branden <sbranden@broadcom.com> > > Add nand_shutdown to wait for current nand operations to finish and prevent > further operations by changing the nand flash state to FL_SHUTDOWN. > > This is addressing a problem observed during reboot tests using UBIFS > root file system: NAND erase operations that are in progress during > system reboot/shutdown are causing partial erased blocks. Although UBI should > be able to detect and recover from this error, this change will avoid > the creation of partial erased blocks on reboot in the middle of a NAND erase > operation. > > Signed-off-by: Scott Branden <sbranden@broadcom.com> > Signed-off-by: Brian Norris <computersforpeace@gmail.com> > --- > Modified to use the new mtd->_reboot hook > > Not tested yet Tested by: Scott Branden <sbranden@broadcom.com> > > drivers/mtd/nand/nand_base.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c > index 41585dfb206f..382354b5547b 100644 > --- a/drivers/mtd/nand/nand_base.c > +++ b/drivers/mtd/nand/nand_base.c > @@ -2944,6 +2944,16 @@ static void nand_resume(struct mtd_info *mtd) > __func__); > } > > +/** > + * nand_shutdown - [MTD Interface] Finish the current NAND operation and > + * prevent further operations > + * @mtd: MTD device structure > + */ > +static void nand_shutdown(struct mtd_info *mtd) > +{ > + nand_get_device(mtd, FL_SHUTDOWN); > +} > + > /* Set default functions */ > static void nand_set_defaults(struct nand_chip *chip, int busw) > { > @@ -4146,6 +4156,7 @@ int nand_scan_tail(struct mtd_info *mtd) > mtd->_unlock = NULL; > mtd->_suspend = nand_suspend; > mtd->_resume = nand_resume; > + mtd->_reboot = nand_shutdown; > mtd->_block_isreserved = nand_block_isreserved; > mtd->_block_isbad = nand_block_isbad; > mtd->_block_markbad = nand_block_markbad; >
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 41585dfb206f..382354b5547b 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -2944,6 +2944,16 @@ static void nand_resume(struct mtd_info *mtd) __func__); } +/** + * nand_shutdown - [MTD Interface] Finish the current NAND operation and + * prevent further operations + * @mtd: MTD device structure + */ +static void nand_shutdown(struct mtd_info *mtd) +{ + nand_get_device(mtd, FL_SHUTDOWN); +} + /* Set default functions */ static void nand_set_defaults(struct nand_chip *chip, int busw) { @@ -4146,6 +4156,7 @@ int nand_scan_tail(struct mtd_info *mtd) mtd->_unlock = NULL; mtd->_suspend = nand_suspend; mtd->_resume = nand_resume; + mtd->_reboot = nand_shutdown; mtd->_block_isreserved = nand_block_isreserved; mtd->_block_isbad = nand_block_isbad; mtd->_block_markbad = nand_block_markbad;