lkml.org 
[lkml]   [2020]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 090/179] enetc: Remove the mdio bus on PF probe bailout
    Date
    From: Claudiu Manoil <claudiu.manoil@nxp.com>

    [ Upstream commit 26cb7085c8984e5b71d65c374a135134ed8cabb3 ]

    For ENETC ports that register an external MDIO bus,
    the bus doesn't get removed on the error bailout path
    of enetc_pf_probe().

    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>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/freescale/enetc/enetc_pf.c | 1 +
    1 file changed, 1 insertion(+)

    diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
    index 438648a06f2ae..041e19895adfa 100644
    --- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
    +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
    @@ -919,6 +919,7 @@ static int enetc_pf_probe(struct pci_dev *pdev,
    return 0;

    err_reg_netdev:
    + enetc_mdio_remove(pf);
    enetc_of_put_phy(priv);
    enetc_free_msix(priv);
    err_alloc_msix:
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-07-27 16:24    [W:3.099 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site