On Mon, Mar 20, 2023 at 08:41:53PM -0700, Jakub Kicinski wrote: > On Mon, 20 Mar 2023 17:16:14 -0500 Andrew Halaney wrote: > > The next approach that was checked was to have a function pointer > > embedded inside a structure that does the appropriate conversion based > > on the variant that's in use. However, some of the function definitions > > are like the following: > > > > void emac3_set_rx_ring_len(void __iomem *ioaddr, u32 len, u32 chan) > > I checked a couple of callbacks and they seem to all be called with > priv->iomem as an arg, so there is no strong reason to pass iomem > instead of priv / hw. Or at least not to pass both.. > > I think that's a better approach than adding the wrappers :( > > Are you familiar with coccinelle / spatch? It's often better than > just regexps for refactoring, maybe it can help? > No worries, I'll try and refactor as you mentioned. Looking at it some this afternoon makes me think I'll try something like this: diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.h b/drivers/net/ethernet/stmicro/stmmac/hwif.h index 16a7421715cb..75c55f696c7a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/hwif.h +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.h @@ -12,7 +12,7 @@ ({ \ int __result = -EINVAL; \ if ((__priv)->hw->__module && (__priv)->hw->__module->__cname) { \ - (__priv)->hw->__module->__cname((__arg0), ##__args); \ + (__priv)->hw->__module->__cname((__priv), (__arg0), ##__args); \ __result = 0; \ } \ __result; \ @@ -21,7 +21,7 @@ ({ \ int __result = -EINVAL; \ if ((__priv)->hw->__module && (__priv)->hw->__module->__cname) \ - __result = (__priv)->hw->__module->__cname((__arg0), ##__args); \ + __result = (__priv)->hw->__module->__cname((__priv), (__arg0), ##__args); \ __result; \ }) @@ -34,68 +34,68 @@ struct dma_edesc; /* Descriptors helpers */ struct stmmac_desc_ops { /* DMA RX descriptor ring initialization */ - void (*init_rx_desc)(struct dma_desc *p, int disable_rx_ic, int mode, - int end, int bfsize); + void (*init_rx_desc)(struct stmmac_priv *priv, struct dma_desc *p, + int disable_rx_ic, int mode, int end, int bfsize); /* DMA TX descriptor ring initialization */ (...) and then, I'll add something like: diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h index a152678b82b7..f5f406a09ae3 100644 --- a/include/linux/stmmac.h +++ b/include/linux/stmmac.h @@ -273,5 +273,7 @@ struct plat_stmmacenet_data { bool use_phy_wol; bool sph_disable; bool serdes_up_after_phy_linkup; + u32 mtl_base; + u32 mtl_offset; }; #endif and rewrite: #define MTL_CHANX_BASE_ADDR(x) (MTL_CHAN_BASE_ADDR + \ (x * MTL_CHAN_BASE_OFFSET)) to use mtl_base/offset if they exist, and so on for the DMA versions, etc... I'm sure I'll probably run into some issue and change course slightly, but thought I'd post a hint of the path to make sure I'm not way off the mark. Thanks for your feedback, Andrew