From patchwork Mon Sep 4 12:02:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 13373777 X-Patchwork-Delegate: kuba@kernel.org Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7CFC442D for ; Mon, 4 Sep 2023 12:02:34 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8748E1B8; Mon, 4 Sep 2023 05:02:33 -0700 (PDT) Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 82CEA863A8; Mon, 4 Sep 2023 14:02:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1693828952; bh=iKsz3lXVX1mLkg6/Pm1nXTQDpxA82A/MCK7KumwAcc4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lM3iLUvMB0LL+EzPaFrZsQocW7uhF5+V9DYP1giThZsaYQWLsQd9xHyoNEB4yJ4n+ TZg0LbNeoQqQ1gAxIn5QEDxSOsm/9uSEWxXyn/TiQGgENeX02D8VQXXYEemlrBxi4S /G1l5yTTSvHv7im0h0tfwwjdSaZOcK1JOnCCjjlbxjVmecCqBwp8JR+oyU8If2i0Qo GLSALHmYKlQDafe9WQIzmgf1d5JdKgfoPyMEYPfnC2CbljgNYzXCSceXSdrW7YYbrL 1z2EpGlo8Hq0cReY9zMJwggpx/yHY5QivZ8u90ruP7zTGRmc9eJvY84OT7lGW3yMy9 muF2geObJbzag== From: Lukasz Majewski To: Eric Dumazet , Andrew Lunn , davem@davemloft.net, Paolo Abeni , Woojung Huh , Vladimir Oltean Cc: Tristram.Ha@microchip.com, Florian Fainelli , Jakub Kicinski , UNGLinuxDriver@microchip.com, George McCollister , Oleksij Rempel , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Lukasz Majewski Subject: [PATCH v3 RFC 1/4] net: dsa: Extend the ksz_device structure to hold info about HSR ports Date: Mon, 4 Sep 2023 14:02:06 +0200 Message-Id: <20230904120209.741207-2-lukma@denx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230904120209.741207-1-lukma@denx.de> References: <20230904120209.741207-1-lukma@denx.de> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC Information about HSR aware ports in a DSA switch can be helpful when one needs tags to be adjusted before the HSR frame is sent. For example - with ksz9477 switch - the TAG needs to be adjusted to have both HSR ports marked in tag to allow execution of HW based frame duplication. Signed-off-by: Lukasz Majewski --- Changes for v2: - Use struct ksz_device to store hsr_ports variable Changes for v3: - None --- drivers/net/dsa/microchip/ksz_common.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/microchip/ksz_common.h index a4de58847dea..9fcafff0c01d 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -158,6 +158,9 @@ struct ksz_device { bool synclko_125; bool synclko_disable; + /* Bitmask indicating ports supporting HSR */ + u16 hsr_ports; + struct vlan_table *vlan_cache; struct ksz_port *ports; From patchwork Mon Sep 4 12:02:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 13373778 X-Patchwork-Delegate: kuba@kernel.org Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 15915AD48 for ; Mon, 4 Sep 2023 12:02:35 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EBCBB1B7; Mon, 4 Sep 2023 05:02:33 -0700 (PDT) Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 2046F8684C; Mon, 4 Sep 2023 14:02:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1693828952; bh=B9gqDbm3tIBLoslh6Yhvjy+urXpXmexvewmKiIKOz8c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pyD8bNu6K4zsj1fcSq4W0IjMiV3eOiG+RdVRI6IVRR32S6WjHjeUOyiaUPbjsG4Nq sqehWszQHmJJ8UGfY+c4InI7iITu/GwhfQh+iyarQ2JS9pPELZp1K/e/rHMo6AAyqW ejbPw6RfqBEili+GgnFseAz++4/vqzZ95+yHalxm2wPhNZuTkpqns2cNXm/sJsE98y bz4+o92rCRs4uMO86tYJY0gxvyrJEz2gpBn+++8Lp+QzrBlZjZxdYbonIjDUsB8DoZ Gh9Mo2GZGGB/ndwyg3m/7+e23LesjntEndUCvV65B2y8CcsWI55mdIrQ9lS1dhqdMO TF//IAwP9r+qg== From: Lukasz Majewski To: Eric Dumazet , Andrew Lunn , davem@davemloft.net, Paolo Abeni , Woojung Huh , Vladimir Oltean Cc: Tristram.Ha@microchip.com, Florian Fainelli , Jakub Kicinski , UNGLinuxDriver@microchip.com, George McCollister , Oleksij Rempel , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Lukasz Majewski Subject: [PATCH v3 RFC 2/4] net: dsa: Extend ksz9477 TAG setup to support HSR frames duplication Date: Mon, 4 Sep 2023 14:02:07 +0200 Message-Id: <20230904120209.741207-3-lukma@denx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230904120209.741207-1-lukma@denx.de> References: <20230904120209.741207-1-lukma@denx.de> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC 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 --- Changes for v2: - Use ksz_hsr_get_ports() to obtain the bits values corresponding to HSR aware ports Changes for v3: - None --- 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); From patchwork Mon Sep 4 12:02:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 13373779 X-Patchwork-Delegate: kuba@kernel.org Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 23A2BC127 for ; Mon, 4 Sep 2023 12:02:36 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6DE691B9; Mon, 4 Sep 2023 05:02:34 -0700 (PDT) Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id B3C98868CB; Mon, 4 Sep 2023 14:02:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1693828953; bh=ty1vG1QAXojaCppSMx6wAeO4YTWZX+QiAp23pxpC9PQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EeuYJvYoBrlilbyb8ixK1U7j6MFwkYVqgSJpEPfwPNRwRe79aQxrNZtxs6MwjaQxV An1LpaeQa7Q8abvHhmeeMB647GLQ3MlPhLmrhWXChG6L+Ht2YvEAN+r0hkc75JJ/cs DRT2BpUEKqDOnYqg1nLEHq0XngtfFl9KBeSeXPK49qBk750t3ktpdmuwhuj+HEKRxj 40O4E0YgKDZp+e9xFTnDqB+cReYurMDay1EpD64p/xLBirYnN0C8hVXW1J8OmLviXB +A9sWlvPZBQCa7FsgVoOietRg1eFjoei10IyKLBmDsloaFbEItzLid7V8xyXq+0Rqo gEz11EeLA/xzg== From: Lukasz Majewski To: Eric Dumazet , Andrew Lunn , davem@davemloft.net, Paolo Abeni , Woojung Huh , Vladimir Oltean Cc: Tristram.Ha@microchip.com, Florian Fainelli , Jakub Kicinski , UNGLinuxDriver@microchip.com, George McCollister , Oleksij Rempel , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Lukasz Majewski Subject: [PATCH v3 RFC 3/4] net: dsa: hsr: Enable in KSZ9477 switch HW HSR offloading Date: Mon, 4 Sep 2023 14:02:08 +0200 Message-Id: <20230904120209.741207-4-lukma@denx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230904120209.741207-1-lukma@denx.de> References: <20230904120209.741207-1-lukma@denx.de> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC This patch adds functions for providing in KSZ9477 switch HSR (High-availability Seamless Redundancy) hardware offloading. According to AN3474 application note following features are provided: - TX packet duplication from host to switch (NETIF_F_HW_HSR_DUP) - RX packet duplication discarding - Prevention of packet loop For last two ones - there is a probability that some packets will not be filtered in HW (in some special cases). Hence, the HSR core code shall be used to discard those not caught frames. Moreover, some switch registers adjustments are required - like setting MAC address of HSR network interface. Additionally, the KSZ9477 switch has been configured to forward frames between HSR ports (1,2) members. Signed-off-by: Lukasz Majewski --- Changes for v2: - Use struct ksz_device to store hsr ports information (not struct dsa) Changes for v3: - Enable in-switch forwarding of frames between HSR ports (i.e. enable bridging of those two ports) - The NETIF_F_HW_HSR_FWD flag has been marked as supported by the HSR network device - Remove ETH MAC address validity check as it is done earlier in the net driver - Add comment regarding adding support for NETIF_F_HW_HSR_FWD flag --- drivers/net/dsa/microchip/ksz9477.c | 103 ++++++++++++++++++++++++++++ drivers/net/dsa/microchip/ksz9477.h | 4 ++ 2 files changed, 107 insertions(+) diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchip/ksz9477.c index 83b7f2d5c1ea..c4ed89c1de48 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -1141,6 +1141,109 @@ int ksz9477_tc_cbs_set_cinc(struct ksz_device *dev, int port, u32 val) return ksz_pwrite16(dev, port, REG_PORT_MTI_CREDIT_INCREMENT, val); } +/* The KSZ9477 provides following HW features to accelerate + * HSR frames handling: + * + * 1. TX PACKET DUPLICATION FROM HOST TO SWITCH + * 2. RX PACKET DUPLICATION DISCARDING + * 3. PREVENTING PACKET LOOP IN THE RING BY SELF-ADDRESS FILTERING + * + * Only one from point 1. has the NETIF_F* flag available. + * + * Ones from point 2 and 3 are "best effort" - i.e. those will + * work correctly most of the time, but it may happen that some + * frames will not be caught. Hence, the SW needs to handle those + * special cases. However, the speed up gain is considerable when + * above features are used. + * + * Moreover, the NETIF_F_HW_HSR_FWD feature is also enabled, as HSR frames + * can be forwarded in the switch fabric between HSR ports. + */ +#define KSZ9477_SUPPORTED_HSR_FEATURES (NETIF_F_HW_HSR_DUP | NETIF_F_HW_HSR_FWD) + +int ksz9477_hsr_join(struct dsa_switch *ds, int port, struct net_device *hsr, + struct dsa_port *partner) +{ + struct ksz_device *dev = ds->priv; + struct net_device *slave; + u8 i, data; + int ret; + + /* Program which ports shall support HSR */ + dev->hsr_ports = BIT(port) | BIT(partner->index); + ksz_write32(dev, REG_HSR_PORT_MAP__4, dev->hsr_ports); + + /* Forward frames between HSR ports (i.e. bridge together HSR ports) */ + ksz_prmw32(dev, port, REG_PORT_VLAN_MEMBERSHIP__4, dev->hsr_ports, + dev->hsr_ports); + ksz_prmw32(dev, partner->index, REG_PORT_VLAN_MEMBERSHIP__4, + dev->hsr_ports, dev->hsr_ports); + + /* Enable discarding of received HSR frames */ + ksz_read8(dev, REG_HSR_ALU_CTRL_0__1, &data); + data |= HSR_DUPLICATE_DISCARD; + data &= ~HSR_NODE_UNICAST; + ksz_write8(dev, REG_HSR_ALU_CTRL_0__1, data); + + /* Self MAC address filtering for HSR frames to avoid + * traverse of the HSR ring more than once. + * + * The HSR port (i.e. hsr0) MAC address is used. + */ + for (i = 0; i < ETH_ALEN; i++) { + ret = ksz_write8(dev, REG_SW_MAC_ADDR_0 + i, hsr->dev_addr[i]); + if (ret) + return ret; + } + + /* Enable global self-address filtering if not yet done during switch + * start + */ + ksz_read8(dev, REG_SW_LUE_CTRL_1, &data); + if (!(data & SW_SRC_ADDR_FILTER)) { + data |= SW_SRC_ADDR_FILTER; + ksz_write8(dev, REG_SW_LUE_CTRL_1, data); + } + + /* Enable per port self-address filtering */ + ksz_port_cfg(dev, port, REG_PORT_LUE_CTRL, PORT_SRC_ADDR_FILTER, true); + ksz_port_cfg(dev, partner->index, REG_PORT_LUE_CTRL, + PORT_SRC_ADDR_FILTER, true); + + /* Setup HW supported features for lan HSR ports */ + slave = dsa_to_port(ds, port)->slave; + slave->features |= KSZ9477_SUPPORTED_HSR_FEATURES; + + slave = dsa_to_port(ds, partner->index)->slave; + slave->features |= KSZ9477_SUPPORTED_HSR_FEATURES; + + pr_debug("%s: HSR join port: %d partner: %d port_map: 0x%x\n", __func__, + port, partner->index, dev->hsr_ports); + + return 0; +} + +int ksz9477_hsr_leave(struct dsa_switch *ds, int port, struct net_device *hsr, + struct dsa_port *partner) +{ + struct ksz_device *dev = ds->priv; + + /* Clear ports HSR support */ + ksz_write32(dev, REG_HSR_PORT_MAP__4, 0); + + /* Disable forwarding frames between HSR ports */ + ksz_prmw32(dev, port, REG_PORT_VLAN_MEMBERSHIP__4, dev->hsr_ports, 0); + ksz_prmw32(dev, partner->index, REG_PORT_VLAN_MEMBERSHIP__4, + dev->hsr_ports, 0); + + /* Disable per port self-address filtering */ + ksz_port_cfg(dev, port, REG_PORT_LUE_CTRL, PORT_SRC_ADDR_FILTER, false); + ksz_port_cfg(dev, partner->index, REG_PORT_LUE_CTRL, + PORT_SRC_ADDR_FILTER, false); + + return 0; +} + int ksz9477_switch_init(struct ksz_device *dev) { u8 data8; diff --git a/drivers/net/dsa/microchip/ksz9477.h b/drivers/net/dsa/microchip/ksz9477.h index b6f7e3c46e3f..634262efb73c 100644 --- a/drivers/net/dsa/microchip/ksz9477.h +++ b/drivers/net/dsa/microchip/ksz9477.h @@ -58,5 +58,9 @@ int ksz9477_dsa_init(struct ksz_device *dev); int ksz9477_switch_init(struct ksz_device *dev); void ksz9477_switch_exit(struct ksz_device *dev); void ksz9477_port_queue_split(struct ksz_device *dev, int port); +int ksz9477_hsr_join(struct dsa_switch *ds, int port, struct net_device *hsr, + struct dsa_port *partner); +int ksz9477_hsr_leave(struct dsa_switch *ds, int port, struct net_device *hsr, + struct dsa_port *partner); #endif From patchwork Mon Sep 4 12:02:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Majewski X-Patchwork-Id: 13373780 X-Patchwork-Delegate: kuba@kernel.org Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 69588C13B for ; Mon, 4 Sep 2023 12:02:36 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 030C7197; Mon, 4 Sep 2023 05:02:35 -0700 (PDT) Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 4E6D8868D7; Mon, 4 Sep 2023 14:02:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1693828953; bh=TB1orKzZPdYd/W9FJV9+IgTkxq4vRghKmc6XDm5R0nw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lK1damqToKmf1FvbFopm4J3LgBkIupYVLozlF3wvkYwgHmv4w9zbSzARJKeVohE1V 8SFdA69UmQHvp61eIKB24A67qvzt5cftnD61WVgOpl5/W0QA6K/zDHUEfl9dqBRuI1 pljhHsXP6YKh9KXOc1N3Een1S3UIRqoG8JQn+LhPTtRi0l8OJ7nhaRf0rieElyJfPN ZXsaLkDfxzSoCuBofg+7I+AOEFhRMjWkanmwkKz5SwexMKpPUBJTq8IMj+0AJscSae 1wNd4x2jwrbddbIahTO9WK6iGwSXKyStxxMbgprC6g4NL892zR5Oh4Was0Xy0NfbKk lku+olBaEUSfA== From: Lukasz Majewski To: Eric Dumazet , Andrew Lunn , davem@davemloft.net, Paolo Abeni , Woojung Huh , Vladimir Oltean Cc: Tristram.Ha@microchip.com, Florian Fainelli , Jakub Kicinski , UNGLinuxDriver@microchip.com, George McCollister , Oleksij Rempel , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Lukasz Majewski Subject: [PATCH v3 RFC 4/4] net: dsa: hsr: Provide generic HSR ksz_hsr_{join|leave} functions Date: Mon, 4 Sep 2023 14:02:09 +0200 Message-Id: <20230904120209.741207-5-lukma@denx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230904120209.741207-1-lukma@denx.de> References: <20230904120209.741207-1-lukma@denx.de> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC This patch provides the common KSZ (i.e. Microchip) DSA code with support for HSR aware devices. To be more specific - generic ksz_hsr_{join|leave} functions are provided, now only supporting KSZ9477 IC. Signed-off-by: Lukasz Majewski --- Changes for v2: - None Changes for v3: - Do not return -EOPNOTSUPP for only PRP_V1 (as v2 will not be caught) --- drivers/net/dsa/microchip/ksz_common.c | 69 ++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c index 579fde54d1e1..91d1acaf4494 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -3433,6 +3434,72 @@ u16 ksz_hsr_get_ports(struct dsa_switch *ds) return 0; } +static int ksz_hsr_join(struct dsa_switch *ds, int port, struct net_device *hsr) +{ + struct dsa_port *partner = NULL, *dp; + struct ksz_device *dev = ds->priv; + enum hsr_version ver; + int ret; + + ret = hsr_get_version(hsr, &ver); + if (ret) + return ret; + + switch (dev->chip_id) { + case KSZ9477_CHIP_ID: + if (!(ver == HSR_V0 || ver == HSR_V1)) + return -EOPNOTSUPP; + } + + /* We can't enable redundancy on the switch until both + * redundant ports have signed up. + */ + dsa_hsr_foreach_port(dp, ds, hsr) { + if (dp->index != port) { + partner = dp; + break; + } + } + + if (!partner) + return 0; + + switch (dev->chip_id) { + case KSZ9477_CHIP_ID: + return ksz9477_hsr_join(ds, port, hsr, partner); + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static int ksz_hsr_leave(struct dsa_switch *ds, int port, + struct net_device *hsr) +{ + struct dsa_port *partner = NULL, *dp; + struct ksz_device *dev = ds->priv; + + dsa_hsr_foreach_port(dp, ds, hsr) { + if (dp->index != port) { + partner = dp; + break; + } + } + + if (!partner) + return 0; + + switch (dev->chip_id) { + case KSZ9477_CHIP_ID: + return ksz9477_hsr_leave(ds, port, hsr, partner); + default: + return -EOPNOTSUPP; + } + + 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, @@ -3452,6 +3519,8 @@ static const struct dsa_switch_ops ksz_switch_ops = { .get_sset_count = ksz_sset_count, .port_bridge_join = ksz_port_bridge_join, .port_bridge_leave = ksz_port_bridge_leave, + .port_hsr_join = ksz_hsr_join, + .port_hsr_leave = ksz_hsr_leave, .port_stp_state_set = ksz_port_stp_state_set, .port_pre_bridge_flags = ksz_port_pre_bridge_flags, .port_bridge_flags = ksz_port_bridge_flags,