lkml.org 
[lkml]   [2019]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.4 21/56] nvmem: core: fix read buffer in place
    Date
    From: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>

    [ Upstream commit 2fe518fecb3a4727393be286db9804cd82ee2d91 ]

    When the bit_offset in the cell is zero, the pointer to the msb will
    not be properly initialized (ie, will still be pointing to the first
    byte in the buffer).

    This being the case, if there are bits to clear in the msb, those will
    be left untouched while the mask will incorrectly clear bit positions
    on the first byte.

    This commit also makes sure that any byte unused in the cell is
    cleared.

    Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
    Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/nvmem/core.c | 15 ++++++++++-----
    1 file changed, 10 insertions(+), 5 deletions(-)

    diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
    index 6fd4e5a5ef4a4..931cc33e46f02 100644
    --- a/drivers/nvmem/core.c
    +++ b/drivers/nvmem/core.c
    @@ -789,7 +789,7 @@ static inline void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell,
    void *buf)
    {
    u8 *p, *b;
    - int i, bit_offset = cell->bit_offset;
    + int i, extra, bit_offset = cell->bit_offset;

    p = b = buf;
    if (bit_offset) {
    @@ -804,11 +804,16 @@ static inline void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell,
    p = b;
    *b++ >>= bit_offset;
    }
    -
    - /* result fits in less bytes */
    - if (cell->bytes != DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE))
    - *p-- = 0;
    + } else {
    + /* point to the msb */
    + p += cell->bytes - 1;
    }
    +
    + /* result fits in less bytes */
    + extra = cell->bytes - DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE);
    + while (--extra >= 0)
    + *p-- = 0;
    +
    /* clear msb bits if any leftover in the last byte */
    *p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0);
    }
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-06-01 15:30    [W:4.164 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site