diff --git a/drivers/mtd_spi_nor/mtd_spi_nor.c b/drivers/mtd_spi_nor/mtd_spi_nor.c index ddd7341ecf..bb1f9804b5 100644 --- a/drivers/mtd_spi_nor/mtd_spi_nor.c +++ b/drivers/mtd_spi_nor/mtd_spi_nor.c @@ -420,17 +420,9 @@ static int mtd_spi_nor_read(mtd_dev_t *mtd, void *dest, uint32_t addr, uint32_t if (addr > chipsize) { return -EOVERFLOW; } - if (size > mtd->page_size) { - size = mtd->page_size; - } if ((addr + size) > chipsize) { size = chipsize - addr; } - uint32_t page_addr_mask = dev->page_addr_mask; - if ((addr & page_addr_mask) != ((addr + size - 1) & page_addr_mask)) { - /* Reads across page boundaries must be split */ - size = mtd->page_size - (addr & ~(page_addr_mask)); - } if (size == 0) { return 0; } diff --git a/tests/unittests/tests-mtd/tests-mtd.c b/tests/unittests/tests-mtd/tests-mtd.c index 277f251c7a..17cbaf28ff 100644 --- a/tests/unittests/tests-mtd/tests-mtd.c +++ b/tests/unittests/tests-mtd/tests-mtd.c @@ -215,10 +215,24 @@ static void test_mtd_write_read(void) /* out of bounds write (more than page size) */ const size_t page_size = dev->page_size; - const uint8_t buf_page[page_size + 1]; + uint8_t buf_page[page_size + 1]; + memset(buf_page, 1, sizeof(buf_page)); ret = mtd_write(dev, buf_page, 0, sizeof(buf_page)); TEST_ASSERT_EQUAL_INT(-EOVERFLOW, ret); + /* Read more than one page */ + ret = mtd_erase(dev, 0, dev->page_size * dev->pages_per_sector); + TEST_ASSERT_EQUAL_INT(0, ret); + ret = mtd_write(dev, buf_page, 0, dev->page_size); + TEST_ASSERT_EQUAL_INT(dev->page_size, ret); + ret = mtd_write(dev, buf_page, dev->page_size, dev->page_size); + TEST_ASSERT_EQUAL_INT(dev->page_size, ret); + memset(buf_page, 0, sizeof(buf_page)); + ret = mtd_read(dev, buf_page, 0, sizeof(buf_page)); + TEST_ASSERT_EQUAL_INT(sizeof(buf_page), ret); + TEST_ASSERT_EQUAL_INT(1, buf_page[0]); + TEST_ASSERT_EQUAL_INT(1, buf_page[sizeof(buf_page) - 1]); + /* pages overlap write */ ret = mtd_write(dev, buf, dev->page_size - (sizeof(buf) / 2), sizeof(buf)); TEST_ASSERT_EQUAL_INT(-EOVERFLOW, ret);