diff mbox series

[net-next] net: pcs: rzn1-miic: update speed only if interface is changed

Message ID 20220629122003.189397-1-clement.leger@bootlin.com (mailing list archive)
State Accepted
Commit 90c74f4d90ad769fc84e0b91a08b5514d83aa683
Delegated to: Netdev Maintainers
Headers show
Series [net-next] net: pcs: rzn1-miic: update speed only if interface is changed | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix success Link
netdev/cover_letter success Single patches do not need cover letters
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers success CCed 10 of 10 maintainers
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 46 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Clément Léger June 29, 2022, 12:20 p.m. UTC
As stated by Russel King, miic_config() can be called as a result of
ethtool setting the configuration while the link is already up. Since
the speed is also set in this function, it could potentially modify
the current speed that is set. This will only happen if there is
no PHY present and we aren't using fixed-link mode.

Handle that by storing the current interface mode in the miic_port
structure and update the speed only if the interface mode is going to
be changed.

Signed-off-by: Clément Léger <clement.leger@bootlin.com>
---
 drivers/net/pcs/pcs-rzn1-miic.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

Comments

patchwork-bot+netdevbpf@kernel.org July 2, 2022, 3:20 a.m. UTC | #1
Hello:

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

On Wed, 29 Jun 2022 14:20:03 +0200 you wrote:
> As stated by Russel King, miic_config() can be called as a result of
> ethtool setting the configuration while the link is already up. Since
> the speed is also set in this function, it could potentially modify
> the current speed that is set. This will only happen if there is
> no PHY present and we aren't using fixed-link mode.
> 
> Handle that by storing the current interface mode in the miic_port
> structure and update the speed only if the interface mode is going to
> be changed.
> 
> [...]

Here is the summary with links:
  - [net-next] net: pcs: rzn1-miic: update speed only if interface is changed
    https://git.kernel.org/netdev/net-next/c/90c74f4d90ad

You are awesome, thank you!
diff mbox series

Patch

diff --git a/drivers/net/pcs/pcs-rzn1-miic.c b/drivers/net/pcs/pcs-rzn1-miic.c
index 8f5e910f443d..a7dab7b48dda 100644
--- a/drivers/net/pcs/pcs-rzn1-miic.c
+++ b/drivers/net/pcs/pcs-rzn1-miic.c
@@ -138,11 +138,13 @@  struct miic {
  * @miic: backiling to MII converter structure
  * @pcs: PCS structure associated to the port
  * @port: port number
+ * @interface: interface mode of the port
  */
 struct miic_port {
 	struct miic *miic;
 	struct phylink_pcs pcs;
 	int port;
+	phy_interface_t interface;
 };
 
 static struct miic_port *phylink_pcs_to_miic_port(struct phylink_pcs *pcs)
@@ -190,8 +192,8 @@  static int miic_config(struct phylink_pcs *pcs, unsigned int mode,
 {
 	struct miic_port *miic_port = phylink_pcs_to_miic_port(pcs);
 	struct miic *miic = miic_port->miic;
+	u32 speed, conv_mode, val, mask;
 	int port = miic_port->port;
-	u32 speed, conv_mode, val;
 
 	switch (interface) {
 	case PHY_INTERFACE_MODE_RMII:
@@ -216,11 +218,20 @@  static int miic_config(struct phylink_pcs *pcs, unsigned int mode,
 		return -EOPNOTSUPP;
 	}
 
-	val = FIELD_PREP(MIIC_CONVCTRL_CONV_MODE, conv_mode) |
-	      FIELD_PREP(MIIC_CONVCTRL_CONV_SPEED, speed);
+	val = FIELD_PREP(MIIC_CONVCTRL_CONV_MODE, conv_mode);
+	mask = MIIC_CONVCTRL_CONV_MODE;
 
-	miic_reg_rmw(miic, MIIC_CONVCTRL(port),
-		     MIIC_CONVCTRL_CONV_MODE | MIIC_CONVCTRL_CONV_SPEED, val);
+	/* Update speed only if we are going to change the interface because
+	 * the link might already be up and it would break it if the speed is
+	 * changed.
+	 */
+	if (interface != miic_port->interface) {
+		val |= FIELD_PREP(MIIC_CONVCTRL_CONV_SPEED, speed);
+		mask |= MIIC_CONVCTRL_CONV_SPEED;
+		miic_port->interface = interface;
+	}
+
+	miic_reg_rmw(miic, MIIC_CONVCTRL(port), mask, val);
 	miic_converter_enable(miic_port->miic, miic_port->port, 1);
 
 	return 0;