|
@@ -237,6 +237,14 @@ int nand_lock(struct mtd_info *mtd, int tight)
|
|
|
/* select the NAND device */
|
|
|
chip->select_chip(mtd, 0);
|
|
|
|
|
|
+ /* check the Lock Tight Status */
|
|
|
+ chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, 0);
|
|
|
+ if (chip->read_byte(mtd) & NAND_LOCK_STATUS_TIGHT) {
|
|
|
+ printf("nand_lock: Device is locked tight!\n");
|
|
|
+ ret = -1;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
chip->cmdfunc(mtd,
|
|
|
(tight ? NAND_CMD_LOCK_TIGHT : NAND_CMD_LOCK),
|
|
|
-1, -1);
|
|
@@ -249,6 +257,7 @@ int nand_lock(struct mtd_info *mtd, int tight)
|
|
|
ret = -1;
|
|
|
}
|
|
|
|
|
|
+ out:
|
|
|
/* de-select the NAND device */
|
|
|
chip->select_chip(mtd, -1);
|
|
|
return ret;
|
|
@@ -337,6 +346,15 @@ int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ /* check the Lock Tight Status */
|
|
|
+ page = (int)(start >> chip->page_shift);
|
|
|
+ chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, page & chip->pagemask);
|
|
|
+ if (chip->read_byte(mtd) & NAND_LOCK_STATUS_TIGHT) {
|
|
|
+ printf("nand_unlock: Device is locked tight!\n");
|
|
|
+ ret = -1;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
if ((start & (mtd->erasesize - 1)) != 0) {
|
|
|
printf("nand_unlock: Start address must be beginning of "
|
|
|
"nand block!\n");
|
|
@@ -358,7 +376,6 @@ int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length,
|
|
|
length -= mtd->erasesize;
|
|
|
|
|
|
/* submit address of first page to unlock */
|
|
|
- page = (int)(start >> chip->page_shift);
|
|
|
chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask);
|
|
|
|
|
|
/* submit ADDRESS of LAST page to unlock */
|