[PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots

Kory Maincent posted 3 patches 2 months ago
[PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots
Posted by Kory Maincent 2 months ago
From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>

Detect when PSE hardware is already configured (user byte == 42) and
skip hardware initialization to prevent power interruption to connected
devices during system reboots.

Previously, the driver would always reconfigure the PSE hardware on
probe, causing a port matrix reflash that resulted in temporary power
loss to all connected devices. This change maintains power continuity
by preserving existing configuration when the PSE has been previously
initialized.

Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
---
 drivers/net/pse-pd/pd692x0.c | 35 ++++++++++++++++++++++++++++++++---
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/drivers/net/pse-pd/pd692x0.c b/drivers/net/pse-pd/pd692x0.c
index 782b1abf94cb..134435e90073 100644
--- a/drivers/net/pse-pd/pd692x0.c
+++ b/drivers/net/pse-pd/pd692x0.c
@@ -30,6 +30,8 @@
 #define PD692X0_FW_MIN_VER	5
 #define PD692X0_FW_PATCH_VER	5
 
+#define PD692X0_USER_BYTE	42
+
 enum pd692x0_fw_state {
 	PD692X0_FW_UNKNOWN,
 	PD692X0_FW_OK,
@@ -80,6 +82,7 @@ enum {
 	PD692X0_MSG_GET_PORT_PARAM,
 	PD692X0_MSG_GET_POWER_BANK,
 	PD692X0_MSG_SET_POWER_BANK,
+	PD692X0_MSG_SET_USER_BYTE,
 
 	/* add new message above here */
 	PD692X0_MSG_CNT
@@ -103,6 +106,7 @@ struct pd692x0_priv {
 	bool last_cmd_key;
 	unsigned long last_cmd_key_time;
 
+	bool cfg_saved;
 	enum ethtool_c33_pse_admin_state admin_state[PD692X0_MAX_PIS];
 	struct regulator_dev *manager_reg[PD692X0_MAX_MANAGERS];
 	int manager_pw_budget[PD692X0_MAX_MANAGERS];
@@ -193,6 +197,12 @@ static const struct pd692x0_msg pd692x0_msg_template_list[PD692X0_MSG_CNT] = {
 		.key = PD692X0_KEY_CMD,
 		.sub = {0x07, 0x0b, 0x57},
 	},
+	[PD692X0_MSG_SET_USER_BYTE] = {
+		.key = PD692X0_KEY_PRG,
+		.sub = {0x41, PD692X0_USER_BYTE},
+		.data = {0x4e, 0x4e, 0x4e, 0x4e,
+			 0x4e, 0x4e, 0x4e, 0x4e},
+	},
 };
 
 static u8 pd692x0_build_msg(struct pd692x0_msg *msg, u8 echo)
@@ -1233,6 +1243,15 @@ static void pd692x0_managers_free_pw_budget(struct pd692x0_priv *priv)
 	}
 }
 
+static int
+pd692x0_save_user_byte(struct pd692x0_priv *priv)
+{
+	struct pd692x0_msg msg, buf;
+
+	msg = pd692x0_msg_template_list[PD692X0_MSG_SET_USER_BYTE];
+	return pd692x0_sendrecv_msg(priv, &msg, &buf);
+}
+
 static int pd692x0_setup_pi_matrix(struct pse_controller_dev *pcdev)
 {
 	struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
@@ -1268,9 +1287,16 @@ static int pd692x0_setup_pi_matrix(struct pse_controller_dev *pcdev)
 	if (ret)
 		goto err_managers_req_pw;
 
-	ret = pd692x0_hw_conf_init(priv);
-	if (ret)
-		goto err_managers_req_pw;
+	/* Do not init the conf if it is already saved */
+	if (!priv->cfg_saved) {
+		ret = pd692x0_hw_conf_init(priv);
+		if (ret)
+			goto err_managers_req_pw;
+
+		ret = pd692x0_save_user_byte(priv);
+		if (ret)
+			goto err_managers_req_pw;
+	}
 
 	pd692x0_of_put_managers(priv, manager);
 	kfree(manager);
@@ -1793,6 +1819,9 @@ static int pd692x0_i2c_probe(struct i2c_client *client)
 		}
 	}
 
+	if (buf.data[2] == PD692X0_USER_BYTE)
+		priv->cfg_saved = true;
+
 	priv->np = dev->of_node;
 	priv->pcdev.nr_lines = PD692X0_MAX_PIS;
 	priv->pcdev.owner = THIS_MODULE;

-- 
2.43.0
Re: [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots
Posted by Simon Horman 2 months ago
On Mon, Oct 13, 2025 at 04:05:33PM +0200, Kory Maincent wrote:
> From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
> 
> Detect when PSE hardware is already configured (user byte == 42) and
> skip hardware initialization to prevent power interruption to connected
> devices during system reboots.
> 
> Previously, the driver would always reconfigure the PSE hardware on
> probe, causing a port matrix reflash that resulted in temporary power
> loss to all connected devices. This change maintains power continuity
> by preserving existing configuration when the PSE has been previously
> initialized.
> 
> Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>

Hi Kory,

Perhaps I'm over thinking things here. But I'm wondering
what provision there is for a situation whereby:

1. The driver configures the device
2. A reboot occurs
2. The (updated) driver wants to (re)configure the device
   with a different configuration, say because it turns
   out there was a bug in or enhancement to the procedure at 1.

...
Re: [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots
Posted by Kory Maincent 2 months ago
On Tue, 14 Oct 2025 09:58:56 +0100
Simon Horman <horms@kernel.org> wrote:

> On Mon, Oct 13, 2025 at 04:05:33PM +0200, Kory Maincent wrote:
> > From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
> > 
> > Detect when PSE hardware is already configured (user byte == 42) and
> > skip hardware initialization to prevent power interruption to connected
> > devices during system reboots.
> > 
> > Previously, the driver would always reconfigure the PSE hardware on
> > probe, causing a port matrix reflash that resulted in temporary power
> > loss to all connected devices. This change maintains power continuity
> > by preserving existing configuration when the PSE has been previously
> > initialized.
> > 
> > Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>  
> 
> Hi Kory,
> 
> Perhaps I'm over thinking things here. But I'm wondering
> what provision there is for a situation whereby:
> 
> 1. The driver configures the device
> 2. A reboot occurs
> 2. The (updated) driver wants to (re)configure the device
>    with a different configuration, say because it turns
>    out there was a bug in or enhancement to the procedure at 1.
> 
> ...

You have to find a way to turn off the power supply of the PSE controller.
As adding a devlink uAPI for this was not accepted, a hard reset for the
PSE controller is the only way to clean the user byte register and (re)configure
the controller at boot time.

Regards,
-- 
Köry Maincent, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com
Re: [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots
Posted by Simon Horman 2 months ago
On Tue, Oct 14, 2025 at 11:56:59AM +0200, Kory Maincent wrote:
> On Tue, 14 Oct 2025 09:58:56 +0100
> Simon Horman <horms@kernel.org> wrote:
> 
> > On Mon, Oct 13, 2025 at 04:05:33PM +0200, Kory Maincent wrote:
> > > From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
> > > 
> > > Detect when PSE hardware is already configured (user byte == 42) and
> > > skip hardware initialization to prevent power interruption to connected
> > > devices during system reboots.
> > > 
> > > Previously, the driver would always reconfigure the PSE hardware on
> > > probe, causing a port matrix reflash that resulted in temporary power
> > > loss to all connected devices. This change maintains power continuity
> > > by preserving existing configuration when the PSE has been previously
> > > initialized.
> > > 
> > > Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>  
> > 
> > Hi Kory,
> > 
> > Perhaps I'm over thinking things here. But I'm wondering
> > what provision there is for a situation whereby:
> > 
> > 1. The driver configures the device
> > 2. A reboot occurs
> > 2. The (updated) driver wants to (re)configure the device
> >    with a different configuration, say because it turns
> >    out there was a bug in or enhancement to the procedure at 1.
> > 
> > ...
> 
> You have to find a way to turn off the power supply of the PSE
> controller.  As adding a devlink uAPI for this was not accepted, a hard
> reset for the PSE controller is the only way to clean the user byte
> register and (re)configure the controller at boot time.

Ok, as long as there is a way.
Maybe worth mentioning in the commit message.
But either way this patch looks good to me.

Reviewed-by: Simon Horman <horms@kernel.org>