From 49358e27639352b7f1e88b7ef8bc13975e39ddad Mon Sep 17 00:00:00 2001 From: Vincent Dupont Date: Thu, 28 Feb 2019 16:56:59 +0100 Subject: [PATCH 1/2] unittests/tests-mtd: add a test to check read spanning pages --- tests/unittests/tests-mtd/tests-mtd.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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); From c077c07017102efd53d2cf8f73f23fe36d0aa1c9 Mon Sep 17 00:00:00 2001 From: Vincent Dupont Date: Thu, 28 Feb 2019 16:57:27 +0100 Subject: [PATCH 2/2] drivers/mrd_spi_nor: fix read spanning pages --- drivers/mtd_spi_nor/mtd_spi_nor.c | 8 -------- 1 file changed, 8 deletions(-) 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; }