diff mbox series

[net-next] net: dsa: xrs700x: forward HSR supervision frames

Message ID 20210615175526.19829-1-george.mccollister@gmail.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series [net-next] net: dsa: xrs700x: forward HSR supervision frames | expand

Checks

Context Check Description
netdev/cover_letter success Link
netdev/fixes_present success Link
netdev/patch_count success Link
netdev/tree_selection success Clearly marked for net-next
netdev/subject_prefix success Link
netdev/cc_maintainers success CCed 8 of 8 maintainers
netdev/source_inline success Was 0 now: 0
netdev/verify_signedoff success Link
netdev/module_param success Was 0 now: 0
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/verify_fixes fail Link
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 64 lines checked
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/header_inline success Link

Commit Message

George McCollister June 15, 2021, 5:55 p.m. UTC
Forward supervision frames between redunant HSR ports. This was broken
in the last commit.

Fixes: 1a42624aecba ("net: dsa: xrs700x: allow HSR/PRP supervision dupes
for node_table")
Signed-off-by: George McCollister <george.mccollister@gmail.com>
---
 drivers/net/dsa/xrs700x/xrs700x.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

Comments

Vladimir Oltean June 15, 2021, 11:22 p.m. UTC | #1
On Tue, Jun 15, 2021 at 12:55:26PM -0500, George McCollister wrote:
> Forward supervision frames between redunant HSR ports. This was broken
> in the last commit.
> 
> Fixes: 1a42624aecba ("net: dsa: xrs700x: allow HSR/PRP supervision dupes
> for node_table")

It would be good if you could resend with the Fixes: line not wrapped
around. There are several scripts around which won't parse that.

> Signed-off-by: George McCollister <george.mccollister@gmail.com>
> ---

Otherwise the change looks reasonably clean, and it agrees with what IEC
62439-3:2018 does seem to imply in "5.3.4 DANH forwarding rules" that
HSR_Supervision frames should be forwarded and without discarding
duplicates. For PRP, of course the DANP does not forward packets between
the redundant ports, so it does not forward PRP_Supervision packets
either.

Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
George McCollister June 16, 2021, 1:31 a.m. UTC | #2
On Tue, Jun 15, 2021 at 6:22 PM Vladimir Oltean <olteanv@gmail.com> wrote:
>
> On Tue, Jun 15, 2021 at 12:55:26PM -0500, George McCollister wrote:
> > Forward supervision frames between redunant HSR ports. This was broken
> > in the last commit.
> >
> > Fixes: 1a42624aecba ("net: dsa: xrs700x: allow HSR/PRP supervision dupes
> > for node_table")
>
> It would be good if you could resend with the Fixes: line not wrapped
> around. There are several scripts around which won't parse that.

WIll do. I was wondering which way was correct and figured scripts
should be smart enough to parse it especially since all it should
really need is Fixes: $HASH. Oh well.

>
> > Signed-off-by: George McCollister <george.mccollister@gmail.com>
> > ---
>
> Otherwise the change looks reasonably clean, and it agrees with what IEC
> 62439-3:2018 does seem to imply in "5.3.4 DANH forwarding rules" that
> HSR_Supervision frames should be forwarded and without discarding
> duplicates. For PRP, of course the DANP does not forward packets between
> the redundant ports, so it does not forward PRP_Supervision packets
> either.

Yeah the tricky part with HSR supervision frames is you must forward
if the other port has received the duplicate frame but not if the
frame has been sent out the port you're about to send from already. At
first I set the mirror bit in addition to the allow bit and activity
was on completely solid as supervision frames looped around.

>
> Reviewed-by: Vladimir Oltean <olteanv@gmail.com>

Thanks
diff mbox series

Patch

diff --git a/drivers/net/dsa/xrs700x/xrs700x.c b/drivers/net/dsa/xrs700x/xrs700x.c
index a79066174a77..130abb0f1438 100644
--- a/drivers/net/dsa/xrs700x/xrs700x.c
+++ b/drivers/net/dsa/xrs700x/xrs700x.c
@@ -337,7 +337,8 @@  static int xrs700x_port_add_bpdu_ipf(struct dsa_switch *ds, int port)
  * This is required to correctly populate the HSR/PRP node_table.
  * Leave the policy disabled, it will be enabled as needed.
  */
-static int xrs700x_port_add_hsrsup_ipf(struct dsa_switch *ds, int port)
+static int xrs700x_port_add_hsrsup_ipf(struct dsa_switch *ds, int port,
+				       int fwdport)
 {
 	struct xrs700x *priv = ds->priv;
 	unsigned int val = 0;
@@ -368,6 +369,9 @@  static int xrs700x_port_add_hsrsup_ipf(struct dsa_switch *ds, int port)
 	if (ret)
 		return ret;
 
+	if (fwdport >= 0)
+		val |= BIT(fwdport);
+
 	/* Allow must be set prevent duplicate discard */
 	ret = regmap_write(priv->regmap, XRS_ETH_ADDR_FWD_ALLOW(port, 1), val);
 	if (ret)
@@ -405,10 +409,6 @@  static int xrs700x_port_setup(struct dsa_switch *ds, int port)
 		ret = xrs700x_port_add_bpdu_ipf(ds, port);
 		if (ret)
 			return ret;
-
-		ret = xrs700x_port_add_hsrsup_ipf(ds, port);
-		if (ret)
-			return ret;
 	}
 
 	return 0;
@@ -562,6 +562,7 @@  static int xrs700x_hsr_join(struct dsa_switch *ds, int port,
 	struct net_device *slave;
 	int ret, i, hsr_pair[2];
 	enum hsr_version ver;
+	bool fwd = false;
 
 	ret = hsr_get_version(hsr, &ver);
 	if (ret)
@@ -607,6 +608,7 @@  static int xrs700x_hsr_join(struct dsa_switch *ds, int port,
 	if (ver == HSR_V1) {
 		val &= ~BIT(partner->index);
 		val &= ~BIT(port);
+		fwd = true;
 	}
 	val &= ~BIT(dsa_upstream_port(ds, port));
 	regmap_write(priv->regmap, XRS_PORT_FWD_MASK(partner->index), val);
@@ -616,10 +618,19 @@  static int xrs700x_hsr_join(struct dsa_switch *ds, int port,
 			    XRS_PORT_FORWARDING);
 	regmap_fields_write(priv->ps_forward, port, XRS_PORT_FORWARDING);
 
-	/* Enable inbound policy added by xrs700x_port_add_hsrsup_ipf()
-	 * which allows HSR/PRP supervision forwarding to the CPU port without
-	 * discarding duplicates.
+	/* Enable inbound policy which allows HSR/PRP supervision forwarding
+	 * to the CPU port without discarding duplicates. Continue to
+	 * forward to redundant ports when in HSR mode while discarding
+	 * duplicates.
 	 */
+	ret = xrs700x_port_add_hsrsup_ipf(ds, partner->index, fwd ? port : -1);
+	if (ret)
+		return ret;
+
+	ret = xrs700x_port_add_hsrsup_ipf(ds, port, fwd ? partner->index : -1);
+	if (ret)
+		return ret;
+
 	regmap_update_bits(priv->regmap,
 			   XRS_ETH_ADDR_CFG(partner->index, 1), 1, 1);
 	regmap_update_bits(priv->regmap, XRS_ETH_ADDR_CFG(port, 1), 1, 1);