From nobody Wed Dec 17 19:44:55 2025 Received: from lelvem-ot01.ext.ti.com (lelvem-ot01.ext.ti.com [198.47.23.234]) (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 DDEA11DDC21; Mon, 16 Dec 2024 10:01:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.47.23.234 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734343300; cv=none; b=soa2aHMAiUkpSSEjfFN3q157jMxKJRatavnSe5sync75ebBbmKaYm5ZzJldKw5blJSmwVD+uFlBf7y3AaM6spxgLgzn8D3MMT4j6pTj2eTjUGZmJjG59KXENLR9tV0qvuulgXy2aPRQypcW+FVIPJ8LIWx2nZ0+fVWZpmiu8m4Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734343300; c=relaxed/simple; bh=/cMS1jvFoQnB2Sl4pS1kic8uPrck7SK8CfSo2KkXOpM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=akhnc1AM04TajJihZ9c3pI2G8wTLTxmqxNXjy5CrToi+VBLtSKt92zJnYlzXxGSej6jLzOFGAKEQ9qxXXQqudVVj7mEhu5XZkHWbsP8qsTcO5iVQJrcUH1AnXYO/YRBMitl9n1kIAr2JJ1KCVLLzK9j7kSHoBgogvfl8v+owvOY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=Yje4NHgs; arc=none smtp.client-ip=198.47.23.234 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="Yje4NHgs" Received: from lelv0266.itg.ti.com ([10.180.67.225]) by lelvem-ot01.ext.ti.com (8.15.2/8.15.2) with ESMTPS id 4BGA0vwO3794076 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 16 Dec 2024 04:00:57 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1734343257; bh=PKFvxnaUtZIq4z8ojsgFldqznVIvmDuULSreEtH0U88=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=Yje4NHgsYMA1gTeiRuI/Nsqp+OnhzgMLQRTiI40Lnp/lqlc3LBnJ8Y/GZ2daFKHIf KPQ1Upl6ITcBr8t9WRtxRuxN4rMje4X8gZMB+OqqRloTtI5JEdRGuH7NTc4kUs+9nG QbkEmbFfssCb435QzSnlLgdIf4VBYdm2PW8atypY= Received: from DLEE113.ent.ti.com (dlee113.ent.ti.com [157.170.170.24]) by lelv0266.itg.ti.com (8.15.2/8.15.2) with ESMTP id 4BGA0vBB095920; Mon, 16 Dec 2024 04:00:57 -0600 Received: from DLEE108.ent.ti.com (157.170.170.38) by DLEE113.ent.ti.com (157.170.170.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23; Mon, 16 Dec 2024 04:00:57 -0600 Received: from fllvsmtp7.itg.ti.com (10.64.40.31) by DLEE108.ent.ti.com (157.170.170.38) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23 via Frontend Transport; Mon, 16 Dec 2024 04:00:57 -0600 Received: from fllv0122.itg.ti.com (fllv0122.itg.ti.com [10.247.120.72]) by fllvsmtp7.itg.ti.com (8.15.2/8.15.2) with ESMTP id 4BGA0vv1079571; Mon, 16 Dec 2024 04:00:57 -0600 Received: from localhost (danish-tpc.dhcp.ti.com [10.24.69.25]) by fllv0122.itg.ti.com (8.14.7/8.14.7) with ESMTP id 4BGA0uXF000622; Mon, 16 Dec 2024 04:00:56 -0600 From: MD Danish Anwar To: , , , , , , , , , , , , , , CC: , , , , Vignesh Raghavendra Subject: [PATCH net-next 1/4] net: ti: Kconfig: Select HSR for ICSSG Driver Date: Mon, 16 Dec 2024 15:30:41 +0530 Message-ID: <20241216100044.577489-2-danishanwar@ti.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241216100044.577489-1-danishanwar@ti.com> References: <20241216100044.577489-1-danishanwar@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea Content-Type: text/plain; charset="utf-8" HSR offloading is supported by ICSSG driver. Select the symbol HSR for TI_ICSSG_PRUETH. Also select NET_SWITCHDEV instead of depending on it to remove recursive dependency. Signed-off-by: MD Danish Anwar --- drivers/net/ethernet/ti/Kconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/ti/Kconfig b/drivers/net/ethernet/ti/Kcon= fig index 0d5a862cd78a..ad366abfa746 100644 --- a/drivers/net/ethernet/ti/Kconfig +++ b/drivers/net/ethernet/ti/Kconfig @@ -187,8 +187,9 @@ config TI_ICSSG_PRUETH select PHYLIB select TI_ICSS_IEP select TI_K3_CPPI_DESC_POOL + select NET_SWITCHDEV + select HSR depends on PRU_REMOTEPROC - depends on NET_SWITCHDEV depends on ARCH_K3 && OF && TI_K3_UDMA_GLUE_LAYER depends on PTP_1588_CLOCK_OPTIONAL help --=20 2.34.1 From nobody Wed Dec 17 19:44:55 2025 Received: from fllvem-ot04.ext.ti.com (fllvem-ot04.ext.ti.com [198.47.19.246]) (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 B394D1F7093; Mon, 16 Dec 2024 10:01:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.47.19.246 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734343291; cv=none; b=GbTpKz6ucBz/txWhl1Pc9Kfk/w9uiUv3tzAbKgde2jBzokeIECXSKWHAMSk1yaYWxKShNTd17QYl36YoyXgdSEk6aj341bCKbINxkXESKD9avMsTBoccxLZCttfeuWzbZNSLpwB7b9nIpfO+Q8bljdp5bEQWkSCyzP+e+6n8ydI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734343291; c=relaxed/simple; bh=PmLFiF0lJBg4gnjCUZL0V0wV+3qp3SdhZVsh7QnNL9c=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=HigkJ0520r2BWYPg1UypnPjNaAQU1xxO90lTfJ1IclUqFuL526DLgPGd6kpYo4D244Uqpq1a0vpyx1e5ODMNR2efP2hbAGgN8K0MaUaLor18uAZZdFZY67826oF7XxoFehbU8nj2m2ZKJGai0h/pWczh6oYmIVsgmrM4nzzO/60= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=tqcz6pey; arc=none smtp.client-ip=198.47.19.246 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="tqcz6pey" Received: from fllv0035.itg.ti.com ([10.64.41.0]) by fllvem-ot04.ext.ti.com (8.15.2/8.15.2) with ESMTPS id 4BGA0xiO3459903 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 16 Dec 2024 04:01:00 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1734343260; bh=csO8Xa/AKFDOquuaniBbxWb0OFjh+/mPUotl4drJc8c=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=tqcz6peye7QXu13VTR0TCU72KHeZeXk0Xd/8Gt7H7fJCP0MYYX4Tpk4PejXvVQ3jY aVKOExwhBkNB3D35r4ftuIBfRIkNCBwMq8G7d6HqJpVS8cJ4PxI0inm9pSKKmddeGD EhNt7omr1LB17E1KSQb49NwAUVLrmqoXNF5CmRH4= Received: from DLEE108.ent.ti.com (dlee108.ent.ti.com [157.170.170.38]) by fllv0035.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 4BGA0x4o058784 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 16 Dec 2024 04:00:59 -0600 Received: from DLEE112.ent.ti.com (157.170.170.23) by DLEE108.ent.ti.com (157.170.170.38) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23; Mon, 16 Dec 2024 04:00:59 -0600 Received: from lelvsmtp6.itg.ti.com (10.180.75.249) by DLEE112.ent.ti.com (157.170.170.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23 via Frontend Transport; Mon, 16 Dec 2024 04:00:59 -0600 Received: from fllv0122.itg.ti.com (fllv0122.itg.ti.com [10.247.120.72]) by lelvsmtp6.itg.ti.com (8.15.2/8.15.2) with ESMTP id 4BGA0xc7081728; Mon, 16 Dec 2024 04:00:59 -0600 Received: from localhost (danish-tpc.dhcp.ti.com [10.24.69.25]) by fllv0122.itg.ti.com (8.14.7/8.14.7) with ESMTP id 4BGA0wNT000627; Mon, 16 Dec 2024 04:00:58 -0600 From: MD Danish Anwar To: , , , , , , , , , , , , , , CC: , , , , Vignesh Raghavendra Subject: [PATCH net-next 2/4] net: ti: icssg-prueth: Add VLAN support in EMAC mode Date: Mon, 16 Dec 2024 15:30:42 +0530 Message-ID: <20241216100044.577489-3-danishanwar@ti.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241216100044.577489-1-danishanwar@ti.com> References: <20241216100044.577489-1-danishanwar@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea Content-Type: text/plain; charset="utf-8" Add support for vlan filtering in dual EMAC mode. Signed-off-by: MD Danish Anwar --- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 29 +++++++++----------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index c568c84a032b..e031bccf31dc 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -822,19 +822,18 @@ static int emac_ndo_vlan_rx_add_vid(struct net_device= *ndev, { struct prueth_emac *emac =3D netdev_priv(ndev); struct prueth *prueth =3D emac->prueth; + int port_mask =3D BIT(emac->port_id); int untag_mask =3D 0; - int port_mask; =20 - if (prueth->is_hsr_offload_mode) { - port_mask =3D BIT(PRUETH_PORT_HOST) | BIT(emac->port_id); - untag_mask =3D 0; + if (prueth->is_hsr_offload_mode) + port_mask |=3D BIT(PRUETH_PORT_HOST); =20 - netdev_dbg(emac->ndev, "VID add vid:%u port_mask:%X untag_mask %X\n", - vid, port_mask, untag_mask); + netdev_err(emac->ndev, "VID add vid:%u port_mask:%X untag_mask %X\n", + vid, port_mask, untag_mask); + + icssg_vtbl_modify(emac, vid, port_mask, untag_mask, true); + icssg_set_pvid(emac->prueth, vid, emac->port_id); =20 - icssg_vtbl_modify(emac, vid, port_mask, untag_mask, true); - icssg_set_pvid(emac->prueth, vid, emac->port_id); - } return 0; } =20 @@ -843,18 +842,16 @@ static int emac_ndo_vlan_rx_del_vid(struct net_device= *ndev, { struct prueth_emac *emac =3D netdev_priv(ndev); struct prueth *prueth =3D emac->prueth; + int port_mask =3D BIT(emac->port_id); int untag_mask =3D 0; - int port_mask; =20 - if (prueth->is_hsr_offload_mode) { + if (prueth->is_hsr_offload_mode) port_mask =3D BIT(PRUETH_PORT_HOST); - untag_mask =3D 0; =20 - netdev_dbg(emac->ndev, "VID del vid:%u port_mask:%X untag_mask %X\n", - vid, port_mask, untag_mask); + netdev_err(emac->ndev, "VID del vid:%u port_mask:%X untag_mask %X\n", + vid, port_mask, untag_mask); + icssg_vtbl_modify(emac, vid, port_mask, untag_mask, false); =20 - icssg_vtbl_modify(emac, vid, port_mask, untag_mask, false); - } return 0; } =20 --=20 2.34.1 From nobody Wed Dec 17 19:44:55 2025 Received: from fllvem-ot04.ext.ti.com (fllvem-ot04.ext.ti.com [198.47.19.246]) (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 B0EA51DDC21; Mon, 16 Dec 2024 10:01:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.47.19.246 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734343290; cv=none; b=lPWh//UxIlrD+pQA/FIkZs/WnQ0agAsjJK0nUtP/oOSh+zfTE6ZUNqDq92GyqdiIX7jfDW54DsERGtJnQekl3TqUhEbAMctUrNMipmi8hoyXgBst7TPyp9cfK5ZtbrZkyzQqXXlkdrCngeWHbBuaMsg/xvnodszYM8xNIFpYZ5s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734343290; c=relaxed/simple; bh=LWbfr8UgCrRVWEIbOwNEGrXfzvmPbbLU+6Y73SeWhyc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=PDb46Gp5297nX7l+y/c7WSUMaJmiNHoQeD26sFVICGkKJa/HSw9QAa+S2rlONfR8+eipTB/KkwzQ+wqZkQhnhWOshZhDagsc/854X/MlZYBJESJcrNpbOqlYonC8V64yE3rVuSKQpsyKyyKkIKK4bt5o0kwFaoeUb7lvZrgpr5E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=D3crGGf0; arc=none smtp.client-ip=198.47.19.246 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="D3crGGf0" Received: from lelv0266.itg.ti.com ([10.180.67.225]) by fllvem-ot04.ext.ti.com (8.15.2/8.15.2) with ESMTPS id 4BGA114O3459911 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 16 Dec 2024 04:01:01 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1734343261; bh=3QL9MBTXLPAnsTaOXmyWD0TbxeO80GgTdO5lWG9Zzls=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=D3crGGf0FNlpcQ7GJUFCQNYi2bPgDeQE2lorFRn3FWgWLDuGheBmOM4qV32sM1V9e dgiyr1quLuDpSY18iHTU7z2frl3CQqQPiws3uYR2iD/YreqlYotUq7IloZ8eb9DAeo qFUlrlRtN31wOw4iBvWhRGXNDW1TyHE/K650Hcq4= Received: from DLEE113.ent.ti.com (dlee113.ent.ti.com [157.170.170.24]) by lelv0266.itg.ti.com (8.15.2/8.15.2) with ESMTP id 4BGA11uu095959; Mon, 16 Dec 2024 04:01:01 -0600 Received: from DLEE107.ent.ti.com (157.170.170.37) by DLEE113.ent.ti.com (157.170.170.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23; Mon, 16 Dec 2024 04:01:00 -0600 Received: from fllvsmtp8.itg.ti.com (10.64.41.158) by DLEE107.ent.ti.com (157.170.170.37) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23 via Frontend Transport; Mon, 16 Dec 2024 04:01:01 -0600 Received: from fllv0122.itg.ti.com (fllv0122.itg.ti.com [10.247.120.72]) by fllvsmtp8.itg.ti.com (8.15.2/8.15.2) with ESMTP id 4BGA1191074027; Mon, 16 Dec 2024 04:01:01 -0600 Received: from localhost (danish-tpc.dhcp.ti.com [10.24.69.25]) by fllv0122.itg.ti.com (8.14.7/8.14.7) with ESMTP id 4BGA10Cu000637; Mon, 16 Dec 2024 04:01:00 -0600 From: MD Danish Anwar To: , , , , , , , , , , , , , , CC: , , , , Vignesh Raghavendra Subject: [PATCH net-next 3/4] net: ti: icssg-prueth: Add Multicast Filtering support for VLAN in MAC mode Date: Mon, 16 Dec 2024 15:30:43 +0530 Message-ID: <20241216100044.577489-4-danishanwar@ti.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241216100044.577489-1-danishanwar@ti.com> References: <20241216100044.577489-1-danishanwar@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea Content-Type: text/plain; charset="utf-8" Add multicast filtering support for VLAN interfaces in dual EMAC mode for ICSSG driver. The driver uses vlan_for_each() API to get the list of available vlans. The driver then sync mc addr of vlan interface with a locally mainatined list emac->vlan_mcast_list[vid] using __hw_addr_sync_multiple() API. The driver then calls the sync / unsync callbacks and based on whether the ndev is vlan or not, driver passes appropriate vid to FDB helper functions. This commit also exports __hw_addr_sync_multiple() in order to use it from the ICSSG driver. Signed-off-by: MD Danish Anwar --- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 69 ++++++++++++++++---- drivers/net/ethernet/ti/icssg/icssg_prueth.h | 6 ++ include/linux/netdevice.h | 3 + net/core/dev_addr_lists.c | 7 +- 4 files changed, 68 insertions(+), 17 deletions(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index e031bccf31dc..a18773ef6eab 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -472,30 +472,43 @@ const struct icss_iep_clockops prueth_iep_clockops = =3D { =20 static int icssg_prueth_add_mcast(struct net_device *ndev, const u8 *addr) { - struct prueth_emac *emac =3D netdev_priv(ndev); - int port_mask =3D BIT(emac->port_id); + struct net_device *real_dev; + struct prueth_emac *emac; + int port_mask; + u8 vlan_id; =20 - port_mask |=3D icssg_fdb_lookup(emac, addr, 0); - icssg_fdb_add_del(emac, addr, 0, port_mask, true); - icssg_vtbl_modify(emac, 0, port_mask, port_mask, true); + vlan_id =3D is_vlan_dev(ndev) ? vlan_dev_vlan_id(ndev) : PRUETH_DFLT_VLAN= _MAC; + real_dev =3D is_vlan_dev(ndev) ? vlan_dev_real_dev(ndev) : ndev; + emac =3D netdev_priv(real_dev); + + port_mask =3D BIT(emac->port_id) | icssg_fdb_lookup(emac, addr, vlan_id); + icssg_fdb_add_del(emac, addr, vlan_id, port_mask, true); + icssg_vtbl_modify(emac, vlan_id, port_mask, port_mask, true); =20 return 0; } =20 static int icssg_prueth_del_mcast(struct net_device *ndev, const u8 *addr) { - struct prueth_emac *emac =3D netdev_priv(ndev); - int port_mask =3D BIT(emac->port_id); + struct net_device *real_dev; + struct prueth_emac *emac; int other_port_mask; + int port_mask; + u8 vlan_id; + + vlan_id =3D is_vlan_dev(ndev) ? vlan_dev_vlan_id(ndev) : PRUETH_DFLT_VLAN= _MAC; + real_dev =3D is_vlan_dev(ndev) ? vlan_dev_real_dev(ndev) : ndev; + emac =3D netdev_priv(real_dev); =20 - other_port_mask =3D port_mask ^ icssg_fdb_lookup(emac, addr, 0); + port_mask =3D BIT(emac->port_id); + other_port_mask =3D port_mask ^ icssg_fdb_lookup(emac, addr, vlan_id); =20 - icssg_fdb_add_del(emac, addr, 0, port_mask, false); - icssg_vtbl_modify(emac, 0, port_mask, port_mask, false); + icssg_fdb_add_del(emac, addr, vlan_id, port_mask, false); + icssg_vtbl_modify(emac, vlan_id, port_mask, port_mask, false); =20 if (other_port_mask) { - icssg_fdb_add_del(emac, addr, 0, other_port_mask, true); - icssg_vtbl_modify(emac, 0, other_port_mask, other_port_mask, true); + icssg_fdb_add_del(emac, addr, vlan_id, other_port_mask, true); + icssg_vtbl_modify(emac, vlan_id, other_port_mask, other_port_mask, true); } =20 return 0; @@ -531,6 +544,28 @@ static int icssg_prueth_hsr_del_mcast(struct net_devic= e *ndev, const u8 *addr) return 0; } =20 +static int icssg_update_vlan_mcast(struct net_device *vdev, int vid, + void *args) +{ + struct net_device *vport_ndev; + struct prueth_emac *emac; + + if (!vdev || !vid) + return 0; + + vport_ndev =3D vlan_dev_real_dev(vdev); + emac =3D netdev_priv(vport_ndev); + + netif_addr_lock_bh(vdev); + __hw_addr_sync_multiple(&emac->vlan_mcast_list[vid], &vdev->mc, vdev->add= r_len); + netif_addr_unlock_bh(vdev); + + __hw_addr_sync_dev(&emac->vlan_mcast_list[vid], vdev, + icssg_prueth_add_mcast, icssg_prueth_del_mcast); + + return 0; +} + /** * emac_ndo_open - EMAC device open * @ndev: network adapter device @@ -772,12 +807,17 @@ static void emac_ndo_set_rx_mode_work(struct work_str= uct *work) return; } =20 - if (emac->prueth->is_hsr_offload_mode) + if (emac->prueth->is_hsr_offload_mode) { __dev_mc_sync(ndev, icssg_prueth_hsr_add_mcast, icssg_prueth_hsr_del_mcast); - else + } else { __dev_mc_sync(ndev, icssg_prueth_add_mcast, icssg_prueth_del_mcast); + if (rtnl_trylock()) { + vlan_for_each(ndev, icssg_update_vlan_mcast, NULL); + rtnl_unlock(); + } + } } =20 /** @@ -828,6 +868,7 @@ static int emac_ndo_vlan_rx_add_vid(struct net_device *= ndev, if (prueth->is_hsr_offload_mode) port_mask |=3D BIT(PRUETH_PORT_HOST); =20 + __hw_addr_init(&emac->vlan_mcast_list[vid]); netdev_err(emac->ndev, "VID add vid:%u port_mask:%X untag_mask %X\n", vid, port_mask, untag_mask); =20 diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.h index f5c1d473e9f9..4da8b87408b5 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -83,6 +83,10 @@ #define ICSS_CMD_ADD_FILTER 0x7 #define ICSS_CMD_ADD_MAC 0x8 =20 +/* VLAN Filtering Related MACROs */ +#define PRUETH_DFLT_VLAN_MAC 0 +#define MAX_VLAN_ID 256 + /* In switch mode there are 3 real ports i.e. 3 mac addrs. * however Linux sees only the host side port. The other 2 ports * are the switch ports. @@ -201,6 +205,8 @@ struct prueth_emac { /* RX IRQ Coalescing Related */ struct hrtimer rx_hrtimer; unsigned long rx_pace_timeout_ns; + + struct netdev_hw_addr_list vlan_mcast_list[MAX_VLAN_ID]; }; =20 /** diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index d917949bba03..a5c169b19543 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -4685,6 +4685,9 @@ int devm_register_netdev(struct device *dev, struct n= et_device *ndev); /* General hardware address lists handling functions */ int __hw_addr_sync(struct netdev_hw_addr_list *to_list, struct netdev_hw_addr_list *from_list, int addr_len); +int __hw_addr_sync_multiple(struct netdev_hw_addr_list *to_list, + struct netdev_hw_addr_list *from_list, + int addr_len); void __hw_addr_unsync(struct netdev_hw_addr_list *to_list, struct netdev_hw_addr_list *from_list, int addr_len); int __hw_addr_sync_dev(struct netdev_hw_addr_list *list, diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 166e404f7c03..90716bd736f3 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -242,9 +242,9 @@ static void __hw_addr_unsync_one(struct netdev_hw_addr_= list *to_list, __hw_addr_del_entry(from_list, ha, false, false); } =20 -static int __hw_addr_sync_multiple(struct netdev_hw_addr_list *to_list, - struct netdev_hw_addr_list *from_list, - int addr_len) +int __hw_addr_sync_multiple(struct netdev_hw_addr_list *to_list, + struct netdev_hw_addr_list *from_list, + int addr_len) { int err =3D 0; struct netdev_hw_addr *ha, *tmp; @@ -260,6 +260,7 @@ static int __hw_addr_sync_multiple(struct netdev_hw_add= r_list *to_list, } return err; } +EXPORT_SYMBOL(__hw_addr_sync_multiple); =20 /* This function only works where there is a strict 1-1 relationship * between source and destination of they synch. If you ever need to --=20 2.34.1 From nobody Wed Dec 17 19:44:55 2025 Received: from lelv0142.ext.ti.com (lelv0142.ext.ti.com [198.47.23.249]) (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 CA688202C47; Mon, 16 Dec 2024 10:01:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.47.23.249 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734343305; cv=none; b=nBFz2kNLfUVK0eLCMZCWdf0HwmKF0+FWeQwgcTRvFfma0NDR1BJ0ru/rR43saASBTEsTnbKg31zIdOPXJ1lKaQ8kRFzhM0gSUKjWkPhyfCL94jP/qViv+oDlkKfQ8AJw9w2qEIL3RkRZreeiXLjFv84wuYBvGGQMq2Z1qUKhjlw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734343305; c=relaxed/simple; bh=Pmrci5ITQweFRa6tVUJ9nCqr42iRc5K5pt8DMY0jtbo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hQFdj7b7sMlMoiYVwsEl5uZMc/qVteb8V/RcVjZ6HnniA37O70ijlahY/0scqvi09yI9XyeDkED4LQtVr+JkNMq/QT2ZVoUELIkr8WEzHLpQTyDRq5eYoZqWJseJ0jNhQyFrfO3zSOrBCqrjWZJmxkM4/4qOTV418z3uoWrQxfA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=UUjSe/wi; arc=none smtp.client-ip=198.47.23.249 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="UUjSe/wi" Received: from lelv0265.itg.ti.com ([10.180.67.224]) by lelv0142.ext.ti.com (8.15.2/8.15.2) with ESMTP id 4BGA14Bd089014; Mon, 16 Dec 2024 04:01:04 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1734343264; bh=7bZOk2G2gvBaeDKP7eXwq9VLhaEuvHR9gCkM5uGMM4w=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=UUjSe/wijqUntOybdLwdaTa7zIAkdgA0kCnbv7szwUgM4Azkkt1iW7D1TX6a6ezms 0odWotbdCfaEOARptYqzFKv8zDo7WfrE25Xf3fVePkK2aFdNBxRIARLI1JzDtmqooT So655B+hMTwxbUvfh1BDg3XH9eYSmg2Fi4CWXTFs= Received: from DFLE103.ent.ti.com (dfle103.ent.ti.com [10.64.6.24]) by lelv0265.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 4BGA136C029350 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 16 Dec 2024 04:01:03 -0600 Received: from DFLE111.ent.ti.com (10.64.6.32) by DFLE103.ent.ti.com (10.64.6.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23; Mon, 16 Dec 2024 04:01:03 -0600 Received: from lelvsmtp6.itg.ti.com (10.180.75.249) by DFLE111.ent.ti.com (10.64.6.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2507.23 via Frontend Transport; Mon, 16 Dec 2024 04:01:02 -0600 Received: from fllv0122.itg.ti.com (fllv0122.itg.ti.com [10.247.120.72]) by lelvsmtp6.itg.ti.com (8.15.2/8.15.2) with ESMTP id 4BGA12RR081965; Mon, 16 Dec 2024 04:01:02 -0600 Received: from localhost (danish-tpc.dhcp.ti.com [10.24.69.25]) by fllv0122.itg.ti.com (8.14.7/8.14.7) with ESMTP id 4BGA12U4000676; Mon, 16 Dec 2024 04:01:02 -0600 From: MD Danish Anwar To: , , , , , , , , , , , , , , CC: , , , , Vignesh Raghavendra Subject: [PATCH net-next 4/4] net: ti: icssg-prueth: Add Support for Multicast filtering with VLAN in HSR mode Date: Mon, 16 Dec 2024 15:30:44 +0530 Message-ID: <20241216100044.577489-5-danishanwar@ti.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241216100044.577489-1-danishanwar@ti.com> References: <20241216100044.577489-1-danishanwar@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea Content-Type: text/plain; charset="utf-8" Add multicast filtering support for VLAN interfaces in HSR offload mode for ICSSG driver. The driver calls vlan_for_each() API on the hsr device's ndev to get the list of available vlans for the hsr device. The driver then sync mc addr of vlan interface with a locally mainatined list emac->vlan_mcast_list[vid] using __hw_addr_sync_multiple() API. The driver then calls the sync / unsync callbacks. In the sync / unsync call back, driver checks if the vdev's real dev is hsr device or not. If the real dev is hsr device, driver gets the per port device using hsr_get_port_ndev() and then driver passes appropriate vid to FDB helper functions. This commit makes below changes in the hsr files. - Move enum hsr_port_type from net/hsr/hsr_main.h to include/linux/if_hsr.h so that the enum can be accessed by drivers using hsr. - Create hsr_get_port_ndev() API that can be used to get the ndev pointer to the slave port from ndev pointer to the hsr net device. - Export hsr_get_port_ndev() API so that the API can be accessed by drivers using hsr. Signed-off-by: MD Danish Anwar --- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 88 ++++++++++++++------ drivers/net/ethernet/ti/icssg/icssg_prueth.h | 2 + include/linux/if_hsr.h | 16 ++++ net/hsr/hsr_device.c | 12 +++ net/hsr/hsr_main.h | 9 -- 5 files changed, 93 insertions(+), 34 deletions(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index a18773ef6eab..4b13787a5fa8 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -514,32 +514,64 @@ static int icssg_prueth_del_mcast(struct net_device *= ndev, const u8 *addr) return 0; } =20 -static int icssg_prueth_hsr_add_mcast(struct net_device *ndev, const u8 *a= ddr) +static void icssg_prueth_hsr_fdb_add_del(struct prueth_emac *emac, + const u8 *addr, u8 vid, bool add) { - struct prueth_emac *emac =3D netdev_priv(ndev); - struct prueth *prueth =3D emac->prueth; - - icssg_fdb_add_del(emac, addr, prueth->default_vlan, + icssg_fdb_add_del(emac, addr, vid, ICSSG_FDB_ENTRY_P0_MEMBERSHIP | ICSSG_FDB_ENTRY_P1_MEMBERSHIP | ICSSG_FDB_ENTRY_P2_MEMBERSHIP | - ICSSG_FDB_ENTRY_BLOCK, true); + ICSSG_FDB_ENTRY_BLOCK, add); + + if (add) + icssg_vtbl_modify(emac, vid, BIT(emac->port_id), + BIT(emac->port_id), add); +} + +static int icssg_prueth_hsr_add_mcast(struct net_device *ndev, const u8 *a= ddr) +{ + struct net_device *real_dev; + struct prueth_emac *emac; + u8 vlan_id, i; + + vlan_id =3D is_vlan_dev(ndev) ? vlan_dev_vlan_id(ndev) : PRUETH_DFLT_VLAN= _HSR; + real_dev =3D is_vlan_dev(ndev) ? vlan_dev_real_dev(ndev) : ndev; + + if (is_hsr_master(real_dev)) { + for (i =3D HSR_PT_SLAVE_A; i < HSR_PT_INTERLINK; i++) { + emac =3D netdev_priv(hsr_get_port_ndev(real_dev, i)); + if (!emac) + return -EINVAL; + icssg_prueth_hsr_fdb_add_del(emac, addr, vlan_id, true); + } + } else { + emac =3D netdev_priv(real_dev); + icssg_prueth_hsr_fdb_add_del(emac, addr, vlan_id, true); + } =20 - icssg_vtbl_modify(emac, emac->port_vlan, BIT(emac->port_id), - BIT(emac->port_id), true); return 0; } =20 static int icssg_prueth_hsr_del_mcast(struct net_device *ndev, const u8 *a= ddr) { - struct prueth_emac *emac =3D netdev_priv(ndev); - struct prueth *prueth =3D emac->prueth; + struct net_device *real_dev; + struct prueth_emac *emac; + u8 vlan_id, i; =20 - icssg_fdb_add_del(emac, addr, prueth->default_vlan, - ICSSG_FDB_ENTRY_P0_MEMBERSHIP | - ICSSG_FDB_ENTRY_P1_MEMBERSHIP | - ICSSG_FDB_ENTRY_P2_MEMBERSHIP | - ICSSG_FDB_ENTRY_BLOCK, false); + vlan_id =3D is_vlan_dev(ndev) ? vlan_dev_vlan_id(ndev) : PRUETH_DFLT_VLAN= _HSR; + real_dev =3D is_vlan_dev(ndev) ? vlan_dev_real_dev(ndev) : ndev; + + if (is_hsr_master(real_dev)) { + for (i =3D HSR_PT_SLAVE_A; i < HSR_PT_INTERLINK; i++) { + emac =3D netdev_priv(hsr_get_port_ndev(real_dev, i)); + if (!emac) + return -EINVAL; + icssg_prueth_hsr_fdb_add_del(emac, addr, vlan_id, false); + } + } else { + emac =3D netdev_priv(real_dev); + icssg_prueth_hsr_fdb_add_del(emac, addr, vlan_id, false); + } =20 return 0; } @@ -547,21 +579,23 @@ static int icssg_prueth_hsr_del_mcast(struct net_devi= ce *ndev, const u8 *addr) static int icssg_update_vlan_mcast(struct net_device *vdev, int vid, void *args) { - struct net_device *vport_ndev; - struct prueth_emac *emac; + struct prueth_emac *emac =3D args; =20 if (!vdev || !vid) return 0; =20 - vport_ndev =3D vlan_dev_real_dev(vdev); - emac =3D netdev_priv(vport_ndev); - netif_addr_lock_bh(vdev); __hw_addr_sync_multiple(&emac->vlan_mcast_list[vid], &vdev->mc, vdev->add= r_len); netif_addr_unlock_bh(vdev); =20 - __hw_addr_sync_dev(&emac->vlan_mcast_list[vid], vdev, - icssg_prueth_add_mcast, icssg_prueth_del_mcast); + if (emac->prueth->is_hsr_offload_mode) + __hw_addr_sync_dev(&emac->vlan_mcast_list[vid], vdev, + icssg_prueth_hsr_add_mcast, + icssg_prueth_hsr_del_mcast); + else + __hw_addr_sync_dev(&emac->vlan_mcast_list[vid], vdev, + icssg_prueth_add_mcast, + icssg_prueth_del_mcast); =20 return 0; } @@ -810,11 +844,15 @@ static void emac_ndo_set_rx_mode_work(struct work_str= uct *work) if (emac->prueth->is_hsr_offload_mode) { __dev_mc_sync(ndev, icssg_prueth_hsr_add_mcast, icssg_prueth_hsr_del_mcast); + if (rtnl_trylock()) { + vlan_for_each(emac->prueth->hsr_dev, icssg_update_vlan_mcast, emac); + rtnl_unlock(); + } } else { __dev_mc_sync(ndev, icssg_prueth_add_mcast, icssg_prueth_del_mcast); if (rtnl_trylock()) { - vlan_for_each(ndev, icssg_update_vlan_mcast, NULL); + vlan_for_each(ndev, icssg_update_vlan_mcast, emac); rtnl_unlock(); } } @@ -1196,7 +1234,7 @@ static int prueth_netdevice_port_link(struct net_devi= ce *ndev, if (prueth->br_members & BIT(PRUETH_PORT_MII0) && prueth->br_members & BIT(PRUETH_PORT_MII1)) { prueth->is_switch_mode =3D true; - prueth->default_vlan =3D 1; + prueth->default_vlan =3D PRUETH_DFLT_VLAN_SW; emac->port_vlan =3D prueth->default_vlan; icssg_change_mode(prueth); } @@ -1249,7 +1287,7 @@ static int prueth_hsr_port_link(struct net_device *nd= ev) NETIF_PRUETH_HSR_OFFLOAD_FEATURES)) return -EOPNOTSUPP; prueth->is_hsr_offload_mode =3D true; - prueth->default_vlan =3D 1; + prueth->default_vlan =3D PRUETH_DFLT_VLAN_HSR; emac0->port_vlan =3D prueth->default_vlan; emac1->port_vlan =3D prueth->default_vlan; icssg_change_mode(prueth); diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.h index 4da8b87408b5..956cb59d98b2 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -84,6 +84,8 @@ #define ICSS_CMD_ADD_MAC 0x8 =20 /* VLAN Filtering Related MACROs */ +#define PRUETH_DFLT_VLAN_HSR 1 +#define PRUETH_DFLT_VLAN_SW 1 #define PRUETH_DFLT_VLAN_MAC 0 #define MAX_VLAN_ID 256 =20 diff --git a/include/linux/if_hsr.h b/include/linux/if_hsr.h index 0404f5bf4f30..d97e1d1599f0 100644 --- a/include/linux/if_hsr.h +++ b/include/linux/if_hsr.h @@ -13,6 +13,15 @@ enum hsr_version { PRP_V1, }; =20 +enum hsr_port_type { + HSR_PT_NONE =3D 0, /* Must be 0, used by framereg */ + HSR_PT_SLAVE_A, + HSR_PT_SLAVE_B, + HSR_PT_INTERLINK, + HSR_PT_MASTER, + HSR_PT_PORTS, /* This must be the last item in the enum */ +}; + /* HSR Tag. * As defined in IEC-62439-3:2010, the HSR tag is really { ethertype =3D 0= x88FB, * path, LSDU_size, sequence Nr }. But we let eth_header() create { h_dest, @@ -32,6 +41,7 @@ struct hsr_tag { #if IS_ENABLED(CONFIG_HSR) extern bool is_hsr_master(struct net_device *dev); extern int hsr_get_version(struct net_device *dev, enum hsr_version *ver); +struct net_device *hsr_get_port_ndev(struct net_device *ndev, enum hsr_por= t_type pt); #else static inline bool is_hsr_master(struct net_device *dev) { @@ -42,6 +52,12 @@ static inline int hsr_get_version(struct net_device *dev, { return -EINVAL; } + +static inline struct net_device *hsr_get_port_ndev(struct net_device *ndev= , enum hsr_port_type pt) +{ + return ERR_PTR(-EINVAL); +} + #endif /* CONFIG_HSR */ =20 #endif /*_LINUX_IF_HSR_H_*/ diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c index 03eadd6c51fd..1e1cbfd02778 100644 --- a/net/hsr/hsr_device.c +++ b/net/hsr/hsr_device.c @@ -663,6 +663,18 @@ bool is_hsr_master(struct net_device *dev) } EXPORT_SYMBOL(is_hsr_master); =20 +struct net_device *hsr_get_port_ndev(struct net_device *ndev, enum hsr_por= t_type pt) +{ + struct hsr_priv *hsr =3D netdev_priv(ndev); + struct hsr_port *port; + + hsr_for_each_port(hsr, port) + if (port->type =3D=3D pt) + return port->dev; + return NULL; +} +EXPORT_SYMBOL(hsr_get_port_ndev); + /* Default multicast address for HSR Supervision frames */ static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) =3D { 0x01, 0x15, 0x4e, 0x00, 0x01, 0x00 diff --git a/net/hsr/hsr_main.h b/net/hsr/hsr_main.h index fcfeb79bb040..db7d88c05b7f 100644 --- a/net/hsr/hsr_main.h +++ b/net/hsr/hsr_main.h @@ -121,15 +121,6 @@ struct hsrv1_ethhdr_sp { struct hsr_sup_tag hsr_sup; } __packed; =20 -enum hsr_port_type { - HSR_PT_NONE =3D 0, /* Must be 0, used by framereg */ - HSR_PT_SLAVE_A, - HSR_PT_SLAVE_B, - HSR_PT_INTERLINK, - HSR_PT_MASTER, - HSR_PT_PORTS, /* This must be the last item in the enum */ -}; - /* PRP Redunancy Control Trailor (RCT). * As defined in IEC-62439-4:2012, the PRP RCT is really { sequence Nr, * Lan indentifier (LanId), LSDU_size and PRP_suffix =3D 0x88FB }. --=20 2.34.1