]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: dsa: qca8k: add set_ageing_time support
authorAnsuel Smith <ansuelsmth@gmail.com>
Mon, 22 Nov 2021 15:23:47 +0000 (16:23 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 22 Nov 2021 15:35:16 +0000 (15:35 +0000)
qca8k support setting ageing time in step of 7s. Add support for it and
set the max value accepted of 7645m.
Documentation talks about support for 10000m but that values doesn't
make sense as the value doesn't match the max value in the reg.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/qca8k.c
drivers/net/dsa/qca8k.h

index d988df913ae026cada4bda0f4909b7db435f17ba..45e769b9166b89fd6d28b1ab39daff3dccb32869 100644 (file)
@@ -1257,6 +1257,10 @@ qca8k_setup(struct dsa_switch *ds)
        /* We don't have interrupts for link changes, so we need to poll */
        ds->pcs_poll = true;
 
+       /* Set min a max ageing value supported */
+       ds->ageing_time_min = 7000;
+       ds->ageing_time_max = 458745000;
+
        return 0;
 }
 
@@ -1796,6 +1800,26 @@ qca8k_port_fast_age(struct dsa_switch *ds, int port)
        mutex_unlock(&priv->reg_mutex);
 }
 
+static int
+qca8k_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
+{
+       struct qca8k_priv *priv = ds->priv;
+       unsigned int secs = msecs / 1000;
+       u32 val;
+
+       /* AGE_TIME reg is set in 7s step */
+       val = secs / 7;
+
+       /* Handle case with 0 as val to NOT disable
+        * learning
+        */
+       if (!val)
+               val = 1;
+
+       return regmap_update_bits(priv->regmap, QCA8K_REG_ATU_CTRL, QCA8K_ATU_AGE_TIME_MASK,
+                                 QCA8K_ATU_AGE_TIME(val));
+}
+
 static int
 qca8k_port_enable(struct dsa_switch *ds, int port,
                  struct phy_device *phy)
@@ -1995,6 +2019,7 @@ static const struct dsa_switch_ops qca8k_switch_ops = {
        .get_strings            = qca8k_get_strings,
        .get_ethtool_stats      = qca8k_get_ethtool_stats,
        .get_sset_count         = qca8k_get_sset_count,
+       .set_ageing_time        = qca8k_set_ageing_time,
        .get_mac_eee            = qca8k_get_mac_eee,
        .set_mac_eee            = qca8k_set_mac_eee,
        .port_enable            = qca8k_port_enable,
index a533b8cf143be22674350c9b0ea270f8298cb7ed..40ec8012622f748f505ffd8dad715d6dad3903ab 100644 (file)
 #define   QCA8K_VTU_FUNC1_BUSY                         BIT(31)
 #define   QCA8K_VTU_FUNC1_VID_MASK                     GENMASK(27, 16)
 #define   QCA8K_VTU_FUNC1_FULL                         BIT(4)
+#define QCA8K_REG_ATU_CTRL                             0x618
+#define   QCA8K_ATU_AGE_TIME_MASK                      GENMASK(15, 0)
+#define   QCA8K_ATU_AGE_TIME(x)                                FIELD_PREP(QCA8K_ATU_AGE_TIME_MASK, (x))
 #define QCA8K_REG_GLOBAL_FW_CTRL0                      0x620
 #define   QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN            BIT(10)
 #define QCA8K_REG_GLOBAL_FW_CTRL1                      0x624