Message ID | 1595421487-13978-1-git-send-email-claudiu.manoil@nxp.com |
---|---|
State | Not Applicable |
Headers | show |
Series | [net] enetc: Remove the mdio bus on PF probe bailout | expand |
>-----Original Message----- >From: netdev-owner@vger.kernel.org <netdev-owner@vger.kernel.org> On >Behalf Of Claudiu Manoil >Sent: Wednesday, July 22, 2020 3:38 PM >To: David S . Miller <davem@davemloft.net> >Cc: netdev@vger.kernel.org >Subject: [PATCH net] enetc: Remove the mdio bus on PF probe bailout Please disregard this patch, it was backported from net-next and does not build on top of net. Will send v2 shortly. Sorry.
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c index 4fac57dbb3c8..bd42732f1375 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c @@ -827,6 +827,7 @@ static void enetc_of_put_phy(struct enetc_ndev_priv *priv) { struct device_node *np = priv->dev->of_node; + enetc_mdio_remove(pf); if (np && of_phy_is_fixed_link(np)) of_phy_deregister_fixed_link(np); if (priv->phy_node) @@ -932,7 +933,6 @@ static void enetc_pf_remove(struct pci_dev *pdev) priv = netdev_priv(si->ndev); unregister_netdev(si->ndev); - enetc_mdio_remove(pf); enetc_of_put_phy(priv); enetc_free_msix(priv);
For ENETC ports that register an external MDIO bus, the bus doesn't get removed on the error bailout path of enetc_pf_probe(). Fix this by unregistering the bus inside enetc_of_put_phy(), since enetc_of_get_phy() is were it gets registered. This issue became much more visible after recent: commit 07095c025ac2 ("net: enetc: Use DT protocol information to set up the ports") Before this commit, one could make probing fail on the error path only by having register_netdev() fail, which is unlikely. But after this commit, because it moved the enetc_of_phy_get() call up in the probing sequence, now we can trigger an mdiobus_free() bug just by forcing enetc_alloc_msix() to return error, i.e. with the 'pci=nomsi' kernel bootarg (since ENETC relies on MSI support to work), as the calltrace below shows: kernel BUG at /home/eiz/work/enetc/net/drivers/net/phy/mdio_bus.c:648! Internal error: Oops - BUG: 0 [#1] PREEMPT SMP [...] Hardware name: LS1028A RDB Board (DT) pstate: 80000005 (Nzcv daif -PAN -UAO BTYPE=--) pc : mdiobus_free+0x50/0x58 lr : devm_mdiobus_free+0x14/0x20 [...] Call trace: mdiobus_free+0x50/0x58 devm_mdiobus_free+0x14/0x20 release_nodes+0x138/0x228 devres_release_all+0x38/0x60 really_probe+0x1c8/0x368 driver_probe_device+0x5c/0xc0 device_driver_attach+0x74/0x80 __driver_attach+0x8c/0xd8 bus_for_each_dev+0x7c/0xd8 driver_attach+0x24/0x30 bus_add_driver+0x154/0x200 driver_register+0x64/0x120 __pci_register_driver+0x44/0x50 enetc_pf_driver_init+0x24/0x30 do_one_initcall+0x60/0x1c0 kernel_init_freeable+0x1fc/0x274 kernel_init+0x14/0x110 ret_from_fork+0x10/0x34 Fixes: ebfcb23d62ab ("enetc: Add ENETC PF level external MDIO support") Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com> --- drivers/net/ethernet/freescale/enetc/enetc_pf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)