Commit e39d14a7 authored by Jonas Gorski's avatar Jonas Gorski Committed by Jakub Kicinski
Browse files

net: dsa: b53: implement setting ageing time



b53 supported switches support configuring ageing time between 1 and
1,048,575 seconds, so add an appropriate setter.

This allows b53 to pass the FDB learning test for both vlan aware and
vlan unaware bridges.

Signed-off-by: default avatarJonas Gorski <jonas.gorski@gmail.com>
Reviewed-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Link: https://patch.msgid.link/20250510092211.276541-1-jonas.gorski@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent b86bcfee
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <linux/export.h>
#include <linux/gpio.h>
#include <linux/kernel.h>
#include <linux/math.h>
#include <linux/module.h>
#include <linux/platform_data/b53.h>
#include <linux/phy.h>
@@ -1175,6 +1176,10 @@ static int b53_setup(struct dsa_switch *ds)
	 */
	ds->untag_vlan_aware_bridge_pvid = true;

	/* Ageing time is set in seconds */
	ds->ageing_time_min = 1 * 1000;
	ds->ageing_time_max = AGE_TIME_MAX * 1000;

	ret = b53_reset_switch(dev);
	if (ret) {
		dev_err(ds->dev, "failed to reset switch\n");
@@ -2373,6 +2378,28 @@ static int b53_get_max_mtu(struct dsa_switch *ds, int port)
	return B53_MAX_MTU;
}

int b53_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
{
	struct b53_device *dev = ds->priv;
	u32 atc;
	int reg;

	if (is63xx(dev))
		reg = B53_AGING_TIME_CONTROL_63XX;
	else
		reg = B53_AGING_TIME_CONTROL;

	atc = DIV_ROUND_CLOSEST(msecs, 1000);

	if (!is5325(dev) && !is5365(dev))
		atc |= AGE_CHANGE;

	b53_write32(dev, B53_MGMT_PAGE, reg, atc);

	return 0;
}
EXPORT_SYMBOL_GPL(b53_set_ageing_time);

static const struct phylink_mac_ops b53_phylink_mac_ops = {
	.mac_select_pcs	= b53_phylink_mac_select_pcs,
	.mac_config	= b53_phylink_mac_config,
@@ -2396,6 +2423,7 @@ static const struct dsa_switch_ops b53_switch_ops = {
	.port_disable		= b53_disable_port,
	.support_eee		= b53_support_eee,
	.set_mac_eee		= b53_set_mac_eee,
	.set_ageing_time	= b53_set_ageing_time,
	.port_bridge_join	= b53_br_join,
	.port_bridge_leave	= b53_br_leave,
	.port_pre_bridge_flags	= b53_br_flags_pre,
+1 −0
Original line number Diff line number Diff line
@@ -343,6 +343,7 @@ void b53_get_strings(struct dsa_switch *ds, int port, u32 stringset,
void b53_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data);
int b53_get_sset_count(struct dsa_switch *ds, int port, int sset);
void b53_get_ethtool_phy_stats(struct dsa_switch *ds, int port, uint64_t *data);
int b53_set_ageing_time(struct dsa_switch *ds, unsigned int msecs);
int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
		bool *tx_fwd_offload, struct netlink_ext_ack *extack);
void b53_br_leave(struct dsa_switch *ds, int port, struct dsa_bridge bridge);
+7 −0
Original line number Diff line number Diff line
@@ -217,6 +217,13 @@
#define   BRCM_HDR_P5_EN		BIT(1) /* Enable tagging on port 5 */
#define   BRCM_HDR_P7_EN		BIT(2) /* Enable tagging on port 7 */

/* Aging Time control register (32 bit) */
#define B53_AGING_TIME_CONTROL		0x06
#define B53_AGING_TIME_CONTROL_63XX	0x08
#define  AGE_CHANGE			BIT(20)
#define  AGE_TIME_MASK			0x7ffff
#define  AGE_TIME_MAX			1048575

/* Mirror capture control register (16 bit) */
#define B53_MIR_CAP_CTL			0x10
#define  CAP_PORT_MASK			0xf
+1 −0
Original line number Diff line number Diff line
@@ -1235,6 +1235,7 @@ static const struct dsa_switch_ops bcm_sf2_ops = {
	.port_disable		= bcm_sf2_port_disable,
	.support_eee		= b53_support_eee,
	.set_mac_eee		= b53_set_mac_eee,
	.set_ageing_time	= b53_set_ageing_time,
	.port_bridge_join	= b53_br_join,
	.port_bridge_leave	= b53_br_leave,
	.port_pre_bridge_flags	= b53_br_flags_pre,