mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH net] net: pse-pd: Fix enabled status mismatch
@ 2024-10-02 12:17 Kory Maincent
  2024-10-02 12:38 ` Andrew Lunn
  2024-10-04 22:40 ` patchwork-bot+netdevbpf
  0 siblings, 2 replies; 4+ messages in thread
From: Kory Maincent @ 2024-10-02 12:17 UTC (permalink / raw)
  To: Andrew Lunn, Kory Maincent (Dent Project),
	Jakub Kicinski, netdev, linux-kernel
  Cc: Kyle Swenson, thomas.petazzoni, Oleksij Rempel, David S. Miller,
	Eric Dumazet, Paolo Abeni

PSE controllers like the TPS23881 can forcefully turn off their
configuration state. In such cases, the is_enabled() and get_status()
callbacks will report the PSE as disabled, while admin_state_enabled
will show it as enabled. This mismatch can lead the user to attempt
to enable it, but no action is taken as admin_state_enabled remains set.

The solution is to disable the PSE before enabling it, ensuring the
actual status matches admin_state_enabled.

Fixes: d83e13761d5b ("net: pse-pd: Use regulator framework within PSE framework")
Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
---

FYI: Saving the enabled state in the driver is not a viable solution, as a
reboot may cause a mismatch between the real and software-saved states.
---
 drivers/net/pse-pd/pse_core.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/net/pse-pd/pse_core.c b/drivers/net/pse-pd/pse_core.c
index 4f032b16a8a0..f8e6854781e6 100644
--- a/drivers/net/pse-pd/pse_core.c
+++ b/drivers/net/pse-pd/pse_core.c
@@ -785,6 +785,17 @@ static int pse_ethtool_c33_set_config(struct pse_control *psec,
 	 */
 	switch (config->c33_admin_control) {
 	case ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED:
+		/* We could have mismatch between admin_state_enabled and
+		 * state reported by regulator_is_enabled. This can occur when
+		 * the PI is forcibly turn off by the controller. Call
+		 * regulator_disable on that case to fix the counters state.
+		 */
+		if (psec->pcdev->pi[psec->id].admin_state_enabled &&
+		    !regulator_is_enabled(psec->ps)) {
+			err = regulator_disable(psec->ps);
+			if (err)
+				break;
+		}
 		if (!psec->pcdev->pi[psec->id].admin_state_enabled)
 			err = regulator_enable(psec->ps);
 		break;
-- 
2.34.1


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

* Re: [PATCH net] net: pse-pd: Fix enabled status mismatch
  2024-10-02 12:17 [PATCH net] net: pse-pd: Fix enabled status mismatch Kory Maincent
@ 2024-10-02 12:38 ` Andrew Lunn
  2024-10-02 12:46   ` Kory Maincent
  2024-10-04 22:40 ` patchwork-bot+netdevbpf
  1 sibling, 1 reply; 4+ messages in thread
From: Andrew Lunn @ 2024-10-02 12:38 UTC (permalink / raw)
  To: Kory Maincent
  Cc: Jakub Kicinski, netdev, linux-kernel, Kyle Swenson,
	thomas.petazzoni, Oleksij Rempel, David S. Miller, Eric Dumazet,
	Paolo Abeni

On Wed, Oct 02, 2024 at 02:17:05PM +0200, Kory Maincent wrote:
> PSE controllers like the TPS23881 can forcefully turn off their
> configuration state. In such cases, the is_enabled() and get_status()
> callbacks will report the PSE as disabled, while admin_state_enabled
> will show it as enabled. This mismatch can lead the user to attempt
> to enable it, but no action is taken as admin_state_enabled remains set.
> 
> The solution is to disable the PSE before enabling it, ensuring the
> actual status matches admin_state_enabled.
> 
> Fixes: d83e13761d5b ("net: pse-pd: Use regulator framework within PSE framework")
> Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
> ---
> 
> FYI: Saving the enabled state in the driver is not a viable solution, as a
> reboot may cause a mismatch between the real and software-saved states.

This seems O.K. to me.

I'm assuming the controller has turned the configuration state to off
to stop the magic smoke escaping? Is there any sort of notification of
this?  Does it raise an interrupt? Sometime in the future we might
want to add a netlink notification about this?

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

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

* Re: [PATCH net] net: pse-pd: Fix enabled status mismatch
  2024-10-02 12:38 ` Andrew Lunn
@ 2024-10-02 12:46   ` Kory Maincent
  0 siblings, 0 replies; 4+ messages in thread
From: Kory Maincent @ 2024-10-02 12:46 UTC (permalink / raw)
  To: Andrew Lunn
  Cc: Jakub Kicinski, netdev, linux-kernel, Kyle Swenson,
	thomas.petazzoni, Oleksij Rempel, David S. Miller, Eric Dumazet,
	Paolo Abeni

On Wed, 2 Oct 2024 14:38:19 +0200
Andrew Lunn <andrew@lunn.ch> wrote:

> On Wed, Oct 02, 2024 at 02:17:05PM +0200, Kory Maincent wrote:
> > PSE controllers like the TPS23881 can forcefully turn off their
> > configuration state. In such cases, the is_enabled() and get_status()
> > callbacks will report the PSE as disabled, while admin_state_enabled
> > will show it as enabled. This mismatch can lead the user to attempt
> > to enable it, but no action is taken as admin_state_enabled remains set.
> > 
> > The solution is to disable the PSE before enabling it, ensuring the
> > actual status matches admin_state_enabled.
> > 
> > Fixes: d83e13761d5b ("net: pse-pd: Use regulator framework within PSE
> > framework") Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
> > ---
> > 
> > FYI: Saving the enabled state in the driver is not a viable solution, as a
> > reboot may cause a mismatch between the real and software-saved states.  
> 
> This seems O.K. to me.
> 
> I'm assuming the controller has turned the configuration state to off
> to stop the magic smoke escaping? Is there any sort of notification of
> this?  Does it raise an interrupt? Sometime in the future we might
> want to add a netlink notification about this?

Thanks for your review!

Yes, in case of over-current or over-temperature, there is an interrupt. The
netlink notifications support will arrive soon in the series in progress.

Regards,
-- 
Köry Maincent, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com

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

* Re: [PATCH net] net: pse-pd: Fix enabled status mismatch
  2024-10-02 12:17 [PATCH net] net: pse-pd: Fix enabled status mismatch Kory Maincent
  2024-10-02 12:38 ` Andrew Lunn
@ 2024-10-04 22:40 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 4+ messages in thread
From: patchwork-bot+netdevbpf @ 2024-10-04 22:40 UTC (permalink / raw)
  To: Kory Maincent
  Cc: andrew, kuba, netdev, linux-kernel, kyle.swenson,
	thomas.petazzoni, o.rempel, davem, edumazet, pabeni

Hello:

This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Wed,  2 Oct 2024 14:17:05 +0200 you wrote:
> PSE controllers like the TPS23881 can forcefully turn off their
> configuration state. In such cases, the is_enabled() and get_status()
> callbacks will report the PSE as disabled, while admin_state_enabled
> will show it as enabled. This mismatch can lead the user to attempt
> to enable it, but no action is taken as admin_state_enabled remains set.
> 
> The solution is to disable the PSE before enabling it, ensuring the
> actual status matches admin_state_enabled.
> 
> [...]

Here is the summary with links:
  - [net] net: pse-pd: Fix enabled status mismatch
    https://git.kernel.org/netdev/net/c/dda3529d2e84

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



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

end of thread, other threads:[~2024-10-04 22:40 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-10-02 12:17 [PATCH net] net: pse-pd: Fix enabled status mismatch Kory Maincent
2024-10-02 12:38 ` Andrew Lunn
2024-10-02 12:46   ` Kory Maincent
2024-10-04 22:40 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®