]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: stmmac: provide function to lookup hwif
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Wed, 29 Oct 2025 00:03:36 +0000 (00:03 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 30 Oct 2025 00:18:22 +0000 (17:18 -0700)
Provide a function to lookup the hwif entry given the core type,
Synopsys version, and device ID (used for XGMAC cores).

Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Tested-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Tested-by: Mohd Ayaan Anwar <mohd.anwar@oss.qualcomm.com>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1vDtf6-0000000CCCL-1cQA@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/hwif.c

index 26cc1bc758bfb43612254d203cc17fc7b9072925..892cef79c4d10cce61fb96c52175efac22d09b78 100644 (file)
@@ -299,6 +299,30 @@ static const struct stmmac_hwif_entry {
        },
 };
 
+static const struct stmmac_hwif_entry *
+stmmac_hwif_find(enum dwmac_core_type core_type, u8 snpsver, u8 dev_id)
+{
+       const struct stmmac_hwif_entry *entry;
+       int i;
+
+       for (i = ARRAY_SIZE(stmmac_hw) - 1; i >= 0; i--) {
+               entry = &stmmac_hw[i];
+
+               if (core_type != entry->core_type)
+                       continue;
+               /* Use synopsys_id var because some setups can override this */
+               if (snpsver < entry->min_id)
+                       continue;
+               if (core_type == DWMAC_CORE_XGMAC &&
+                   (dev_id ^ entry->dev_id))
+                       continue;
+
+               return entry;
+       }
+
+       return NULL;
+}
+
 int stmmac_hwif_init(struct stmmac_priv *priv)
 {
        enum dwmac_core_type core_type = priv->plat->core_type;
@@ -306,7 +330,7 @@ int stmmac_hwif_init(struct stmmac_priv *priv)
        struct stmmac_version version;
        struct mac_device_info *mac;
        bool needs_setup = true;
-       int i, ret;
+       int ret;
 
        stmmac_get_version(priv, &version);
 
@@ -339,18 +363,10 @@ int stmmac_hwif_init(struct stmmac_priv *priv)
        spin_lock_init(&mac->irq_ctrl_lock);
 
        /* Fallback to generic HW */
-       for (i = ARRAY_SIZE(stmmac_hw) - 1; i >= 0; i--) {
-               entry = &stmmac_hw[i];
-
-               if (core_type != entry->core_type)
-                       continue;
-               /* Use synopsys_id var because some setups can override this */
-               if (priv->synopsys_id < entry->min_id)
-                       continue;
-               if (core_type == DWMAC_CORE_XGMAC &&
-                   (version.dev_id ^ entry->dev_id))
-                       continue;
 
+       /* Use synopsys_id var because some setups can override this */
+       entry = stmmac_hwif_find(core_type, priv->synopsys_id, version.dev_id);
+       if (entry) {
                /* Only use generic HW helpers if needed */
                mac->desc = mac->desc ? : entry->desc;
                mac->dma = mac->dma ? : entry->dma;