From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5D715378D89; Tue, 17 Mar 2026 09:42:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740535; cv=none; b=h6JLtUKTdBkGed5KH+SdsUc8owLk6TiUAVFNA6kqRF0remRLys3jbbn0+lMj7s6sIb/WDHRHdTnGauS2DGG6zO8cjr8YP5Ie55AEhIdyMfo9mURdpio+1F8YIS7RtmYcz05A5X+OSaAtW2djngy7nrv2eaNroPWTM4v9/g4UZAA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740535; c=relaxed/simple; bh=aqwo6YDRLA2mVz94WYaEU1NWDqPecZfQ0fOXF3ovnY0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p3gh4h+Px0ZYWmXxA2OaulTNPuS8/MjvW+ZQOCxvf4v12Wb5I/t8oRieW9EwHJMqP2ovNoMemZ7tYrv8oFIl/eVHYKq4sBXjpLP8WONKjaHHvrpCJW68xJG5EyeFdUDeUszoC4jW8gM/Egp2EJHmJt3sp+FJnO4k0I1mu5vzGmA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: AaYzSEM4Sh2TMumCrcnurA== X-CSE-MsgGUID: BpPtnz9zSpefIlrUb67l3A== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:04 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id 557484016D6A; Tue, 17 Mar 2026 18:42:02 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:41:54 +0100 Subject: [PATCH net-next 01/13] net: renesas: rswitch: improve port change mode functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-1-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=3529; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=aqwo6YDRLA2mVz94WYaEU1NWDqPecZfQ0fOXF3ovnY0=; b=8nreXECy8+Cjtg0k27Zya8vFp5z52h/Ea5Iior2Zeehln1w1JYj4ed7gdQNno3cpSVauvlFB/ Zgm4rrP+H+dDvjnhWsv/JK+Pz6Xtmeslscl9Bw+UY7RIa9dV3JIehJH X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= For ETHA and GWCA ports every mode change from operational to configuration and vice-versa requires to change the mode to "disable" first. This was done by calling the function twice. Let the change_mode functione take care of this requiered step in a single call. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch_main.c | 39 +++++++++++++------------= ---- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch_main.c b/drivers/net/ethe= rnet/renesas/rswitch_main.c index 6fe964816322..f6d1e610e7fa 100644 --- a/drivers/net/ethernet/renesas/rswitch_main.c +++ b/drivers/net/ethernet/renesas/rswitch_main.c @@ -176,14 +176,19 @@ static int rswitch_gwca_change_mode(struct rswitch_pr= ivate *priv, if (!rswitch_agent_clock_is_enabled(priv->addr, priv->gwca.index)) rswitch_agent_clock_ctrl(priv->addr, priv->gwca.index, 1); =20 - iowrite32(mode, priv->addr + GWMC); + iowrite32(GWMC_OPC_DISABLE, priv->addr + GWMC); =20 - ret =3D rswitch_reg_wait(priv->addr, GWMS, GWMS_OPS_MASK, mode); + ret =3D rswitch_reg_wait(priv->addr, GWMS, GWMS_OPS_MASK, GWMC_OPC_DISABL= E); =20 - if (mode =3D=3D GWMC_OPC_DISABLE) + if (mode =3D=3D GWMC_OPC_DISABLE) { rswitch_agent_clock_ctrl(priv->addr, priv->gwca.index, 0); =20 - return ret; + return ret; + } + + iowrite32(mode, priv->addr + GWMC); + + return rswitch_reg_wait(priv->addr, GWMS, GWMS_OPS_MASK, mode); } =20 static int rswitch_gwca_mcast_table_reset(struct rswitch_private *priv) @@ -682,9 +687,6 @@ static int rswitch_gwca_hw_init(struct rswitch_private = *priv) unsigned int i; int err; =20 - err =3D rswitch_gwca_change_mode(priv, GWMC_OPC_DISABLE); - if (err < 0) - return err; err =3D rswitch_gwca_change_mode(priv, GWMC_OPC_CONFIG); if (err < 0) return err; @@ -717,9 +719,6 @@ static int rswitch_gwca_hw_init(struct rswitch_private = *priv) return err; } =20 - err =3D rswitch_gwca_change_mode(priv, GWMC_OPC_DISABLE); - if (err < 0) - return err; return rswitch_gwca_change_mode(priv, GWMC_OPC_OPERATION); } =20 @@ -727,9 +726,6 @@ static int rswitch_gwca_hw_deinit(struct rswitch_privat= e *priv) { int err; =20 - err =3D rswitch_gwca_change_mode(priv, GWMC_OPC_DISABLE); - if (err < 0) - return err; err =3D rswitch_gwca_change_mode(priv, GWMC_OPC_RESET); if (err < 0) return err; @@ -1116,14 +1112,18 @@ static int rswitch_etha_change_mode(struct rswitch_= etha *etha, if (!rswitch_agent_clock_is_enabled(etha->coma_addr, etha->index)) rswitch_agent_clock_ctrl(etha->coma_addr, etha->index, 1); =20 - iowrite32(mode, etha->addr + EAMC); - - ret =3D rswitch_reg_wait(etha->addr, EAMS, EAMS_OPS_MASK, mode); + iowrite32(EAMC_OPC_DISABLE, etha->addr + EAMC); + ret =3D rswitch_reg_wait(etha->addr, EAMS, EAMS_OPS_MASK, EAMC_OPC_DISABL= E); =20 - if (mode =3D=3D EAMC_OPC_DISABLE) + if (mode =3D=3D EAMC_OPC_DISABLE) { rswitch_agent_clock_ctrl(etha->coma_addr, etha->index, 0); =20 - return ret; + return ret; + } + + iowrite32(mode, etha->addr + EAMC); + + return rswitch_reg_wait(etha->addr, EAMS, EAMS_OPS_MASK, mode); } =20 static void rswitch_etha_read_mac_address(struct rswitch_etha *etha) @@ -1203,9 +1203,6 @@ static int rswitch_etha_hw_init(struct rswitch_etha *= etha, const u8 *mac) { int err; =20 - err =3D rswitch_etha_change_mode(etha, EAMC_OPC_DISABLE); - if (err < 0) - return err; err =3D rswitch_etha_change_mode(etha, EAMC_OPC_CONFIG); if (err < 0) return err; --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 27DE13947B0; Tue, 17 Mar 2026 09:42:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740537; cv=none; b=cMLrEe0ZBIHRFx9j2l5C/7mHiw4SAczr3vqZcr9kBMWsx92cnMFKQgLa3XmFpN5nBGGy3yPj76U/SHVaxUYbedXwjfLJJscBYbtVSf958GEDkVB5rE4+8ZpNiL4HENsAi0SFhoKEG1+i7qMl48ifwj0nNHxFcxddw7C3lDLREOc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740537; c=relaxed/simple; bh=AHTbZ5ZMDiHqSa7GUptX2ISx1icHznDQhy/RCqMiIuo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CzZm4cr53eTAajr7pHivkUOspKhgVMYYd3gcOacCHC0hB/crbw5bQ5UhxRJ9FnS5nB2a9pamFscNTUqNPxy9jET5FUxq2GWUJOIMVyPZbYqnZheIeaqqYcj1yQf/ylqjb+m6lCCl5qqZPSXKFHLaGNkkGsaSx3YrG87eF8VH+TM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: +KS2qGdsQdaU/TwCMS89bA== X-CSE-MsgGUID: +tJhItJfTP6TOuIPjR3/9w== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:08 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id 668844015D64; Tue, 17 Mar 2026 18:42:05 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:41:55 +0100 Subject: [PATCH net-next 02/13] net: renesas: rswitch: use device instead of net_device Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-2-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=6218; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=AHTbZ5ZMDiHqSa7GUptX2ISx1icHznDQhy/RCqMiIuo=; b=jZH6De2N6We4sLwxisf82+luQ0Jm32QArrFp+oRtllIEn6hVAeYRTJ8hqeJKLzznFLm479nef t1yCoVKgBZQAlJxbuuuG1hG6Y23Nzy1m04rk/1sH6rUzqqsV3bRCOjL X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= In upcomming changes for adding vlan support struct net_device will not be available in all cases, therefore use struct device instead. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch_main.c | 34 ++++++++++++++-----------= ---- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch_main.c b/drivers/net/ethe= rnet/renesas/rswitch_main.c index f6d1e610e7fa..f10e188bc0bd 100644 --- a/drivers/net/ethernet/renesas/rswitch_main.c +++ b/drivers/net/ethernet/renesas/rswitch_main.c @@ -302,13 +302,13 @@ static int rswitch_gwca_queue_alloc_rx_buf(struct rsw= itch_gwca_queue *gq, return -ENOMEM; } =20 -static void rswitch_gwca_queue_free(struct net_device *ndev, +static void rswitch_gwca_queue_free(struct device *dev, struct rswitch_gwca_queue *gq) { unsigned int i; =20 if (!gq->dir_tx) { - dma_free_coherent(ndev->dev.parent, + dma_free_coherent(dev, sizeof(struct rswitch_ext_ts_desc) * (gq->ring_size + 1), gq->rx_ring, gq->ring_dma); gq->rx_ring =3D NULL; @@ -318,7 +318,7 @@ static void rswitch_gwca_queue_free(struct net_device *= ndev, kfree(gq->rx_bufs); gq->rx_bufs =3D NULL; } else { - dma_free_coherent(ndev->dev.parent, + dma_free_coherent(dev, sizeof(struct rswitch_ext_desc) * (gq->ring_size + 1), gq->tx_ring, gq->ring_dma); gq->tx_ring =3D NULL; @@ -357,7 +357,7 @@ static int rswitch_gwca_queue_alloc(struct net_device *= ndev, if (rswitch_gwca_queue_alloc_rx_buf(gq, 0, gq->ring_size) < 0) goto out; =20 - gq->rx_ring =3D dma_alloc_coherent(ndev->dev.parent, + gq->rx_ring =3D dma_alloc_coherent(&priv->pdev->dev, sizeof(struct rswitch_ext_ts_desc) * (gq->ring_size + 1), &gq->ring_dma, GFP_KERNEL); } else { @@ -367,7 +367,7 @@ static int rswitch_gwca_queue_alloc(struct net_device *= ndev, gq->unmap_addrs =3D kzalloc_objs(*gq->unmap_addrs, gq->ring_size); if (!gq->unmap_addrs) goto out; - gq->tx_ring =3D dma_alloc_coherent(ndev->dev.parent, + gq->tx_ring =3D dma_alloc_coherent(&priv->pdev->dev, sizeof(struct rswitch_ext_desc) * (gq->ring_size + 1), &gq->ring_dma, GFP_KERNEL); } @@ -385,7 +385,7 @@ static int rswitch_gwca_queue_alloc(struct net_device *= ndev, return 0; =20 out: - rswitch_gwca_queue_free(ndev, gq); + rswitch_gwca_queue_free(&priv->pdev->dev, gq); =20 return -ENOMEM; } @@ -467,12 +467,11 @@ static void rswitch_gwca_ts_queue_fill(struct rswitch= _private *priv, } } =20 -static int rswitch_gwca_queue_ext_ts_fill(struct net_device *ndev, +static int rswitch_gwca_queue_ext_ts_fill(struct device *dev, struct rswitch_gwca_queue *gq, unsigned int start_index, unsigned int num) { - struct rswitch_device *rdev =3D netdev_priv(ndev); struct rswitch_ext_ts_desc *desc; unsigned int i, index; dma_addr_t dma_addr; @@ -481,18 +480,17 @@ static int rswitch_gwca_queue_ext_ts_fill(struct net_= device *ndev, index =3D (i + start_index) % gq->ring_size; desc =3D &gq->rx_ring[index]; if (!gq->dir_tx) { - dma_addr =3D dma_map_single(ndev->dev.parent, + dma_addr =3D dma_map_single(dev, gq->rx_bufs[index] + RSWITCH_HEADROOM, RSWITCH_MAP_BUF_SIZE, DMA_FROM_DEVICE); - if (dma_mapping_error(ndev->dev.parent, dma_addr)) + if (dma_mapping_error(dev, dma_addr)) goto err; =20 desc->desc.info_ds =3D cpu_to_le16(RSWITCH_DESC_BUF_SIZE); rswitch_desc_set_dptr(&desc->desc, dma_addr); dma_wmb(); desc->desc.die_dt =3D DT_FEMPTY | DIE; - desc->info1 =3D cpu_to_le64(INFO1_SPN(rdev->etha->index)); } else { desc->desc.die_dt =3D DT_EEMPTY | DIE; } @@ -506,7 +504,7 @@ static int rswitch_gwca_queue_ext_ts_fill(struct net_de= vice *ndev, index =3D (i + start_index) % gq->ring_size; desc =3D &gq->rx_ring[index]; dma_addr =3D rswitch_desc_get_dptr(&desc->desc); - dma_unmap_single(ndev->dev.parent, dma_addr, + dma_unmap_single(dev, dma_addr, RSWITCH_MAP_BUF_SIZE, DMA_FROM_DEVICE); } } @@ -514,7 +512,7 @@ static int rswitch_gwca_queue_ext_ts_fill(struct net_de= vice *ndev, return -ENOMEM; } =20 -static int rswitch_gwca_queue_ext_ts_format(struct net_device *ndev, +static int rswitch_gwca_queue_ext_ts_format(struct device *dev, struct rswitch_private *priv, struct rswitch_gwca_queue *gq) { @@ -524,7 +522,7 @@ static int rswitch_gwca_queue_ext_ts_format(struct net_= device *ndev, int err; =20 memset(gq->rx_ring, 0, ring_size); - err =3D rswitch_gwca_queue_ext_ts_fill(ndev, gq, 0, gq->ring_size); + err =3D rswitch_gwca_queue_ext_ts_fill(dev, gq, 0, gq->ring_size); if (err < 0) return err; =20 @@ -636,7 +634,7 @@ static void rswitch_txdmac_free(struct net_device *ndev) { struct rswitch_device *rdev =3D netdev_priv(ndev); =20 - rswitch_gwca_queue_free(ndev, rdev->tx_queue); + rswitch_gwca_queue_free(ndev->dev.parent, rdev->tx_queue); rswitch_gwca_put(rdev->priv, rdev->tx_queue); } =20 @@ -670,7 +668,7 @@ static void rswitch_rxdmac_free(struct net_device *ndev) { struct rswitch_device *rdev =3D netdev_priv(ndev); =20 - rswitch_gwca_queue_free(ndev, rdev->rx_queue); + rswitch_gwca_queue_free(ndev->dev.parent, rdev->rx_queue); rswitch_gwca_put(rdev->priv, rdev->rx_queue); } =20 @@ -679,7 +677,7 @@ static int rswitch_rxdmac_init(struct rswitch_private *= priv, unsigned int index) struct rswitch_device *rdev =3D priv->rdev[index]; struct net_device *ndev =3D rdev->ndev; =20 - return rswitch_gwca_queue_ext_ts_format(ndev, priv, rdev->rx_queue); + return rswitch_gwca_queue_ext_ts_format(ndev->dev.parent, priv, rdev->rx_= queue); } =20 static int rswitch_gwca_hw_init(struct rswitch_private *priv) @@ -870,7 +868,7 @@ static bool rswitch_rx(struct net_device *ndev, int *qu= ota) ret =3D rswitch_gwca_queue_alloc_rx_buf(gq, gq->dirty, num); if (ret < 0) goto err; - ret =3D rswitch_gwca_queue_ext_ts_fill(ndev, gq, gq->dirty, num); + ret =3D rswitch_gwca_queue_ext_ts_fill(ndev->dev.parent, gq, gq->dirty, n= um); if (ret < 0) goto err; gq->dirty =3D rswitch_next_queue_index(gq, false, num); --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id F33B239E6CB; Tue, 17 Mar 2026 09:42:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740538; cv=none; b=Kn3csKnKA0tbFD3fGqQxMtLtSoBbfkT6AmVXQLLdpfAS8SJvdotSaw53dtcbu6pqZr2ZFGKMsBxMzPraXBypL41eMgfDtfAGaEqoPeQkI3g4/o0jpTAZnG0d+yLI+poEwtb+PGrXOliPEVykq2a71AO28c1Gb8NTJCQLjzcKDpE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740538; c=relaxed/simple; bh=qOJp9NLB9+UtI5DU5azk15Hf+Q/qHTqK5aYPyRrfBfY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ocWkkTtAQ2/zzo3swamu1qW8LT7mBbvgWrrkC9WQeyyyPyxjtbPXfQLJaSiCPp4hzF7prSPSSFN5H573g8l7jaOFr+1graRp/5uqJNd7xZRDj2mWodIAOJxRrgPCpHagyWHTF17rgzy74Sloa4mx0YfSHOgM93bzlsdJSR9cmdw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: XZ0pU5lOQo+COdt66mkQ9g== X-CSE-MsgGUID: uPn7UzoYTnuW5VoUBH8Rjw== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:11 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id 796AE4016D6A; Tue, 17 Mar 2026 18:42:08 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:41:56 +0100 Subject: [PATCH net-next 03/13] net: renesas: rswitch: fix FWPC2 register access macros Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-3-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=2272; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=qOJp9NLB9+UtI5DU5azk15Hf+Q/qHTqK5aYPyRrfBfY=; b=mpsgcYeW/QZEEfI4IR/P9wQRZcJ/vONj3jrEkfpAFg2LrLi+Az9M52SGOHQDj0Y9wCtsJHgfE Rdv/FTi5YvWDaLtYBbk0B6M3cUVK2KXNOOP7ibo5GcihoM4aJYhW1Sr X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= Fix typo in macro name and remove duplicate macro definition. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch.h | 3 +-- drivers/net/ethernet/renesas/rswitch_l2.c | 2 +- drivers/net/ethernet/renesas/rswitch_main.c | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/= renesas/rswitch.h index aa605304fed0..340524d995ac 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -826,8 +826,7 @@ enum rswitch_gwca_mode { #define FWPC1_DDE BIT(0) =20 #define FWPC2(i) (FWPC20 + (i) * 0x10) -#define FWCP2_LTWFW GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16) -#define FWCP2_LTWFW_MASK GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16) +#define FWPC2_LTWFW GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16) =20 #define FWPBFC(i) (FWPBFC0 + (i) * 0x10) #define FWPBFC_PBDV GENMASK(RSWITCH_NUM_AGENTS - 1, 0) diff --git a/drivers/net/ethernet/renesas/rswitch_l2.c b/drivers/net/ethern= et/renesas/rswitch_l2.c index 9433cd8adced..709524c8a5c4 100644 --- a/drivers/net/ethernet/renesas/rswitch_l2.c +++ b/drivers/net/ethernet/renesas/rswitch_l2.c @@ -82,7 +82,7 @@ static void rswitch_update_l2_hw_forwarding(struct rswitc= h_private *priv) * * Do not allow L2 forwarding to self for hw port. */ - iowrite32(FIELD_PREP(FWCP2_LTWFW_MASK, fwd_mask | BIT(rdev->port)), + iowrite32(FIELD_PREP(FWPC2_LTWFW, fwd_mask | BIT(rdev->port)), priv->addr + FWPC2(rdev->port)); } =20 diff --git a/drivers/net/ethernet/renesas/rswitch_main.c b/drivers/net/ethe= rnet/renesas/rswitch_main.c index f10e188bc0bd..d404bc41bd1e 100644 --- a/drivers/net/ethernet/renesas/rswitch_main.c +++ b/drivers/net/ethernet/renesas/rswitch_main.c @@ -129,7 +129,7 @@ static int rswitch_fwd_init(struct rswitch_private *pri= v) iowrite32(FIELD_PREP(FWCP1_LTHFW, all_ports_mask), priv->addr + FWPC1(i)); /* Disallow L2 forwarding */ - iowrite32(FIELD_PREP(FWCP2_LTWFW, all_ports_mask), + iowrite32(FIELD_PREP(FWPC2_LTWFW, all_ports_mask), priv->addr + FWPC2(i)); /* Disallow port based forwarding */ iowrite32(0, priv->addr + FWPBFC(i)); --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 24FF2375F82; Tue, 17 Mar 2026 09:42:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740539; cv=none; b=Cy2oGGEB067T0Spp7k/ZMedXGQ0ue5wrhfv3jIfyv6ZjSWWFFlX1ebuUtCQL34zWi4tTRWlMivqofRKWgeqnUtBfNtJrQ5oy3IRtomEWpDNip5iEETOWWY8BQcSVvLfCola8Z110O0vUfcyFnrRnp1AJ+9xvF+sqdsIOJgMtNvY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740539; c=relaxed/simple; bh=rcTOSka6tP/lYSG7IJtOBUcaxYoJK+gaZ9DeXg39u/s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=H+eTvLibM8clvMVsksjq5T2A2FJ0EdCy7LbjBYYrrkXfk7Oru57ZQU4tTT0c2cmaGifmG5XFTWj+kaukt7Baq3PMEwOl1ouw2Fo1BN4H7Z/6Flg4y0+TgjorrQoUAtHS26WMGmt3QY1b5IkF8BQy581kLJepZ4vYXsK0pG/FA4g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: zNtYGq6+QEKOoJ7aYHBBpQ== X-CSE-MsgGUID: tua6CLeWS4+mn37QllJOPw== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:14 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id 8A4904017304; Tue, 17 Mar 2026 18:42:11 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:41:57 +0100 Subject: [PATCH net-next 04/13] net: renesas: rswitch: add register definitions for vlan support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-4-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=6161; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=rcTOSka6tP/lYSG7IJtOBUcaxYoJK+gaZ9DeXg39u/s=; b=Zy/k3t+PdMbNF7/198fge8jABB5YTncj5le/Y6H0OdesDNypTuYB7dvTy/+Q7sALcm7kjs0HJ GRQ9A+DQM66BkzyTBZ+md0hK31HSwnJhns/Cwa09C2CTQn+5/rgMvQ1 X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= Add missing register and bit definitions for vlan support. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch.h | 156 +++++++++++++++++++++++++++++= +++- 1 file changed, 152 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/= renesas/rswitch.h index 340524d995ac..15d3fa48b0e3 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -7,8 +7,10 @@ #ifndef __RSWITCH_H__ #define __RSWITCH_H__ =20 +#include #include #include +#include =20 #include "rcar_gen4_ptp.h" =20 @@ -221,7 +223,7 @@ enum rswitch_reg { FWMACTL1 =3D FWRO + 0x4634, FWMACTL2 =3D FWRO + 0x4638, FWMACTL3 =3D FWRO + 0x463c, - FWMACTL4 =3D FWRO + 0x4640, + FWMACTL40 =3D FWRO + 0x4640, FWMACTL5 =3D FWRO + 0x4650, FWMACTLR =3D FWRO + 0x4654, FWMACTIM =3D FWRO + 0x4660, @@ -249,7 +251,7 @@ enum rswitch_reg { FWVLANTL0 =3D FWRO + 0x4910, FWVLANTL1 =3D FWRO + 0x4914, FWVLANTL2 =3D FWRO + 0x4918, - FWVLANTL3 =3D FWRO + 0x4920, + FWVLANTL30 =3D FWRO + 0x4920, FWVLANTL4 =3D FWRO + 0x4930, FWVLANTLR =3D FWRO + 0x4934, FWVLANTIM =3D FWRO + 0x4940, @@ -508,7 +510,7 @@ enum rswitch_reg { EACTDQMLM =3D TARO + 0x010c, EAVCC =3D TARO + 0x0130, EAVTC =3D TARO + 0x0134, - EATTFC =3D TARO + 0x0138, + EARTFC =3D TARO + 0x0138, EACAEC =3D TARO + 0x0200, EACC =3D TARO + 0x0204, EACAIVC0 =3D TARO + 0x0220, @@ -729,6 +731,41 @@ enum rswitch_etha_mode { =20 #define EAMS_OPS_MASK EAMC_OPC_OPERATION =20 +/* bit field definitions for EAVCC and GWVCC */ +#define VEM GENMASK(18, 16) +#define VIM BIT(0) + +/* bit field definitions for EAVTC and GWVTC */ +#define STD BIT(31) +#define STP GENMASK(30, 28) +#define STV GENMASK(27, 16) +#define CTD BIT(15) +#define CTP GENMASK(14, 12) +#define CTV GENMASK(11, 0) + +/* bit field definitions for EARTFC and GWTTCF */ +#define UT BIT(8) +#define SCRT BIT(7) +#define SCT BIT(6) +#define CRT BIT(5) +#define CT BIT(4) +#define CSRT BIT(3) +#define CST BIT(2) +#define RT BIT(1) +#define NT BIT(0) + +/* bit field definitions for EARDQDC and GWRDQDC */ +#define DQD GENMASK(10, 0) +#define DES_RAM_DP 0x400 + +enum vlan_egress_mode { + NO_VLAN, + C_TAG_VLAN, + HW_C_TAG_VLAN, + SC_TAG_VLAN, + HW_SC_TAG_VLAN, +}; + #define EAVCC_VEM_SC_TAG (0x3 << 16) =20 #define MPIC_PIS GENMASK(2, 0) @@ -806,6 +843,22 @@ enum rswitch_gwca_mode { #define CABPPFLC_INIT_VALUE 0x00800080 =20 /* MFWD */ +#define FWGC_SVM GENMASK(1, 0) + +enum switch_vlan_mode { + NO_VLAN_MODE, + C_TAG, + SC_TAG, +}; + +/* FWCEPRC2 */ +#define FDMACSLFEF BIT(19) +#define FDMACUFEF BIT(3) + +/* FWCEPTC */ +#define EPCS GENMASK(17, 16) +#define EPCSD GENMASK(6, 0) + #define FWPC0(i) (FWPC00 + (i) * 0x10) #define FWPC0_LTHTA BIT(0) #define FWPC0_IP4UE BIT(3) @@ -816,10 +869,13 @@ enum rswitch_gwca_mode { #define FWPC0_IPDSA BIT(12) #define FWPC0_IPHLA BIT(18) #define FWPC0_MACDSA BIT(20) +#define FWPC0_MACRUDA BIT(21) #define FWPC0_MACSSA BIT(23) #define FWPC0_MACHLA BIT(26) #define FWPC0_MACHMA BIT(27) #define FWPC0_VLANSA BIT(28) +#define FWPC0_VLANRU BIT(29) +#define FWPC0_VLANRUS BIT(30) =20 #define FWPC1(i) (FWPC10 + (i) * 0x10) #define FWCP1_LTHFW GENMASK(16 + (RSWITCH_NUM_AGENTS - 1), 16) @@ -847,6 +903,98 @@ enum rswitch_gwca_mode { #define FWMACAGC_MACAGOG BIT(28) #define FWMACAGC_MACDESOG BIT(29) =20 +//FWMACTL0 +#define FWMACTL0_ED BIT(16) +#define FWMACTL0_HLD BIT(10) +#define FWMACTL0_DE BIT(9) +#define FWMACTL0_SL BIT(8) + +//FWMACTL3 +#define FWMACTL3_DSLV GENMASK(16 + RSWITCH_NUM_AGENTS - 1, 16) +#define FWMACTL3_SSLV GENMASK(RSWITCH_NUM_AGENTS - 1, 0) + +//FWMACTL4 +#define FWMACTL4(i) (FWMACTL40 + (i) * 4) +#define FWMACTL4_CSDL GENMASK(6, 0) + +//FWMACTL5 +#define FWMACTL5_CME BIT(21) +#define FWMACTL5_EME BIT(20) +#define FWMACTL5_IPU BIT(19) +#define FWMACTL5_IPV GENMASK(18, 16) +#define FWMACTL5_DV GENMASK(6, 0) + +//FWMACTLR +#define FWMACTLR_L BIT(31) +#define FWMACTLR_LCN GENMASK(25, 16) +#define FWMACTLR_LO BIT(3) +#define FWMACTLR_LEF BIT(2) +#define FWMACTLR_LSF BIT(1) +#define FWMACTLR_LF BIT(0) + +// FWVLANTEC +#define VLANTMUE GENMASK(28, 16) + +// FWVLANTL0 +#define VLANED BIT(16) +#define VLANHLDL BIT(10) +#define VLANSLL BIT(8) + +// FWVLANTL1 +#define VLANVIDL GENMASK(11, 0) + +// FWVLANTL2 +#define VLANSLVL GENMASK(6, 0) + +// FWVLANTL3 +#define FWVLANTL3(i) (FWVLANTL30 + (i) * 4) +#define VLANCSDL GENMASK(6, 0) + +// FWVLANTL4 +#define VLANCMEL BIT(21) +#define VLANEMEL BIT(20) +#define VLANIPUL BIT(19) +#define VLANIPVL GENMASK(18, 16) +#define VLANDVL GENMASK(6, 0) + +// FWVLANTLR +#define VLANTL BIT(31) +#define VLANLO BIT(3) +#define VLANLEF BIT(2) +#define VLANLSF BIT(1) +#define VLANLF BIT(0) + +// FWVLANTIM +#define VLANTR BIT(1) +#define VLANTIOG BIT(0) + +// FWVLANTEM +#define VLANTUEN GENMASK(28, 16) +#define VLANTEN GENAMSK(12, 0) + +// FWVLANTS +#define VLANVIDS GENMASK(11, 0) + +// FWVLANTSR0 +#define VLANTS BIT(31) +#define VLANHLDS BIT(10) +#define VLANSLS BIT(8) +#define VLANSNF BIT(1) +#define VLANSEF BIT(0) + +// FWVLANTSR1 +#define VLANSLVS GENMASK(6, 0) + +// FWVLANTSR2 +#define FWVLANTSR2(i) (FWVLANTSR20 + (i) * 4) + +// FWVLANTSR3 +#define VLANCMES BIT(21) +#define VLANEMES BIT(20) +#define VLANIPUS BIT(19) +#define VLANIPVS GENMASK(18, 16) +#define VLANDVS GENMASK(6, 0) + #define RSW_AGEING_CLK_PER_US 0x140 #define RSW_AGEING_TIME 300 =20 @@ -904,7 +1052,7 @@ enum DIE_DT { #define INFO1_DV(port_vector) ((u64)(port_vector) << 48ULL) =20 /* For reception */ -#define INFO1_SPN(port) ((u64)(port) << 36ULL) +#define SPN GENMASK_U64(38, 36) =20 /* For timestamp descriptor in dptrl (Byte 4 to 7) */ #define TS_DESC_TSUN(dptrl) ((dptrl) & GENMASK(7, 0)) --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie6.idc.renesas.com (relmlor2.renesas.com [210.160.252.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BE870379EF6; Tue, 17 Mar 2026 09:42:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740550; cv=none; b=pP0bR/hIyCYME60jlzycHGnX/s8eQl8mD963soZM7XHH6my0gUkOSJc//MLZDwIwj02lnbuQoxmse3kXYfHZmSnQk2MOzOW6E17CGLAh6aDGN7cIDOxMh5RQWnwlL8GwGa2Y6cofuugn8u5t36CMMOn1uh/oiZjKjkls5QpsOhw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740550; c=relaxed/simple; bh=pqPX66nqzY6BalxpifRIhDeL3aUrNVLAlaxPrOMewJM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DrTM8AeKHopZavrxZEiv2eqpME2CjG+s0sqscdpYnKa1Pra4Vi7OR0IfMwSkh93yJOzWjf0l2/k4YWtpMDU79IHUelt6QoF40tcJlTqQNXUm3zgFg1xNlYsGgRmnkeje+YQZuRtbwtXj2dA0lkObnyJPZgwIpd95kWPvP72MJqQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: 5T/cqGmqS7yP5bLjABxkuQ== X-CSE-MsgGUID: /WS+ILEpT7GaX8JFrkaP+g== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie6.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:17 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id 9B4D94015D64; Tue, 17 Mar 2026 18:42:14 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:41:58 +0100 Subject: [PATCH net-next 05/13] net: renesas: rswitch: add exception path for packets with unknown dst MAC Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-5-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=7240; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=pqPX66nqzY6BalxpifRIhDeL3aUrNVLAlaxPrOMewJM=; b=f3XJ/NhG0yV001A6kLm8RcXR0KoONdpukPyodG6z9/KuAZOsqLjAreoU+4Urxq5aQzFAJRZFP 0M07r9qwM6ADCFoie2PInWWEFRtt6Qds2FX9V8ZHcmOXlbUkVDsTdZE X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= Packets with unknown MAC address cannot be handled by the HW forwarding. These need to be forwarded, via an exception path, to the network driver. Creates a queue for the exeption path. Packets received with unknown src/dst address need to be passed to the CPU. The received packet does not have the correct source port information, this is derived from the descriptor and added to the new queue. The received packet is added to the new queue and sent to the CPU for MAC learning. The CPU will broadcast the received packet, to all ports. This is how the HW learns the new MAC address. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch.h | 1 + drivers/net/ethernet/renesas/rswitch_main.c | 80 +++++++++++++++++++++++++= +--- 2 files changed, 74 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/= renesas/rswitch.h index 15d3fa48b0e3..bf123b564ed1 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -1148,6 +1148,7 @@ struct rswitch_gwca { struct rswitch_gwca_queue *queues; int num_queues; struct rswitch_gwca_queue ts_queue; + struct rswitch_gwca_queue *l2_shared_rx_queue; DECLARE_BITMAP(used, RSWITCH_MAX_NUM_QUEUES); u32 tx_irq_bits[RSWITCH_NUM_IRQ_REGS]; u32 rx_irq_bits[RSWITCH_NUM_IRQ_REGS]; diff --git a/drivers/net/ethernet/renesas/rswitch_main.c b/drivers/net/ethe= rnet/renesas/rswitch_main.c index d404bc41bd1e..f8ceb7f66903 100644 --- a/drivers/net/ethernet/renesas/rswitch_main.c +++ b/drivers/net/ethernet/renesas/rswitch_main.c @@ -680,6 +680,34 @@ static int rswitch_rxdmac_init(struct rswitch_private = *priv, unsigned int index) return rswitch_gwca_queue_ext_ts_format(ndev->dev.parent, priv, rdev->rx_= queue); } =20 +static int rswitch_shared_rx_queue_alloc(struct rswitch_private *priv) +{ + struct rswitch_gwca *gwca =3D &priv->gwca; + struct device *dev =3D &priv->pdev->dev; + + int err; + + gwca->l2_shared_rx_queue =3D rswitch_gwca_get(priv); + if (!gwca->l2_shared_rx_queue) + return -EBUSY; + + err =3D rswitch_gwca_queue_alloc(NULL, priv, gwca->l2_shared_rx_queue, fa= lse, RX_RING_SIZE); + if (err < 0) { + rswitch_gwca_put(priv, gwca->l2_shared_rx_queue); + return err; + } + + return rswitch_gwca_queue_ext_ts_format(dev, priv, gwca->l2_shared_rx_que= ue); +} + +static void rswitch_shared_rx_queue_free(struct rswitch_private *priv) +{ + struct rswitch_gwca *gwca =3D &priv->gwca; + + rswitch_gwca_queue_free(&priv->pdev->dev, gwca->l2_shared_rx_queue); + rswitch_gwca_put(priv, gwca->l2_shared_rx_queue); +} + static int rswitch_gwca_hw_init(struct rswitch_private *priv) { unsigned int i; @@ -717,6 +745,12 @@ static int rswitch_gwca_hw_init(struct rswitch_private= *priv) return err; } =20 + err =3D rswitch_shared_rx_queue_alloc(priv); + if (err < 0) { + rswitch_shared_rx_queue_free(priv); + return err; + } + return rswitch_gwca_change_mode(priv, GWMC_OPC_OPERATION); } =20 @@ -940,6 +974,7 @@ static int rswitch_poll(struct napi_struct *napi, int b= udget) rswitch_enadis_data_irq(priv, rdev->tx_queue->index, true); rswitch_enadis_data_irq(priv, rdev->rx_queue->index, true); } + rswitch_enadis_data_irq(priv, priv->gwca.l2_shared_rx_queue->index, true= ); spin_unlock_irqrestore(&priv->lock, flags); } =20 @@ -952,15 +987,31 @@ static int rswitch_poll(struct napi_struct *napi, int= budget) return 0; } =20 -static void rswitch_queue_interrupt(struct net_device *ndev) +static void rswitch_queue_interrupt(struct rswitch_private *priv, struct r= switch_gwca_queue *gq) { - struct rswitch_device *rdev =3D netdev_priv(ndev); + struct rswitch_ext_ts_desc *desc; + struct rswitch_device *rdev; + struct net_device *ndev; + u32 spn; + + if (gq->index =3D=3D priv->gwca.l2_shared_rx_queue->index) { + desc =3D &gq->rx_ring[gq->cur]; + spn =3D FIELD_GET(SPN, desc->info1); + ndev =3D priv->rdev[spn]->ndev; + rdev =3D netdev_priv(ndev); + gq->ndev =3D ndev; + rdev->rx_queue =3D gq; + } else { + rdev =3D netdev_priv(gq->ndev); + } + =20 if (napi_schedule_prep(&rdev->napi)) { - spin_lock(&rdev->priv->lock); - rswitch_enadis_data_irq(rdev->priv, rdev->tx_queue->index, false); - rswitch_enadis_data_irq(rdev->priv, rdev->rx_queue->index, false); - spin_unlock(&rdev->priv->lock); + spin_lock(&priv->lock); + rswitch_enadis_data_irq(priv, rdev->tx_queue->index, false); + rswitch_enadis_data_irq(priv, rdev->rx_queue->index, false); + rswitch_enadis_data_irq(priv, priv->gwca.l2_shared_rx_queue->index, fals= e); + spin_unlock(&priv->lock); __napi_schedule(&rdev->napi); } } @@ -978,7 +1029,7 @@ static irqreturn_t rswitch_data_irq(struct rswitch_pri= vate *priv, u32 *dis) continue; =20 rswitch_ack_data_irq(priv, gq->index); - rswitch_queue_interrupt(gq->ndev); + rswitch_queue_interrupt(priv, gq); } =20 return IRQ_HANDLED; @@ -1513,6 +1564,14 @@ static int rswitch_serdes_set_params(struct rswitch_= device *rdev) return phy_set_speed(rdev->serdes, rdev->etha->speed); } =20 +static void rswitch_etha_set_exception_path(struct rswitch_private *priv) +{ + iowrite32(FDMACUFEF, priv->addr + FWCEPRC2); + iowrite32(FIELD_PREP(EPCSD, priv->gwca.l2_shared_rx_queue->index) | + FIELD_PREP(EPCSD, priv->gwca.l2_shared_rx_queue->index), + priv->addr + FWCEPTC); +} + static int rswitch_ether_port_init_one(struct rswitch_device *rdev) { int err; @@ -1566,6 +1625,8 @@ static int rswitch_ether_port_init_all(struct rswitch= _private *priv) unsigned int i; int err; =20 + rswitch_etha_set_exception_path(priv); + rswitch_for_each_enabled_port(priv, i) { err =3D rswitch_ether_port_init_one(priv->rdev[i]); if (err) @@ -1616,6 +1677,7 @@ static int rswitch_open(struct net_device *ndev) bitmap_set(rdev->priv->opened_ports, rdev->port, 1); rswitch_enadis_data_irq(rdev->priv, rdev->tx_queue->index, true); rswitch_enadis_data_irq(rdev->priv, rdev->rx_queue->index, true); + rswitch_enadis_data_irq(rdev->priv, rdev->priv->gwca.l2_shared_rx_queue->= index, true); spin_unlock_irqrestore(&rdev->priv->lock, flags); =20 phy_start(ndev->phydev); @@ -1642,6 +1704,7 @@ static int rswitch_stop(struct net_device *ndev) spin_lock_irqsave(&rdev->priv->lock, flags); rswitch_enadis_data_irq(rdev->priv, rdev->tx_queue->index, false); rswitch_enadis_data_irq(rdev->priv, rdev->rx_queue->index, false); + rswitch_enadis_data_irq(rdev->priv, rdev->priv->gwca.l2_shared_rx_queue->= index, false); bitmap_clear(rdev->priv->opened_ports, rdev->port, 1); spin_unlock_irqrestore(&rdev->priv->lock, flags); =20 @@ -2166,6 +2229,9 @@ static int renesas_eth_sw_probe(struct platform_devic= e *pdev) priv->gwca.index =3D AGENT_INDEX_GWCA; priv->gwca.num_queues =3D min(RSWITCH_NUM_PORTS * NUM_QUEUES_PER_NDEV, RSWITCH_MAX_NUM_QUEUES); + /* One extra queue for L2 switch reception */ + priv->gwca.num_queues =3D min(priv->gwca.num_queues + 1, + RSWITCH_MAX_NUM_QUEUES); priv->gwca.queues =3D devm_kcalloc(&pdev->dev, priv->gwca.num_queues, sizeof(*priv->gwca.queues), GFP_KERNEL); if (!priv->gwca.queues) --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8C0033A257B; Tue, 17 Mar 2026 09:42:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740542; cv=none; b=em0gAy61m2v4sLkW7E/CJtLNRK/L+7mIedYYv58V35KKO68tdWCY0hGDpgzNp5s8lgv5OoskIKBTIqIP2TNALtfKO0uRgI3Z+21KdhpaRMz7a3nE19ACjczKnLV5yIeGkPIWJOKEfaGE3lyl3ebafTXkgkRnypN6xoiVLgXjehk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740542; c=relaxed/simple; bh=uaOzubV6lX5PuPIXhNg1QdvFlsthNSX4pUWq9WpfST8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=G0e7+46AUSLnzcAfPG/zVhTxA7d4GriowXwDpYXRnNivBbclk6NH+OxysS0wOyBMdFp6GWCszGr4gHpJ5E0PdKPd8DH8+mucKx72baJD+QM+0b1VNkv9WvOaMbspetTAwhrG5cpulPTJK0NApeiLhlbwViPyjDpPLV6FpvVg7jc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: BiaSvzRMR0azA6MQmx14wg== X-CSE-MsgGUID: 6O7hJI4eTE6r5+r5gFZ/SQ== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:20 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id AC5724016D6A; Tue, 17 Mar 2026 18:42:17 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:41:59 +0100 Subject: [PATCH net-next 06/13] net: renesas: rswitch: add forwarding rules for gwca Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-6-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=1726; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=uaOzubV6lX5PuPIXhNg1QdvFlsthNSX4pUWq9WpfST8=; b=JECrVpLlbdHqnll3A+o4IaUH3ZFVXPQ2fQAOmg5UDxizQmUiEtSE2pWmgKX2Jmhj/Zr18CYrw ZIMvHgA4rFQB9yYLN4ryDFOFZ+P84ADZX81w/r6pZuskEjvXfseV3r1 X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= Add rules to forward packets from the Ethernet ports to the CPU port (GWCA) using L2 forwarding instead of port forwarding. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch_l2.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/net/ethernet/renesas/rswitch_l2.c b/drivers/net/ethern= et/renesas/rswitch_l2.c index 709524c8a5c4..21165ec56ce8 100644 --- a/drivers/net/ethernet/renesas/rswitch_l2.c +++ b/drivers/net/ethernet/renesas/rswitch_l2.c @@ -93,10 +93,36 @@ static void rswitch_update_l2_hw_forwarding(struct rswi= tch_private *priv) } } =20 +static void rswitch_update_l2_hw_forwarding_gwca(struct rswitch_private *p= riv) +{ + struct rswitch_device *rdev; + + if (priv->offload_brdev) { + rswitch_modify(priv->addr, FWPC0(AGENT_INDEX_GWCA), + 0, FWPC0_MACSSA | FWPC0_MACDSA | FWPC0_MACRUDA); + + rswitch_for_all_ports(priv, rdev) { + rswitch_modify(priv->addr, FWPC2(rdev->etha->index), + FIELD_PREP(FWPC2_LTWFW, BIT(AGENT_INDEX_GWCA)), + 0); + } + } else { + rswitch_modify(priv->addr, FWPC0(AGENT_INDEX_GWCA), + FWPC0_MACSSA | FWPC0_MACDSA | FWPC0_MACRUDA, + 0); + rswitch_for_all_ports(priv, rdev) { + rswitch_modify(priv->addr, FWPC2(rdev->etha->index), + 0, + FIELD_PREP(FWPC2_LTWFW, BIT(AGENT_INDEX_GWCA))); + } + } +} + void rswitch_update_l2_offload(struct rswitch_private *priv) { rswitch_update_l2_hw_learning(priv); rswitch_update_l2_hw_forwarding(priv); + rswitch_update_l2_hw_forwarding_gwca(priv); } =20 static void rswitch_update_offload_brdev(struct rswitch_private *priv) --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9C2E339F164; Tue, 17 Mar 2026 09:42:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740546; cv=none; b=pV9iYv7Io5kiHJEA3wXI7lMy3RpBWFyZb0p2SdgR4fsYqL2BCmrs2i9GPAtHJ6BUT86OTLImxt40gKVzQaR+ZhIndBvujXSHk0hctyqPSnnC39jCcHjaxiSuUt1Xz8dvWpymFQtn/3YXPq2P0y2AL6cSvNER19nwb7JUivBUlmI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740546; c=relaxed/simple; bh=qP4I8G9zNImRW0K3+hJs+IDbBZErpgqcOxRSKe0y7x8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rW4MxosZAsLemBHePyoMKL01WK6/rIpnQPHHDzgMX1oXjaVGe9GoDnVuRy1PNc7fQKgYvbN7L+pu9H3DoSB2glA/yGOKr25vywnOsU1wWzQZ5fOQ10fNZRGFLORUEY6Rw+Fvj5EhLHj0QLcRHnjZnJzJQ4bhuUKmMGK3tJ0vCW4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: r0V9xmgxSDa27bLOxoizcA== X-CSE-MsgGUID: HjXUgoI6SoykPguj+Jd0zA== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:23 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id BC3284016D6A; Tue, 17 Mar 2026 18:42:20 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:42:00 +0100 Subject: [PATCH net-next 07/13] net: renesas: rswitch: make helper functions available to whole driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-7-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=2846; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=qP4I8G9zNImRW0K3+hJs+IDbBZErpgqcOxRSKe0y7x8=; b=18DRQRcTtFPHSrsQYdL4fD8P56EQskkIb2lPO1r74ea89RjPr1Q/UZONwAAIUCs+hDWQx2mwY q/iCKcPm4/LB6HLETY9FZDvj70ZbA/pr/a0u4Z2ceGZcNVqUw40NLDb X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= These functions will be needed in L2 and vlan handling. Remove static declaration and add function prototype to rswitch.h. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch.h | 6 ++++-- drivers/net/ethernet/renesas/rswitch_main.c | 12 ++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/= renesas/rswitch.h index bf123b564ed1..ff2a84057f01 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* Renesas Ethernet Switch device driver * - * Copyright (C) 2022-2025 Renesas Electronics Corporation + * Copyright (C) 2022-2026 Renesas Electronics Corporation */ =20 #ifndef __RSWITCH_H__ @@ -1218,5 +1218,7 @@ struct rswitch_private { =20 bool is_rdev(const struct net_device *ndev); void rswitch_modify(void __iomem *addr, enum rswitch_reg reg, u32 clear, u= 32 set); - +int rswitch_reg_wait(void __iomem *addr, u32 offs, u32 mask, u32 expected); +int rswitch_gwca_change_mode(struct rswitch_private *priv, enum rswitch_gw= ca_mode mode); +int rswitch_etha_change_mode(struct rswitch_etha *etha, enum rswitch_etha_= mode mode); #endif /* #ifndef __RSWITCH_H__ */ diff --git a/drivers/net/ethernet/renesas/rswitch_main.c b/drivers/net/ethe= rnet/renesas/rswitch_main.c index f8ceb7f66903..b16f7aca4a69 100644 --- a/drivers/net/ethernet/renesas/rswitch_main.c +++ b/drivers/net/ethernet/renesas/rswitch_main.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 /* Renesas Ethernet Switch device driver * - * Copyright (C) 2022-2025 Renesas Electronics Corporation + * Copyright (C) 2022-2026 Renesas Electronics Corporation */ =20 #include @@ -32,7 +32,7 @@ =20 #define RSWITCH_GPTP_OFFSET_S4 0x00018000 =20 -static int rswitch_reg_wait(void __iomem *addr, u32 offs, u32 mask, u32 ex= pected) +int rswitch_reg_wait(void __iomem *addr, u32 offs, u32 mask, u32 expected) { u32 val; =20 @@ -168,8 +168,8 @@ static int rswitch_fwd_init(struct rswitch_private *pri= v) } =20 /* Gateway CPU agent block (GWCA) */ -static int rswitch_gwca_change_mode(struct rswitch_private *priv, - enum rswitch_gwca_mode mode) +int rswitch_gwca_change_mode(struct rswitch_private *priv, + enum rswitch_gwca_mode mode) { int ret; =20 @@ -1153,8 +1153,8 @@ static int rswitch_gwca_ts_request_irqs(struct rswitc= h_private *priv) } =20 /* Ethernet TSN Agent block (ETHA) and Ethernet MAC IP block (RMAC) */ -static int rswitch_etha_change_mode(struct rswitch_etha *etha, - enum rswitch_etha_mode mode) +int rswitch_etha_change_mode(struct rswitch_etha *etha, + enum rswitch_etha_mode mode) { int ret; =20 --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie6.idc.renesas.com (relmlor2.renesas.com [210.160.252.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 86AB93A1A27; Tue, 17 Mar 2026 09:42:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740551; cv=none; b=hl4VTDIew8VifCpYk0UJdRGdAjWOw1XLyRVpS4BAZN+K7rsjJRNUwnlABNwMwvekXWsLn+x3zm75VuVXUCizLHjg7I2lnVk5ohPH8qUww4mEGOCflFZWj9NvZHUGvdNRicMwvSvm7dbXk3sBIVig6HKdQHKJRZ2Hw/9Sn4ioG/4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740551; c=relaxed/simple; bh=be72gMXAAPLEEl16TU8jP7s7AtiEA7bNqEE8ajTJQZE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ka9MEhB9h3b+1pbSq2bQwgi7cekqlTASg0B5XUT8OGWK2HU0pC5vAHuCMsk5NOyY0BUufTBo1DKbci/jH/Z3eZ9731anduHEZEukLvXeG9D6b81+3rLKrncQdY3X1f6rqdNOo000kawBnrilZiOKGEEGHChMVnjMyJ8De91GhPs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: NqW9jM4wTO2k/mh0Lsor1w== X-CSE-MsgGUID: 4NzH5/3OQkusjAwQ0XIglA== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie6.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:26 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id CBF294016D6A; Tue, 17 Mar 2026 18:42:23 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:42:01 +0100 Subject: [PATCH net-next 08/13] net: renesas: rswitch: add basic vlan init to rswitch_fwd_init Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-8-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=1893; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=be72gMXAAPLEEl16TU8jP7s7AtiEA7bNqEE8ajTJQZE=; b=MFjCirNrzHzQGbQctEGilbGxiRxemWdC25iOKwCQErwGI4bl+rHtAc0JXQYxkjexcZzXvO1C6 20WvfmNk2oDC/5KDp6mQQuNBnW076f1Pj9r0YUwhzEEcSLANFs1i+BT X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= Add basic vlan related register initialization. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch_main.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch_main.c b/drivers/net/ethe= rnet/renesas/rswitch_main.c index b16f7aca4a69..ac87175b918e 100644 --- a/drivers/net/ethernet/renesas/rswitch_main.c +++ b/drivers/net/ethernet/renesas/rswitch_main.c @@ -120,6 +120,7 @@ static int rswitch_fwd_init(struct rswitch_private *pri= v) u32 all_ports_mask =3D GENMASK(RSWITCH_NUM_AGENTS - 1, 0); unsigned int i; u32 reg_val; + int ret; =20 /* Start with empty configuration */ for (i =3D 0; i < RSWITCH_NUM_AGENTS; i++) { @@ -154,17 +155,27 @@ static int rswitch_fwd_init(struct rswitch_private *p= riv) } =20 /* For GWCA port, allow direct descriptor forwarding */ - rswitch_modify(priv->addr, FWPC1(priv->gwca.index), FWPC1_DDE, FWPC1_DDE); + rswitch_modify(priv->addr, FWPC1(priv->gwca.index), 0, FWPC1_DDE); =20 /* Initialize hardware L2 forwarding table */ =20 - /* Allow entire table to be used for "unsecure" entries */ + /* Allow entire table to be used for "un-secure" entries */ rswitch_modify(priv->addr, FWMACHEC, 0, FWMACHEC_MACHMUE_MASK); =20 /* Initialize MAC hash table */ iowrite32(FWMACTIM_MACTIOG, priv->addr + FWMACTIM); =20 - return rswitch_reg_wait(priv->addr, FWMACTIM, FWMACTIM_MACTIOG, 0); + ret =3D rswitch_reg_wait(priv->addr, FWMACTIM, FWMACTIM_MACTIOG, 0); + if (ret) + return ret; + + /* Allow entire VLAN table to be used for "un-secure" entries */ + iowrite32(VLANTMUE, priv->addr + FWVLANTEC); + + /* Initialize VLAN table */ + iowrite32(VLANTIOG, priv->addr + FWVLANTIM); + + return rswitch_reg_wait(priv->addr, FWVLANTIM, VLANTIOG, 0); } =20 /* Gateway CPU agent block (GWCA) */ --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BBD5C39E17B; Tue, 17 Mar 2026 09:42:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740551; cv=none; b=YfyW9VRyA5nm8ZiPB9U/gTrGRIMdJluHLRUXNoSHyzIRzZ1C9bQzGSZUS5xJggc4oBetW7sLbssoEDcjblpU+icYJqyBr/Skc2ycyZ2OnaL35luQeSodmD0kJt/wUrLqzMyJ+uWnIm86NhcWOICVPrqit0UwYpgck4pp5uNBjW4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740551; c=relaxed/simple; bh=OefNjGkxEG5kTziyf+/8NB1KQyg+CiOUkHHInvBgL+8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GgkWhz+m/C6+HhzvtHt71bKug3el/WHHs29g4p7mcJ+x0zK4UuDPK80thntNqx+Z+9aUa/A1e/3HtoqWzedO9A5B/fyKG9R7GTKc/9FXKoOu6I/pvMGkrTh1kQY7gpBRfbrh0AZAKOb2ljsItNObFy/uYqn6b0G4IAkvicDNRIE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: WGC18th2Rq+Un34SRS3xlQ== X-CSE-MsgGUID: OBex4MIiQ2maL5QQlpgocQ== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:29 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id DC41D4016D6A; Tue, 17 Mar 2026 18:42:26 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:42:02 +0100 Subject: [PATCH net-next 09/13] net: renesas: rswitch: update port HW init Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-9-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=2575; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=OefNjGkxEG5kTziyf+/8NB1KQyg+CiOUkHHInvBgL+8=; b=wmAKPtLX6jX280EyiTqs3F+b2ufi0q9p7kHxwRePxomjwNF6kCeGqy1yChBZeJKuDXx9ha3Ni T7GY1sdZMuxD+zVSiQg1jdBTi21GJIEKOzr4T2KkAuWYWAxovQyrGSj X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= Certain Ethernet and cpu port settings need to be updated for vlan support. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch.h | 4 ---- drivers/net/ethernet/renesas/rswitch_main.c | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/= renesas/rswitch.h index ff2a84057f01..42c8bbafa27d 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -766,8 +766,6 @@ enum vlan_egress_mode { HW_SC_TAG_VLAN, }; =20 -#define EAVCC_VEM_SC_TAG (0x3 << 16) - #define MPIC_PIS GENMASK(2, 0) #define MPIC_PIS_GMII 2 #define MPIC_PIS_XGMII 4 @@ -806,8 +804,6 @@ enum rswitch_gwca_mode { #define GWMTIRM_MTIOG BIT(0) #define GWMTIRM_MTR BIT(1) =20 -#define GWVCC_VEM_SC_TAG (0x3 << 16) - #define GWARIRM_ARIOG BIT(0) #define GWARIRM_ARR BIT(1) =20 diff --git a/drivers/net/ethernet/renesas/rswitch_main.c b/drivers/net/ethe= rnet/renesas/rswitch_main.c index ac87175b918e..d1be588fb625 100644 --- a/drivers/net/ethernet/renesas/rswitch_main.c +++ b/drivers/net/ethernet/renesas/rswitch_main.c @@ -735,8 +735,11 @@ static int rswitch_gwca_hw_init(struct rswitch_private= *priv) if (err < 0) return err; =20 - iowrite32(GWVCC_VEM_SC_TAG, priv->addr + GWVCC); - iowrite32(0, priv->addr + GWTTFC); + iowrite32(0, priv->addr + GWIRC); + iowrite32(FIELD_PREP(DQD, DES_RAM_DP), priv->addr + GWRDQDC0); + /* Drop frames with unknown tags */ + iowrite32(UT, priv->addr + GWTTFC); + iowrite32(lower_32_bits(priv->gwca.linkfix_table_dma), priv->addr + GWDCB= AC1); iowrite32(upper_32_bits(priv->gwca.linkfix_table_dma), priv->addr + GWDCB= AC0); iowrite32(lower_32_bits(priv->gwca.ts_queue.ring_dma), priv->addr + GWTDC= AC10); @@ -878,6 +881,7 @@ static bool rswitch_rx(struct net_device *ndev, int *qu= ota) limit =3D boguscnt; =20 desc =3D &gq->rx_ring[gq->cur]; + while ((desc->desc.die_dt & DT_MASK) !=3D DT_FEMPTY) { dma_rmb(); skb =3D rswitch_rx_handle_desc(ndev, gq, desc); @@ -1267,7 +1271,12 @@ static int rswitch_etha_hw_init(struct rswitch_etha = *etha, const u8 *mac) if (err < 0) return err; =20 - iowrite32(EAVCC_VEM_SC_TAG, etha->addr + EAVCC); + iowrite32(0, etha->addr + EAIRC); + iowrite32(FIELD_PREP(DQD, DES_RAM_DP), etha->addr + EATDQDC0); + + /* Drop frames with unknown tags */ + iowrite32(UT, etha->addr + EARTFC); + rswitch_rmac_setting(etha, mac); rswitch_etha_enable_mii(etha); =20 --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CE34C3A4504; Tue, 17 Mar 2026 09:42:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740554; cv=none; b=Jt0/aXCnMdoSm10Ubx0KcNgxs4PM5Kq51SDdF54nzapxYok7UQuV3kxwAKaX3Ufzi+d0guRvHelKDFlg/aG17Gh5Wym1tSHK/JpuYaBioF30+tsmPs/N0oqVpZ6hB3bsWuOyVtCKmDjjTQacgSiW/BpuMw01skdQ4p39pSAZu/Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740554; c=relaxed/simple; bh=qcbstgk0xYi7kZJQ24nFZVWxlUGX+TeNrlSt5D85PHU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=SF3inu5jyaOspWPkQbJyuIOHs7yHjc8WwQcH9ffI8FAYYC+Jgsq9XDE+bMsDSXxWotwWI+dwd7kGwV0Sfea4rC8snYPfIh8QqqLXD6SNAzNJicvS7VB8WXlpZR6Xu+g4VlHuOVLwO+UCAT78RDyIjl9Gw2Xj2VH3pahTFqWDJw0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: WkfJm974R3yyjLGICaEdpw== X-CSE-MsgGUID: vHzyGvQBQ7ieIMpAFmEnnQ== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:32 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id EC5124016D6A; Tue, 17 Mar 2026 18:42:29 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:42:03 +0100 Subject: [PATCH net-next 10/13] net: renesas: rswitch: clean up is_rdev rswitch_device checking Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-10-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=2714; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=qcbstgk0xYi7kZJQ24nFZVWxlUGX+TeNrlSt5D85PHU=; b=lwQp+CLavALqlYCW2tmNpn9L05EKuAhDDpRqwqXn11NasaSlRJvjyKjYGDe1Ntc4FvHb9E7mH S0VftGPUOZLDyXksG4dA4QNVQXUM7LoeG8DmrEwTBrAqoSha+4i73p+ X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= Add null pointer checking for ndev and remove unnecessay rswitch_port_check() wrapper function. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch_l2.c | 15 +++++---------- drivers/net/ethernet/renesas/rswitch_main.c | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch_l2.c b/drivers/net/ethern= et/renesas/rswitch_l2.c index 21165ec56ce8..da8c04dd65e4 100644 --- a/drivers/net/ethernet/renesas/rswitch_l2.c +++ b/drivers/net/ethernet/renesas/rswitch_l2.c @@ -162,11 +162,6 @@ static void rswitch_update_offload_brdev(struct rswitc= h_private *priv) rswitch_update_l2_offload(priv); } =20 -static bool rswitch_port_check(const struct net_device *ndev) -{ - return is_rdev(ndev); -} - static void rswitch_port_update_brdev(struct net_device *ndev, struct net_device *brdev) { @@ -203,7 +198,7 @@ static int rswitch_netdevice_event(struct notifier_bloc= k *nb, struct netdev_notifier_changeupper_info *info; struct net_device *brdev; =20 - if (!rswitch_port_check(ndev)) + if (!is_rdev(ndev)) return NOTIFY_DONE; if (event !=3D NETDEV_CHANGEUPPER) return NOTIFY_DONE; @@ -258,12 +253,12 @@ static int rswitch_switchdev_event(struct notifier_bl= ock *nb, =20 if (event =3D=3D SWITCHDEV_PORT_ATTR_SET) { ret =3D switchdev_handle_port_attr_set(ndev, ptr, - rswitch_port_check, + is_rdev, rswitch_port_attr_set); return notifier_from_errno(ret); } =20 - if (!rswitch_port_check(ndev)) + if (!is_rdev(ndev)) return NOTIFY_DONE; =20 return notifier_from_errno(-EOPNOTSUPP); @@ -282,11 +277,11 @@ static int rswitch_switchdev_blocking_event(struct no= tifier_block *nb, return -EOPNOTSUPP; case SWITCHDEV_PORT_ATTR_SET: ret =3D switchdev_handle_port_attr_set(ndev, ptr, - rswitch_port_check, + is_rdev, rswitch_port_attr_set); break; default: - if (!rswitch_port_check(ndev)) + if (!is_rdev(ndev)) return NOTIFY_DONE; ret =3D -EOPNOTSUPP; } diff --git a/drivers/net/ethernet/renesas/rswitch_main.c b/drivers/net/ethe= rnet/renesas/rswitch_main.c index d1be588fb625..da984027239c 100644 --- a/drivers/net/ethernet/renesas/rswitch_main.c +++ b/drivers/net/ethernet/renesas/rswitch_main.c @@ -1962,7 +1962,7 @@ static const struct net_device_ops rswitch_netdev_ops= =3D { =20 bool is_rdev(const struct net_device *ndev) { - return (ndev->netdev_ops =3D=3D &rswitch_netdev_ops); + return ndev && (ndev->netdev_ops =3D=3D &rswitch_netdev_ops); } =20 static int rswitch_get_ts_info(struct net_device *ndev, struct kernel_etht= ool_ts_info *info) --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E315F3A382C; Tue, 17 Mar 2026 09:42:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740557; cv=none; b=DDrx/ROpJij52CQ3hI1WTsEI5UVpJCIJZ8RjFsBLGSxUd7EdIB3ligfdU4zwTVBZoxuiOccFUEODRsEzvc/b4s8HA57FL0fS2Qbgof0OumQf/zjuV9GO497ansNkb1vy5X5yQRsqzWKKqr6/DLKJdFp9NKyNoxxl63gTDlfWXoQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740557; c=relaxed/simple; bh=g1Jcx3HF+zw7LyqJCYhw8ODgE7FX68duppwcZpBHa80=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NJHyHmGygP9p20msA7xB8MGAj9VZ4wUeZ8qIuF01mcYGl+XOv7BBBAg4/O6xXTdlgynM0sM2THW+g5tznfQFOy9cYGEcDcHcpMKkle27nF8AgRxDYywjDAfmiMxX6QkjXo3AA3dIyJ6bj/rNB6O00y1SIYMlDYbFwc8/WqC0Wko= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: dd5fFX+sS02HCxenReA3qw== X-CSE-MsgGUID: k9korBmxQkicvHo64oXrwg== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:35 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id 0A9A54016D6A; Tue, 17 Mar 2026 18:42:32 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:42:04 +0100 Subject: [PATCH net-next 11/13] net: renesas: rswitch: add passing of rswitch_private into notifiers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-11-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=5516; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=g1Jcx3HF+zw7LyqJCYhw8ODgE7FX68duppwcZpBHa80=; b=Ep0HxeKUXHJb6WnWwLPhRSA3TR+BRPkiU4ABoXeCYW2fLq8qfDeaiTFQYGOMhAb/OJBxECikc NPaTUAoLgN2APVTIrv/8Zg5+RBNjhYkBf2Um1+I+nAc75D5QIZdWr7f X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= Provide struct rswitch_private to notifiers. This will be needed to access the HW in the notification handlers. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch.h | 5 ++++ drivers/net/ethernet/renesas/rswitch_l2.c | 45 ++++++++++++-------------= ---- drivers/net/ethernet/renesas/rswitch_l2.h | 6 ++-- drivers/net/ethernet/renesas/rswitch_main.c | 4 +-- 4 files changed, 28 insertions(+), 32 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/= renesas/rswitch.h index 42c8bbafa27d..6dfc53c6b985 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -1199,6 +1199,11 @@ struct rswitch_private { struct rswitch_etha etha[RSWITCH_NUM_PORTS]; struct rswitch_mfwd mfwd; =20 + /* Notifiers */ + struct notifier_block rswitch_netdevice_nb; + struct notifier_block rswitch_switchdev_nb; + struct notifier_block rswitch_switchdev_blocking_nb; + struct list_head port_list; =20 spinlock_t lock; /* lock interrupt registers' control */ diff --git a/drivers/net/ethernet/renesas/rswitch_l2.c b/drivers/net/ethern= et/renesas/rswitch_l2.c index da8c04dd65e4..596a9fe2c086 100644 --- a/drivers/net/ethernet/renesas/rswitch_l2.c +++ b/drivers/net/ethernet/renesas/rswitch_l2.c @@ -289,48 +289,39 @@ static int rswitch_switchdev_blocking_event(struct no= tifier_block *nb, return notifier_from_errno(ret); } =20 -static struct notifier_block rswitch_netdevice_nb =3D { - .notifier_call =3D rswitch_netdevice_event, -}; - -static struct notifier_block rswitch_switchdev_nb =3D { - .notifier_call =3D rswitch_switchdev_event, -}; - -static struct notifier_block rswitch_switchdev_blocking_nb =3D { - .notifier_call =3D rswitch_switchdev_blocking_event, -}; - -int rswitch_register_notifiers(void) +int rswitch_register_notifiers(struct rswitch_private *priv) { - int ret; + int err; =20 - ret =3D register_netdevice_notifier(&rswitch_netdevice_nb); - if (ret) + priv->rswitch_netdevice_nb.notifier_call =3D rswitch_netdevice_event; + err =3D register_netdevice_notifier(&priv->rswitch_netdevice_nb); + if (err) goto register_netdevice_notifier_failed; =20 - ret =3D register_switchdev_notifier(&rswitch_switchdev_nb); - if (ret) + priv->rswitch_switchdev_nb.notifier_call =3D rswitch_switchdev_event; + err =3D register_switchdev_notifier(&priv->rswitch_switchdev_nb); + if (err) goto register_switchdev_notifier_failed; =20 - ret =3D register_switchdev_blocking_notifier(&rswitch_switchdev_blocking_= nb); - if (ret) + priv->rswitch_switchdev_blocking_nb.notifier_call =3D rswitch_switchdev_b= locking_event; + err =3D register_switchdev_blocking_notifier(&priv->rswitch_switchdev_blo= cking_nb); + if (err) goto register_switchdev_blocking_notifier_failed; =20 return 0; =20 register_switchdev_blocking_notifier_failed: - unregister_switchdev_notifier(&rswitch_switchdev_nb); + unregister_switchdev_notifier(&priv->rswitch_switchdev_nb); register_switchdev_notifier_failed: - unregister_netdevice_notifier(&rswitch_netdevice_nb); + unregister_netdevice_notifier(&priv->rswitch_netdevice_nb); register_netdevice_notifier_failed: =20 - return ret; + return err; } =20 -void rswitch_unregister_notifiers(void) +void rswitch_unregister_notifiers(struct rswitch_private *priv) { - unregister_switchdev_blocking_notifier(&rswitch_switchdev_blocking_nb); - unregister_switchdev_notifier(&rswitch_switchdev_nb); - unregister_netdevice_notifier(&rswitch_netdevice_nb); + unregister_switchdev_blocking_notifier(&priv->rswitch_switchdev_blocking_= nb); + unregister_switchdev_notifier(&priv->rswitch_switchdev_nb); + unregister_netdevice_notifier(&priv->rswitch_netdevice_nb); } diff --git a/drivers/net/ethernet/renesas/rswitch_l2.h b/drivers/net/ethern= et/renesas/rswitch_l2.h index 57050ede8f31..af9780c63c9a 100644 --- a/drivers/net/ethernet/renesas/rswitch_l2.h +++ b/drivers/net/ethernet/renesas/rswitch_l2.h @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* Renesas Ethernet Switch device driver * - * Copyright (C) 2025 Renesas Electronics Corporation + * Copyright (C) 2025 - 2026 Renesas Electronics Corporation */ =20 #ifndef __RSWITCH_L2_H__ @@ -9,7 +9,7 @@ =20 void rswitch_update_l2_offload(struct rswitch_private *priv); =20 -int rswitch_register_notifiers(void); -void rswitch_unregister_notifiers(void); +int rswitch_register_notifiers(struct rswitch_private *priv); +void rswitch_unregister_notifiers(struct rswitch_private *priv); =20 #endif /* #ifndef __RSWITCH_L2_H__ */ diff --git a/drivers/net/ethernet/renesas/rswitch_main.c b/drivers/net/ethe= rnet/renesas/rswitch_main.c index da984027239c..4e0a481ef403 100644 --- a/drivers/net/ethernet/renesas/rswitch_main.c +++ b/drivers/net/ethernet/renesas/rswitch_main.c @@ -2272,7 +2272,7 @@ static int renesas_eth_sw_probe(struct platform_devic= e *pdev) if (list_empty(&priv->port_list)) dev_warn(&pdev->dev, "could not initialize any ports\n"); =20 - ret =3D rswitch_register_notifiers(); + ret =3D rswitch_register_notifiers(priv); if (ret) { dev_err(&pdev->dev, "could not register notifiers\n"); return ret; @@ -2311,7 +2311,7 @@ static void renesas_eth_sw_remove(struct platform_dev= ice *pdev) { struct rswitch_private *priv =3D platform_get_drvdata(pdev); =20 - rswitch_unregister_notifiers(); + rswitch_unregister_notifiers(priv); rswitch_deinit(priv); =20 pm_runtime_put(&pdev->dev); --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie6.idc.renesas.com (relmlor2.renesas.com [210.160.252.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E98D33A0E8B; Tue, 17 Mar 2026 09:42:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740563; cv=none; b=LjhLXRfiMjVE0ZWgmjI8j0DkLYZ7oOT0X7r3UlsSJwyQqF62q5Me0Rwej8kHXgnXjNLfjlH0Cr0j6toOQRN/+OxESt1UYdYpCBro9O0MjgGxdlnguBaa7lB8EHMn6Aq/rHy1gi9Hc+jnIcQW1XuRMHWd7MbJtfU3JGmwHyvvE9k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740563; c=relaxed/simple; bh=3e7qKUFGjulqsrC6IVG14rkv2jldSXWwt5NdTeSQiBM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rPtPz/KZThPg5gZgqlN94w0mDOjCOWMrEZyuLLaiZ9Hw9UEuPHd3qm/mkG5CiptuNXwpA7h5w19h6T5EK6V7OPW6e2VansMLkD+ePHexjc0zpwLrDEEx+azvFQeAClGGV7+hNq3Tp9CPkaLldY089Rg/522OTTQ5FwPkrYgDxBw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: kV1YOLkxTn2ZtPzyiVYmoA== X-CSE-MsgGUID: hxC12Ug3SGeVOs1RYGJ6Sg== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie6.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:38 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id 1E4D44015D64; Tue, 17 Mar 2026 18:42:35 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:42:05 +0100 Subject: [PATCH net-next 12/13] net: renesas: rswitch: add handler for FDB notification Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-12-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=8841; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=3e7qKUFGjulqsrC6IVG14rkv2jldSXWwt5NdTeSQiBM=; b=PEMjoPk9fWOyZwdf92GXOr9e8VwVZw8Pib8hQivCiV4pATK7KGDuPuj4iJtEl34zXZxXkNM+8 0j/CYyB4aplC/MosehVBvrZRQnPyUc3peggyeBjh/mCiX5bB7qHxIO3 X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= The SWITCHDEV_FDB_ADD_TO_DEVICE notification writes the bridge MAC address to the GWCA and adds a static rule to the MAC table. The SWITCHDEV_FDB_DEL_TO_DEVICE removes the static rule from the MAC table. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch.h | 8 ++ drivers/net/ethernet/renesas/rswitch_l2.c | 205 ++++++++++++++++++++++++++= ---- 2 files changed, 190 insertions(+), 23 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/= renesas/rswitch.h index 6dfc53c6b985..443fc4e49602 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -1217,6 +1217,14 @@ struct rswitch_private { enum hwtstamp_rx_filters tstamp_rx_ctrl; }; =20 +struct rswitch_switchdev_event_work { + struct work_struct work; + struct switchdev_notifier_fdb_info fdb_info; + struct net_device *ndev; + struct rswitch_private *priv; + unsigned long event; +}; + bool is_rdev(const struct net_device *ndev); void rswitch_modify(void __iomem *addr, enum rswitch_reg reg, u32 clear, u= 32 set); int rswitch_reg_wait(void __iomem *addr, u32 offs, u32 mask, u32 expected); diff --git a/drivers/net/ethernet/renesas/rswitch_l2.c b/drivers/net/ethern= et/renesas/rswitch_l2.c index 596a9fe2c086..edfa22676faa 100644 --- a/drivers/net/ethernet/renesas/rswitch_l2.c +++ b/drivers/net/ethernet/renesas/rswitch_l2.c @@ -23,7 +23,8 @@ static bool rdev_for_l2_offload(struct rswitch_device *rd= ev) static void rswitch_change_l2_hw_offloading(struct rswitch_device *rdev, bool start, bool learning) { - u32 bits =3D learning ? FWPC0_MACSSA | FWPC0_MACHLA | FWPC0_MACHMA : FWPC= 0_MACDSA; + u32 bits =3D learning ? FWPC0_MACSSA | FWPC0_MACHLA | FWPC0_MACHMA | FWPC= 0_MACRUDA : + FWPC0_MACDSA; u32 clear =3D start ? 0 : bits; u32 set =3D start ? bits : 0; =20 @@ -82,8 +83,9 @@ static void rswitch_update_l2_hw_forwarding(struct rswitc= h_private *priv) * * Do not allow L2 forwarding to self for hw port. */ - iowrite32(FIELD_PREP(FWPC2_LTWFW, fwd_mask | BIT(rdev->port)), - priv->addr + FWPC2(rdev->port)); + rswitch_modify(priv->addr, FWPC2(rdev->port), + FIELD_PREP(FWPC2_LTWFW, ~(fwd_mask | BIT(rdev->port))), + 0); } =20 if (new_forwarding_offload && !rdev->forwarding_offloaded) @@ -192,7 +194,8 @@ static int rswitch_port_update_stp_state(struct net_dev= ice *ndev, u8 stp_state) } =20 static int rswitch_netdevice_event(struct notifier_block *nb, - unsigned long event, void *ptr) + unsigned long event, + void *ptr) { struct net_device *ndev =3D netdev_notifier_info_to_dev(ptr); struct netdev_notifier_changeupper_info *info; @@ -245,25 +248,6 @@ static int rswitch_port_attr_set(struct net_device *nd= ev, const void *ctx, } } =20 -static int rswitch_switchdev_event(struct notifier_block *nb, - unsigned long event, void *ptr) -{ - struct net_device *ndev =3D switchdev_notifier_info_to_dev(ptr); - int ret; - - if (event =3D=3D SWITCHDEV_PORT_ATTR_SET) { - ret =3D switchdev_handle_port_attr_set(ndev, ptr, - is_rdev, - rswitch_port_attr_set); - return notifier_from_errno(ret); - } - - if (!is_rdev(ndev)) - return NOTIFY_DONE; - - return notifier_from_errno(-EOPNOTSUPP); -} - static int rswitch_switchdev_blocking_event(struct notifier_block *nb, unsigned long event, void *ptr) { @@ -289,6 +273,181 @@ static int rswitch_switchdev_blocking_event(struct no= tifier_block *nb, return notifier_from_errno(ret); } =20 +static int rswitch_gwca_write_mac_address(struct rswitch_private *priv, co= nst u8 *mac) +{ + int err; + + err =3D rswitch_gwca_change_mode(priv, GWMC_OPC_CONFIG); + if (err < 0) + return err; + + iowrite32((mac[0] << 8) | mac[1], priv->addr + GWMAC0); + iowrite32((mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5], + priv->addr + GWMAC1); + + return rswitch_gwca_change_mode(priv, GWMC_OPC_OPERATION); +} + +static int rswitch_add_addr_to_mactable(struct rswitch_private *priv, cons= t u8 *mac) +{ + u32 index =3D priv->gwca.l2_shared_rx_queue->index; + int err; + + rswitch_modify(priv->addr, FWMACTL0, FWMACTL0_ED, 0); + iowrite32((mac[0] << 8) | mac[1], priv->addr + FWMACTL1); + iowrite32((mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5], + priv->addr + FWMACTL2); + iowrite32(FWMACTL3_DSLV | FWMACTL3_SSLV, + priv->addr + FWMACTL3); + iowrite32(FIELD_PREP(FWMACTL4_CSDL, index), + priv->addr + FWMACTL4(GWCA_INDEX)); + iowrite32(FIELD_PREP(FWMACTL5_DV, BIT(AGENT_INDEX_GWCA)), + priv->addr + FWMACTL5); + + err =3D rswitch_reg_wait(priv->addr, FWMACTLR, FWMACTLR_L, 0); + if (err < 0) + return err; + + if (ioread32(priv->addr + FWMACTLR)) + return NOTIFY_BAD; + + return NOTIFY_DONE; +} + +static int rswitch_del_addr_from_mactable(struct rswitch_private *priv, co= nst u8 *mac) +{ + int err; + + rswitch_modify(priv->addr, FWMACTL0, 0, FWMACTL0_ED); + iowrite32((mac[0] << 8) | mac[1], priv->addr + FWMACTL1); + iowrite32((mac[2] << 24) | (mac[3] << 16) | (mac[4] << 8) | mac[5], + priv->addr + FWMACTL2); + iowrite32(FWMACTL3_DSLV | FWMACTL3_SSLV, + priv->addr + FWMACTL3); + iowrite32(FIELD_PREP(FWMACTL4_CSDL, BIT(0)), + priv->addr + FWMACTL4(GWCA_INDEX)); + iowrite32(FIELD_PREP(FWMACTL5_DV, BIT(AGENT_INDEX_GWCA)), + priv->addr + FWMACTL5); + + err =3D rswitch_reg_wait(priv->addr, FWMACTLR, FWMACTLR_L, 0); + if (err < 0) + return err; + + err =3D ioread32(priv->addr + FWMACTLR); + if (err) + return NOTIFY_BAD; + + return NOTIFY_DONE; +} + +static void rswitch_switchdev_bridge_fdb_event_work(struct work_struct *wo= rk) +{ + struct rswitch_switchdev_event_work *switchdev_work; + struct rswitch_device *rdev; + struct net_device *ndev; + + switchdev_work =3D container_of(work, struct rswitch_switchdev_event_work= , work); + ndev =3D switchdev_work->ndev; + + rtnl_lock(); + + /* Unfortunately all net_device members point to br0, there is no simple = way to check + * if the event was triggered by a port device setting. + */ + rswitch_for_all_ports(switchdev_work->priv, rdev) { + if (ether_addr_equal(rdev->ndev->dev_addr, switchdev_work->fdb_info.addr= )) + goto out; + } + + /* Handle only bridge device */ + if (is_rdev(ndev)) + goto out; + + switch (switchdev_work->event) { + case SWITCHDEV_FDB_ADD_TO_DEVICE: + rswitch_gwca_write_mac_address(switchdev_work->priv, switchdev_work->fdb= _info.addr); + rswitch_add_addr_to_mactable(switchdev_work->priv, switchdev_work->fdb_i= nfo.addr); + break; + case SWITCHDEV_FDB_DEL_TO_DEVICE: + rswitch_del_addr_from_mactable(switchdev_work->priv, switchdev_work->fdb= _info.addr); + break; + default: + break; + } + +out: + rtnl_unlock(); + + kfree(switchdev_work->fdb_info.addr); + kfree(switchdev_work); + dev_put(ndev); +} + +/* called under rcu_read_lock() */ +static int rswitch_switchdev_event(struct notifier_block *nb, + unsigned long event, + void *ptr) +{ + struct net_device *ndev =3D switchdev_notifier_info_to_dev(ptr); + struct rswitch_switchdev_event_work *switchdev_work; + struct switchdev_notifier_fdb_info *fdb_info; + struct switchdev_notifier_info *info =3D ptr; + struct rswitch_private *priv; + int err; + + priv =3D container_of(nb, struct rswitch_private, rswitch_switchdev_nb); + + switch (event) { + case SWITCHDEV_FDB_ADD_TO_DEVICE: + fallthrough; + case SWITCHDEV_FDB_DEL_TO_DEVICE: + switchdev_work =3D kzalloc(sizeof(*switchdev_work), GFP_ATOMIC); + + if (!switchdev_work) + return NOTIFY_BAD; + + switchdev_work->ndev =3D info->dev; + switchdev_work->priv =3D priv; + switchdev_work->event =3D event; + + fdb_info =3D container_of(info, + struct switchdev_notifier_fdb_info, + info); + + INIT_WORK(&switchdev_work->work, rswitch_switchdev_bridge_fdb_event_work= ); + + memcpy(&switchdev_work->fdb_info, ptr, sizeof(switchdev_work->fdb_info)); + + switchdev_work->fdb_info.addr =3D kzalloc(ETH_ALEN, GFP_ATOMIC); + if (!switchdev_work->fdb_info.addr) + goto err_addr_alloc; + + ether_addr_copy((u8 *)switchdev_work->fdb_info.addr, + fdb_info->addr); + dev_hold(ndev); + queue_work(system_long_wq, &switchdev_work->work); + + break; + case SWITCHDEV_PORT_ATTR_SET: + err =3D switchdev_handle_port_attr_set(ndev, ptr, + is_rdev, + rswitch_port_attr_set); + return notifier_from_errno(err); + + if (!is_rdev(ndev)) + return NOTIFY_DONE; + + return notifier_from_errno(-EOPNOTSUPP); + } + + return NOTIFY_DONE; + +err_addr_alloc: + kfree(switchdev_work); + + return NOTIFY_BAD; +} + int rswitch_register_notifiers(struct rswitch_private *priv) { int err; --=20 2.43.0 From nobody Mon Apr 6 23:37:14 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1A7BF3A0EA6; Tue, 17 Mar 2026 09:42:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740565; cv=none; b=UTneO27sDO2+lxMsRa7uJtw3Iukw8pRqR3z4sVcMZ61Fct4ITVVAomi2FTgkIHDUCMH+Qw5/Ssp2a3vo360MIjvRO+Ef1zMVBlVydxsZyaub+iCnOX2vrRUxHv4ZK4+ptlRc4cdhrdUsTHkXo4qmMLvpu++zzFMDr9Mjl3P1q7g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773740565; c=relaxed/simple; bh=mMwc4EjOsnojmcJ6Mmi5/SeVEv/rhLgubWkPiMApCjs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MXN85vdWkFZezs6MiQjhIXLfz3cTD7oQ7im0MBpmfLPJgZyTcT3Elw0oDJGWiz2eDtcsEeUldhljO45/z4QdhsaNGSAbUe6xL+7RdnxNAuzEcYU7hdiWQIqRj/8PScXbkaEVS4w+1pMlcQhkwMuDHfMb9GEGVtWCepEtx/hQ+xM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com; spf=pass smtp.mailfrom=renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=renesas.com X-CSE-ConnectionGUID: WDdTDg/8Tra4Zg1R5WVrVQ== X-CSE-MsgGUID: 7xwicoV5T+WLZMqeuKg4FQ== Received: from unknown (HELO relmlir5.idc.renesas.com) ([10.200.68.151]) by relmlie5.idc.renesas.com with ESMTP; 17 Mar 2026 18:42:41 +0900 Received: from [127.0.1.1] (unknown [10.226.78.135]) by relmlir5.idc.renesas.com (Postfix) with ESMTP id 395A54016D6A; Tue, 17 Mar 2026 18:42:38 +0900 (JST) From: Michael Dege Date: Tue, 17 Mar 2026 10:42:06 +0100 Subject: [PATCH net-next 13/13] net: renesas: rswitch: add vlan aware switching Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-rswitch_add_vlans-v1-13-3a57bfa0f2d1@renesas.com> References: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> In-Reply-To: <20260317-rswitch_add_vlans-v1-0-3a57bfa0f2d1@renesas.com> To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773740518; l=15008; i=michael.dege@renesas.com; s=20251023; h=from:subject:message-id; bh=mMwc4EjOsnojmcJ6Mmi5/SeVEv/rhLgubWkPiMApCjs=; b=5hTqCC0cj/2LtJ7KlVD19YUhLqxw2Mc0q3RTmLJ+n2D3AzrNAMC1APha0gb6OkEeyFN8tZ6KK DdgK+OpUQteBjHNaFLPUgJPEu2/UyFXNjBT507wy4kB9Y8YXl1zIZj3 X-Developer-Key: i=michael.dege@renesas.com; a=ed25519; pk=gu1rwIcCrAxNMv2I8fIfiQvt51xzZwnQy4Ua/DscQt8= Add vlan support to L2 HW bridge. On R-Car S4 there is limited vlan support, which is not fully 802.1Q compliant. The aim of this driver addition is to get as close as possible to the correct behavior. Limitations are: - all ports should be in the same default vlan - default vlans are not stripped on egress. Signed-off-by: Michael Dege --- drivers/net/ethernet/renesas/rswitch_l2.c | 406 ++++++++++++++++++++++++++= ---- 1 file changed, 357 insertions(+), 49 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch_l2.c b/drivers/net/ethern= et/renesas/rswitch_l2.c index edfa22676faa..16a519961725 100644 --- a/drivers/net/ethernet/renesas/rswitch_l2.c +++ b/drivers/net/ethernet/renesas/rswitch_l2.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include =20 @@ -177,22 +178,6 @@ static void rswitch_port_update_brdev(struct net_devic= e *ndev, rswitch_update_offload_brdev(rdev->priv); } =20 -static int rswitch_port_update_stp_state(struct net_device *ndev, u8 stp_s= tate) -{ - struct rswitch_device *rdev; - - if (!is_rdev(ndev)) - return -ENODEV; - - rdev =3D netdev_priv(ndev); - rdev->learning_requested =3D (stp_state =3D=3D BR_STATE_LEARNING || - stp_state =3D=3D BR_STATE_FORWARDING); - rdev->forwarding_requested =3D (stp_state =3D=3D BR_STATE_FORWARDING); - rswitch_update_l2_offload(rdev->priv); - - return 0; -} - static int rswitch_netdevice_event(struct notifier_block *nb, unsigned long event, void *ptr) @@ -216,61 +201,395 @@ static int rswitch_netdevice_event(struct notifier_b= lock *nb, return NOTIFY_OK; } =20 -static int rswitch_update_ageing_time(struct net_device *ndev, clock_t tim= e) +static int rswitch_port_update_stp_state(struct net_device *ndev, u8 stp_s= tate) { - struct rswitch_device *rdev =3D netdev_priv(ndev); - u32 reg_val; + struct rswitch_device *rdev; =20 if (!is_rdev(ndev)) return -ENODEV; =20 + rdev =3D netdev_priv(ndev); + rdev->learning_requested =3D (stp_state =3D=3D BR_STATE_LEARNING || + stp_state =3D=3D BR_STATE_FORWARDING); + rdev->forwarding_requested =3D (stp_state =3D=3D BR_STATE_FORWARDING); + rswitch_update_l2_offload(rdev->priv); + + return 0; +} + +static int rswitch_update_ageing_time(struct rswitch_private *priv, clock_= t time) +{ + u32 reg_val; + if (!FIELD_FIT(FWMACAGC_MACAGT, time)) return -EINVAL; =20 reg_val =3D FIELD_PREP(FWMACAGC_MACAGT, time); reg_val |=3D FWMACAGC_MACAGE | FWMACAGC_MACAGSL; - iowrite32(reg_val, rdev->priv->addr + FWMACAGC); + iowrite32(reg_val, priv->addr + FWMACAGC); =20 return 0; } =20 -static int rswitch_port_attr_set(struct net_device *ndev, const void *ctx, - const struct switchdev_attr *attr, - struct netlink_ext_ack *extack) +static void rswitch_update_vlan_filtering(struct rswitch_private *priv, + bool vlan_filtering) +{ + if (vlan_filtering) + rswitch_modify(priv->addr, FWPC0(AGENT_INDEX_GWCA), + 0, FWPC0_VLANSA | FWPC0_VLANRU); + else + rswitch_modify(priv->addr, FWPC0(AGENT_INDEX_GWCA), + FWPC0_VLANSA | FWPC0_VLANRU, 0); +} + +static int rswitch_handle_port_attr_set(struct net_device *ndev, + struct notifier_block *nb, + struct switchdev_notifier_port_attr_info *info) { + const struct switchdev_attr *attr =3D info->attr; + struct rswitch_private *priv; + int err; + + priv =3D container_of(nb, struct rswitch_private, rswitch_switchdev_block= ing_nb); + switch (attr->id) { case SWITCHDEV_ATTR_ID_PORT_STP_STATE: - return rswitch_port_update_stp_state(ndev, attr->u.stp_state); + err =3D rswitch_port_update_stp_state(ndev, attr->u.stp_state); + + break; case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME: - return rswitch_update_ageing_time(ndev, attr->u.ageing_time); + err =3D rswitch_update_ageing_time(priv, attr->u.ageing_time); + + break; + case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING: + rswitch_update_vlan_filtering(priv, attr->u.vlan_filtering); + + break; + case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED: + + break; + default: + return -EOPNOTSUPP; + } + + if (err < 0) + return err; + + info->handled =3D true; + + return NOTIFY_DONE; +} + +static int rswitch_read_vlan_table(struct rswitch_private *priv, u16 vid, + u32 *vlanslvs, u32 *vlandvs) +{ + int err; + + iowrite32(FIELD_PREP(VLANVIDS, vid), priv->addr + FWVLANTS); + err =3D rswitch_reg_wait(priv->addr, FWVLANTSR0, VLANTS, 0); + if (err < 0) + return err; + + /* check if vlans are present in table */ + if (!(ioread32(priv->addr + FWVLANTSR0) & VLANSNF)) { + *vlanslvs =3D (ioread32(priv->addr + FWVLANTSR1) & VLANSLVS); + *vlandvs =3D (ioread32(priv->addr + FWVLANTSR3) & VLANDVS); + } + + return 0; +} + +static int rswitch_write_vlan_table(struct rswitch_private *priv, u16 vid,= u32 index) +{ + u32 vlancsdl =3D priv->gwca.l2_shared_rx_queue->index; + u32 vlanslvs =3D 0, vlandvs =3D 0; + int err; + + err =3D rswitch_read_vlan_table(priv, vid, &vlanslvs, &vlandvs); + if (err < 0) + return err; + + rswitch_modify(priv->addr, FWVLANTL0, VLANED, 0); + iowrite32(FIELD_PREP(VLANVIDL, vid), priv->addr + FWVLANTL1); + + vlanslvs |=3D BIT(index); + vlandvs |=3D BIT(index); + iowrite32(FIELD_PREP(VLANSLVL, vlanslvs), priv->addr + FWVLANTL2); + iowrite32(FIELD_PREP(VLANCSDL, vlancsdl), priv->addr + FWVLANTL3(GWCA_IND= EX)); + iowrite32(FIELD_PREP(VLANDVL, vlandvs), priv->addr + FWVLANTL4); + + return rswitch_reg_wait(priv->addr, FWVLANTLR, VLANTL, 0); +} + +static int rswitch_erase_vlan_table(struct rswitch_private *priv, u16 vid,= u32 index) +{ + u32 vlanslvs =3D 0, vlandvs =3D 0; + int err; + + err =3D rswitch_read_vlan_table(priv, vid, &vlanslvs, &vlandvs); + if (err < 0) + return err; + + vlanslvs &=3D ~BIT(index); + vlandvs &=3D ~BIT(index); + + /* only erase empty vlan table entries */ + if (vlanslvs =3D=3D 0) + rswitch_modify(priv->addr, FWVLANTL0, 0, VLANED); + + iowrite32(FIELD_PREP(VLANVIDL, vid), priv->addr + FWVLANTL1); + iowrite32(FIELD_PREP(VLANSLVL, vlanslvs), priv->addr + FWVLANTL2); + iowrite32(FIELD_PREP(VLANDVL, vlandvs), priv->addr + FWVLANTL4); + + return rswitch_reg_wait(priv->addr, FWVLANTLR, VLANTL, 0); +} + +static int rswitch_port_set_vlan_tag(struct rswitch_etha *etha, + struct switchdev_obj_port_vlan *p_vlan, + bool delete) +{ + u32 err, vem_val; + + err =3D rswitch_etha_change_mode(etha, EAMC_OPC_CONFIG); + if (err < 0) + return err; + + rswitch_modify(etha->addr, EAVCC, VIM, 0); + + if (((ioread32(etha->addr + EAVTC) & CTV) =3D=3D p_vlan->vid) && delete) { + rswitch_modify(etha->addr, EAVTC, CTV, 0); + rswitch_modify(etha->addr, EAVCC, VEM, 0); + } else if (!delete) { + if ((p_vlan->flags & BRIDGE_VLAN_INFO_PVID) && + (p_vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED)) + vem_val =3D FIELD_PREP(VEM, C_TAG_VLAN); + else if (p_vlan->flags & BRIDGE_VLAN_INFO_PVID) + vem_val =3D FIELD_PREP(VEM, HW_C_TAG_VLAN); + else + vem_val =3D 0; + rswitch_modify(etha->addr, EAVCC, VEM, vem_val); + rswitch_modify(etha->addr, EAVTC, CTV, FIELD_PREP(CTV, p_vlan->vid)); + } + + return rswitch_etha_change_mode(etha, EAMC_OPC_OPERATION); +} + +static int rswitch_gwca_set_vlan_tag(struct rswitch_private *priv, + struct switchdev_obj_port_vlan *p_vlan, + bool delete) +{ + u32 err, vem_val; + + err =3D rswitch_gwca_change_mode(priv, GWMC_OPC_CONFIG); + if (err < 0) + return err; + + rswitch_modify(priv->addr, GWVCC, VIM, 0); + + if (((ioread32(priv->addr + GWVTC) & CTV) =3D=3D p_vlan->vid) && delete) { + rswitch_modify(priv->addr, GWVTC, CTV, 0); + rswitch_modify(priv->addr, GWVCC, VEM, 0); + } else if (!delete) { + if ((p_vlan->flags & BRIDGE_VLAN_INFO_PVID) && + (p_vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED)) + vem_val =3D FIELD_PREP(VEM, C_TAG_VLAN); + else if (p_vlan->flags & BRIDGE_VLAN_INFO_PVID) + vem_val =3D FIELD_PREP(VEM, HW_C_TAG_VLAN); + else + vem_val =3D 0; + rswitch_modify(priv->addr, GWVCC, VEM, vem_val); + rswitch_modify(priv->addr, GWVTC, CTV, FIELD_PREP(CTV, p_vlan->vid)); + } + + return rswitch_gwca_change_mode(priv, GWMC_OPC_OPERATION); +} + +static int rswitch_port_obj_do_add(struct net_device *ndev, + struct switchdev_obj_port_vlan *p_vlan) +{ + struct rswitch_device *rdev =3D netdev_priv(ndev); + struct rswitch_private *priv =3D rdev->priv; + struct rswitch_etha *etha =3D rdev->etha; + int err; + + /* Set Rswitch VLAN mode */ + iowrite32(br_vlan_enabled(rdev->brdev) ? FIELD_PREP(FWGC_SVM, C_TAG) : 0, + priv->addr + FWGC); + + err =3D rswitch_write_vlan_table(priv, p_vlan->vid, etha->index); + if (err < 0) + return err; + + /* If the default vlan for this port has been set, don't overwrite it. */ + if (ioread32(etha->addr + EAVCC)) + return NOTIFY_DONE; + + if (br_vlan_enabled(rdev->brdev)) + rswitch_modify(priv->addr, FWPC0(etha->index), 0, FWPC0_VLANSA | FWPC0_V= LANRU); + + rswitch_modify(priv->addr, FWPC2(AGENT_INDEX_GWCA), + FIELD_PREP(FWPC2_LTWFW, BIT(etha->index)), + 0); + + return rswitch_port_set_vlan_tag(etha, p_vlan, false); +} + +static int rswitch_port_obj_do_add_gwca(struct net_device *ndev, + struct rswitch_private *priv, + struct switchdev_obj_port_vlan *p_vlan) +{ + int err; + + if (!(p_vlan->flags & BRIDGE_VLAN_INFO_BRENTRY)) + return NOTIFY_DONE; + + /* Set Rswitch VLAN mode */ + iowrite32(br_vlan_enabled(ndev) ? FIELD_PREP(FWGC_SVM, C_TAG) : 0, priv->= addr + FWGC); + + err =3D rswitch_write_vlan_table(priv, p_vlan->vid, AGENT_INDEX_GWCA); + if (err < 0) + return err; + + /* If the default vlan for this port has been set, don't overwrite it. */ + if (ioread32(priv->addr + GWVCC)) + return NOTIFY_DONE; + + return rswitch_gwca_set_vlan_tag(priv, p_vlan, false); +} + +static int rswitch_port_obj_do_del(struct net_device *ndev, + struct switchdev_obj_port_vlan *p_vlan) +{ + struct rswitch_device *rdev =3D netdev_priv(ndev); + struct rswitch_private *priv =3D rdev->priv; + struct rswitch_etha *etha =3D rdev->etha; + u32 err; + + err =3D rswitch_port_set_vlan_tag(etha, p_vlan, true); + if (err < 0) + return err; + + rswitch_modify(priv->addr, FWPC0(etha->index), FWPC0_VLANSA | FWPC0_VLANR= U, 0); + rswitch_modify(priv->addr, FWPC2(AGENT_INDEX_GWCA), 0, + FIELD_PREP(FWPC2_LTWFW, BIT(etha->index))); + rswitch_modify(priv->addr, FWPC2(rdev->port), + 0, FIELD_PREP(FWPC2_LTWFW, GENMASK(RSWITCH_NUM_AGENTS - 1, 0))); + + return rswitch_erase_vlan_table(priv, p_vlan->vid, etha->index); +} + +static int rswitch_port_obj_do_del_gwca(struct net_device *ndev, + struct rswitch_private *priv, + struct switchdev_obj_port_vlan *p_vlan) +{ + int err; + + err =3D rswitch_gwca_set_vlan_tag(priv, p_vlan, true); + if (err < 0) + return err; + + rswitch_modify(priv->addr, FWPC0(AGENT_INDEX_GWCA), + FWPC0_VLANSA | FWPC0_VLANRU, + 0); + + return rswitch_erase_vlan_table(priv, p_vlan->vid, AGENT_INDEX_GWCA); +} + +static int rswitch_handle_port_obj_add(struct net_device *ndev, + struct notifier_block *nb, + struct switchdev_notifier_port_obj_info *info) +{ + struct switchdev_obj_port_vlan *p_vlan =3D SWITCHDEV_OBJ_PORT_VLAN(info->= obj); + struct rswitch_private *priv; + int err; + + priv =3D container_of(nb, struct rswitch_private, rswitch_switchdev_block= ing_nb); + + if ((p_vlan->flags & BRIDGE_VLAN_INFO_MASTER) || + (p_vlan->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) || + (p_vlan->flags & BRIDGE_VLAN_INFO_RANGE_END) || + (p_vlan->flags & BRIDGE_VLAN_INFO_ONLY_OPTS)) + return NOTIFY_DONE; + + switch (info->obj->id) { + case SWITCHDEV_OBJ_ID_PORT_VLAN: + if (!is_rdev(ndev)) + err =3D rswitch_port_obj_do_add_gwca(ndev, priv, p_vlan); + else + err =3D rswitch_port_obj_do_add(ndev, p_vlan); + + if (err < 0) + return err; + + break; default: return -EOPNOTSUPP; } + + info->handled =3D true; + + return NOTIFY_DONE; +} + +static int rswitch_handle_port_obj_del(struct net_device *ndev, + struct notifier_block *nb, + struct switchdev_notifier_port_obj_info *info) +{ + struct switchdev_obj_port_vlan *p_vlan =3D SWITCHDEV_OBJ_PORT_VLAN(info->= obj); + struct rswitch_private *priv; + int err; + + priv =3D container_of(nb, struct rswitch_private, rswitch_switchdev_block= ing_nb); + + if ((p_vlan->flags & BRIDGE_VLAN_INFO_MASTER) || + (p_vlan->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) || + (p_vlan->flags & BRIDGE_VLAN_INFO_RANGE_END) || + (p_vlan->flags & BRIDGE_VLAN_INFO_ONLY_OPTS)) + return NOTIFY_DONE; + + switch (info->obj->id) { + case SWITCHDEV_OBJ_ID_PORT_VLAN: + if (!is_rdev(ndev)) + err =3D rswitch_port_obj_do_del_gwca(ndev, priv, p_vlan); + else + err =3D rswitch_port_obj_do_del(ndev, p_vlan); + + if (err < 0) + return err; + + break; + default: + return -EOPNOTSUPP; + } + + info->handled =3D true; + + return NOTIFY_DONE; } =20 static int rswitch_switchdev_blocking_event(struct notifier_block *nb, - unsigned long event, void *ptr) + unsigned long event, + void *ptr) { struct net_device *ndev =3D switchdev_notifier_info_to_dev(ptr); - int ret; + int err; =20 switch (event) { case SWITCHDEV_PORT_OBJ_ADD: - return -EOPNOTSUPP; + err =3D rswitch_handle_port_obj_add(ndev, nb, ptr); + + return notifier_from_errno(err); case SWITCHDEV_PORT_OBJ_DEL: - return -EOPNOTSUPP; + err =3D rswitch_handle_port_obj_del(ndev, nb, ptr); + + return notifier_from_errno(err); case SWITCHDEV_PORT_ATTR_SET: - ret =3D switchdev_handle_port_attr_set(ndev, ptr, - is_rdev, - rswitch_port_attr_set); - break; - default: - if (!is_rdev(ndev)) - return NOTIFY_DONE; - ret =3D -EOPNOTSUPP; + err =3D rswitch_handle_port_attr_set(ndev, nb, ptr); + + return notifier_from_errno(err); } =20 - return notifier_from_errno(ret); + return NOTIFY_DONE; } =20 static int rswitch_gwca_write_mac_address(struct rswitch_private *priv, co= nst u8 *mac) @@ -393,7 +712,6 @@ static int rswitch_switchdev_event(struct notifier_bloc= k *nb, struct switchdev_notifier_fdb_info *fdb_info; struct switchdev_notifier_info *info =3D ptr; struct rswitch_private *priv; - int err; =20 priv =3D container_of(nb, struct rswitch_private, rswitch_switchdev_nb); =20 @@ -428,16 +746,6 @@ static int rswitch_switchdev_event(struct notifier_blo= ck *nb, queue_work(system_long_wq, &switchdev_work->work); =20 break; - case SWITCHDEV_PORT_ATTR_SET: - err =3D switchdev_handle_port_attr_set(ndev, ptr, - is_rdev, - rswitch_port_attr_set); - return notifier_from_errno(err); - - if (!is_rdev(ndev)) - return NOTIFY_DONE; - - return notifier_from_errno(-EOPNOTSUPP); } =20 return NOTIFY_DONE; --=20 2.43.0