lkml.org 
[lkml]   [2019]   [Oct]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 15/32] mtd: spi-nor: Check for errors after each Register Operation
    Date
    From: Tudor Ambarus <tudor.ambarus@microchip.com>

    Check for the return vales of each Register Operation.

    Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
    ---
    drivers/mtd/spi-nor/spi-nor.c | 81 ++++++++++++++++++++++++++++++++-----------
    1 file changed, 60 insertions(+), 21 deletions(-)

    diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
    index 889fd77dbe96..21f01fdcfa16 100644
    --- a/drivers/mtd/spi-nor/spi-nor.c
    +++ b/drivers/mtd/spi-nor/spi-nor.c
    @@ -595,11 +595,15 @@ static int st_micron_set_4byte(struct spi_nor *nor, bool enable)
    {
    int ret;

    - spi_nor_write_enable(nor);
    + ret == spi_nor_write_enable(nor);
    + if (ret)
    + return ret;
    +
    ret = macronix_set_4byte(nor, enable);
    - spi_nor_write_disable(nor);
    + if (ret)
    + return ret;

    - return ret;
    + return spi_nor_write_disable(nor);
    }

    static int spansion_set_4byte(struct spi_nor *nor, bool enable)
    @@ -665,11 +669,15 @@ static int winbond_set_4byte(struct spi_nor *nor, bool enable)
    * Register to be set to 1, so all 3-byte-address reads come from the
    * second 16M. We must clear the register to enable normal behavior.
    */
    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + return ret;
    +
    ret = spi_nor_write_ear(nor, 0);
    - spi_nor_write_disable(nor);
    + if (ret)
    + return ret;

    - return ret;
    + return spi_nor_write_disable(nor);
    }

    static int spi_nor_xread_sr(struct spi_nor *nor, u8 *sr)
    @@ -855,7 +863,9 @@ static int spi_nor_write_sr_cr(struct spi_nor *nor, u8 *sr_cr)
    {
    int ret;

    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + return ret;

    if (nor->spimem) {
    struct spi_mem_op op =
    @@ -885,7 +895,10 @@ static int spi_nor_write_sr_and_check(struct spi_nor *nor, u8 status_new,
    {
    int ret;

    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + return ret;
    +
    ret = spi_nor_write_sr(nor, status_new);
    if (ret)
    return ret;
    @@ -1393,7 +1406,9 @@ static int spi_nor_erase_multi_sectors(struct spi_nor *nor, u64 addr, u32 len)
    list_for_each_entry_safe(cmd, next, &erase_list, list) {
    nor->erase_opcode = cmd->opcode;
    while (cmd->count) {
    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + goto destroy_erase_cmd_list;

    ret = spi_nor_erase_sector(nor, addr);
    if (ret)
    @@ -1448,7 +1463,9 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
    if (len == mtd->size && !(nor->flags & SNOR_F_NO_OP_CHIP_ERASE)) {
    unsigned long timeout;

    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + goto erase_err;

    ret = spi_nor_erase_chip(nor);
    if (ret)
    @@ -1475,7 +1492,9 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
    /* "sector"-at-a-time erase */
    } else if (spi_nor_has_uniform_erase(nor)) {
    while (len) {
    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + goto erase_err;

    ret = spi_nor_erase_sector(nor, addr);
    if (ret)
    @@ -1496,7 +1515,7 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
    goto erase_err;
    }

    - spi_nor_write_disable(nor);
    + ret = spi_nor_write_disable(nor);

    erase_err:
    spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_ERASE);
    @@ -1845,9 +1864,13 @@ static int macronix_quad_enable(struct spi_nor *nor)
    if (nor->bouncebuf[0] & SR_QUAD_EN_MX)
    return 0;

    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + return ret;

    - spi_nor_write_sr(nor, nor->bouncebuf[0] | SR_QUAD_EN_MX);
    + ret = spi_nor_write_sr(nor, nor->bouncebuf[0] | SR_QUAD_EN_MX);
    + if (ret)
    + return ret;

    ret = spi_nor_wait_till_ready(nor);
    if (ret)
    @@ -2018,7 +2041,9 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor)
    /* Update the Quad Enable bit. */
    *sr2 |= SR2_QUAD_EN_BIT7;

    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + return ret;

    ret = spi_nor_write_sr2(nor, sr2);
    if (ret)
    @@ -2059,7 +2084,9 @@ static int spi_nor_clear_sr_bp(struct spi_nor *nor)
    if (ret)
    return ret;

    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + return ret;

    ret = spi_nor_write_sr(nor, nor->bouncebuf[0] & ~mask);
    if (ret)
    @@ -2676,7 +2703,9 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
    if (ret)
    return ret;

    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + goto sst_write_err;

    nor->sst_write_second = false;

    @@ -2714,14 +2743,19 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
    }
    nor->sst_write_second = false;

    - spi_nor_write_disable(nor);
    + ret = spi_nor_write_disable(nor);
    + if (ret)
    + goto sst_write_err;
    +
    ret = spi_nor_wait_till_ready(nor);
    if (ret)
    goto sst_write_err;

    /* Write out trailing byte if it exists. */
    if (actual != len) {
    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + goto sst_write_err;

    nor->program_opcode = SPINOR_OP_BP;
    ret = spi_nor_write_data(nor, to, 1, buf + actual);
    @@ -2731,8 +2765,10 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
    ret = spi_nor_wait_till_ready(nor);
    if (ret)
    goto sst_write_err;
    - spi_nor_write_disable(nor);
    +
    actual += 1;
    +
    + ret = spi_nor_write_disable(nor);
    }
    sst_write_err:
    *retlen += actual;
    @@ -2783,7 +2819,10 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len,

    addr = spi_nor_convert_addr(nor, addr);

    - spi_nor_write_enable(nor);
    + ret = spi_nor_write_enable(nor);
    + if (ret)
    + goto write_err;
    +
    ret = spi_nor_write_data(nor, addr, page_remain, buf + i);
    if (ret < 0)
    goto write_err;
    --
    2.9.5
    \
     
     \ /
      Last update: 2019-10-29 12:19    [W:4.753 / U:0.492 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site