Patch "dsa: mv88e6xxx: Do a final check before timing out" has been added to the 6.1-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

    dsa: mv88e6xxx: Do a final check before timing out

to the 6.1-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:
     dsa-mv88e6xxx-do-a-final-check-before-timing-out.patch
and it can be found in the queue-6.1 subdirectory.

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



commit 9bbaa84ecaeca40ae4d2d1cd4ab363546113da7a
Author: Linus Walleij <linus.walleij@xxxxxxxxxx>
Date:   Thu Jul 13 00:34:05 2023 +0200

    dsa: mv88e6xxx: Do a final check before timing out
    
    [ Upstream commit 95ce158b6c93b28842b54b42ad1cb221b9844062 ]
    
    I get sporadic timeouts from the driver when using the
    MV88E6352. Reading the status again after the loop fixes the
    problem: the operation is successful but goes undetected.
    
    Some added prints show things like this:
    
    [   58.356209] mv88e6085 mdio_mux-0.1:00: Timeout while waiting
        for switch, addr 1b reg 0b, mask 8000, val 0000, data c000
    [   58.367487] mv88e6085 mdio_mux-0.1:00: Timeout waiting for
        ATU op 4000, fid 0001
    (...)
    [   61.826293] mv88e6085 mdio_mux-0.1:00: Timeout while waiting
        for switch, addr 1c reg 18, mask 8000, val 0000, data 9860
    [   61.837560] mv88e6085 mdio_mux-0.1:00: Timeout waiting
        for PHY command 1860 to complete
    
    The reason is probably not the commands: I think those are
    mostly fine with the 50+50ms timeout, but the problem
    appears when OpenWrt brings up several interfaces in
    parallel on a system with 7 populated ports: if one of
    them take more than 50 ms and waits one or more of the
    others can get stuck on the mutex for the switch and then
    this can easily multiply.
    
    As we sleep and wait, the function loop needs a final
    check after exiting the loop if we were successful.
    
    Suggested-by: Andrew Lunn <andrew@xxxxxxx>
    Cc: Tobias Waldekranz <tobias@xxxxxxxxxxxxxx>
    Fixes: 35da1dfd9484 ("net: dsa: mv88e6xxx: Improve performance of busy bit polling")
    Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx>
    Reviewed-by: Andrew Lunn <andrew@xxxxxxx>
    Link: https://lore.kernel.org/r/20230712223405.861899-1-linus.walleij@xxxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 4db1652015d1d..b69bd44ada1f2 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -109,6 +109,13 @@ int mv88e6xxx_wait_mask(struct mv88e6xxx_chip *chip, int addr, int reg,
 			usleep_range(1000, 2000);
 	}
 
+	err = mv88e6xxx_read(chip, addr, reg, &data);
+	if (err)
+		return err;
+
+	if ((data & mask) == val)
+		return 0;
+
 	dev_err(chip->dev, "Timeout while waiting for switch\n");
 	return -ETIMEDOUT;
 }



[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