* [PATCH net-next v2 0/3] Preserve PSE PD692x0 configuration across reboots
@ 2025-10-13 14:05 Kory Maincent
2025-10-13 14:05 ` [PATCH net-next v2 1/3] net: pse-pd: pd692x0: Replace __free macro with explicit kfree calls Kory Maincent
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Kory Maincent @ 2025-10-13 14:05 UTC (permalink / raw)
To: Oleksij Rempel, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni
Cc: Thomas Petazzoni, kernel, Dent Project, netdev, linux-kernel,
Kory Maincent
From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
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>
---
Changes in v2:
- Resend the series as I carelessly send it during the merge window.
- Link to v1: https://lore.kernel.org/r/20250930-feature_pd692x0_reboot_keep_conf-v1-0-620dce7ee8a2@bootlin.com
---
Kory Maincent (3):
net: pse-pd: pd692x0: Replace __free macro with explicit kfree calls
net: pse-pd: pd692x0: Separate configuration parsing from hardware setup
net: pse-pd: pd692x0: Preserve PSE configuration across reboots
drivers/net/pse-pd/pd692x0.c | 155 +++++++++++++++++++++++++++++++------------
1 file changed, 112 insertions(+), 43 deletions(-)
---
base-commit: 7d5145eba189b35f64c7e7c03a613941fede2cd7
change-id: 20250929-feature_pd692x0_reboot_keep_conf-69a996467491
Best regards,
--
Köry Maincent, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH net-next v2 1/3] net: pse-pd: pd692x0: Replace __free macro with explicit kfree calls
2025-10-13 14:05 [PATCH net-next v2 0/3] Preserve PSE PD692x0 configuration across reboots Kory Maincent
@ 2025-10-13 14:05 ` Kory Maincent
2025-10-14 9:01 ` Simon Horman
2025-10-13 14:05 ` [PATCH net-next v2 2/3] net: pse-pd: pd692x0: Separate configuration parsing from hardware setup Kory Maincent
` (2 subsequent siblings)
3 siblings, 1 reply; 10+ messages in thread
From: Kory Maincent @ 2025-10-13 14:05 UTC (permalink / raw)
To: Oleksij Rempel, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni
Cc: Thomas Petazzoni, kernel, Dent Project, netdev, linux-kernel,
Kory Maincent
From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
Replace __free(kfree) with explicit kfree() calls to follow the net
subsystem policy of avoiding automatic cleanup macros as described in
the documentation.
Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
---
drivers/net/pse-pd/pd692x0.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/net/pse-pd/pd692x0.c b/drivers/net/pse-pd/pd692x0.c
index f4e91ba64a66..055e925c853e 100644
--- a/drivers/net/pse-pd/pd692x0.c
+++ b/drivers/net/pse-pd/pd692x0.c
@@ -1200,9 +1200,9 @@ static void pd692x0_managers_free_pw_budget(struct pd692x0_priv *priv)
static int pd692x0_setup_pi_matrix(struct pse_controller_dev *pcdev)
{
- struct pd692x0_manager *manager __free(kfree) = NULL;
struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
struct pd692x0_matrix port_matrix[PD692X0_MAX_PIS];
+ struct pd692x0_manager *manager;
int ret, nmanagers;
/* Should we flash the port matrix */
@@ -1216,7 +1216,7 @@ static int pd692x0_setup_pi_matrix(struct pse_controller_dev *pcdev)
ret = pd692x0_of_get_managers(priv, manager);
if (ret < 0)
- return ret;
+ goto err_free_manager;
nmanagers = ret;
ret = pd692x0_register_managers_regulator(priv, manager, nmanagers);
@@ -1236,12 +1236,15 @@ static int pd692x0_setup_pi_matrix(struct pse_controller_dev *pcdev)
goto err_managers_req_pw;
pd692x0_of_put_managers(priv, manager, nmanagers);
+ kfree(manager);
return 0;
err_managers_req_pw:
pd692x0_managers_free_pw_budget(priv);
err_of_managers:
pd692x0_of_put_managers(priv, manager, nmanagers);
+err_free_manager:
+ kfree(manager);
return ret;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH net-next v2 2/3] net: pse-pd: pd692x0: Separate configuration parsing from hardware setup
2025-10-13 14:05 [PATCH net-next v2 0/3] Preserve PSE PD692x0 configuration across reboots Kory Maincent
2025-10-13 14:05 ` [PATCH net-next v2 1/3] net: pse-pd: pd692x0: Replace __free macro with explicit kfree calls Kory Maincent
@ 2025-10-13 14:05 ` Kory Maincent
2025-10-14 9:02 ` Simon Horman
2025-10-13 14:05 ` [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots Kory Maincent
2025-10-16 1:00 ` [PATCH net-next v2 0/3] Preserve PSE PD692x0 " patchwork-bot+netdevbpf
3 siblings, 1 reply; 10+ messages in thread
From: Kory Maincent @ 2025-10-13 14:05 UTC (permalink / raw)
To: Oleksij Rempel, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni
Cc: Thomas Petazzoni, kernel, Dent Project, netdev, linux-kernel,
Kory Maincent
From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
Cache the port matrix configuration in driver private data to enable
PSE controller reconfiguration. This refactoring separates device tree
parsing from hardware configuration application, allowing settings to be
reapplied without reparsing the device tree.
This refactoring is a prerequisite for preserving PSE configuration
across reboots to prevent power disruption to connected devices.
Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
---
drivers/net/pse-pd/pd692x0.c | 115 ++++++++++++++++++++++++++++---------------
1 file changed, 76 insertions(+), 39 deletions(-)
diff --git a/drivers/net/pse-pd/pd692x0.c b/drivers/net/pse-pd/pd692x0.c
index 055e925c853e..782b1abf94cb 100644
--- a/drivers/net/pse-pd/pd692x0.c
+++ b/drivers/net/pse-pd/pd692x0.c
@@ -85,6 +85,11 @@ enum {
PD692X0_MSG_CNT
};
+struct pd692x0_matrix {
+ u8 hw_port_a;
+ u8 hw_port_b;
+};
+
struct pd692x0_priv {
struct i2c_client *client;
struct pse_controller_dev pcdev;
@@ -101,6 +106,8 @@ struct pd692x0_priv {
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];
+ int nmanagers;
+ struct pd692x0_matrix *port_matrix;
};
/* Template list of communication messages. The non-null bytes defined here
@@ -809,11 +816,6 @@ struct pd692x0_manager {
int nports;
};
-struct pd692x0_matrix {
- u8 hw_port_a;
- u8 hw_port_b;
-};
-
static int
pd692x0_of_get_ports_manager(struct pd692x0_priv *priv,
struct pd692x0_manager *manager,
@@ -903,7 +905,8 @@ pd692x0_of_get_managers(struct pd692x0_priv *priv,
}
of_node_put(managers_node);
- return nmanagers;
+ priv->nmanagers = nmanagers;
+ return 0;
out:
for (i = 0; i < nmanagers; i++) {
@@ -963,8 +966,7 @@ pd692x0_register_manager_regulator(struct device *dev, char *reg_name,
static int
pd692x0_register_managers_regulator(struct pd692x0_priv *priv,
- const struct pd692x0_manager *manager,
- int nmanagers)
+ const struct pd692x0_manager *manager)
{
struct device *dev = &priv->client->dev;
size_t reg_name_len;
@@ -975,7 +977,7 @@ pd692x0_register_managers_regulator(struct pd692x0_priv *priv,
*/
reg_name_len = strlen(dev_name(dev)) + 23;
- for (i = 0; i < nmanagers; i++) {
+ for (i = 0; i < priv->nmanagers; i++) {
static const char * const regulators[] = { "vaux5", "vaux3p3" };
struct regulator_dev *rdev;
char *reg_name;
@@ -1008,10 +1010,14 @@ pd692x0_register_managers_regulator(struct pd692x0_priv *priv,
}
static int
-pd692x0_conf_manager_power_budget(struct pd692x0_priv *priv, int id, int pw)
+pd692x0_conf_manager_power_budget(struct pd692x0_priv *priv, int id)
{
struct pd692x0_msg msg, buf;
- int ret, pw_mW = pw / 1000;
+ int ret, pw_mW;
+
+ pw_mW = priv->manager_pw_budget[id] / 1000;
+ if (!pw_mW)
+ return 0;
msg = pd692x0_msg_template_list[PD692X0_MSG_GET_POWER_BANK];
msg.data[0] = id;
@@ -1032,11 +1038,11 @@ pd692x0_conf_manager_power_budget(struct pd692x0_priv *priv, int id, int pw)
}
static int
-pd692x0_configure_managers(struct pd692x0_priv *priv, int nmanagers)
+pd692x0_req_managers_pw_budget(struct pd692x0_priv *priv)
{
int i, ret;
- for (i = 0; i < nmanagers; i++) {
+ for (i = 0; i < priv->nmanagers; i++) {
struct regulator *supply = priv->manager_reg[i]->supply;
int pw_budget;
@@ -1053,7 +1059,18 @@ pd692x0_configure_managers(struct pd692x0_priv *priv, int nmanagers)
return ret;
priv->manager_pw_budget[i] = pw_budget;
- ret = pd692x0_conf_manager_power_budget(priv, i, pw_budget);
+ }
+
+ return 0;
+}
+
+static int
+pd692x0_configure_managers(struct pd692x0_priv *priv)
+{
+ int i, ret;
+
+ for (i = 0; i < priv->nmanagers; i++) {
+ ret = pd692x0_conf_manager_power_budget(priv, i);
if (ret < 0)
return ret;
}
@@ -1101,10 +1118,9 @@ pd692x0_set_port_matrix(const struct pse_pi_pairset *pairset,
static int
pd692x0_set_ports_matrix(struct pd692x0_priv *priv,
- const struct pd692x0_manager *manager,
- int nmanagers,
- struct pd692x0_matrix port_matrix[PD692X0_MAX_PIS])
+ const struct pd692x0_manager *manager)
{
+ struct pd692x0_matrix *port_matrix = priv->port_matrix;
struct pse_controller_dev *pcdev = &priv->pcdev;
int i, ret;
@@ -1117,7 +1133,7 @@ pd692x0_set_ports_matrix(struct pd692x0_priv *priv,
/* Update with values for every PSE PIs */
for (i = 0; i < pcdev->nr_lines; i++) {
ret = pd692x0_set_port_matrix(&pcdev->pi[i].pairset[0],
- manager, nmanagers,
+ manager, priv->nmanagers,
&port_matrix[i]);
if (ret) {
dev_err(&priv->client->dev,
@@ -1126,7 +1142,7 @@ pd692x0_set_ports_matrix(struct pd692x0_priv *priv,
}
ret = pd692x0_set_port_matrix(&pcdev->pi[i].pairset[1],
- manager, nmanagers,
+ manager, priv->nmanagers,
&port_matrix[i]);
if (ret) {
dev_err(&priv->client->dev,
@@ -1139,9 +1155,9 @@ pd692x0_set_ports_matrix(struct pd692x0_priv *priv,
}
static int
-pd692x0_write_ports_matrix(struct pd692x0_priv *priv,
- const struct pd692x0_matrix port_matrix[PD692X0_MAX_PIS])
+pd692x0_write_ports_matrix(struct pd692x0_priv *priv)
{
+ struct pd692x0_matrix *port_matrix = priv->port_matrix;
struct pd692x0_msg msg, buf;
int ret, i;
@@ -1166,13 +1182,32 @@ pd692x0_write_ports_matrix(struct pd692x0_priv *priv,
return 0;
}
+static int pd692x0_hw_conf_init(struct pd692x0_priv *priv)
+{
+ int ret;
+
+ /* Is PD692x0 ready to be configured? */
+ if (priv->fw_state != PD692X0_FW_OK &&
+ priv->fw_state != PD692X0_FW_COMPLETE)
+ return 0;
+
+ ret = pd692x0_configure_managers(priv);
+ if (ret)
+ return ret;
+
+ ret = pd692x0_write_ports_matrix(priv);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static void pd692x0_of_put_managers(struct pd692x0_priv *priv,
- struct pd692x0_manager *manager,
- int nmanagers)
+ struct pd692x0_manager *manager)
{
int i, j;
- for (i = 0; i < nmanagers; i++) {
+ for (i = 0; i < priv->nmanagers; i++) {
for (j = 0; j < manager[i].nports; j++)
of_node_put(manager[i].port_node[j]);
of_node_put(manager[i].node);
@@ -1201,48 +1236,50 @@ static void pd692x0_managers_free_pw_budget(struct pd692x0_priv *priv)
static int pd692x0_setup_pi_matrix(struct pse_controller_dev *pcdev)
{
struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
- struct pd692x0_matrix port_matrix[PD692X0_MAX_PIS];
+ struct pd692x0_matrix *port_matrix;
struct pd692x0_manager *manager;
- int ret, nmanagers;
-
- /* Should we flash the port matrix */
- if (priv->fw_state != PD692X0_FW_OK &&
- priv->fw_state != PD692X0_FW_COMPLETE)
- return 0;
+ int ret;
manager = kcalloc(PD692X0_MAX_MANAGERS, sizeof(*manager), GFP_KERNEL);
if (!manager)
return -ENOMEM;
+ port_matrix = devm_kcalloc(&priv->client->dev, PD692X0_MAX_PIS,
+ sizeof(*port_matrix), GFP_KERNEL);
+ if (!port_matrix) {
+ ret = -ENOMEM;
+ goto err_free_manager;
+ }
+ priv->port_matrix = port_matrix;
+
ret = pd692x0_of_get_managers(priv, manager);
if (ret < 0)
goto err_free_manager;
- nmanagers = ret;
- ret = pd692x0_register_managers_regulator(priv, manager, nmanagers);
+ ret = pd692x0_register_managers_regulator(priv, manager);
if (ret)
goto err_of_managers;
- ret = pd692x0_configure_managers(priv, nmanagers);
+ ret = pd692x0_req_managers_pw_budget(priv);
if (ret)
goto err_of_managers;
- ret = pd692x0_set_ports_matrix(priv, manager, nmanagers, port_matrix);
+ ret = pd692x0_set_ports_matrix(priv, manager);
if (ret)
goto err_managers_req_pw;
- ret = pd692x0_write_ports_matrix(priv, port_matrix);
+ ret = pd692x0_hw_conf_init(priv);
if (ret)
goto err_managers_req_pw;
- pd692x0_of_put_managers(priv, manager, nmanagers);
+ pd692x0_of_put_managers(priv, manager);
kfree(manager);
return 0;
err_managers_req_pw:
pd692x0_managers_free_pw_budget(priv);
err_of_managers:
- pd692x0_of_put_managers(priv, manager, nmanagers);
+ pd692x0_of_put_managers(priv, manager);
err_free_manager:
kfree(manager);
return ret;
@@ -1647,7 +1684,7 @@ static enum fw_upload_err pd692x0_fw_poll_complete(struct fw_upload *fwl)
return FW_UPLOAD_ERR_FW_INVALID;
}
- ret = pd692x0_setup_pi_matrix(&priv->pcdev);
+ ret = pd692x0_hw_conf_init(priv);
if (ret < 0) {
dev_err(&client->dev, "Error configuring ports matrix (%pe)\n",
ERR_PTR(ret));
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots
2025-10-13 14:05 [PATCH net-next v2 0/3] Preserve PSE PD692x0 configuration across reboots Kory Maincent
2025-10-13 14:05 ` [PATCH net-next v2 1/3] net: pse-pd: pd692x0: Replace __free macro with explicit kfree calls Kory Maincent
2025-10-13 14:05 ` [PATCH net-next v2 2/3] net: pse-pd: pd692x0: Separate configuration parsing from hardware setup Kory Maincent
@ 2025-10-13 14:05 ` Kory Maincent
2025-10-14 8:58 ` Simon Horman
2025-10-16 1:00 ` [PATCH net-next v2 0/3] Preserve PSE PD692x0 " patchwork-bot+netdevbpf
3 siblings, 1 reply; 10+ messages in thread
From: Kory Maincent @ 2025-10-13 14:05 UTC (permalink / raw)
To: Oleksij Rempel, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni
Cc: Thomas Petazzoni, kernel, Dent Project, netdev, linux-kernel,
Kory Maincent
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
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots
2025-10-13 14:05 ` [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots Kory Maincent
@ 2025-10-14 8:58 ` Simon Horman
2025-10-14 9:56 ` Kory Maincent
0 siblings, 1 reply; 10+ messages in thread
From: Simon Horman @ 2025-10-14 8:58 UTC (permalink / raw)
To: Kory Maincent
Cc: Oleksij Rempel, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Thomas Petazzoni, kernel,
Dent Project, netdev, linux-kernel
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.
...
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next v2 1/3] net: pse-pd: pd692x0: Replace __free macro with explicit kfree calls
2025-10-13 14:05 ` [PATCH net-next v2 1/3] net: pse-pd: pd692x0: Replace __free macro with explicit kfree calls Kory Maincent
@ 2025-10-14 9:01 ` Simon Horman
0 siblings, 0 replies; 10+ messages in thread
From: Simon Horman @ 2025-10-14 9:01 UTC (permalink / raw)
To: Kory Maincent
Cc: Oleksij Rempel, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Thomas Petazzoni, kernel,
Dent Project, netdev, linux-kernel
On Mon, Oct 13, 2025 at 04:05:31PM +0200, Kory Maincent wrote:
> From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
>
> Replace __free(kfree) with explicit kfree() calls to follow the net
> subsystem policy of avoiding automatic cleanup macros as described in
> the documentation.
>
> Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
Reviewed-by: Simon Horman <horms@kernel.org>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next v2 2/3] net: pse-pd: pd692x0: Separate configuration parsing from hardware setup
2025-10-13 14:05 ` [PATCH net-next v2 2/3] net: pse-pd: pd692x0: Separate configuration parsing from hardware setup Kory Maincent
@ 2025-10-14 9:02 ` Simon Horman
0 siblings, 0 replies; 10+ messages in thread
From: Simon Horman @ 2025-10-14 9:02 UTC (permalink / raw)
To: Kory Maincent
Cc: Oleksij Rempel, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Thomas Petazzoni, kernel,
Dent Project, netdev, linux-kernel
On Mon, Oct 13, 2025 at 04:05:32PM +0200, Kory Maincent wrote:
> From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
>
> Cache the port matrix configuration in driver private data to enable
> PSE controller reconfiguration. This refactoring separates device tree
> parsing from hardware configuration application, allowing settings to be
> reapplied without reparsing the device tree.
>
> This refactoring is a prerequisite for preserving PSE configuration
> across reboots to prevent power disruption to connected devices.
>
> Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
Reviewed-by: Simon Horman <horms@kernel.org>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots
2025-10-14 8:58 ` Simon Horman
@ 2025-10-14 9:56 ` Kory Maincent
2025-10-14 14:06 ` Simon Horman
0 siblings, 1 reply; 10+ messages in thread
From: Kory Maincent @ 2025-10-14 9:56 UTC (permalink / raw)
To: Simon Horman
Cc: Oleksij Rempel, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Thomas Petazzoni, kernel,
Dent Project, netdev, linux-kernel
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
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots
2025-10-14 9:56 ` Kory Maincent
@ 2025-10-14 14:06 ` Simon Horman
0 siblings, 0 replies; 10+ messages in thread
From: Simon Horman @ 2025-10-14 14:06 UTC (permalink / raw)
To: Kory Maincent
Cc: Oleksij Rempel, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Thomas Petazzoni, kernel,
Dent Project, netdev, linux-kernel
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>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next v2 0/3] Preserve PSE PD692x0 configuration across reboots
2025-10-13 14:05 [PATCH net-next v2 0/3] Preserve PSE PD692x0 configuration across reboots Kory Maincent
` (2 preceding siblings ...)
2025-10-13 14:05 ` [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots Kory Maincent
@ 2025-10-16 1:00 ` patchwork-bot+netdevbpf
3 siblings, 0 replies; 10+ messages in thread
From: patchwork-bot+netdevbpf @ 2025-10-16 1:00 UTC (permalink / raw)
To: Kory Maincent
Cc: o.rempel, andrew+netdev, davem, edumazet, kuba, pabeni,
thomas.petazzoni, kernel, dentproject, netdev, linux-kernel
Hello:
This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:
On Mon, 13 Oct 2025 16:05:30 +0200 you wrote:
> From: Kory Maincent (Dent Project) <kory.maincent@bootlin.com>
>
> 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.
>
> [...]
Here is the summary with links:
- [net-next,v2,1/3] net: pse-pd: pd692x0: Replace __free macro with explicit kfree calls
https://git.kernel.org/netdev/net-next/c/f197902cd21a
- [net-next,v2,2/3] net: pse-pd: pd692x0: Separate configuration parsing from hardware setup
https://git.kernel.org/netdev/net-next/c/6fa1f8b64a47
- [net-next,v2,3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots
https://git.kernel.org/netdev/net-next/c/8f3d044b34fe
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] 10+ messages in thread
end of thread, other threads:[~2025-10-16 1:00 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-13 14:05 [PATCH net-next v2 0/3] Preserve PSE PD692x0 configuration across reboots Kory Maincent
2025-10-13 14:05 ` [PATCH net-next v2 1/3] net: pse-pd: pd692x0: Replace __free macro with explicit kfree calls Kory Maincent
2025-10-14 9:01 ` Simon Horman
2025-10-13 14:05 ` [PATCH net-next v2 2/3] net: pse-pd: pd692x0: Separate configuration parsing from hardware setup Kory Maincent
2025-10-14 9:02 ` Simon Horman
2025-10-13 14:05 ` [PATCH net-next v2 3/3] net: pse-pd: pd692x0: Preserve PSE configuration across reboots Kory Maincent
2025-10-14 8:58 ` Simon Horman
2025-10-14 9:56 ` Kory Maincent
2025-10-14 14:06 ` Simon Horman
2025-10-16 1:00 ` [PATCH net-next v2 0/3] Preserve PSE PD692x0 " 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;
as well as URLs for NNTP newsgroup(s).