2023-09-05 16:20:55

by Lukasz Majewski

[permalink] [raw]
Subject: [PATCH v2 2/4] net: dsa: Extend ksz9477 TAG setup to support HSR frames duplication

The KSZ9477 has support for HSR (High-Availability Seamless Redundancy).
One of its offloading (i.e. performed in the switch IC hardware) features
is to duplicate received frame to both HSR aware switch ports.

To achieve this goal - the tail TAG needs to be modified. To be more
specific, both ports must be marked as destination (egress) ones.

Moreover, according to AN3474 application note, the lookup bit (10)
should not be set in the tail tag.

Last but not least - the NETIF_F_HW_HSR_DUP flag indicates that the device
supports HSR and assures (in HSR core code) that frame is sent only once
from HOST to switch with tail tag indicating both ports.

Information about bits to be set in tag is provided via KSZ generic
ksz_hsr_get_ports() function.

Signed-off-by: Lukasz Majewski <[email protected]>
---
- Use ksz_hsr_get_ports() to obtain the bits values corresponding to
HSR aware ports
---
drivers/net/dsa/microchip/ksz_common.c | 12 ++++++++++++
include/linux/dsa/ksz_common.h | 1 +
net/dsa/tag_ksz.c | 5 +++++
3 files changed, 18 insertions(+)

diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c
index d9d843efd111..579fde54d1e1 100644
--- a/drivers/net/dsa/microchip/ksz_common.c
+++ b/drivers/net/dsa/microchip/ksz_common.c
@@ -3421,6 +3421,18 @@ static int ksz_setup_tc(struct dsa_switch *ds, int port,
}
}

+u16 ksz_hsr_get_ports(struct dsa_switch *ds)
+{
+ struct ksz_device *dev = ds->priv;
+
+ switch (dev->chip_id) {
+ case KSZ9477_CHIP_ID:
+ return dev->hsr_ports;
+ }
+
+ return 0;
+}
+
static const struct dsa_switch_ops ksz_switch_ops = {
.get_tag_protocol = ksz_get_tag_protocol,
.connect_tag_protocol = ksz_connect_tag_protocol,
diff --git a/include/linux/dsa/ksz_common.h b/include/linux/dsa/ksz_common.h
index 576a99ca698d..fa3d9b0f3a72 100644
--- a/include/linux/dsa/ksz_common.h
+++ b/include/linux/dsa/ksz_common.h
@@ -50,4 +50,5 @@ ksz_tagger_data(struct dsa_switch *ds)
return ds->tagger_data;
}

+u16 ksz_hsr_get_ports(struct dsa_switch *ds);
#endif /* _NET_DSA_KSZ_COMMON_H_ */
diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c
index ea100bd25939..903db95c37ee 100644
--- a/net/dsa/tag_ksz.c
+++ b/net/dsa/tag_ksz.c
@@ -293,6 +293,11 @@ static struct sk_buff *ksz9477_xmit(struct sk_buff *skb,
if (is_link_local_ether_addr(hdr->h_dest))
val |= KSZ9477_TAIL_TAG_OVERRIDE;

+ if (dev->features & NETIF_F_HW_HSR_DUP) {
+ val &= ~KSZ9477_TAIL_TAG_LOOKUP;
+ val |= ksz_hsr_get_ports(dp->ds);
+ }
+
*tag = cpu_to_be16(val);

return ksz_defer_xmit(dp, skb);
--
2.20.1


2023-09-05 16:23:48

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v2 2/4] net: dsa: Extend ksz9477 TAG setup to support HSR frames duplication

Hi Lukasz,

kernel test robot noticed the following build errors:

[auto build test ERROR on v6.5]
[also build test ERROR on next-20230831]
[cannot apply to net-next/main net/main linus/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Lukasz-Majewski/net-dsa-Extend-the-ksz_device-structure-to-hold-info-about-HSR-ports/20230831-192012
base: v6.5
patch link: https://lore.kernel.org/r/20230831111827.548118-3-lukma%40denx.de
patch subject: [PATCH v2 2/4] net: dsa: Extend ksz9477 TAG setup to support HSR frames duplication
config: openrisc-randconfig-r026-20230901 (https://download.01.org/0day-ci/archive/20230901/[email protected]/config)
compiler: or1k-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230901/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

All errors (new ones prefixed by >>):

or1k-linux-ld: net/dsa/tag_ksz.o: in function `ksz9477_xmit':
>> net/dsa/tag_ksz.c:298:(.text+0xcf8): undefined reference to `ksz_hsr_get_ports'
net/dsa/tag_ksz.c:298:(.text+0xcf8): relocation truncated to fit: R_OR1K_INSN_REL_26 against undefined symbol `ksz_hsr_get_ports'


vim +298 net/dsa/tag_ksz.c

269
270 static struct sk_buff *ksz9477_xmit(struct sk_buff *skb,
271 struct net_device *dev)
272 {
273 u16 queue_mapping = skb_get_queue_mapping(skb);
274 u8 prio = netdev_txq_to_tc(dev, queue_mapping);
275 struct dsa_port *dp = dsa_slave_to_port(dev);
276 struct ethhdr *hdr;
277 __be16 *tag;
278 u16 val;
279
280 if (skb->ip_summed == CHECKSUM_PARTIAL && skb_checksum_help(skb))
281 return NULL;
282
283 /* Tag encoding */
284 ksz_xmit_timestamp(dp, skb);
285
286 tag = skb_put(skb, KSZ9477_INGRESS_TAG_LEN);
287 hdr = skb_eth_hdr(skb);
288
289 val = BIT(dp->index);
290
291 val |= FIELD_PREP(KSZ9477_TAIL_TAG_PRIO, prio);
292
293 if (is_link_local_ether_addr(hdr->h_dest))
294 val |= KSZ9477_TAIL_TAG_OVERRIDE;
295
296 if (dev->features & NETIF_F_HW_HSR_DUP) {
297 val &= ~KSZ9477_TAIL_TAG_LOOKUP;
> 298 val |= ksz_hsr_get_ports(dp->ds);
299 }
300
301 *tag = cpu_to_be16(val);
302
303 return ksz_defer_xmit(dp, skb);
304 }
305

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki