On Thu, Oct 29, 2020 at 2:31 AM Vladimir Oltean <olte...@gmail.com> wrote: > > On Thu, Oct 29, 2020 at 02:12:21AM +0800, DENG Qingfang wrote: > > MT7530/7531 has a global RX packet length register, which can be used > > to set MTU. > > > > Signed-off-by: DENG Qingfang <dqf...@gmail.com> > > --- > > Reviewed-by: Vladimir Oltean <olte...@gmail.com> > > Also, please format your patches with --subject-prefix="PATCH net-next" > in the future. Jakub installed some patchwork scripts that "guess" the > tree based on the commit message, but maybe sometimes they might fail: > > https://patchwork.ozlabs.org/project/netdev/patch/e5fdcddeda21884a21162e441d1e8a04994f2825.1603837679.git.pavana.sha...@digi.com/ > > > drivers/net/dsa/mt7530.c | 36 ++++++++++++++++++++++++++++++++++++ > > drivers/net/dsa/mt7530.h | 12 ++++++++++++ > > 2 files changed, 48 insertions(+) > > > > diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c > > index de7692b763d8..7764c66a47c9 100644 > > --- a/drivers/net/dsa/mt7530.c > > +++ b/drivers/net/dsa/mt7530.c > > @@ -1021,6 +1021,40 @@ mt7530_port_disable(struct dsa_switch *ds, int port) > > mutex_unlock(&priv->reg_mutex); > > } > > > > +static int > > +mt7530_port_change_mtu(struct dsa_switch *ds, int port, int new_mtu) > > +{ > > + struct mt7530_priv *priv = ds->priv; > > + int length; > > + > > + /* When a new MTU is set, DSA always set the CPU port's MTU to the > > largest MTU > > + * of the slave ports. Because the switch only has a global RX length > > register, > > + * only allowing CPU port here is enough. > > + */ > > Good point, please tell that to Linus (cc) - I'm talking about > e0b2e0d8e669 ("net: dsa: rtl8366rb: Roof MTU for switch"),
And 6ae5834b983a ("net: dsa: b53: add MTU configuration support"), 1baf0fac10fb ("net: dsa: mv88e6xxx: Use chip-wide max frame size for MTU"), f58d2598cf70 ("net: dsa: qca8k: implement the port MTU callbacks") CC'd them as well. Also, the commit e0b2e0d8e669 states that the new_mtu parameter is L2 frame length instead of L2 payload. But according to my tests, it is L2 payload (i.e. the same as the MTU shown in `ip link` or `ifconfig`. Is that right? > > > + if (!dsa_is_cpu_port(ds, port)) > > + return 0; > > + > > + /* RX length also includes Ethernet header, MTK tag, and FCS length */ > > + length = new_mtu + ETH_HLEN + MTK_HDR_LEN + ETH_FCS_LEN; > > + if (length <= 1522) > > + mt7530_rmw(priv, MT7530_GMACCR, MAX_RX_PKT_LEN_MASK, > > MAX_RX_PKT_LEN_1522); > > + else if (length <= 1536) > > + mt7530_rmw(priv, MT7530_GMACCR, MAX_RX_PKT_LEN_MASK, > > MAX_RX_PKT_LEN_1536); > > + else if (length <= 1552) > > + mt7530_rmw(priv, MT7530_GMACCR, MAX_RX_PKT_LEN_MASK, > > MAX_RX_PKT_LEN_1552); > > + else > > + mt7530_rmw(priv, MT7530_GMACCR, MAX_RX_JUMBO_MASK | > > MAX_RX_PKT_LEN_MASK, > > + MAX_RX_JUMBO(DIV_ROUND_UP(length, 1024)) | > > MAX_RX_PKT_LEN_JUMBO); > > + > > + return 0; > > +} > > + > > +static int > > +mt7530_port_max_mtu(struct dsa_switch *ds, int port) > > +{ > > + return MT7530_MAX_MTU; > > +} > > + > > static void > > mt7530_stp_state_set(struct dsa_switch *ds, int port, u8 state) > > { > > @@ -2519,6 +2553,8 @@ static const struct dsa_switch_ops mt7530_switch_ops > > = { > > .get_sset_count = mt7530_get_sset_count, > > .port_enable = mt7530_port_enable, > > .port_disable = mt7530_port_disable, > > + .port_change_mtu = mt7530_port_change_mtu, > > + .port_max_mtu = mt7530_port_max_mtu, > > .port_stp_state_set = mt7530_stp_state_set, > > .port_bridge_join = mt7530_port_bridge_join, > > .port_bridge_leave = mt7530_port_bridge_leave,