]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: mdio: checkpatch & documentation cleanup
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Sun, 17 May 2026 10:29:18 +0000 (12:29 +0200)
committerRobert Marko <robimarko@gmail.com>
Thu, 21 May 2026 10:10:27 +0000 (12:10 +0200)
checkpatch is complaining. Fix that. Additionally adapt the
documentation and move it up to the beginning of the driver.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/23411
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/realtek/files-6.18/drivers/net/mdio/mdio-realtek-otto.c

index b72cac5e9547e3a4dd3682545fd4c579ea30f0ea..533481f91c4cb4ff771fe624f069e99683e0d78e 100644 (file)
@@ -1,5 +1,58 @@
 // SPDX-License-Identifier: GPL-2.0-only
 
+/*
+ * On all Realtek switch platforms the hardware periodically reads the link status of all PHYs.
+ * The result is automatically written into MAC specific registers that can be consumed by a
+ * DSA driver.  This is to some degree programmable, so that one can tell the hardware to read
+ * specific C22 registers from specific pages, or C45 registers, to determine the current link
+ * speed, duplex, flow-control, ...
+ *
+ * This happens without any need for the driver to do anything at runtime, completely invisible
+ * and in a parallel hardware thread, independent of the CPU running Linux. All one needs to do
+ * is to set it up once. Having the MAC link settings automatically follow the PHY link status
+ * also happens to be the only way to control MAC port status in a meaningful way, or at least
+ * it's the only way that is fully understood, as this is what every vendor firmware is doing.
+ *
+ * The hardware PHY polling unit doesn't care about bus locking. It just assumes that all paged
+ * PHY operations are also done via the same hardware unit offering this PHY access abstractions.
+ *
+ * Additionally the devices are known to have a so called raw mode. Using the special MAX_PAGE-1
+ * with the MDIO controller found in Realtek SoCs allows to access the PHY in raw mode, i.e.
+ * bypassing the cache and paging engine of the MDIO controller. E.g. for RTL838x this is 4095.
+ *
+ * On the other hand Realtek PHYs usually make use of select register 0x1f to switch pages. There
+ * is no problem to issue separate page and access bus calls to the PHYs when they are not
+ * attached to an Realtek SoC. The design should be to keep the PHY code bus independent.
+ *
+ * To bring all this together one needs a tricky bus design that intercepts select page calls but
+ * lets raw page accesses through. And especially knows how to handle raw accesses to the select
+ * register.
+ *
+ * While C45 clause handling is pretty standard the legacy functions basically track the accesses
+ * and the state of the bus with the rtmd_port attributes of the control structure. The page
+ * selection works as follows:
+ *
+ * phy_write(phydev, RTMD_PAGE_SELECT, 12)     : store internal page 12 in driver
+ * phy_write(phydev, 7, 33)                    : write page=12, reg=7, val=33
+ *
+ * Any Realtek PHY that is connected to this bus must simply provide the standard page functions:
+ *
+ * define RTL821X_PAGE_SELECT 0x1f
+ *
+ * static int rtl821x_read_page(struct phy_device *phydev)
+ * {
+ *   return __phy_read(phydev, RTL821X_PAGE_SELECT);
+ * }
+ *
+ * static int rtl821x_write_page(struct phy_device *phydev, int page)
+ * {
+ *   return __phy_write(phydev, RTL821X_PAGE_SELECT, page);
+ * }
+ *
+ * In case there are non Realtek PHYs attached to the bus the logic might need to be changed.
+ * For now it should be sufficient.
+ */
+
 #include <linux/fwnode.h>
 #include <linux/fwnode_mdio.h>
 #include <linux/mfd/syscon.h>
 #define for_each_sds_port(ctrl, pn) \
        for_each_set_bit(pn, (ctrl)->sds_ports, RTMD_MAX_PORTS)
 
-/*
- * On all Realtek switch platforms the hardware periodically reads the link status of all
- * PHYs. This is to some degree programmable, so that one can tell the hardware to read
- * specific C22 registers from specific pages, or C45 registers, to determine the current
- * link speed, duplex, flow-control, ...
- *
- * This happens without any need for the driver to do anything at runtime, completely
- * invisible and in a parallel hardware thread, independent of the CPU running Linux.
- * All one needs to do is to set it up once. Having the MAC link settings automatically
- * follow the PHY link status also happens to be the only way to control MAC port status
- * in a meaningful way, or at least it's the only way we fully understand, as this is
- * what every vendor firmware is doing.
- *
- * The hardware PHY polling unit doesn't care about bus locking, it just assumes that all
- * paged PHY operations are also done via the same hardware unit offering this PHY access
- * abstractions.
- *
- * Additionally at least the RTL838x and RTL839x devices are known to have a so called
- * raw mode. Using the special MAX_PAGE-1 with the MDIO controller found in Realtek
- * SoCs allows to access the PHY in raw mode, ie. bypassing the cache and paging engine
- * of the MDIO controller. E.g. for RTL838x this is 0xfff.
- *
- * On the other hand Realtek PHYs usually make use of select register 0x1f to switch
- * pages. There is no problem to issue separate page and access bus calls to the PHYs
- * when they are not attached to an Realtek SoC. The paradigm should be to keep the PHY
- * implementation bus independent.
- *
- * To bring all this together we need a tricky bus design that intercepts select page
- * calls but lets raw page accesses through. And especially knows how to handle raw
- * accesses to the select register. Additionally we need the possibility to write to
- * all 8 ports of the PHY individually.
- *
- * While the C45 clause stuff is pretty standard the legacy functions basically track
- * the accesses and the state of the bus with the rtmd_port attributes of the control
- * structure. The page selection works as follows:
- *
- * phy_write(phydev, RTMD_PAGE_SELECT, 12)     : store internal page 12 in driver
- * phy_write(phydev, 7, 33)                    : write page=12, reg=7, val=33
- *
- * or simply
- *
- * phy_write_paged(phydev, 12, 7, 33)          : write page=12, reg=7, val=33
- *
- * Any Realtek PHY that will be connected to this bus must simply provide the standard
- * page functions:
- *
- * define RTL821X_PAGE_SELECT 0x1f
- *
- * static int rtl821x_read_page(struct phy_device *phydev)
- * {
- *   return __phy_read(phydev, RTL821X_PAGE_SELECT);
- * }
- *
- * static int rtl821x_write_page(struct phy_device *phydev, int page)
- * {
- *   return __phy_write(phydev, RTL821X_PAGE_SELECT, page);
- * }
- *
- * In case there are non Realtek PHYs attached to the bus the logic might need to be
- * reimplemented. For now it should be sufficient.
- */
-
 struct rtmd_port {
        int page;
        bool raw;
@@ -225,7 +216,7 @@ struct rtmd_bus {
 };
 
 struct rtmd_ctrl {
-       struct mutex lock;
+       struct mutex lock; /* protect HW access */
        struct regmap *map;
        const struct rtmd_config *cfg;
        struct rtmd_port port[RTMD_MAX_PORTS];
@@ -291,7 +282,7 @@ static int rtmd_phy_to_port(struct mii_bus *bus, int phy)
 }
 
 static int rtmd_run_cmd(struct mii_bus *bus, u32 cmd,
-                         struct rtmd_command_data *cmd_data, u32 *val)
+                       struct rtmd_command_data *cmd_data, u32 *val)
 {
        struct rtmd_ctrl *ctrl = rtmd_ctrl_from_bus(bus);
        u32 cmdstate;
@@ -992,7 +983,8 @@ static int rtmd_map_ports(struct device *dev)
 
                if (test_bit(pn, ctrl->phy_ports) ||
                    test_bit(pn, ctrl->sds_ports))
-                       return dev_err_probe(dev, -EINVAL, "%pfwP duplicate port number\n", fw_port);
+                       return dev_err_probe(dev, -EINVAL, "%pfwP duplicate port number\n",
+                                            fw_port);
 
                struct fwnode_handle *fw_phy __free(fwnode_handle) =
                        fwnode_find_reference(fw_port, "phy-handle", 0);
@@ -1028,7 +1020,7 @@ static int rtmd_map_ports(struct device *dev)
 }
 
 static int rtmd_probe_one(struct device *dev, struct rtmd_ctrl *ctrl,
-                           struct fwnode_handle *fw_bus)
+                         struct fwnode_handle *fw_bus)
 {
        struct rtmd_chan *chan;
        struct mii_bus *bus;
@@ -1224,22 +1216,10 @@ static const struct rtmd_config rtmd_931x_cfg = {
 };
 
 static const struct of_device_id rtmd_ids[] = {
-       {
-               .compatible = "realtek,rtl8380-mdio",
-               .data = &rtmd_838x_cfg,
-       },
-       {
-               .compatible = "realtek,rtl8392-mdio",
-               .data = &rtmd_839x_cfg,
-       },
-       {
-               .compatible = "realtek,rtl9301-mdio",
-               .data = &rtmd_930x_cfg,
-       },
-       {
-               .compatible = "realtek,rtl9311-mdio",
-               .data = &rtmd_931x_cfg,
-       },
+       { .compatible = "realtek,rtl8380-mdio", .data = &rtmd_838x_cfg, },
+       { .compatible = "realtek,rtl8392-mdio", .data = &rtmd_839x_cfg, },
+       { .compatible = "realtek,rtl9301-mdio", .data = &rtmd_930x_cfg, },
+       { .compatible = "realtek,rtl9311-mdio", .data = &rtmd_931x_cfg, },
        { /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, rtmd_ids);
@@ -1256,4 +1236,4 @@ module_platform_driver(rtmd_driver);
 
 MODULE_AUTHOR("Markus Stockhausen <markus.stockhausen@gmx.de>");
 MODULE_DESCRIPTION("Realtek Otto MDIO driver");
-MODULE_LICENSE("GPL v2");
+MODULE_LICENSE("GPL");