From 462a088c474832b19ff2730de1e6bea66d399c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Sat, 15 Oct 2022 23:01:29 +0200 Subject: Add Turris kernel (includes patches from OpenWrt) --- ...8e6xxx-improve-88e6352-serdes-statistics-.patch | 125 +++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 pkgs/patches-linux-5.15/784-v5.19-4-net-dsa-mv88e6xxx-improve-88e6352-serdes-statistics-.patch (limited to 'pkgs/patches-linux-5.15/784-v5.19-4-net-dsa-mv88e6xxx-improve-88e6352-serdes-statistics-.patch') diff --git a/pkgs/patches-linux-5.15/784-v5.19-4-net-dsa-mv88e6xxx-improve-88e6352-serdes-statistics-.patch b/pkgs/patches-linux-5.15/784-v5.19-4-net-dsa-mv88e6xxx-improve-88e6352-serdes-statistics-.patch new file mode 100644 index 0000000..ce63919 --- /dev/null +++ b/pkgs/patches-linux-5.15/784-v5.19-4-net-dsa-mv88e6xxx-improve-88e6352-serdes-statistics-.patch @@ -0,0 +1,125 @@ +From d84031286e44a08a3512a8e98a6f3a4e37e6c11d Mon Sep 17 00:00:00 2001 +From: "Russell King (Oracle)" +Date: Thu, 3 Feb 2022 13:30:52 +0000 +Subject: [PATCH 4/6] net: dsa: mv88e6xxx: improve 88e6352 serdes statistics + detection +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The decision whether to report serdes statistics currently depends on +the cached C_Mode value for the port, read at probe time or updated by +configuration. However, port 4 can be in "automedia" mode when it is +used as a serdes port, meaning it switches between the internal PHY and +the serdes, changing the read-only C_Mode value depending on which +first gains link. Consequently, the C_Mode value read at probe does not +accurately reflect whether the port has the serdes associated with it. + +In "net: dsa: mv88e6xxx: add mv88e6352_g2_scratch_port_has_serdes()", +we added a way to read the hardware configuration to determine which +port has the serdes associated with it. Use this to determine which +port reports the serdes statistics. + +Reviewed-by: Marek BehĂșn +Signed-off-by: Russell King (Oracle) +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/mv88e6xxx/serdes.c | 43 ++++++++++++++++-------------- + 1 file changed, 23 insertions(+), 20 deletions(-) + +diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx/serdes.c +index 6ae7a0ed9e0b..bde2228b674d 100644 +--- a/drivers/net/dsa/mv88e6xxx/serdes.c ++++ b/drivers/net/dsa/mv88e6xxx/serdes.c +@@ -267,14 +267,6 @@ int mv88e6352_serdes_get_lane(struct mv88e6xxx_chip *chip, int port) + return lane; + } + +-static bool mv88e6352_port_has_serdes(struct mv88e6xxx_chip *chip, int port) +-{ +- if (mv88e6xxx_serdes_get_lane(chip, port) >= 0) +- return true; +- +- return false; +-} +- + struct mv88e6352_serdes_hw_stat { + char string[ETH_GSTRING_LEN]; + int sizeof_stat; +@@ -288,20 +280,24 @@ static struct mv88e6352_serdes_hw_stat mv88e6352_serdes_hw_stats[] = { + + int mv88e6352_serdes_get_sset_count(struct mv88e6xxx_chip *chip, int port) + { +- if (mv88e6352_port_has_serdes(chip, port)) +- return ARRAY_SIZE(mv88e6352_serdes_hw_stats); ++ int err; + +- return 0; ++ err = mv88e6352_g2_scratch_port_has_serdes(chip, port); ++ if (err <= 0) ++ return err; ++ ++ return ARRAY_SIZE(mv88e6352_serdes_hw_stats); + } + + int mv88e6352_serdes_get_strings(struct mv88e6xxx_chip *chip, + int port, uint8_t *data) + { + struct mv88e6352_serdes_hw_stat *stat; +- int i; ++ int err, i; + +- if (!mv88e6352_port_has_serdes(chip, port)) +- return 0; ++ err = mv88e6352_g2_scratch_port_has_serdes(chip, port); ++ if (err <= 0) ++ return err; + + for (i = 0; i < ARRAY_SIZE(mv88e6352_serdes_hw_stats); i++) { + stat = &mv88e6352_serdes_hw_stats[i]; +@@ -343,11 +339,12 @@ int mv88e6352_serdes_get_stats(struct mv88e6xxx_chip *chip, int port, + { + struct mv88e6xxx_port *mv88e6xxx_port = &chip->ports[port]; + struct mv88e6352_serdes_hw_stat *stat; ++ int i, err; + u64 value; +- int i; + +- if (!mv88e6352_port_has_serdes(chip, port)) +- return 0; ++ err = mv88e6352_g2_scratch_port_has_serdes(chip, port); ++ if (err <= 0) ++ return err; + + BUILD_BUG_ON(ARRAY_SIZE(mv88e6352_serdes_hw_stats) > + ARRAY_SIZE(mv88e6xxx_port->serdes_stats)); +@@ -414,8 +411,13 @@ unsigned int mv88e6352_serdes_irq_mapping(struct mv88e6xxx_chip *chip, int port) + + int mv88e6352_serdes_get_regs_len(struct mv88e6xxx_chip *chip, int port) + { +- if (!mv88e6352_port_has_serdes(chip, port)) +- return 0; ++ int err; ++ ++ mv88e6xxx_reg_lock(chip); ++ err = mv88e6352_g2_scratch_port_has_serdes(chip, port); ++ mv88e6xxx_reg_unlock(chip); ++ if (err <= 0) ++ return err; + + return 32 * sizeof(u16); + } +@@ -427,7 +429,8 @@ void mv88e6352_serdes_get_regs(struct mv88e6xxx_chip *chip, int port, void *_p) + int err; + int i; + +- if (!mv88e6352_port_has_serdes(chip, port)) ++ err = mv88e6352_g2_scratch_port_has_serdes(chip, port); ++ if (err <= 0) + return; + + for (i = 0 ; i < 32; i++) { +-- +2.35.1 + -- cgit v1.2.3