Message ID | 20221107135755.2664997-2-o.rempel@pengutronix.de (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: dsa: microchip: add MTU support for KSZ8 series | expand |
On Mon, 2022-11-07 at 14:57 +0100, Oleksij Rempel wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you > know the content is safe > > There are no HW specific registers, so we can process all of them > in one location. Tested in KSZ9893 and LAN937x by changing the mtu to max_mtu using ifconfig. It works fine. > > Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> > --- > drivers/net/dsa/microchip/ksz9477.c | 5 ----- > drivers/net/dsa/microchip/ksz9477.h | 1 - > drivers/net/dsa/microchip/ksz9477_reg.h | 2 -- > drivers/net/dsa/microchip/ksz_common.c | 21 ++++++++++++++++----- > drivers/net/dsa/microchip/ksz_common.h | 3 ++- > 5 files changed, 18 insertions(+), 14 deletions(-) > > diff --git a/drivers/net/dsa/microchip/ksz9477.c > b/drivers/net/dsa/microchip/ksz9477.c > index a6a0321a8931..e3adb126fdff 100644 > --- a/drivers/net/dsa/microchip/ksz9477.c > +++ b/drivers/net/dsa/microchip/ksz9477.c > @@ -60,11 +60,6 @@ int ksz9477_change_mtu(struct ksz_device *dev, int > port, int mtu) > REG_SW_MTU_MASK, max_frame); > } > > -int ksz9477_max_mtu(struct ksz_device *dev, int port) > -{ > - return KSZ9477_MAX_FRAME_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN; > -} > - > static int ksz9477_wait_vlan_ctrl_ready(struct ksz_device *dev) > { > unsigned int val; > diff --git a/drivers/net/dsa/microchip/ksz9477.h > b/drivers/net/dsa/microchip/ksz9477.h > index 00862c4cfb7f..7c5bb3032772 100644 > --- a/drivers/net/dsa/microchip/ksz9477.h > +++ b/drivers/net/dsa/microchip/ksz9477.h > @@ -50,7 +50,6 @@ int ksz9477_mdb_add(struct ksz_device *dev, int > port, > int ksz9477_mdb_del(struct ksz_device *dev, int port, > const struct switchdev_obj_port_mdb *mdb, struct > dsa_db db); > int ksz9477_change_mtu(struct ksz_device *dev, int port, int mtu); > -int ksz9477_max_mtu(struct ksz_device *dev, int port); > void ksz9477_config_cpu_port(struct dsa_switch *ds); > int ksz9477_enable_stp_addr(struct ksz_device *dev); > int ksz9477_reset_switch(struct ksz_device *dev); > diff --git a/drivers/net/dsa/microchip/ksz9477_reg.h > b/drivers/net/dsa/microchip/ksz9477_reg.h > index 53c68d286dd3..cc457fa64939 100644 > --- a/drivers/net/dsa/microchip/ksz9477_reg.h > +++ b/drivers/net/dsa/microchip/ksz9477_reg.h > @@ -1615,6 +1615,4 @@ > #define PTP_TRIG_UNIT_M (BIT(MAX_TRIG_UNIT) - > 1) > #define PTP_TS_UNIT_M (BIT(MAX_TIMESTAMP_UNIT) - 1) > > -#define KSZ9477_MAX_FRAME_SIZE 9000 > - > #endif /* KSZ9477_REGS_H */ > diff --git a/drivers/net/dsa/microchip/ksz_common.c > b/drivers/net/dsa/microchip/ksz_common.c > index d612181b3226..486ad03d0acf 100644 > --- a/drivers/net/dsa/microchip/ksz_common.c > +++ b/drivers/net/dsa/microchip/ksz_common.c > @@ -14,6 +14,7 @@ > #include <linux/phy.h> > #include <linux/etherdevice.h> > #include <linux/if_bridge.h> > +#include <linux/if_vlan.h> > #include <linux/irq.h> > #include <linux/irqdomain.h> > #include <linux/of_mdio.h> > @@ -206,7 +207,6 @@ static const struct ksz_dev_ops ksz9477_dev_ops = > { > .mdb_add = ksz9477_mdb_add, > .mdb_del = ksz9477_mdb_del, > .change_mtu = ksz9477_change_mtu, > - .max_mtu = ksz9477_max_mtu, > .phylink_mac_link_up = ksz9477_phylink_mac_link_up, > .config_cpu_port = ksz9477_config_cpu_port, > .enable_stp_addr = ksz9477_enable_stp_addr, > @@ -243,7 +243,6 @@ static const struct ksz_dev_ops lan937x_dev_ops = > { > .mdb_add = ksz9477_mdb_add, > .mdb_del = ksz9477_mdb_del, > .change_mtu = lan937x_change_mtu, > - .max_mtu = ksz9477_max_mtu, > .phylink_mac_link_up = ksz9477_phylink_mac_link_up, > .config_cpu_port = lan937x_config_cpu_port, > .enable_stp_addr = ksz9477_enable_stp_addr, > @@ -2473,10 +2472,22 @@ static int ksz_max_mtu(struct dsa_switch *ds, > int port) > { > struct ksz_device *dev = ds->priv; > > - if (!dev->dev_ops->max_mtu) > - return -EOPNOTSUPP; > + switch (dev->chip_id) { > + case KSZ8563_CHIP_ID: > + case KSZ9477_CHIP_ID: > + case KSZ9567_CHIP_ID: > + case KSZ9893_CHIP_ID: > + case KSZ9896_CHIP_ID: > + case KSZ9897_CHIP_ID: > + case LAN9370_CHIP_ID: > + case LAN9371_CHIP_ID: > + case LAN9372_CHIP_ID: > + case LAN9373_CHIP_ID: > + case LAN9374_CHIP_ID: > + return KSZ9477_MAX_FRAME_SIZE - VLAN_ETH_HLEN - > ETH_FCS_LEN; > + } > > - return dev->dev_ops->max_mtu(dev, port); > + return -EOPNOTSUPP; > } > > static void ksz_set_xmii(struct ksz_device *dev, int port, > diff --git a/drivers/net/dsa/microchip/ksz_common.h > b/drivers/net/dsa/microchip/ksz_common.h > index 9cfa179575ce..7de5070637ec 100644 > --- a/drivers/net/dsa/microchip/ksz_common.h > +++ b/drivers/net/dsa/microchip/ksz_common.h > @@ -320,7 +320,6 @@ struct ksz_dev_ops { > void (*get_caps)(struct ksz_device *dev, int port, > struct phylink_config *config); > int (*change_mtu)(struct ksz_device *dev, int port, int mtu); > - int (*max_mtu)(struct ksz_device *dev, int port); > void (*freeze_mib)(struct ksz_device *dev, int port, bool > freeze); > void (*port_init_cnt)(struct ksz_device *dev, int port); > void (*phylink_mac_config)(struct ksz_device *dev, int port, > @@ -585,6 +584,8 @@ static inline int is_lan937x(struct ksz_device > *dev) > > #define PORT_SRC_PHY_INT 1 > > +#define KSZ9477_MAX_FRAME_SIZE 9000 > + > /* Regmap tables generation */ > #define KSZ_SPI_OP_RD 3 > #define KSZ_SPI_OP_WR 2 > -- > 2.30.2 >
diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchip/ksz9477.c index a6a0321a8931..e3adb126fdff 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -60,11 +60,6 @@ int ksz9477_change_mtu(struct ksz_device *dev, int port, int mtu) REG_SW_MTU_MASK, max_frame); } -int ksz9477_max_mtu(struct ksz_device *dev, int port) -{ - return KSZ9477_MAX_FRAME_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN; -} - static int ksz9477_wait_vlan_ctrl_ready(struct ksz_device *dev) { unsigned int val; diff --git a/drivers/net/dsa/microchip/ksz9477.h b/drivers/net/dsa/microchip/ksz9477.h index 00862c4cfb7f..7c5bb3032772 100644 --- a/drivers/net/dsa/microchip/ksz9477.h +++ b/drivers/net/dsa/microchip/ksz9477.h @@ -50,7 +50,6 @@ int ksz9477_mdb_add(struct ksz_device *dev, int port, int ksz9477_mdb_del(struct ksz_device *dev, int port, const struct switchdev_obj_port_mdb *mdb, struct dsa_db db); int ksz9477_change_mtu(struct ksz_device *dev, int port, int mtu); -int ksz9477_max_mtu(struct ksz_device *dev, int port); void ksz9477_config_cpu_port(struct dsa_switch *ds); int ksz9477_enable_stp_addr(struct ksz_device *dev); int ksz9477_reset_switch(struct ksz_device *dev); diff --git a/drivers/net/dsa/microchip/ksz9477_reg.h b/drivers/net/dsa/microchip/ksz9477_reg.h index 53c68d286dd3..cc457fa64939 100644 --- a/drivers/net/dsa/microchip/ksz9477_reg.h +++ b/drivers/net/dsa/microchip/ksz9477_reg.h @@ -1615,6 +1615,4 @@ #define PTP_TRIG_UNIT_M (BIT(MAX_TRIG_UNIT) - 1) #define PTP_TS_UNIT_M (BIT(MAX_TIMESTAMP_UNIT) - 1) -#define KSZ9477_MAX_FRAME_SIZE 9000 - #endif /* KSZ9477_REGS_H */ diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index d612181b3226..486ad03d0acf 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -14,6 +14,7 @@ #include <linux/phy.h> #include <linux/etherdevice.h> #include <linux/if_bridge.h> +#include <linux/if_vlan.h> #include <linux/irq.h> #include <linux/irqdomain.h> #include <linux/of_mdio.h> @@ -206,7 +207,6 @@ static const struct ksz_dev_ops ksz9477_dev_ops = { .mdb_add = ksz9477_mdb_add, .mdb_del = ksz9477_mdb_del, .change_mtu = ksz9477_change_mtu, - .max_mtu = ksz9477_max_mtu, .phylink_mac_link_up = ksz9477_phylink_mac_link_up, .config_cpu_port = ksz9477_config_cpu_port, .enable_stp_addr = ksz9477_enable_stp_addr, @@ -243,7 +243,6 @@ static const struct ksz_dev_ops lan937x_dev_ops = { .mdb_add = ksz9477_mdb_add, .mdb_del = ksz9477_mdb_del, .change_mtu = lan937x_change_mtu, - .max_mtu = ksz9477_max_mtu, .phylink_mac_link_up = ksz9477_phylink_mac_link_up, .config_cpu_port = lan937x_config_cpu_port, .enable_stp_addr = ksz9477_enable_stp_addr, @@ -2473,10 +2472,22 @@ static int ksz_max_mtu(struct dsa_switch *ds, int port) { struct ksz_device *dev = ds->priv; - if (!dev->dev_ops->max_mtu) - return -EOPNOTSUPP; + switch (dev->chip_id) { + case KSZ8563_CHIP_ID: + case KSZ9477_CHIP_ID: + case KSZ9567_CHIP_ID: + case KSZ9893_CHIP_ID: + case KSZ9896_CHIP_ID: + case KSZ9897_CHIP_ID: + case LAN9370_CHIP_ID: + case LAN9371_CHIP_ID: + case LAN9372_CHIP_ID: + case LAN9373_CHIP_ID: + case LAN9374_CHIP_ID: + return KSZ9477_MAX_FRAME_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN; + } - return dev->dev_ops->max_mtu(dev, port); + return -EOPNOTSUPP; } static void ksz_set_xmii(struct ksz_device *dev, int port, diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/microchip/ksz_common.h index 9cfa179575ce..7de5070637ec 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -320,7 +320,6 @@ struct ksz_dev_ops { void (*get_caps)(struct ksz_device *dev, int port, struct phylink_config *config); int (*change_mtu)(struct ksz_device *dev, int port, int mtu); - int (*max_mtu)(struct ksz_device *dev, int port); void (*freeze_mib)(struct ksz_device *dev, int port, bool freeze); void (*port_init_cnt)(struct ksz_device *dev, int port); void (*phylink_mac_config)(struct ksz_device *dev, int port, @@ -585,6 +584,8 @@ static inline int is_lan937x(struct ksz_device *dev) #define PORT_SRC_PHY_INT 1 +#define KSZ9477_MAX_FRAME_SIZE 9000 + /* Regmap tables generation */ #define KSZ_SPI_OP_RD 3 #define KSZ_SPI_OP_WR 2
There are no HW specific registers, so we can process all of them in one location. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- drivers/net/dsa/microchip/ksz9477.c | 5 ----- drivers/net/dsa/microchip/ksz9477.h | 1 - drivers/net/dsa/microchip/ksz9477_reg.h | 2 -- drivers/net/dsa/microchip/ksz_common.c | 21 ++++++++++++++++----- drivers/net/dsa/microchip/ksz_common.h | 3 ++- 5 files changed, 18 insertions(+), 14 deletions(-)