Patch "net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems" has been added to the 6.5-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems

to the 6.5-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-dsa-qca8k-fix-regmap-bulk-read-write-methods-on-.patch
and it can be found in the queue-6.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b00502870a37a16355c94d51269e1d12272b87aa
Author: Marek Behún <kabel@xxxxxxxxxx>
Date:   Wed Oct 4 11:19:03 2023 +0200

    net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems
    
    [ Upstream commit 5652d1741574eb89cc02576e50ee3e348bd6dd77 ]
    
    Commit c766e077d927 ("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: c766e077d927 ("net: dsa: qca8k: convert to regmap read/write API")
    Signed-off-by: Marek Behún <kabel@xxxxxxxxxx>
    Tested-by: Christian Marangi <ansuelsmth@xxxxxxxxx>
    Reviewed-by: Christian Marangi <ansuelsmth@xxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8xxx.c
index efe9380d4a15d..8e1574c63954e 100644
--- a/drivers/net/dsa/qca/qca8k-8xxx.c
+++ b/drivers/net/dsa/qca/qca8k-8xxx.c
@@ -505,8 +505,8 @@ qca8k_bulk_read(void *ctx, const void *reg_buf, size_t reg_len,
 		void *val_buf, size_t val_len)
 {
 	int i, count = val_len / sizeof(u32), ret;
-	u32 reg = *(u32 *)reg_buf & U16_MAX;
 	struct qca8k_priv *priv = ctx;
+	u32 reg = *(u16 *)reg_buf;
 
 	if (priv->mgmt_master &&
 	    !qca8k_read_eth(priv, reg, val_buf, val_len))
@@ -527,8 +527,8 @@ qca8k_bulk_gather_write(void *ctx, const void *reg_buf, size_t reg_len,
 			const void *val_buf, size_t val_len)
 {
 	int i, count = val_len / sizeof(u32), ret;
-	u32 reg = *(u32 *)reg_buf & U16_MAX;
 	struct qca8k_priv *priv = ctx;
+	u32 reg = *(u16 *)reg_buf;
 	u32 *val = (u32 *)val_buf;
 
 	if (priv->mgmt_master &&



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux