mbox series

[net-next,v3,0/5] net: ipqess: introduce Qualcomm IPQESS driver

Message ID 20220826154650.615582-1-maxime.chevallier@bootlin.com
Headers show
Series net: ipqess: introduce Qualcomm IPQESS driver | expand

Message

Maxime Chevallier Aug. 26, 2022, 3:46 p.m. UTC
Hello everyone,

This is the 3rd iteration of a series that introduces a new driver, for
the Qualcomm IPQESS Ethernet Controller, found on the IPQ4019.

Notables changes on V3 :
 - Took into account Russell's review on the ioctl handler and the mac
   capabilities that were missing
 - Took Andrew's reviews into account by reworking the napi rx loop,
   some stray "inline" keywords, and useless warnings
 - Took Vlad's reviews into account by reworking a few macros
 - Took Christophe's review into account by removing extra GFP_ZERO
 - Took Rob's review into account by simplifying the binding

Note that this V3 didn't focus on the tagging protocol, as I understand
the issue is still open. I'm willing to keep on testing some ideas, and
continue Florian's discussion.

Notables changes on V2 :
 - Put the DSA tag in the skb itself instead of using skb->shinfo
 - Fixed the initialisation sequence based on Andrew's comments
 - Reworked the error paths in the init sequence
 - Add support for the clock and reset lines on that controller
 - Fixed and updated the binding

The driver itself is pretty straightforward, but has lived out-of-tree
for a while. I've done my best to clean-up some outdated API calls, but
some might remain.

This controller is somewhat special, since it's part of the IPQ4019 SoC
which also includes an QCA8K switch, and uses the IPQESS controller for
the CPU port. The switch is so tightly intergrated with the MAC that it
is connected to the MAC using an internal link (hence the fact that we
only support PHY_INTERFACE_MODE_INTERNAL), and this has some
consequences on the DSA side.

The tagging for the switch isn't done inband as most switch do, but
out-of-band, the DSA tag being included in the DMA descriptor.

This series includes a new out-of-band tagger that uses the skb headroom
to convey the tag between the tagger and the MAC driver.

Thanks to the Sartura folks who worked on a base version of this driver,
and provided test hardware.

Best regards,

Maxime Chevallier

Maxime Chevallier (5):
  net: ipqess: introduce the Qualcomm IPQESS driver
  net: dsa: add out-of-band tagging protocol
  net: ipqess: Add out-of-band DSA tagging support
  net: dt-bindings: Introduce the Qualcomm IPQESS Ethernet controller
  ARM: dts: qcom: ipq4019: Add description for the IPQESS Ethernet
    controller

 .../devicetree/bindings/net/qcom,ipqess.yaml  |   95 ++
 MAINTAINERS                                   |    6 +
 arch/arm/boot/dts/qcom-ipq4019.dtsi           |   46 +
 drivers/net/ethernet/qualcomm/Kconfig         |   12 +
 drivers/net/ethernet/qualcomm/Makefile        |    2 +
 drivers/net/ethernet/qualcomm/ipqess/Makefile |    8 +
 drivers/net/ethernet/qualcomm/ipqess/ipqess.c | 1284 +++++++++++++++++
 drivers/net/ethernet/qualcomm/ipqess/ipqess.h |  518 +++++++
 .../ethernet/qualcomm/ipqess/ipqess_ethtool.c |  168 +++
 include/linux/dsa/oob.h                       |   17 +
 include/net/dsa.h                             |    2 +
 net/dsa/Kconfig                               |    7 +
 net/dsa/Makefile                              |    1 +
 net/dsa/tag_oob.c                             |   84 ++
 14 files changed, 2250 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/qcom,ipqess.yaml
 create mode 100644 drivers/net/ethernet/qualcomm/ipqess/Makefile
 create mode 100644 drivers/net/ethernet/qualcomm/ipqess/ipqess.c
 create mode 100644 drivers/net/ethernet/qualcomm/ipqess/ipqess.h
 create mode 100644 drivers/net/ethernet/qualcomm/ipqess/ipqess_ethtool.c
 create mode 100644 include/linux/dsa/oob.h
 create mode 100644 net/dsa/tag_oob.c

Comments

Andrew Lunn Aug. 27, 2022, 6:48 p.m. UTC | #1
> diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig
> index 3eef72ce99a4..3e095041dcca 100644
> --- a/net/dsa/Kconfig
> +++ b/net/dsa/Kconfig
> @@ -57,6 +57,13 @@ config NET_DSA_TAG_HELLCREEK
>  	  Say Y or M if you want to enable support for tagging frames
>  	  for the Hirschmann Hellcreek TSN switches.
>  
> +config NET_DSA_TAG_OOB
> +	tristate "Tag driver for Out-of-band tagging drivers"
> +	help
> +	  Say Y or M if you want to enable support for tagging out-of-band. In
> +	  that case, the MAC driver becomes responsible for sending the tag to
> +	  the switch, outside the inband data.
> +

This file is sorted by the tristate text. So this new entry should
come after NET_DSA_TAG_OCELOT_8021Q

> @@ -9,6 +9,7 @@ obj-$(CONFIG_NET_DSA_TAG_BRCM_COMMON) += tag_brcm.o
>  obj-$(CONFIG_NET_DSA_TAG_DSA_COMMON) += tag_dsa.o
>  obj-$(CONFIG_NET_DSA_TAG_GSWIP) += tag_gswip.o
>  obj-$(CONFIG_NET_DSA_TAG_HELLCREEK) += tag_hellcreek.o
> +obj-$(CONFIG_NET_DSA_TAG_OOB) += tag_oob.o
>  obj-$(CONFIG_NET_DSA_TAG_KSZ) += tag_ksz.o
>  obj-$(CONFIG_NET_DSA_TAG_LAN9303) += tag_lan9303.o
>  obj-$(CONFIG_NET_DSA_TAG_MTK) += tag_mtk.o

And this should also be after NET_DSA_TAG_OCELOT_8021Q.

    Andrew
Andrew Lunn Aug. 27, 2022, 7:28 p.m. UTC | #2
> +static void ipqess_get_strings(struct net_device *netdev, u32 stringset,
> +			       u8 *data)
> +{
> +	u8 *p = data;
> +	u32 i;
> +
> +	switch (stringset) {
> +	case ETH_SS_STATS:
> +		for (i = 0; i < ARRAY_SIZE(ipqess_stats); i++) {
> +			memcpy(p, ipqess_stats[i].string,
> +			       min((size_t)ETH_GSTRING_LEN,
> +				   strlen(ipqess_stats[i].string) + 1));

That looks pretty similar to strlcpy().

> +static int ipqess_get_settings(struct net_device *netdev,
> +			       struct ethtool_link_ksettings *cmd)

It would be traditional to have the k in the name.

> +{
> +	struct ipqess *ess = netdev_priv(netdev);
> +
> +	return phylink_ethtool_ksettings_get(ess->phylink, cmd);
> +}
> +
> +static int ipqess_set_settings(struct net_device *netdev,
> +			       const struct ethtool_link_ksettings *cmd)
> +{

Here too.

     Andrew