On Tue, Apr 02, 2024 at 02:49:48PM +0100, Russell King (Oracle) wrote: > On Tue, Apr 02, 2024 at 02:37:01PM +0200, Romain Gantois wrote: > > + ret = stmmac_dvr_probe(dev, plat_dat, &stmmac_res); > > + if (ret) > > + return ret; > > + > > + ndev = platform_get_drvdata(pdev); > > + priv = netdev_priv(ndev); > > + > > + pcs_node = of_parse_phandle(np, "pcs-handle", 0); > > + if (pcs_node) { > > + pcs = miic_create(dev, pcs_node); > > + of_node_put(pcs_node); > > + if (IS_ERR(pcs)) > > + return PTR_ERR(pcs); > > + > > + priv->hw->phylink_pcs = pcs; > > + } > > I'm afraid that this fails at one of the most basic principles of kernel > multi-threaded programming. stmmac_dvr_probe() as part of its work calls > register_netdev() which publishes to userspace the network device. > > Everything that is required must be setup _prior_ to publication to > userspace to avoid races, because as soon as the network device is > published, userspace can decide to bring that interface up. If one > hasn't finished the initialisation, the interface can be brought up > before that initialisation is complete. > > I don't see anything obvious in the stmmac data structures that would > allow you to hook in at an appropriate point before the > register_netdev() but after the netdev has been created. The > priv->hw data structure is created by stmmac_hwif_init() > > I see that drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c is also > guilty of this as well, and should be fixed. It's even worse because it > does a truck load of stuff after stmmac_dvr_probe() which it most > definitely should not be doing. > > I definitely get the feeling that the structure of the stmmac driver > is really getting out of hand, and is making stuff harder for people, > and it's not improving over time - in fact, it's getting worse. It > needs a *lot* of work to bring it back to a sane model. I'm not going to say that the two patches threaded to this email are "sane" but at least it avoids the problem. socfpga still has issues with initialisation done after register_netdev() though. -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!