net: ocelot: add support for ndo_change_mtu
authorClément Léger <clement.leger@bootlin.com>
Thu, 9 Dec 2021 15:49:10 +0000 (16:49 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sat, 11 Dec 2021 04:56:57 +0000 (20:56 -0800)
This commit adds support for changing MTU for the ocelot register based
interface. For ocelot, JUMBO frame size can be set up to 25000 bytes
but has been set to 9000 which is a saner value and allows for maximum
gain of performance with FDMA.

Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Clément Léger <clement.leger@bootlin.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mscc/ocelot.h
drivers/net/ethernet/mscc/ocelot_net.c

index 1eb0b5ad51e97d6f5ada56ab5d3209f229e0a767..bf4eff6d7086db9a6984d0db01dc19e20cac6834 100644 (file)
@@ -32,6 +32,8 @@
 
 #define OCELOT_PTP_QUEUE_SZ    128
 
+#define OCELOT_JUMBO_MTU       9000
+
 struct ocelot_port_tc {
        bool block_shared;
        unsigned long offload_cnt;
index 0fcf359a697583475211926ca1ad816468fa425b..881e4d8e7f8e43b4dbf497252e50dbdf8a4c1cd3 100644 (file)
@@ -764,10 +764,23 @@ static int ocelot_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        return phy_mii_ioctl(dev->phydev, ifr, cmd);
 }
 
+static int ocelot_change_mtu(struct net_device *dev, int new_mtu)
+{
+       struct ocelot_port_private *priv = netdev_priv(dev);
+       struct ocelot_port *ocelot_port = &priv->port;
+       struct ocelot *ocelot = ocelot_port->ocelot;
+
+       ocelot_port_set_maxlen(ocelot, priv->chip_port, new_mtu);
+       WRITE_ONCE(dev->mtu, new_mtu);
+
+       return 0;
+}
+
 static const struct net_device_ops ocelot_port_netdev_ops = {
        .ndo_open                       = ocelot_port_open,
        .ndo_stop                       = ocelot_port_stop,
        .ndo_start_xmit                 = ocelot_port_xmit,
+       .ndo_change_mtu                 = ocelot_change_mtu,
        .ndo_set_rx_mode                = ocelot_set_rx_mode,
        .ndo_set_mac_address            = ocelot_port_set_mac_address,
        .ndo_get_stats64                = ocelot_get_stats64,
@@ -1670,6 +1683,7 @@ int ocelot_probe_port(struct ocelot *ocelot, int port, struct regmap *target,
 
        dev->netdev_ops = &ocelot_port_netdev_ops;
        dev->ethtool_ops = &ocelot_ethtool_ops;
+       dev->max_mtu = OCELOT_JUMBO_MTU;
 
        dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_RXFCS |
                NETIF_F_HW_TC;