mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-27 09:02:06 +00:00
mtd: nand: create a helper verification function
... verification for 'nand_erase_nand' These checks are expected to be used by 'nand_lock' and 'nand_unlock' routines too. As all these three are block aligned operations. So, creating a helper function for this makes sense. Signed-off-by: Vimal Singh <vimalsingh@ti.com> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
91f8026603
commit
6fe5a6acdc
1 changed files with 30 additions and 18 deletions
|
@ -108,6 +108,35 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
|
||||||
*/
|
*/
|
||||||
DEFINE_LED_TRIGGER(nand_led_trigger);
|
DEFINE_LED_TRIGGER(nand_led_trigger);
|
||||||
|
|
||||||
|
static int check_offs_len(struct mtd_info *mtd,
|
||||||
|
loff_t ofs, uint64_t len)
|
||||||
|
{
|
||||||
|
struct nand_chip *chip = mtd->priv;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
/* Start address must align on block boundary */
|
||||||
|
if (ofs & ((1 << chip->phys_erase_shift) - 1)) {
|
||||||
|
DEBUG(MTD_DEBUG_LEVEL0, "%s: Unaligned address\n", __func__);
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Length must align on block boundary */
|
||||||
|
if (len & ((1 << chip->phys_erase_shift) - 1)) {
|
||||||
|
DEBUG(MTD_DEBUG_LEVEL0, "%s: Length not block aligned\n",
|
||||||
|
__func__);
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do not allow past end of device */
|
||||||
|
if (ofs + len > mtd->size) {
|
||||||
|
DEBUG(MTD_DEBUG_LEVEL0, "%s: Past end of device\n",
|
||||||
|
__func__);
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nand_release_device - [GENERIC] release chip
|
* nand_release_device - [GENERIC] release chip
|
||||||
* @mtd: MTD device structure
|
* @mtd: MTD device structure
|
||||||
|
@ -2293,25 +2322,8 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
|
||||||
__func__, (unsigned long long)instr->addr,
|
__func__, (unsigned long long)instr->addr,
|
||||||
(unsigned long long)instr->len);
|
(unsigned long long)instr->len);
|
||||||
|
|
||||||
/* Start address must align on block boundary */
|
if (check_offs_len(mtd, instr->addr, instr->len))
|
||||||
if (instr->addr & ((1 << chip->phys_erase_shift) - 1)) {
|
|
||||||
DEBUG(MTD_DEBUG_LEVEL0, "%s: Unaligned address\n", __func__);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
|
||||||
|
|
||||||
/* Length must align on block boundary */
|
|
||||||
if (instr->len & ((1 << chip->phys_erase_shift) - 1)) {
|
|
||||||
DEBUG(MTD_DEBUG_LEVEL0, "%s: Length not block aligned\n",
|
|
||||||
__func__);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do not allow erase past end of device */
|
|
||||||
if ((instr->len + instr->addr) > mtd->size) {
|
|
||||||
DEBUG(MTD_DEBUG_LEVEL0, "%s: Erase past end of device\n",
|
|
||||||
__func__);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
|
instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue