realtek: Use atomic poll for aux-mdio commands
authorSander Vanheule <sander@svanheule.net>
Thu, 16 Jan 2025 12:23:54 +0000 (13:23 +0100)
committerSander Vanheule <sander@svanheule.net>
Thu, 16 Jan 2025 12:56:55 +0000 (13:56 +0100)
regmap_read_poll_timeout() relies on usleep_range() to time the polling
loop. With the current, rather large, scheduling interval, a short
usleep_range() may take a lot longer than expected, causing performance
issues.

Switch the driver over to using regmap_read_poll_timeout_atomic(), which
uses udelay() to time the polling loop.

For comparision, the 'ethtool -m <dev>' command is about 10 times faster
with the atomic variant.
Using 'perf -r10 ethtool -m lan25':
  - Driver using regmap_read_poll_timeout():
      2.0117 +- 0.0118 seconds time elapsed  ( +-  0.58% )
  - Driver using regmap_read_poll_timeout_atomic():
      0.1674 +- 0.0250 seconds time elapsed  ( +- 14.95% )

Signed-off-by: Sander Vanheule <sander@svanheule.net>
target/linux/realtek/patches-6.6/723-net-mdio-Add-Realtek-Otto-auxiliary-controller.patch

index 430f8f5c007ecca26910fea182ce8e66187756af..a58cc496efe1dc4c459227e5e09dd220f153d8eb 100644 (file)
@@ -103,7 +103,7 @@ Signed-off-by: Sander Vanheule <sander@svanheule.net>
 +      if (err)
 +              return err;
 +
-+      err = regmap_read_poll_timeout(ctrl->map, ctrl->cmd_reg, run, (run != cmd), 3, 100);
++      err = regmap_read_poll_timeout_atomic(ctrl->map, ctrl->cmd_reg, run, (run != cmd), 3, 100);
 +
 +      if ((run & ~mask_volatile) != (cmd & ~mask_volatile)) {
 +              dev_err(ctrl->dev, "Command modified. Is offloading still active?");