RE: [PATCH net-next v2 4/5] net: ravb: Do not apply RX checksum settings to hardware if the interface is down

From: Biju Das
Date: Fri Feb 09 2024 - 12:13:11 EST


Hi Claudiu Beznea,

> -----Original Message-----
> From: Claudiu <claudiu.beznea@xxxxxxxxx>
> Sent: Friday, February 9, 2024 5:05 PM
> Subject: [PATCH net-next v2 4/5] net: ravb: Do not apply RX checksum
> settings to hardware if the interface is down
>
> From: Claudiu Beznea <claudiu.beznea.uj@xxxxxxxxxxxxxx>
>
> Do not apply the RX checksum settings 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
> RX checksum settings and apply them in ravb_open() through
> ravb_emac_init().
> This has been solved by introducing pm_runtime_active() check. 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@xxxxxxxxxxxxxx>
> ---
>
> 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
>
> [2]
>
> drivers/net/ethernet/renesas/ravb_main.c | 20 +++++++++++++++++++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/renesas/ravb_main.c
> b/drivers/net/ethernet/renesas/ravb_main.c
> index 7a7f743a1fef..f4be08f0198d 100644
> --- a/drivers/net/ethernet/renesas/ravb_main.c
> +++ b/drivers/net/ethernet/renesas/ravb_main.c
> @@ -2478,8 +2478,14 @@ static int ravb_change_mtu(struct net_device *ndev,
> int new_mtu) static void ravb_set_rx_csum(struct net_device *ndev, bool
> enable) {
> struct ravb_private *priv = netdev_priv(ndev);
> + struct device *dev = &priv->pdev->dev;
> unsigned long flags;
>
> + pm_runtime_get_noresume(dev);
> +
> + if (!pm_runtime_active(dev))
> + goto out_rpm_put;


Thanks for the patch,

Why can't this be handled in ravb_set_features() to avoid code
duplication??

Cheers,
Biju

> +
> spin_lock_irqsave(&priv->lock, flags);
>
> /* Disable TX and RX */
> @@ -2492,6 +2498,9 @@ static void ravb_set_rx_csum(struct net_device
> *ndev, bool enable)
> ravb_rcv_snd_enable(ndev);
>
> spin_unlock_irqrestore(&priv->lock, flags);
> +
> +out_rpm_put:
> + pm_runtime_put_noidle(dev);
> }
>
> static int ravb_endisable_csum_gbeth(struct net_device *ndev, enum
> ravb_reg reg, @@ -2515,10 +2524,16 @@ static int
> ravb_set_features_gbeth(struct net_device *ndev, {
> netdev_features_t changed = ndev->features ^ features;
> struct ravb_private *priv = netdev_priv(ndev);
> + struct device *dev = &priv->pdev->dev;
> unsigned long flags;
> int ret = 0;
> u32 val;
>
> + pm_runtime_get_noresume(dev);
> +
> + if (!pm_runtime_active(dev))
> + goto out_rpm_put;
> +
> spin_lock_irqsave(&priv->lock, flags);
> if (changed & NETIF_F_RXCSUM) {
> if (features & NETIF_F_RXCSUM)
> @@ -2542,9 +2557,12 @@ static int ravb_set_features_gbeth(struct
> net_device *ndev,
> goto done;
> }
>
> - ndev->features = features;
> done:
> spin_unlock_irqrestore(&priv->lock, flags);
> +out_rpm_put:
> + pm_runtime_put_noidle(dev);
> + if (!ret)
> + ndev->features = features;
>
> return ret;
> }
> --
> 2.39.2
>