]> Gentwo Git Trees - linux/.git/commitdiff
net: dsa: tag_ksz: use the dsa_xmit_port_mask() helper
authorVladimir Oltean <vladimir.oltean@nxp.com>
Thu, 27 Nov 2025 12:08:52 +0000 (14:08 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 29 Nov 2025 04:03:39 +0000 (20:03 -0800)
The "ksz8795", "ksz9893", "ksz9477" and "lan937x" tagging protocols
populate a bit mask for the TX ports.

Unlike the others, "ksz9477" also accelerates HSR packet duplication.

Make the HSR duplication logic available generically to all 4 taggers by
using the dsa_xmit_port_mask() function to set the TX port mask.

Cc: Woojung Huh <woojung.huh@microchip.com>
Cc: UNGLinuxDriver@microchip.com
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://patch.msgid.link/20251127120902.292555-6-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/dsa/tag_ksz.c

index 0b7564b53790da29226249c7feb253465df2d2eb..9170a0148cc43b4213ec4bd8e81d338589671f23 100644 (file)
@@ -120,7 +120,6 @@ static struct sk_buff *ksz_common_rcv(struct sk_buff *skb,
 
 static struct sk_buff *ksz8795_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-       struct dsa_port *dp = dsa_user_to_port(dev);
        struct ethhdr *hdr;
        u8 *tag;
 
@@ -131,7 +130,7 @@ static struct sk_buff *ksz8795_xmit(struct sk_buff *skb, struct net_device *dev)
        tag = skb_put(skb, KSZ_INGRESS_TAG_LEN);
        hdr = skb_eth_hdr(skb);
 
-       *tag = 1 << dp->index;
+       *tag = dsa_xmit_port_mask(skb, dev);
        if (is_link_local_ether_addr(hdr->h_dest))
                *tag |= KSZ8795_TAIL_TAG_OVERRIDE;
 
@@ -294,21 +293,12 @@ static struct sk_buff *ksz9477_xmit(struct sk_buff *skb,
        tag = skb_put(skb, KSZ9477_INGRESS_TAG_LEN);
        hdr = skb_eth_hdr(skb);
 
-       val = BIT(dp->index);
-
+       val = dsa_xmit_port_mask(skb, dev);
        val |= FIELD_PREP(KSZ9477_TAIL_TAG_PRIO, prio);
 
        if (is_link_local_ether_addr(hdr->h_dest))
                val |= KSZ9477_TAIL_TAG_OVERRIDE;
 
-       if (dev->features & NETIF_F_HW_HSR_DUP) {
-               struct net_device *hsr_dev = dp->hsr_dev;
-               struct dsa_port *other_dp;
-
-               dsa_hsr_foreach_port(other_dp, dp->ds, hsr_dev)
-                       val |= BIT(other_dp->index);
-       }
-
        *tag = cpu_to_be16(val);
 
        return ksz_defer_xmit(dp, skb);
@@ -371,8 +361,7 @@ static struct sk_buff *ksz9893_xmit(struct sk_buff *skb,
        tag = skb_put(skb, KSZ_INGRESS_TAG_LEN);
        hdr = skb_eth_hdr(skb);
 
-       *tag = BIT(dp->index);
-
+       *tag = dsa_xmit_port_mask(skb, dev);
        *tag |= FIELD_PREP(KSZ9893_TAIL_TAG_PRIO, prio);
 
        if (is_link_local_ether_addr(hdr->h_dest))
@@ -436,8 +425,7 @@ static struct sk_buff *lan937x_xmit(struct sk_buff *skb,
 
        tag = skb_put(skb, LAN937X_EGRESS_TAG_LEN);
 
-       val = BIT(dp->index);
-
+       val = dsa_xmit_port_mask(skb, dev);
        val |= FIELD_PREP(LAN937X_TAIL_TAG_PRIO, prio);
 
        if (is_link_local_ether_addr(hdr->h_dest))