]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: mdio: harden bus number checks
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Sun, 3 May 2026 07:36:18 +0000 (09:36 +0200)
committerRobert Marko <robimarko@gmail.com>
Tue, 5 May 2026 11:12:16 +0000 (13:12 +0200)
The mdio hardware is fully understood. Describe the number of real
busses in the configuration structure and check against this limit
when working on busses.

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

index d530bdffc44955a5167724d59dc6687f5d6f4e0a..30295cf694acbb573cea2b6e656c436c2e9ec4a3 100644 (file)
 #define RTMDIO_MAX_PORTS                       57
 #define RTMDIO_MAX_SMI_BUSSES                  4
 
+#define RTMDIO_838X_NUM_BUSSES                 1
 #define RTMDIO_838X_NUM_PAGES                  4096
+#define RTMDIO_839X_NUM_BUSSES                 2
 #define RTMDIO_839X_NUM_PAGES                  8192
+#define RTMDIO_930X_NUM_BUSSES                 4
 #define RTMDIO_930X_NUM_PAGES                  4096
+#define RTMDIO_931X_NUM_BUSSES                 4
 #define RTMDIO_931X_NUM_PAGES                  8192
 #define RTMDIO_PAGE_SELECT                     0x1f
 #define RTMDIO_RAW_PAGE(p)                     ((p) - 1)
@@ -213,6 +217,7 @@ struct rtmdio_config {
        u32 cmd_mask;
        u32 cmd_reg;
        int bus_map_base;
+       u16 num_busses;
        u16 num_pages;
        u16 num_phys;
        int port_map_base;
@@ -724,7 +729,7 @@ static int rtmdio_839x_setup_ctrl(struct rtmdio_ctrl *ctrl)
 static int rtmdio_930x_setup_ctrl(struct rtmdio_ctrl *ctrl)
 {
        /* Define C22/C45 bus feature set */
-       for (int smi_bus = 0; smi_bus < RTMDIO_MAX_SMI_BUSSES; smi_bus++)
+       for (int smi_bus = 0; smi_bus < ctrl->cfg->num_busses; smi_bus++)
                regmap_assign_bits(ctrl->map, RTMDIO_930X_SMI_GLB_CTRL,
                                   BIT(16 + smi_bus), ctrl->bus[smi_bus].is_c45);
 
@@ -776,7 +781,7 @@ static int rtmdio_931x_setup_ctrl(struct rtmdio_ctrl *ctrl)
        msleep(100);
 
        /* Define C22/C45 bus feature set */
-       for (int smi_bus = 0; smi_bus < RTMDIO_MAX_SMI_BUSSES; smi_bus++) {
+       for (int smi_bus = 0; smi_bus < ctrl->cfg->num_busses; smi_bus++) {
                if (ctrl->bus[smi_bus].is_c45)
                        c45_mask |= 0x2 << (smi_bus * 2);  /* Std. C45, non-standard is 0x3 */
        }
@@ -876,7 +881,7 @@ static int rtmdio_map_ports(struct device *dev)
                        return dev_err_probe(dev, -EINVAL, "%pfwP no bus address\n",
                                             of_fwnode_handle(phy->parent));
 
-               if (smi_bus >= RTMDIO_MAX_SMI_BUSSES)
+               if (smi_bus >= ctrl->cfg->num_busses)
                        return dev_err_probe(dev, -EINVAL, "%pfwP illegal bus number\n",
                                             of_fwnode_handle(phy->parent));
 
@@ -970,6 +975,7 @@ static const struct rtmdio_config rtmdio_838x_cfg = {
        .cmd_fail       = RTMDIO_838X_CMD_FAIL,
        .cmd_mask       = RTMDIO_838X_CMD_MASK,
        .cmd_reg        = RTMDIO_838X_SMI_ACCESS_PHY_CTRL_1,
+       .num_busses     = RTMDIO_838X_NUM_BUSSES,
        .num_pages      = RTMDIO_838X_NUM_PAGES,
        .num_phys       = 28,
        .port_map_base  = RTMDIO_838X_SMI_PORT0_5_ADDR_CTRL,
@@ -989,6 +995,7 @@ static const struct rtmdio_config rtmdio_839x_cfg = {
        .cmd_fail       = RTMDIO_839X_CMD_FAIL,
        .cmd_mask       = RTMDIO_839X_CMD_MASK,
        .cmd_reg        = RTMDIO_839X_PHYREG_ACCESS_CTRL,
+       .num_busses     = RTMDIO_839X_NUM_BUSSES,
        .num_pages      = RTMDIO_839X_NUM_PAGES,
        .num_phys       = 52,
        .read_c22       = rtmdio_839x_read_c22,
@@ -1007,6 +1014,7 @@ static const struct rtmdio_config rtmdio_930x_cfg = {
        .cmd_mask       = RTMDIO_930X_CMD_MASK,
        .cmd_reg        = RTMDIO_930X_SMI_ACCESS_PHY_CTRL_1,
        .bus_map_base   = RTMDIO_930X_SMI_PORT0_15_POLLING_SEL,
+       .num_busses     = RTMDIO_930X_NUM_BUSSES,
        .num_pages      = RTMDIO_930X_NUM_PAGES,
        .num_phys       = 28,
        .port_map_base  = RTMDIO_930X_SMI_PORT0_5_ADDR_CTRL,
@@ -1027,6 +1035,7 @@ static const struct rtmdio_config rtmdio_931x_cfg = {
        .cmd_mask       = RTMDIO_931X_CMD_MASK,
        .cmd_reg        = RTMDIO_931X_SMI_INDRT_ACCESS_CTRL_0,
        .bus_map_base   = RTMDIO_931X_SMI_PORT_POLLING_SEL,
+       .num_busses     = RTMDIO_931X_NUM_BUSSES,
        .num_pages      = RTMDIO_931X_NUM_PAGES,
        .num_phys       = 56,
        .port_map_base  = RTMDIO_931X_SMI_PORT_ADDR_CTRL,