config->mac_capabilities |= MAC_1000FD;
 }
 
+int ksz9477_set_ageing_time(struct ksz_device *dev, unsigned int msecs)
+{
+       u32 secs = msecs / 1000;
+       u8 value;
+       u8 data;
+       int ret;
+
+       value = FIELD_GET(SW_AGE_PERIOD_7_0_M, secs);
+
+       ret = ksz_write8(dev, REG_SW_LUE_CTRL_3, value);
+       if (ret < 0)
+               return ret;
+
+       data = FIELD_GET(SW_AGE_PERIOD_10_8_M, secs);
+
+       ret = ksz_read8(dev, REG_SW_LUE_CTRL_0, &value);
+       if (ret < 0)
+               return ret;
+
+       value &= ~SW_AGE_CNT_M;
+       value |= FIELD_PREP(SW_AGE_CNT_M, data);
+
+       return ksz_write8(dev, REG_SW_LUE_CTRL_0, value);
+}
+
 void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)
 {
        struct dsa_switch *ds = dev->ds;
 
 void ksz9477_cfg_port_member(struct ksz_device *dev, int port, u8 member);
 void ksz9477_flush_dyn_mac_table(struct ksz_device *dev, int port);
 void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port);
+int ksz9477_set_ageing_time(struct ksz_device *dev, unsigned int msecs);
 int ksz9477_r_phy(struct ksz_device *dev, u16 addr, u16 reg, u16 *data);
 int ksz9477_w_phy(struct ksz_device *dev, u16 addr, u16 reg, u16 val);
 void ksz9477_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, u64 *cnt);
 
 
 #define SW_VLAN_ENABLE                 BIT(7)
 #define SW_DROP_INVALID_VID            BIT(6)
-#define SW_AGE_CNT_M                   0x7
+#define SW_AGE_CNT_M                   GENMASK(5, 3)
 #define SW_AGE_CNT_S                   3
+#define SW_AGE_PERIOD_10_8_M           GENMASK(10, 8)
 #define SW_RESV_MCAST_ENABLE           BIT(2)
 #define SW_HASH_OPTION_M               0x03
 #define SW_HASH_OPTION_CRC             1
 #define SW_PRIO_LOWEST_DA_SA           3
 
 #define REG_SW_LUE_CTRL_3              0x0313
+#define SW_AGE_PERIOD_7_0_M            GENMASK(7, 0)
 
 #define REG_SW_LUE_INT_STATUS          0x0314
 #define REG_SW_LUE_INT_ENABLE          0x0315
 
        .cfg_port_member = ksz9477_cfg_port_member,
        .flush_dyn_mac_table = ksz9477_flush_dyn_mac_table,
        .port_setup = ksz9477_port_setup,
+       .set_ageing_time = ksz9477_set_ageing_time,
        .r_phy = ksz9477_r_phy,
        .w_phy = ksz9477_w_phy,
        .r_mib_cnt = ksz9477_r_mib_cnt,
        .cfg_port_member = ksz9477_cfg_port_member,
        .flush_dyn_mac_table = ksz9477_flush_dyn_mac_table,
        .port_setup = lan937x_port_setup,
+       .set_ageing_time = lan937x_set_ageing_time,
        .r_phy = lan937x_r_phy,
        .w_phy = lan937x_w_phy,
        .r_mib_cnt = ksz9477_r_mib_cnt,
        dev->dev_ops->flush_dyn_mac_table(dev, port);
 }
 
+static int ksz_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
+{
+       struct ksz_device *dev = ds->priv;
+
+       if (!dev->dev_ops->set_ageing_time)
+               return -EOPNOTSUPP;
+
+       return dev->dev_ops->set_ageing_time(dev, msecs);
+}
+
 static int ksz_port_fdb_add(struct dsa_switch *ds, int port,
                            const unsigned char *addr, u16 vid,
                            struct dsa_db db)
        .phylink_mac_link_up    = ksz_phylink_mac_link_up,
        .phylink_mac_link_down  = ksz_mac_link_down,
        .port_enable            = ksz_enable_port,
+       .set_ageing_time        = ksz_set_ageing_time,
        .get_strings            = ksz_get_strings,
        .get_ethtool_stats      = ksz_get_ethtool_stats,
        .get_sset_count         = ksz_sset_count,
 
        void (*flush_dyn_mac_table)(struct ksz_device *dev, int port);
        void (*port_cleanup)(struct ksz_device *dev, int port);
        void (*port_setup)(struct ksz_device *dev, int port, bool cpu_port);
+       int (*set_ageing_time)(struct ksz_device *dev, unsigned int msecs);
        int (*r_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 *val);
        int (*w_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 val);
        void (*r_mib_cnt)(struct ksz_device *dev, int port, u16 addr,
 
 void lan937x_phylink_get_caps(struct ksz_device *dev, int port,
                              struct phylink_config *config);
 void lan937x_setup_rgmii_delay(struct ksz_device *dev, int port);
+int lan937x_set_ageing_time(struct ksz_device *dev, unsigned int msecs);
 #endif
 
        return 0;
 }
 
+int lan937x_set_ageing_time(struct ksz_device *dev, unsigned int msecs)
+{
+       u32 secs = msecs / 1000;
+       u32 value;
+       int ret;
+
+       value = FIELD_GET(SW_AGE_PERIOD_7_0_M, secs);
+
+       ret = ksz_write8(dev, REG_SW_AGE_PERIOD__1, value);
+       if (ret < 0)
+               return ret;
+
+       value = FIELD_GET(SW_AGE_PERIOD_19_8_M, secs);
+
+       return ksz_write16(dev, REG_SW_AGE_PERIOD__2, value);
+}
+
 static void lan937x_set_tune_adj(struct ksz_device *dev, int port,
                                 u16 reg, u8 val)
 {
 
 #define SW_FAST_AGING                  BIT(1)
 #define SW_LINK_AUTO_AGING             BIT(0)
 
+#define REG_SW_AGE_PERIOD__1           0x0313
+#define SW_AGE_PERIOD_7_0_M            GENMASK(7, 0)
+
+#define REG_SW_AGE_PERIOD__2           0x0320
+#define SW_AGE_PERIOD_19_8_M           GENMASK(19, 8)
+
 #define REG_SW_MAC_CTRL_0              0x0330
 #define SW_NEW_BACKOFF                 BIT(7)
 #define SW_PAUSE_UNH_MODE              BIT(1)