linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next v3 0/6] net: ravb: Add runtime PM support (part 2)
@ 2024-02-13  9:41 Claudiu
  2024-02-13  9:41 ` [PATCH net-next v3 1/6] net: ravb: Get rid of the temporary variable irq Claudiu
                   ` (5 more replies)
  0 siblings, 6 replies; 16+ messages in thread
From: Claudiu @ 2024-02-13  9:41 UTC (permalink / raw)
  To: s.shtylyov, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, claudiu.beznea, Claudiu Beznea

From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

Hi,

Series adds runtime PM support for the ravb driver. This is a continuation
of [1].

There are 5 more preparation patches (patches 1-5) and patch 6
adds runtime PM support.

Patches in this series were part of [2].

Changes in v3:
- fixed typos
- added patch "net: ravb: Move the update of ndev->features to
  ravb_set_features()"
- changes title of patch "net: ravb: Do not apply RX checksum
  settings to hardware if the interface is down" from v2 into
  "net: ravb: Do not apply features to hardware if the interface
  is down", changed patch description and updated the patch
- collected tags

Changes in v2:
- address review comments
- in patch 4/5 take into account the latest changes introduced
  in ravb_set_features_gbeth()

Changes since [2]:
- patch 1/5 is new
- use pm_runtime_get_noresume() and pm_runtime_active() in patches
  3/5, 4/5
- fixed higlighted typos in patch 4/5

[1] https://lore.kernel.org/all/20240202084136.3426492-1-claudiu.beznea.uj@bp.renesas.com/
[2] https://lore.kernel.org/all/20240105082339.1468817-1-claudiu.beznea.uj@bp.renesas.com/

Claudiu Beznea (6):
  net: ravb: Get rid of the temporary variable irq
  net: ravb: Keep the reverse order of operations in ravb_close()
  net: ravb: Return cached statistics if the interface is down
  net: ravb: Move the update of ndev->features to ravb_set_features()
  net: ravb: Do not apply features to hardware if the interface is down
  net: ravb: Add runtime PM support

 drivers/net/ethernet/renesas/ravb_main.c | 135 ++++++++++++++++++-----
 1 file changed, 105 insertions(+), 30 deletions(-)

-- 
2.39.2


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH net-next v3 1/6] net: ravb: Get rid of the temporary variable irq
  2024-02-13  9:41 [PATCH net-next v3 0/6] net: ravb: Add runtime PM support (part 2) Claudiu
@ 2024-02-13  9:41 ` Claudiu
  2024-02-13  9:41 ` [PATCH net-next v3 2/6] net: ravb: Keep the reverse order of operations in ravb_close() Claudiu
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 16+ messages in thread
From: Claudiu @ 2024-02-13  9:41 UTC (permalink / raw)
  To: s.shtylyov, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, claudiu.beznea, Claudiu Beznea

From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

The 4th argument of ravb_setup_irq() is used to save the IRQ number that
will be further used by the driver code. Not all ravb_setup_irqs() calls
need to save the IRQ number. The previous code used to pass a dummy
variable as the 4th argument in case the IRQ is not needed for further
usage. That is not necessary as the code from ravb_setup_irq() can detect
by itself if the IRQ needs to be saved. Thus, get rid of the code that is
not needed.

Reported-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
---

Changes in v3:
- collected tag

Changes in v2:
- use a temporary variable in ravb_setup_irq()

Changes since [2]:
- this patch in new

[2] https://lore.kernel.org/all/20240105082339.1468817-1-claudiu.beznea.uj@bp.renesas.com/

 drivers/net/ethernet/renesas/ravb_main.c | 29 +++++++++++++-----------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index f9a1e9038dbf..a1bf54de0e4c 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -2747,24 +2747,27 @@ static int ravb_setup_irq(struct ravb_private *priv, const char *irq_name,
 	struct device *dev = &pdev->dev;
 	const char *dev_name;
 	unsigned long flags;
-	int error;
+	int error, irq_num;
 
 	if (irq_name) {
 		dev_name = devm_kasprintf(dev, GFP_KERNEL, "%s:%s", ndev->name, ch);
 		if (!dev_name)
 			return -ENOMEM;
 
-		*irq = platform_get_irq_byname(pdev, irq_name);
+		irq_num = platform_get_irq_byname(pdev, irq_name);
 		flags = 0;
 	} else {
 		dev_name = ndev->name;
-		*irq = platform_get_irq(pdev, 0);
+		irq_num = platform_get_irq(pdev, 0);
 		flags = IRQF_SHARED;
 	}
-	if (*irq < 0)
-		return *irq;
+	if (irq_num < 0)
+		return irq_num;
+
+	if (irq)
+		*irq = irq_num;
 
-	error = devm_request_irq(dev, *irq, handler, flags, dev_name, ndev);
+	error = devm_request_irq(dev, irq_num, handler, flags, dev_name, ndev);
 	if (error)
 		netdev_err(ndev, "cannot request IRQ %s\n", dev_name);
 
@@ -2776,7 +2779,7 @@ static int ravb_setup_irqs(struct ravb_private *priv)
 	const struct ravb_hw_info *info = priv->info;
 	struct net_device *ndev = priv->ndev;
 	const char *irq_name, *emac_irq_name;
-	int error, irq;
+	int error;
 
 	if (!info->multi_irqs)
 		return ravb_setup_irq(priv, NULL, NULL, &ndev->irq, ravb_interrupt);
@@ -2799,28 +2802,28 @@ static int ravb_setup_irqs(struct ravb_private *priv)
 		return error;
 
 	if (info->err_mgmt_irqs) {
-		error = ravb_setup_irq(priv, "err_a", "err_a", &irq, ravb_multi_interrupt);
+		error = ravb_setup_irq(priv, "err_a", "err_a", NULL, ravb_multi_interrupt);
 		if (error)
 			return error;
 
-		error = ravb_setup_irq(priv, "mgmt_a", "mgmt_a", &irq, ravb_multi_interrupt);
+		error = ravb_setup_irq(priv, "mgmt_a", "mgmt_a", NULL, ravb_multi_interrupt);
 		if (error)
 			return error;
 	}
 
-	error = ravb_setup_irq(priv, "ch0", "ch0:rx_be", &irq, ravb_be_interrupt);
+	error = ravb_setup_irq(priv, "ch0", "ch0:rx_be", NULL, ravb_be_interrupt);
 	if (error)
 		return error;
 
-	error = ravb_setup_irq(priv, "ch1", "ch1:rx_nc", &irq, ravb_nc_interrupt);
+	error = ravb_setup_irq(priv, "ch1", "ch1:rx_nc", NULL, ravb_nc_interrupt);
 	if (error)
 		return error;
 
-	error = ravb_setup_irq(priv, "ch18", "ch18:tx_be", &irq, ravb_be_interrupt);
+	error = ravb_setup_irq(priv, "ch18", "ch18:tx_be", NULL, ravb_be_interrupt);
 	if (error)
 		return error;
 
-	return ravb_setup_irq(priv, "ch19", "ch19:tx_nc", &irq, ravb_nc_interrupt);
+	return ravb_setup_irq(priv, "ch19", "ch19:tx_nc", NULL, ravb_nc_interrupt);
 }
 
 static int ravb_probe(struct platform_device *pdev)
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next v3 2/6] net: ravb: Keep the reverse order of operations in ravb_close()
  2024-02-13  9:41 [PATCH net-next v3 0/6] net: ravb: Add runtime PM support (part 2) Claudiu
  2024-02-13  9:41 ` [PATCH net-next v3 1/6] net: ravb: Get rid of the temporary variable irq Claudiu
@ 2024-02-13  9:41 ` Claudiu
  2024-02-13  9:41 ` [PATCH net-next v3 3/6] net: ravb: Return cached statistics if the interface is down Claudiu
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 16+ messages in thread
From: Claudiu @ 2024-02-13  9:41 UTC (permalink / raw)
  To: s.shtylyov, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, claudiu.beznea, Claudiu Beznea

From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

Keep the reverse order of operations in ravb_close() when compared with
ravb_open(). This is the recommended configuration sequence.

Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
---

Changes in v3:
- none

Changes in v2:
- none

Changes since [2]:
- none

Changes in v3 of [2]:
- fixed typos in patch description
- collected tags

Changes in v2 of [2]:
- none; this patch is new

[2] https://lore.kernel.org/all/20240105082339.1468817-1-claudiu.beznea.uj@bp.renesas.com/

 drivers/net/ethernet/renesas/ravb_main.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index a1bf54de0e4c..c81cbd81826e 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -2321,6 +2321,14 @@ static int ravb_close(struct net_device *ndev)
 	ravb_write(ndev, 0, RIC2);
 	ravb_write(ndev, 0, TIC);
 
+	/* PHY disconnect */
+	if (ndev->phydev) {
+		phy_stop(ndev->phydev);
+		phy_disconnect(ndev->phydev);
+		if (of_phy_is_fixed_link(np))
+			of_phy_deregister_fixed_link(np);
+	}
+
 	/* Stop PTP Clock driver */
 	if (info->gptp || info->ccc_gac)
 		ravb_ptp_stop(ndev);
@@ -2339,14 +2347,6 @@ static int ravb_close(struct net_device *ndev)
 		}
 	}
 
-	/* PHY disconnect */
-	if (ndev->phydev) {
-		phy_stop(ndev->phydev);
-		phy_disconnect(ndev->phydev);
-		if (of_phy_is_fixed_link(np))
-			of_phy_deregister_fixed_link(np);
-	}
-
 	cancel_work_sync(&priv->work);
 
 	if (info->nc_queues)
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next v3 3/6] net: ravb: Return cached statistics if the interface is down
  2024-02-13  9:41 [PATCH net-next v3 0/6] net: ravb: Add runtime PM support (part 2) Claudiu
  2024-02-13  9:41 ` [PATCH net-next v3 1/6] net: ravb: Get rid of the temporary variable irq Claudiu
  2024-02-13  9:41 ` [PATCH net-next v3 2/6] net: ravb: Keep the reverse order of operations in ravb_close() Claudiu
@ 2024-02-13  9:41 ` Claudiu
  2024-02-13  9:41 ` [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features() Claudiu
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 16+ messages in thread
From: Claudiu @ 2024-02-13  9:41 UTC (permalink / raw)
  To: s.shtylyov, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, claudiu.beznea, Claudiu Beznea

From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

Return the cached statistics in case the interface is down. There should be
no drawback to this, as cached statistics are updated in ravb_close().

In order to avoid accessing the IP registers while the IP is runtime
suspended pm_runtime_active() check was introduced. The device runtime
PM usage counter has been incremented to avoid disabling the device clocks
while the check is in progress (if any).

The commit prepares the code for the addition of runtime PM support.

Suggested-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
---

Changes in v3:
- none

Changes in v2:
- collected tag

Changes since [2]:
- use pm_runtime_get_noresume() and pm_runtime_active()

Changes in v3 of [2]:
- this was patch 18/21 in v2
- use ndev->flags & IFF_UP instead of netif_running checks

Changes in v2 of [2]:
- none; this patch is new

[2] https://lore.kernel.org/all/20240105082339.1468817-1-claudiu.beznea.uj@bp.renesas.com/

 drivers/net/ethernet/renesas/ravb_main.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index c81cbd81826e..7a7f743a1fef 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -2248,8 +2248,15 @@ static struct net_device_stats *ravb_get_stats(struct net_device *ndev)
 	struct ravb_private *priv = netdev_priv(ndev);
 	const struct ravb_hw_info *info = priv->info;
 	struct net_device_stats *nstats, *stats0, *stats1;
+	struct device *dev = &priv->pdev->dev;
 
 	nstats = &ndev->stats;
+
+	pm_runtime_get_noresume(dev);
+
+	if (!pm_runtime_active(dev))
+		goto out_rpm_put;
+
 	stats0 = &priv->stats[RAVB_BE];
 
 	if (info->tx_counters) {
@@ -2291,6 +2298,8 @@ static struct net_device_stats *ravb_get_stats(struct net_device *ndev)
 		nstats->rx_over_errors += stats1->rx_over_errors;
 	}
 
+out_rpm_put:
+	pm_runtime_put_noidle(dev);
 	return nstats;
 }
 
@@ -2358,6 +2367,9 @@ static int ravb_close(struct net_device *ndev)
 	if (info->nc_queues)
 		ravb_ring_free(ndev, RAVB_NC);
 
+	/* Update statistics. */
+	ravb_get_stats(ndev);
+
 	/* Set reset mode. */
 	return ravb_set_opmode(ndev, CCC_OPC_RESET);
 }
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features()
  2024-02-13  9:41 [PATCH net-next v3 0/6] net: ravb: Add runtime PM support (part 2) Claudiu
                   ` (2 preceding siblings ...)
  2024-02-13  9:41 ` [PATCH net-next v3 3/6] net: ravb: Return cached statistics if the interface is down Claudiu
@ 2024-02-13  9:41 ` Claudiu
  2024-02-13 19:36   ` Sergey Shtylyov
  2024-02-13 19:52   ` Sergey Shtylyov
  2024-02-13  9:41 ` [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down Claudiu
  2024-02-13  9:41 ` [PATCH net-next v3 6/6] net: ravb: Add runtime PM support Claudiu
  5 siblings, 2 replies; 16+ messages in thread
From: Claudiu @ 2024-02-13  9:41 UTC (permalink / raw)
  To: s.shtylyov, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, claudiu.beznea, Claudiu Beznea

From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

Commit c2da9408579d ("ravb: Add Rx checksum offload support for GbEth")
introduced support for setting GbEth features. With this the IP-specific
features update functions update the ndev->features individually.

Next commits add runtime PM support for the ravb driver. The runtime PM
implementation will enable/disable the IP clocks on
the ravb_open()/ravb_close() functions. Accessing the IP registers with
clocks disabled blocks the system.

The ravb_set_features() function could be executed when the Ethernet
interface is closed so we need to ensure we don't access IP registers while
the interface is down when runtime PM support will be in place.

For these, move the update of ndev->features to ravb_set_features() and
make the IP-specific features set function return int. In this way we
update the ndev->features only when the IP-specific features set function
returns success and we can avoid code duplication when introducing
runtime PM registers protection.

Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---

Changes in v3:
- none; this patch is new

 drivers/net/ethernet/renesas/ravb_main.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 7a7f743a1fef..b3b91783bb7a 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -2475,7 +2475,7 @@ static int ravb_change_mtu(struct net_device *ndev, int new_mtu)
 	return 0;
 }
 
-static void ravb_set_rx_csum(struct net_device *ndev, bool enable)
+static int ravb_set_rx_csum(struct net_device *ndev, bool enable)
 {
 	struct ravb_private *priv = netdev_priv(ndev);
 	unsigned long flags;
@@ -2492,6 +2492,8 @@ static void ravb_set_rx_csum(struct net_device *ndev, bool enable)
 	ravb_rcv_snd_enable(ndev);
 
 	spin_unlock_irqrestore(&priv->lock, flags);
+
+	return 0;
 }
 
 static int ravb_endisable_csum_gbeth(struct net_device *ndev, enum ravb_reg reg,
@@ -2542,7 +2544,6 @@ static int ravb_set_features_gbeth(struct net_device *ndev,
 			goto done;
 	}
 
-	ndev->features = features;
 done:
 	spin_unlock_irqrestore(&priv->lock, flags);
 
@@ -2557,8 +2558,6 @@ static int ravb_set_features_rcar(struct net_device *ndev,
 	if (changed & NETIF_F_RXCSUM)
 		ravb_set_rx_csum(ndev, features & NETIF_F_RXCSUM);
 
-	ndev->features = features;
-
 	return 0;
 }
 
@@ -2567,8 +2566,15 @@ static int ravb_set_features(struct net_device *ndev,
 {
 	struct ravb_private *priv = netdev_priv(ndev);
 	const struct ravb_hw_info *info = priv->info;
+	int ret;
 
-	return info->set_feature(ndev, features);
+	ret = info->set_feature(ndev, features);
+	if (ret)
+		return ret;
+
+	ndev->features = features;
+
+	return 0;
 }
 
 static const struct net_device_ops ravb_netdev_ops = {
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down
  2024-02-13  9:41 [PATCH net-next v3 0/6] net: ravb: Add runtime PM support (part 2) Claudiu
                   ` (3 preceding siblings ...)
  2024-02-13  9:41 ` [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features() Claudiu
@ 2024-02-13  9:41 ` Claudiu
  2024-02-13 10:13   ` Biju Das
  2024-02-13 19:48   ` Sergey Shtylyov
  2024-02-13  9:41 ` [PATCH net-next v3 6/6] net: ravb: Add runtime PM support Claudiu
  5 siblings, 2 replies; 16+ messages in thread
From: Claudiu @ 2024-02-13  9:41 UTC (permalink / raw)
  To: s.shtylyov, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, claudiu.beznea, Claudiu Beznea

From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

Do not apply features to hardware if the interface is down. In case runtime
PM is enabled, and while the interface is down, the IP will be in reset
mode (as for some platforms disabling the clocks will switch the IP to
reset mode, which will lead to losing register contents) and applying
settings in reset mode is not an option. Instead, cache the features and
apply them in ravb_open() through ravb_emac_init().

To avoid accessing the hardware while the interface is down
pm_runtime_active() check was introduced. Along with it the device runtime
PM usage counter has been incremented to avoid disabling the device clocks
while the check is in progress (if any).

Commit prepares for the addition of runtime PM.

Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
---

Changes in v3:
- updated patch title and description
- updated patch content due to patch 4/6

Changes in v2:
- fixed typo in patch description
- adjusted ravb_set_features_gbeth(); didn't collect the Sergey's Rb
  tag due to this 

Changes since [2]:
- use pm_runtime_get_noresume() and pm_runtime_active() and updated the
  commit message to describe that
- fixed typos
- s/CSUM/checksum in patch title and description

Changes in v3 of [2]:
- this was patch 20/21 in v2
- fixed typos in patch description
- removed code from ravb_open()
- use ndev->flags & IFF_UP checks instead of netif_running()

Changes in v2 of [2]:
- none; this patch is new


 drivers/net/ethernet/renesas/ravb_main.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index b3b91783bb7a..4dd0520dea90 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -2566,15 +2566,23 @@ static int ravb_set_features(struct net_device *ndev,
 {
 	struct ravb_private *priv = netdev_priv(ndev);
 	const struct ravb_hw_info *info = priv->info;
-	int ret;
+	struct device *dev = &priv->pdev->dev;
+	int ret = 0;
+
+	pm_runtime_get_noresume(dev);
+
+	if (!pm_runtime_active(dev))
+		goto out_set_features;
 
 	ret = info->set_feature(ndev, features);
 	if (ret)
-		return ret;
+		goto out_rpm_put;
 
+out_set_features:
 	ndev->features = features;
-
-	return 0;
+out_rpm_put:
+	pm_runtime_put_noidle(dev);
+	return ret;
 }
 
 static const struct net_device_ops ravb_netdev_ops = {
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH net-next v3 6/6] net: ravb: Add runtime PM support
  2024-02-13  9:41 [PATCH net-next v3 0/6] net: ravb: Add runtime PM support (part 2) Claudiu
                   ` (4 preceding siblings ...)
  2024-02-13  9:41 ` [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down Claudiu
@ 2024-02-13  9:41 ` Claudiu
  5 siblings, 0 replies; 16+ messages in thread
From: Claudiu @ 2024-02-13  9:41 UTC (permalink / raw)
  To: s.shtylyov, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, claudiu.beznea, Claudiu Beznea

From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

Add runtime PM support for the ravb driver. As the driver is used by
different IP variants, with different behaviors, to be able to have the
runtime PM support available for all devices, the preparatory commits
moved all the resources parsing and allocations in the driver's probe
function and kept the settings for ravb_open(). This is due to the fact
that on some IP variants-platforms tuples disabling/enabling the clocks
will switch the IP to the reset operation mode where register contents is
lost and reconfiguration needs to be done. For this the rabv_open()
function enables the clocks, switches the IP to configuration mode, applies
all the register settings and switches the IP to the operational mode. At
the end of ravb_open() IP is ready to send/receive data.

In ravb_close() necessary reverts are done (compared with ravb_open()), the
IP is switched to reset mode and clocks are disabled.

The ethtool APIs or IOCTLs that might execute while the interface is down
are either cached (and applied in ravb_open()) or rejected (as at that time
the IP is in reset mode). Keeping the IP in the reset mode also increases
the power saved (according to the hardware manual).

Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
---

Changes in v3:
- fixed typo in patch description

Changes in v2:
- none

Changes since [2]:
- none
- didn't returned directly the ret code of pm_runtime_put_autosuspend()
  as, in theory, it might return 1 in case device is suspended through
  this calltrace:
  pm_runtime_put_autosuspend() ->
    __pm_runtime_suspend() ->
      rpm_suspend() ->
        rpm_check_suspend_allowed()

Changes in v3 of [2]:
- this was patch 21/21 in v2
- collected tags
- fixed typos in patch description

Changes in v2 of [2]:
- keep RPM support for all platforms

[2] https://lore.kernel.org/all/20240105082339.1468817-1-claudiu.beznea.uj@bp.renesas.com/

 drivers/net/ethernet/renesas/ravb_main.c | 54 ++++++++++++++++++++++--
 1 file changed, 50 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 4dd0520dea90..1d3de2e3f917 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -1939,16 +1939,21 @@ static int ravb_open(struct net_device *ndev)
 {
 	struct ravb_private *priv = netdev_priv(ndev);
 	const struct ravb_hw_info *info = priv->info;
+	struct device *dev = &priv->pdev->dev;
 	int error;
 
 	napi_enable(&priv->napi[RAVB_BE]);
 	if (info->nc_queues)
 		napi_enable(&priv->napi[RAVB_NC]);
 
+	error = pm_runtime_resume_and_get(dev);
+	if (error < 0)
+		goto out_napi_off;
+
 	/* Set AVB config mode */
 	error = ravb_set_config_mode(ndev);
 	if (error)
-		goto out_napi_off;
+		goto out_rpm_put;
 
 	ravb_set_delay_mode(ndev);
 	ravb_write(ndev, priv->desc_bat_dma, DBAT);
@@ -1982,6 +1987,9 @@ static int ravb_open(struct net_device *ndev)
 	ravb_stop_dma(ndev);
 out_set_reset:
 	ravb_set_opmode(ndev, CCC_OPC_RESET);
+out_rpm_put:
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
 out_napi_off:
 	if (info->nc_queues)
 		napi_disable(&priv->napi[RAVB_NC]);
@@ -2322,6 +2330,8 @@ static int ravb_close(struct net_device *ndev)
 	struct ravb_private *priv = netdev_priv(ndev);
 	const struct ravb_hw_info *info = priv->info;
 	struct ravb_tstamp_skb *ts_skb, *ts_skb2;
+	struct device *dev = &priv->pdev->dev;
+	int error;
 
 	netif_tx_stop_all_queues(ndev);
 
@@ -2371,7 +2381,14 @@ static int ravb_close(struct net_device *ndev)
 	ravb_get_stats(ndev);
 
 	/* Set reset mode. */
-	return ravb_set_opmode(ndev, CCC_OPC_RESET);
+	error = ravb_set_opmode(ndev, CCC_OPC_RESET);
+	if (error)
+		return error;
+
+	pm_runtime_mark_last_busy(dev);
+	pm_runtime_put_autosuspend(dev);
+
+	return 0;
 }
 
 static int ravb_hwtstamp_get(struct net_device *ndev, struct ifreq *req)
@@ -2927,6 +2944,8 @@ static int ravb_probe(struct platform_device *pdev)
 	clk_prepare(priv->refclk);
 
 	platform_set_drvdata(pdev, ndev);
+	pm_runtime_set_autosuspend_delay(&pdev->dev, 100);
+	pm_runtime_use_autosuspend(&pdev->dev);
 	pm_runtime_enable(&pdev->dev);
 	error = pm_runtime_resume_and_get(&pdev->dev);
 	if (error < 0)
@@ -3032,6 +3051,9 @@ static int ravb_probe(struct platform_device *pdev)
 	netdev_info(ndev, "Base address at %#x, %pM, IRQ %d.\n",
 		    (u32)ndev->base_addr, ndev->dev_addr, ndev->irq);
 
+	pm_runtime_mark_last_busy(&pdev->dev);
+	pm_runtime_put_autosuspend(&pdev->dev);
+
 	return 0;
 
 out_napi_del:
@@ -3049,6 +3071,7 @@ static int ravb_probe(struct platform_device *pdev)
 	pm_runtime_put(&pdev->dev);
 out_rpm_disable:
 	pm_runtime_disable(&pdev->dev);
+	pm_runtime_dont_use_autosuspend(&pdev->dev);
 	clk_unprepare(priv->refclk);
 out_reset_assert:
 	reset_control_assert(rstc);
@@ -3062,6 +3085,12 @@ static void ravb_remove(struct platform_device *pdev)
 	struct net_device *ndev = platform_get_drvdata(pdev);
 	struct ravb_private *priv = netdev_priv(ndev);
 	const struct ravb_hw_info *info = priv->info;
+	struct device *dev = &priv->pdev->dev;
+	int error;
+
+	error = pm_runtime_resume_and_get(dev);
+	if (error < 0)
+		return;
 
 	unregister_netdev(ndev);
 	if (info->nc_queues)
@@ -3073,8 +3102,9 @@ static void ravb_remove(struct platform_device *pdev)
 	dma_free_coherent(ndev->dev.parent, priv->desc_bat_size, priv->desc_bat,
 			  priv->desc_bat_dma);
 
-	pm_runtime_put_sync(&pdev->dev);
+	pm_runtime_put_sync_suspend(&pdev->dev);
 	pm_runtime_disable(&pdev->dev);
+	pm_runtime_dont_use_autosuspend(dev);
 	clk_unprepare(priv->refclk);
 	reset_control_assert(priv->rstc);
 	free_netdev(ndev);
@@ -3156,6 +3186,10 @@ static int ravb_suspend(struct device *dev)
 	if (ret)
 		return ret;
 
+	ret = pm_runtime_force_suspend(&priv->pdev->dev);
+	if (ret)
+		return ret;
+
 reset_assert:
 	return reset_control_assert(priv->rstc);
 }
@@ -3178,16 +3212,28 @@ static int ravb_resume(struct device *dev)
 		ret = ravb_wol_restore(ndev);
 		if (ret)
 			return ret;
+	} else {
+		ret = pm_runtime_force_resume(dev);
+		if (ret)
+			return ret;
 	}
 
 	/* Reopening the interface will restore the device to the working state. */
 	ret = ravb_open(ndev);
 	if (ret < 0)
-		return ret;
+		goto out_rpm_put;
 
 	ravb_set_rx_mode(ndev);
 	netif_device_attach(ndev);
 
+	return 0;
+
+out_rpm_put:
+	if (!priv->wol_enabled) {
+		pm_runtime_mark_last_busy(dev);
+		pm_runtime_put_autosuspend(dev);
+	}
+
 	return ret;
 }
 
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* RE: [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down
  2024-02-13  9:41 ` [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down Claudiu
@ 2024-02-13 10:13   ` Biju Das
  2024-02-13 11:07     ` claudiu beznea
  2024-02-13 19:48   ` Sergey Shtylyov
  1 sibling, 1 reply; 16+ messages in thread
From: Biju Das @ 2024-02-13 10:13 UTC (permalink / raw)
  To: Claudiu.Beznea, s.shtylyov, davem, edumazet, kuba, pabeni
  Cc: netdev, linux-renesas-soc, linux-kernel, Claudiu.Beznea, Claudiu Beznea


Hi Claudiu,

> -----Original Message-----
> From: Claudiu <claudiu.beznea@tuxon.dev>
> Sent: Tuesday, February 13, 2024 9:41 AM
> Subject: [PATCH net-next v3 5/6] net: ravb: Do not apply features to
> hardware if the interface is down
> 
> From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> 
> Do not apply features to hardware if the interface is down. In case
> runtime PM is enabled, and while the interface is down, the IP will be in
> reset mode (as for some platforms disabling the clocks will switch the IP
> to reset mode, which will lead to losing register contents) and applying
> settings in reset mode is not an option. Instead, cache the features and
> apply them in ravb_open() through ravb_emac_init().
> 
> To avoid accessing the hardware while the interface is down
> pm_runtime_active() check was introduced. Along with it the device runtime
> PM usage counter has been incremented to avoid disabling the device clocks
> while the check is in progress (if any).
> 
> Commit prepares for the addition of runtime PM.
> 
> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> ---
> 
> Changes in v3:
> - updated patch title and description
> - updated patch content due to patch 4/6
> 
> Changes in v2:
> - fixed typo in patch description
> - adjusted ravb_set_features_gbeth(); didn't collect the Sergey's Rb
>   tag due to this
> 
> Changes since [2]:
> - use pm_runtime_get_noresume() and pm_runtime_active() and updated the
>   commit message to describe that
> - fixed typos
> - s/CSUM/checksum in patch title and description
> 
> Changes in v3 of [2]:
> - this was patch 20/21 in v2
> - fixed typos in patch description
> - removed code from ravb_open()
> - use ndev->flags & IFF_UP checks instead of netif_running()
> 
> Changes in v2 of [2]:
> - none; this patch is new
> 
> 
>  drivers/net/ethernet/renesas/ravb_main.c | 16 ++++++++++++----
>  1 file changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/ethernet/renesas/ravb_main.c
> b/drivers/net/ethernet/renesas/ravb_main.c
> index b3b91783bb7a..4dd0520dea90 100644
> --- a/drivers/net/ethernet/renesas/ravb_main.c
> +++ b/drivers/net/ethernet/renesas/ravb_main.c
> @@ -2566,15 +2566,23 @@ static int ravb_set_features(struct net_device
> *ndev,  {
>  	struct ravb_private *priv = netdev_priv(ndev);
>  	const struct ravb_hw_info *info = priv->info;
> -	int ret;
> +	struct device *dev = &priv->pdev->dev;
> +	int ret = 0;
> +
> +	pm_runtime_get_noresume(dev);
> +
> +	if (!pm_runtime_active(dev))
> +		goto out_set_features;

This can be simplified, which avoids 1 goto statement and
Unnecessary ret initialization. I am leaving to you and Sergey.

	if (!pm_runtime_active(dev))
		ret = 0;
	else
		ret = info->set_feature(ndev, features);

	pm_runtime_put_noidle(dev);
	if (ret)
		goto err;

	ndev->features = features;

err:
	return ret;

Cheers,
Biju

> 
>  	ret = info->set_feature(ndev, features);
>  	if (ret)
> -		return ret;
> +		goto out_rpm_put;
> 
> +out_set_features:
>  	ndev->features = features;
> -
> -	return 0;
> +out_rpm_put:
> +	pm_runtime_put_noidle(dev);
> +	return ret;
>  }
> 
>  static const struct net_device_ops ravb_netdev_ops = {
> --
> 2.39.2


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down
  2024-02-13 10:13   ` Biju Das
@ 2024-02-13 11:07     ` claudiu beznea
  2024-02-13 11:39       ` Biju Das
  2024-02-13 18:55       ` claudiu beznea
  0 siblings, 2 replies; 16+ messages in thread
From: claudiu beznea @ 2024-02-13 11:07 UTC (permalink / raw)
  To: Biju Das, s.shtylyov, davem, edumazet, kuba, pabeni
  Cc: netdev, linux-renesas-soc, linux-kernel, Claudiu Beznea

Hi, Biju,

On 13.02.2024 12:13, Biju Das wrote:
> 
> Hi Claudiu,
> 
>> -----Original Message-----
>> From: Claudiu <claudiu.beznea@tuxon.dev>
>> Sent: Tuesday, February 13, 2024 9:41 AM
>> Subject: [PATCH net-next v3 5/6] net: ravb: Do not apply features to
>> hardware if the interface is down
>>
>> From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
>>
>> Do not apply features to hardware if the interface is down. In case
>> runtime PM is enabled, and while the interface is down, the IP will be in
>> reset mode (as for some platforms disabling the clocks will switch the IP
>> to reset mode, which will lead to losing register contents) and applying
>> settings in reset mode is not an option. Instead, cache the features and
>> apply them in ravb_open() through ravb_emac_init().
>>
>> To avoid accessing the hardware while the interface is down
>> pm_runtime_active() check was introduced. Along with it the device runtime
>> PM usage counter has been incremented to avoid disabling the device clocks
>> while the check is in progress (if any).
>>
>> Commit prepares for the addition of runtime PM.
>>
>> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
>> ---
>>
>> Changes in v3:
>> - updated patch title and description
>> - updated patch content due to patch 4/6
>>
>> Changes in v2:
>> - fixed typo in patch description
>> - adjusted ravb_set_features_gbeth(); didn't collect the Sergey's Rb
>>   tag due to this
>>
>> Changes since [2]:
>> - use pm_runtime_get_noresume() and pm_runtime_active() and updated the
>>   commit message to describe that
>> - fixed typos
>> - s/CSUM/checksum in patch title and description
>>
>> Changes in v3 of [2]:
>> - this was patch 20/21 in v2
>> - fixed typos in patch description
>> - removed code from ravb_open()
>> - use ndev->flags & IFF_UP checks instead of netif_running()
>>
>> Changes in v2 of [2]:
>> - none; this patch is new
>>
>>
>>  drivers/net/ethernet/renesas/ravb_main.c | 16 ++++++++++++----
>>  1 file changed, 12 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/renesas/ravb_main.c
>> b/drivers/net/ethernet/renesas/ravb_main.c
>> index b3b91783bb7a..4dd0520dea90 100644
>> --- a/drivers/net/ethernet/renesas/ravb_main.c
>> +++ b/drivers/net/ethernet/renesas/ravb_main.c
>> @@ -2566,15 +2566,23 @@ static int ravb_set_features(struct net_device
>> *ndev,  {
>>  	struct ravb_private *priv = netdev_priv(ndev);
>>  	const struct ravb_hw_info *info = priv->info;
>> -	int ret;
>> +	struct device *dev = &priv->pdev->dev;
>> +	int ret = 0;
>> +
>> +	pm_runtime_get_noresume(dev);
>> +
>> +	if (!pm_runtime_active(dev))
>> +		goto out_set_features;
> 
> This can be simplified, which avoids 1 goto statement and
> Unnecessary ret initialization. I am leaving to you and Sergey.
> 
> 	if (!pm_runtime_active(dev))
> 		ret = 0;
> 	else
> 		ret = info->set_feature(ndev, features);
> 
> 	pm_runtime_put_noidle(dev);
> 	if (ret)
> 		goto err;
> 
> 	ndev->features = features;
> 
> err:
> 	return ret;
> 

I find it a bit difficult to follow this way.

Thank you,
Claudiu Beznea

> Cheers,
> Biju
> 
>>
>>  	ret = info->set_feature(ndev, features);
>>  	if (ret)
>> -		return ret;
>> +		goto out_rpm_put;
>>
>> +out_set_features:
>>  	ndev->features = features;
>> -
>> -	return 0;
>> +out_rpm_put:
>> +	pm_runtime_put_noidle(dev);
>> +	return ret;
>>  }
>>
>>  static const struct net_device_ops ravb_netdev_ops = {
>> --
>> 2.39.2
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down
  2024-02-13 11:07     ` claudiu beznea
@ 2024-02-13 11:39       ` Biju Das
  2024-02-13 18:55       ` claudiu beznea
  1 sibling, 0 replies; 16+ messages in thread
From: Biju Das @ 2024-02-13 11:39 UTC (permalink / raw)
  To: Claudiu.Beznea, s.shtylyov, davem, edumazet, kuba, pabeni
  Cc: netdev, linux-renesas-soc, linux-kernel, Claudiu Beznea

Hi Claudiu,

> -----Original Message-----
> From: claudiu beznea <claudiu.beznea@tuxon.dev>
> Sent: Tuesday, February 13, 2024 11:07 AM
> Subject: Re: [PATCH net-next v3 5/6] net: ravb: Do not apply features to
> hardware if the interface is down
> 
> Hi, Biju,
> 
> On 13.02.2024 12:13, Biju Das wrote:
> >
> > Hi Claudiu,
> >
> >> -----Original Message-----
> >> From: Claudiu <claudiu.beznea@tuxon.dev>
> >> Sent: Tuesday, February 13, 2024 9:41 AM
> >> Subject: [PATCH net-next v3 5/6] net: ravb: Do not apply features to
> >> hardware if the interface is down
> >>
> >> From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> >>
> >> Do not apply features to hardware if the interface is down. In case
> >> runtime PM is enabled, and while the interface is down, the IP will
> >> be in reset mode (as for some platforms disabling the clocks will
> >> switch the IP to reset mode, which will lead to losing register
> >> contents) and applying settings in reset mode is not an option.
> >> Instead, cache the features and apply them in ravb_open() through
> ravb_emac_init().
> >>
> >> To avoid accessing the hardware while the interface is down
> >> pm_runtime_active() check was introduced. Along with it the device
> >> runtime PM usage counter has been incremented to avoid disabling the
> >> device clocks while the check is in progress (if any).
> >>
> >> Commit prepares for the addition of runtime PM.
> >>
> >> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> >> ---
> >>
> >> Changes in v3:
> >> - updated patch title and description
> >> - updated patch content due to patch 4/6
> >>
> >> Changes in v2:
> >> - fixed typo in patch description
> >> - adjusted ravb_set_features_gbeth(); didn't collect the Sergey's Rb
> >>   tag due to this
> >>
> >> Changes since [2]:
> >> - use pm_runtime_get_noresume() and pm_runtime_active() and updated the
> >>   commit message to describe that
> >> - fixed typos
> >> - s/CSUM/checksum in patch title and description
> >>
> >> Changes in v3 of [2]:
> >> - this was patch 20/21 in v2
> >> - fixed typos in patch description
> >> - removed code from ravb_open()
> >> - use ndev->flags & IFF_UP checks instead of netif_running()
> >>
> >> Changes in v2 of [2]:
> >> - none; this patch is new
> >>
> >>
> >>  drivers/net/ethernet/renesas/ravb_main.c | 16 ++++++++++++----
> >>  1 file changed, 12 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/drivers/net/ethernet/renesas/ravb_main.c
> >> b/drivers/net/ethernet/renesas/ravb_main.c
> >> index b3b91783bb7a..4dd0520dea90 100644
> >> --- a/drivers/net/ethernet/renesas/ravb_main.c
> >> +++ b/drivers/net/ethernet/renesas/ravb_main.c
> >> @@ -2566,15 +2566,23 @@ static int ravb_set_features(struct
> >> net_device *ndev,  {
> >>  	struct ravb_private *priv = netdev_priv(ndev);
> >>  	const struct ravb_hw_info *info = priv->info;
> >> -	int ret;
> >> +	struct device *dev = &priv->pdev->dev;
> >> +	int ret = 0;
> >> +
> >> +	pm_runtime_get_noresume(dev);
> >> +
> >> +	if (!pm_runtime_active(dev))
> >> +		goto out_set_features;
> >
> > This can be simplified, which avoids 1 goto statement and Unnecessary
> > ret initialization. I am leaving to you and Sergey.
> >
> > 	if (!pm_runtime_active(dev))
> > 		ret = 0;
> > 	else
> > 		ret = info->set_feature(ndev, features);
> >
> > 	pm_runtime_put_noidle(dev);
> > 	if (ret)
> > 		goto err;
> >
> > 	ndev->features = features;
> >
> > err:
> > 	return ret;
> >
> 
> I find it a bit difficult to follow this way.

I find this patch complicated by doing unnecessary intiailzation
And goto statements for non-err cases.. 

Maybe others can suggest how to do it in a better way. 

Cheers,
Biju
> 
> Thank you,
> Claudiu Beznea
> 
> > Cheers,
> > Biju
> >
> >>
> >>  	ret = info->set_feature(ndev, features);
> >>  	if (ret)
> >> -		return ret;
> >> +		goto out_rpm_put;
> >>
> >> +out_set_features:
> >>  	ndev->features = features;
> >> -
> >> -	return 0;
> >> +out_rpm_put:
> >> +	pm_runtime_put_noidle(dev);
> >> +	return ret;
> >>  }
> >>
> >>  static const struct net_device_ops ravb_netdev_ops = {
> >> --
> >> 2.39.2
> >

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down
  2024-02-13 11:07     ` claudiu beznea
  2024-02-13 11:39       ` Biju Das
@ 2024-02-13 18:55       ` claudiu beznea
  1 sibling, 0 replies; 16+ messages in thread
From: claudiu beznea @ 2024-02-13 18:55 UTC (permalink / raw)
  To: Biju Das, s.shtylyov, davem, edumazet, kuba, pabeni
  Cc: netdev, linux-renesas-soc, linux-kernel, Claudiu Beznea



On 13.02.2024 13:07, claudiu beznea wrote:
>>> @@ -2566,15 +2566,23 @@ static int ravb_set_features(struct net_device
>>> *ndev,  {
>>>  	struct ravb_private *priv = netdev_priv(ndev);
>>>  	const struct ravb_hw_info *info = priv->info;
>>> -	int ret;
>>> +	struct device *dev = &priv->pdev->dev;
>>> +	int ret = 0;
>>> +
>>> +	pm_runtime_get_noresume(dev);
>>> +
>>> +	if (!pm_runtime_active(dev))
>>> +		goto out_set_features;
>> This can be simplified, which avoids 1 goto statement and
>> Unnecessary ret initialization. I am leaving to you and Sergey.
>>
>> 	if (!pm_runtime_active(dev))
>> 		ret = 0;
>> 	else
>> 		ret = info->set_feature(ndev, features);
>>
>> 	pm_runtime_put_noidle(dev);
>> 	if (ret)
>> 		goto err;
>>
>> 	ndev->features = features;
>>
>> err:
>> 	return ret;
>>
> I find it a bit difficult to follow this way.

Looking again at it, your version seems better.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features()
  2024-02-13  9:41 ` [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features() Claudiu
@ 2024-02-13 19:36   ` Sergey Shtylyov
  2024-02-13 19:58     ` Sergey Shtylyov
  2024-02-13 19:52   ` Sergey Shtylyov
  1 sibling, 1 reply; 16+ messages in thread
From: Sergey Shtylyov @ 2024-02-13 19:36 UTC (permalink / raw)
  To: Claudiu, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, Claudiu Beznea

On 2/13/24 12:41 PM, Claudiu wrote:

> From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> 
> Commit c2da9408579d ("ravb: Add Rx checksum offload support for GbEth")
> introduced support for setting GbEth features. With this the IP-specific
> features update functions update the ndev->features individually.
> 
> Next commits add runtime PM support for the ravb driver. The runtime PM
> implementation will enable/disable the IP clocks on
> the ravb_open()/ravb_close() functions. Accessing the IP registers with
> clocks disabled blocks the system.
> 
> The ravb_set_features() function could be executed when the Ethernet
> interface is closed so we need to ensure we don't access IP registers while
> the interface is down when runtime PM support will be in place.
> 
> For these, move the update of ndev->features to ravb_set_features() and
> make the IP-specific features set function return int. In this way we
> update the ndev->features only when the IP-specific features set function
> returns success and we can avoid code duplication when introducing
> runtime PM registers protection.
> 
> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>

[...]

MBR, Sergey

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down
  2024-02-13  9:41 ` [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down Claudiu
  2024-02-13 10:13   ` Biju Das
@ 2024-02-13 19:48   ` Sergey Shtylyov
  1 sibling, 0 replies; 16+ messages in thread
From: Sergey Shtylyov @ 2024-02-13 19:48 UTC (permalink / raw)
  To: Claudiu, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, Claudiu Beznea

On 2/13/24 12:41 PM, Claudiu wrote:

> From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> 
> Do not apply features to hardware if the interface is down. In case runtime
> PM is enabled, and while the interface is down, the IP will be in reset
> mode (as for some platforms disabling the clocks will switch the IP to
> reset mode, which will lead to losing register contents) and applying
> settings in reset mode is not an option. Instead, cache the features and
> apply them in ravb_open() through ravb_emac_init().
> 
> To avoid accessing the hardware while the interface is down
> pm_runtime_active() check was introduced. Along with it the device runtime
> PM usage counter has been incremented to avoid disabling the device clocks
> while the check is in progress (if any).
> 
> Commit prepares for the addition of runtime PM.
> 
> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>

Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>

[...]

MBR, Sergey

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features()
  2024-02-13  9:41 ` [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features() Claudiu
  2024-02-13 19:36   ` Sergey Shtylyov
@ 2024-02-13 19:52   ` Sergey Shtylyov
  2024-02-14  5:45     ` claudiu beznea
  1 sibling, 1 reply; 16+ messages in thread
From: Sergey Shtylyov @ 2024-02-13 19:52 UTC (permalink / raw)
  To: Claudiu, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, Claudiu Beznea

On 2/13/24 12:41 PM, Claudiu wrote:

> From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> 
> Commit c2da9408579d ("ravb: Add Rx checksum offload support for GbEth")
> introduced support for setting GbEth features. With this the IP-specific
> features update functions update the ndev->features individually.
> 
> Next commits add runtime PM support for the ravb driver. The runtime PM
> implementation will enable/disable the IP clocks on
> the ravb_open()/ravb_close() functions. Accessing the IP registers with
> clocks disabled blocks the system.
> 
> The ravb_set_features() function could be executed when the Ethernet
> interface is closed so we need to ensure we don't access IP registers while
> the interface is down when runtime PM support will be in place.
> 
> For these, move the update of ndev->features to ravb_set_features() and
> make the IP-specific features set function return int. In this way we
> update the ndev->features only when the IP-specific features set function
> returns success and we can avoid code duplication when introducing
> runtime PM registers protection.
> 
> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
[...]

> diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
> index 7a7f743a1fef..b3b91783bb7a 100644
> --- a/drivers/net/ethernet/renesas/ravb_main.c
> +++ b/drivers/net/ethernet/renesas/ravb_main.c
> @@ -2475,7 +2475,7 @@ static int ravb_change_mtu(struct net_device *ndev, int new_mtu)
>  	return 0;
>  }
>  
> -static void ravb_set_rx_csum(struct net_device *ndev, bool enable)
> +static int ravb_set_rx_csum(struct net_device *ndev, bool enable)
>  {
>  	struct ravb_private *priv = netdev_priv(ndev);
>  	unsigned long flags;
> @@ -2492,6 +2492,8 @@ static void ravb_set_rx_csum(struct net_device *ndev, bool enable)
>  	ravb_rcv_snd_enable(ndev);
>  
>  	spin_unlock_irqrestore(&priv->lock, flags);
> +
> +	return 0;
>  }
>  
>  static int ravb_endisable_csum_gbeth(struct net_device *ndev, enum ravb_reg reg,

   Wait! You're not updating the call site of ravb_set_rx_csum(), are you?
It looks like the above 2 hunks aren't needed...

[...]

MBR, Sergey

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features()
  2024-02-13 19:36   ` Sergey Shtylyov
@ 2024-02-13 19:58     ` Sergey Shtylyov
  0 siblings, 0 replies; 16+ messages in thread
From: Sergey Shtylyov @ 2024-02-13 19:58 UTC (permalink / raw)
  To: Claudiu, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, Claudiu Beznea

On 2/13/24 10:36 PM, Sergey Shtylyov wrote:
[...]

>> From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
>>
>> Commit c2da9408579d ("ravb: Add Rx checksum offload support for GbEth")
>> introduced support for setting GbEth features. With this the IP-specific
>> features update functions update the ndev->features individually.
>>
>> Next commits add runtime PM support for the ravb driver. The runtime PM
>> implementation will enable/disable the IP clocks on
>> the ravb_open()/ravb_close() functions. Accessing the IP registers with
>> clocks disabled blocks the system.
>>
>> The ravb_set_features() function could be executed when the Ethernet
>> interface is closed so we need to ensure we don't access IP registers while
>> the interface is down when runtime PM support will be in place.
>>
>> For these, move the update of ndev->features to ravb_set_features() and
>> make the IP-specific features set function return int. In this way we
>> update the ndev->features only when the IP-specific features set function
>> returns success and we can avoid code duplication when introducing
>> runtime PM registers protection.
>>
>> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> 
> Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>

   Have to withdraw this... :-/

[...]

MBR, Sergey

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features()
  2024-02-13 19:52   ` Sergey Shtylyov
@ 2024-02-14  5:45     ` claudiu beznea
  0 siblings, 0 replies; 16+ messages in thread
From: claudiu beznea @ 2024-02-14  5:45 UTC (permalink / raw)
  To: Sergey Shtylyov, davem, edumazet, kuba, pabeni, biju.das.jz
  Cc: netdev, linux-renesas-soc, linux-kernel, Claudiu Beznea



On 13.02.2024 21:52, Sergey Shtylyov wrote:
> On 2/13/24 12:41 PM, Claudiu wrote:
> 
>> From: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
>>
>> Commit c2da9408579d ("ravb: Add Rx checksum offload support for GbEth")
>> introduced support for setting GbEth features. With this the IP-specific
>> features update functions update the ndev->features individually.
>>
>> Next commits add runtime PM support for the ravb driver. The runtime PM
>> implementation will enable/disable the IP clocks on
>> the ravb_open()/ravb_close() functions. Accessing the IP registers with
>> clocks disabled blocks the system.
>>
>> The ravb_set_features() function could be executed when the Ethernet
>> interface is closed so we need to ensure we don't access IP registers while
>> the interface is down when runtime PM support will be in place.
>>
>> For these, move the update of ndev->features to ravb_set_features() and
>> make the IP-specific features set function return int. In this way we
>> update the ndev->features only when the IP-specific features set function
>> returns success and we can avoid code duplication when introducing
>> runtime PM registers protection.
>>
>> Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> [...]
> 
>> diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
>> index 7a7f743a1fef..b3b91783bb7a 100644
>> --- a/drivers/net/ethernet/renesas/ravb_main.c
>> +++ b/drivers/net/ethernet/renesas/ravb_main.c
>> @@ -2475,7 +2475,7 @@ static int ravb_change_mtu(struct net_device *ndev, int new_mtu)
>>  	return 0;
>>  }
>>  
>> -static void ravb_set_rx_csum(struct net_device *ndev, bool enable)
>> +static int ravb_set_rx_csum(struct net_device *ndev, bool enable)
>>  {
>>  	struct ravb_private *priv = netdev_priv(ndev);
>>  	unsigned long flags;
>> @@ -2492,6 +2492,8 @@ static void ravb_set_rx_csum(struct net_device *ndev, bool enable)
>>  	ravb_rcv_snd_enable(ndev);
>>  
>>  	spin_unlock_irqrestore(&priv->lock, flags);
>> +
>> +	return 0;
>>  }
>>  
>>  static int ravb_endisable_csum_gbeth(struct net_device *ndev, enum ravb_reg reg,
> 
>    Wait! You're not updating the call site of ravb_set_rx_csum(), are you?
> It looks like the above 2 hunks aren't needed...

A, you're right. I'll update it in the next version.

Thank you,
Claudiu Beznea

> 
> [...]
> 
> MBR, Sergey

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2024-02-14  5:45 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-13  9:41 [PATCH net-next v3 0/6] net: ravb: Add runtime PM support (part 2) Claudiu
2024-02-13  9:41 ` [PATCH net-next v3 1/6] net: ravb: Get rid of the temporary variable irq Claudiu
2024-02-13  9:41 ` [PATCH net-next v3 2/6] net: ravb: Keep the reverse order of operations in ravb_close() Claudiu
2024-02-13  9:41 ` [PATCH net-next v3 3/6] net: ravb: Return cached statistics if the interface is down Claudiu
2024-02-13  9:41 ` [PATCH net-next v3 4/6] net: ravb: Move the update of ndev->features to ravb_set_features() Claudiu
2024-02-13 19:36   ` Sergey Shtylyov
2024-02-13 19:58     ` Sergey Shtylyov
2024-02-13 19:52   ` Sergey Shtylyov
2024-02-14  5:45     ` claudiu beznea
2024-02-13  9:41 ` [PATCH net-next v3 5/6] net: ravb: Do not apply features to hardware if the interface is down Claudiu
2024-02-13 10:13   ` Biju Das
2024-02-13 11:07     ` claudiu beznea
2024-02-13 11:39       ` Biju Das
2024-02-13 18:55       ` claudiu beznea
2024-02-13 19:48   ` Sergey Shtylyov
2024-02-13  9:41 ` [PATCH net-next v3 6/6] net: ravb: Add runtime PM support Claudiu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).