mediatek: mtk-snand: check request size against chip info
authorChuanhong Guo <gch981213@gmail.com>
Mon, 23 Aug 2021 16:31:17 +0000 (00:31 +0800)
committerChuanhong Guo <gch981213@gmail.com>
Fri, 27 Aug 2021 02:26:25 +0000 (10:26 +0800)
mtd->size will be overrided by BMT which makes all mtd requests made by
bmt fail in request size checking.
this commit changes the driver to check against actual chip size in chip
info as a workaround.

Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
target/linux/mediatek/files-5.10/drivers/mtd/mtk-snand/mtk-snand-mtd.c

index b0fcda446d4795175649c1fb53894629767dced0..7e5baf03691126b5a30a3bdabd03bdbf325052b4 100644 (file)
@@ -57,7 +57,7 @@ static int mtk_snand_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
        int ret;
 
        /* Do not allow write past end of device */
-       if ((instr->addr + instr->len) > mtd->size) {
+       if ((instr->addr + instr->len) > msm->cinfo.chipsize) {
                dev_err(msm->pdev.dev,
                        "attempt to erase beyond end of device\n");
                return -EINVAL;
@@ -194,7 +194,7 @@ static int mtk_snand_mtd_read_oob(struct mtd_info *mtd, loff_t from,
        maxooblen = mtd_oobavail(mtd, ops);
 
        /* Do not allow read past end of device */
-       if (ops->datbuf && (from + ops->len) > mtd->size) {
+       if (ops->datbuf && (from + ops->len) > msm->cinfo.chipsize) {
                dev_err(msm->pdev.dev,
                        "attempt to read beyond end of device\n");
                return -EINVAL;
@@ -205,9 +205,11 @@ static int mtk_snand_mtd_read_oob(struct mtd_info *mtd, loff_t from,
                return -EINVAL;
        }
 
-       if (unlikely(from >= mtd->size ||
-           ops->ooboffs + ops->ooblen > ((mtd->size >> mtd->writesize_shift) -
-           (from >> mtd->writesize_shift)) * maxooblen)) {
+       if (unlikely(from >= msm->cinfo.chipsize ||
+                    ops->ooboffs + ops->ooblen >
+                            ((msm->cinfo.chipsize >> mtd->writesize_shift) -
+                             (from >> mtd->writesize_shift)) *
+                                    maxooblen)) {
                dev_err(msm->pdev.dev,
                        "attempt to read beyond end of device\n");
                return -EINVAL;
@@ -321,7 +323,7 @@ static int mtk_snand_mtd_write_oob(struct mtd_info *mtd, loff_t to,
        maxooblen = mtd_oobavail(mtd, ops);
 
        /* Do not allow write past end of device */
-       if (ops->datbuf && (to + ops->len) > mtd->size) {
+       if (ops->datbuf && (to + ops->len) > msm->cinfo.chipsize) {
                dev_err(msm->pdev.dev,
                        "attempt to write beyond end of device\n");
                return -EINVAL;
@@ -333,9 +335,11 @@ static int mtk_snand_mtd_write_oob(struct mtd_info *mtd, loff_t to,
                return -EINVAL;
        }
 
-       if (unlikely(to >= mtd->size ||
-           ops->ooboffs + ops->ooblen > ((mtd->size >> mtd->writesize_shift) -
-           (to >> mtd->writesize_shift)) * maxooblen)) {
+       if (unlikely(to >= msm->cinfo.chipsize ||
+                    ops->ooboffs + ops->ooblen >
+                            ((msm->cinfo.chipsize >> mtd->writesize_shift) -
+                             (to >> mtd->writesize_shift)) *
+                                    maxooblen)) {
                dev_err(msm->pdev.dev,
                        "attempt to write beyond end of device\n");
                return -EINVAL;