From: Jens Emil Schulz Ostergaard <jensemil.schulzostergaard@microchip.com>
To: Jakub Kicinski <kuba@kernel.org>
Cc: <UNGLinuxDriver@microchip.com>, <andrew@lunn.ch>,
<olteanv@gmail.com>, <davem@davemloft.net>, <edumazet@google.com>,
<pabeni@redhat.com>, <horms@kernel.org>, <robh@kernel.org>,
<krzk+dt@kernel.org>, <conor+dt@kernel.org>,
<woojung.huh@microchip.com>, <linux@armlinux.org.uk>,
<Steen.Hegelund@microchip.com>, <daniel.machon@microchip.com>,
<linux-kernel@vger.kernel.org>, <netdev@vger.kernel.org>,
<devicetree@vger.kernel.org>
Subject: Re: [PATCH net-next v4 1/9] net: dsa: add tag driver for LAN9645X
Date: Tue, 12 May 2026 08:28:46 +0200 [thread overview]
Message-ID: <5d440e2a4647a578c277e303a8ad7f0f4bc96767.camel@microchip.com> (raw)
In-Reply-To: <20260506014552.1616551-1-kuba@kernel.org>
On Tue, 2026-05-05 at 18:45 -0700, Jakub Kicinski wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
>
> This is an AI-generated review of your patch. The human sending this
> email has considered the AI review valid, or at least plausible.
> ---
> net: dsa: add tag driver for LAN9645X
>
> Adds a DSA tag driver for Microchip LAN9645x switches operating with a
> front port configured as an NPI CPU port. RX uses a 16-byte long prefix
> plus a 28-byte internal frame header; TX uses only the IFH.
>
> > diff --git a/net/dsa/tag_lan9645x.c b/net/dsa/tag_lan9645x.c
> > new file mode 100644
> > index 000000000000..81e7a78e0f81
> > --- /dev/null
> > +++ b/net/dsa/tag_lan9645x.c
>
> [ ... ]
>
> > +static struct sk_buff *lan9645x_rcv(struct sk_buff *skb,
> > + struct net_device *ndev)
> > +{
> > + u32 src_port, qos_class, vlan_tci, tag_type, popcnt, etype_ofs;
> > + struct dsa_port *dp;
> > + u32 ifh_gap_len = 0;
> > + u16 vlan_tpid;
> > + u8 *ifh;
> > +
> > + /* DSA master already consumed DMAC,SMAC,ETYPE from long prefix. Go back
> > + * to beginning of frame.
> > + */
> > + skb_push(skb, ETH_HLEN);
> > +
> > + if (unlikely(!pskb_may_pull(skb, LAN9645X_TOTAL_TAG_LEN)))
> > + return NULL;
> > +
> > + /* IFH starts after our long prefix */
> > + ifh = skb_pull(skb, LAN9645X_LONG_PREFIX_LEN);
>
> [ ... ]
>
> > + skb_pull(skb, LAN9645X_IFH_LEN);
> > +
> > + if (unlikely(!pskb_may_pull(skb, ifh_gap_len + ETH_HLEN)))
> > + return NULL;
> > +
> > + skb_pull(skb, ifh_gap_len);
> > + skb_reset_mac_header(skb);
> > + skb_set_network_header(skb, ETH_HLEN);
> > + skb_reset_mac_len(skb);
> > +
> > + /* Remove the long prefix + IFH + ifh_gap contribution from
> > + * skb->csum so the stack sees a checksum consistent with the
> > + * real Ethernet frame. skb->data currently points at the real
> > + * MAC header.
> > + */
> > + skb_postpull_rcsum(skb,
> > + skb->data - LAN9645X_TOTAL_TAG_LEN - ifh_gap_len,
> > + LAN9645X_TOTAL_TAG_LEN + ifh_gap_len);
>
> Does this skb_postpull_rcsum() call subtract the wrong region from
> skb->csum for CHECKSUM_COMPLETE frames?
>
> By the time lan9645x_rcv() is entered, the conduit's eth_type_trans()
> has already pulled the first ETH_HLEN (14) bytes of the long prefix and
> adjusted skb->csum accordingly, so skb->csum covers bytes starting at
> offset 14 (the remaining 2 bytes of the long prefix plus IFH plus any
> gap plus the real frame).
>
> At the point of the skb_postpull_rcsum() call, skb->data points at the
> real MAC header, i.e. at offset LAN9645X_TOTAL_TAG_LEN + ifh_gap_len
> from the start of the originally-received frame. So
> skb->data - LAN9645X_TOTAL_TAG_LEN - ifh_gap_len points at offset 0,
> and the subtracted region is [0, LAN9645X_TOTAL_TAG_LEN + ifh_gap_len).
>
> That region includes the first 14 bytes that eth_type_trans() already
> removed from skb->csum, and it stops short of the real MAC header which
> also needs to be removed. Shouldn't the subtracted region instead start
> at what skb->data was on entry to rcv() (i.e. post-eth_type_trans) and
> cover LAN9645X_TOTAL_TAG_LEN + ifh_gap_len bytes from there, so that it
> matches what skb->csum actually covers?
>
> For reference, tag_ocelot.c (cited in the commit message as the
> architectural model) saves start = skb->data at function entry before
> any skb_push()/skb_pull() manipulation:
>
> net/dsa/tag_ocelot.c:ocelot_rcv() {
> ...
> u8 *start = skb->data;
> ...
> skb_push(skb, ETH_HLEN);
> skb_pull(skb, OCELOT_SHORT_PREFIX_LEN);
> ...
> }
>
> and later passes that saved pointer to skb_postpull_rcsum() with the
> total tag length, so the subtracted region exactly matches what the
> NIC's csum_complete covers.
>
> Would saving skb->data on entry (before the initial skb_push(ETH_HLEN))
> and passing that as the start argument, with length
> LAN9645X_TOTAL_TAG_LEN + ifh_gap_len, produce the correct result here
> as well?
Hehe, this is what I did originally, but in the previous version sashiko
convinced me that was not correct. I do not have a CHECKSUM_COMPLETE
host to test it with unfortunately. But after looking at mlx5 it does seem
the original was correct and the (real) ethernet header should be subtracted.
We can not save skb->data on entry, as it may have become stale. But just
swapping the order of skb_pull(skb, ETH_HLEN) and skb_postpul_rcsum should
give the desired effect. I will fix this in the next version.
next prev parent reply other threads:[~2026-05-12 6:29 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-30 9:34 [PATCH net-next v4 0/9] net: dsa: add DSA support for the LAN9645x switch chip family Jens Emil Schulz Østergaard
2026-04-30 9:34 ` [PATCH net-next v4 1/9] net: dsa: add tag driver for LAN9645X Jens Emil Schulz Østergaard
2026-05-06 1:45 ` Jakub Kicinski
2026-05-12 6:28 ` Jens Emil Schulz Ostergaard [this message]
2026-04-30 9:34 ` [PATCH net-next v4 2/9] dt-bindings: net: lan9645x: add LAN9645X switch bindings Jens Emil Schulz Østergaard
2026-04-30 9:34 ` [PATCH net-next v4 3/9] net: dsa: lan9645x: add autogenerated register macros Jens Emil Schulz Østergaard
2026-04-30 9:34 ` [PATCH net-next v4 4/9] net: dsa: lan9645x: add basic dsa driver for LAN9645X Jens Emil Schulz Østergaard
2026-05-06 1:45 ` Jakub Kicinski
2026-05-12 7:15 ` Jens Emil Schulz Ostergaard
2026-04-30 9:34 ` [PATCH net-next v4 5/9] net: dsa: lan9645x: add bridge support Jens Emil Schulz Østergaard
2026-05-06 1:46 ` Jakub Kicinski
2026-05-12 7:24 ` Jens Emil Schulz Ostergaard
2026-04-30 9:34 ` [PATCH net-next v4 6/9] net: dsa: lan9645x: add vlan support Jens Emil Schulz Østergaard
2026-05-06 1:46 ` Jakub Kicinski
2026-05-12 7:29 ` Jens Emil Schulz Ostergaard
2026-04-30 9:34 ` [PATCH net-next v4 7/9] net: dsa: lan9645x: add mac table integration Jens Emil Schulz Østergaard
2026-05-06 1:46 ` Jakub Kicinski
2026-05-12 7:42 ` Jens Emil Schulz Ostergaard
2026-04-30 9:34 ` [PATCH net-next v4 8/9] net: dsa: lan9645x: add mdb management Jens Emil Schulz Østergaard
2026-05-06 1:46 ` Jakub Kicinski
2026-05-12 7:45 ` Jens Emil Schulz Ostergaard
2026-04-30 9:34 ` [PATCH net-next v4 9/9] net: dsa: lan9645x: add port statistics Jens Emil Schulz Østergaard
2026-05-06 1:46 ` Jakub Kicinski
2026-05-06 1:48 ` Jakub Kicinski
2026-05-12 8:47 ` Jens Emil Schulz Ostergaard
2026-05-12 23:39 ` Jakub Kicinski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5d440e2a4647a578c277e303a8ad7f0f4bc96767.camel@microchip.com \
--to=jensemil.schulzostergaard@microchip.com \
--cc=Steen.Hegelund@microchip.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=andrew@lunn.ch \
--cc=conor+dt@kernel.org \
--cc=daniel.machon@microchip.com \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=olteanv@gmail.com \
--cc=pabeni@redhat.com \
--cc=robh@kernel.org \
--cc=woojung.huh@microchip.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox