#define STM32_MAX_MMAP_SZ      SZ_256M
 #define STM32_MAX_NORCHIP      2
 
+#define STM32_QSPI_FIFO_SZ     32
 #define STM32_QSPI_FIFO_TIMEOUT_US 30000
 #define STM32_QSPI_BUSY_TIMEOUT_US 100000
 
        u32 presc;
        u32 read_mode;
        bool registered;
+       u32 prefetch_limit;
 };
 
 struct stm32_qspi {
 {
        struct stm32_qspi *qspi = flash->qspi;
        u32 ccr, dcr, cr;
+       u32 last_byte;
        int err;
 
        err = stm32_qspi_wait_nobusy(qspi);
                if (err)
                        goto abort;
                writel_relaxed(FCR_CTCF, qspi->io_base + QUADSPI_FCR);
+       } else {
+               last_byte = cmd->addr + cmd->len;
+               if (last_byte > flash->prefetch_limit)
+                       goto abort;
        }
 
        return err;
        cr = readl_relaxed(qspi->io_base + QUADSPI_CR) | CR_ABORT;
        writel_relaxed(cr, qspi->io_base + QUADSPI_CR);
 
-       dev_err(qspi->dev, "%s abort err:%d\n", __func__, err);
+       if (err)
+               dev_err(qspi->dev, "%s abort err:%d\n", __func__, err);
+
        return err;
 }
 
        }
 
        flash->fsize = FSIZE_VAL(mtd->size);
+       flash->prefetch_limit = mtd->size - STM32_QSPI_FIFO_SZ;
 
        flash->read_mode = CCR_FMODE_MM;
        if (mtd->size > qspi->mm_size)