• Marek Behún's avatar
    net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems · 5652d174
    Marek Behún authored
    Commit c766e077 ("net: dsa: qca8k: convert to regmap read/write
    API") introduced bulk read/write methods to qca8k's regmap.
    
    The regmap bulk read/write methods get the register address in a buffer
    passed as a void pointer parameter (the same buffer contains also the
    read/written values). The register address occupies only as many bytes
    as it requires at the beginning of this buffer. For example if the
    .reg_bits member in regmap_config is 16 (as is the case for this
    driver), the register address occupies only the first 2 bytes in this
    buffer, so it can be cast to u16.
    
    But the original commit implementing these bulk read/write methods cast
    the buffer to u32:
      u32 reg = *(u32 *)reg_buf & U16_MAX;
    taking the first 4 bytes. This works on little endian systems where the
    first 2 bytes of the buffer correspond to the low 16-bits, but it
    obviously cannot work on big endian systems.
    
    Fix this by casting the beginning of the buffer to u16 as
       u32 reg = *(u16 *)reg_buf;
    
    Fixes: c766e077 ("net: dsa: qca8k: convert to regmap read/write API")
    Signed-off-by: default avatarMarek Behún <kabel@kernel.org>
    Tested-by: default avatarChristian Marangi <ansuelsmth@gmail.com>
    Reviewed-by: default avatarChristian Marangi <ansuelsmth@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5652d174
qca8k-8xxx.c 53.8 KB