Skip to content
  • Claudiu Manoil's avatar
    26cb7085
    enetc: Remove the mdio bus on PF probe bailout · 26cb7085
    Claudiu Manoil authored
    
    
    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 07095c02 ("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: ebfcb23d ("enetc: Add ENETC PF level external MDIO support")
    Signed-off-by: default avatarClaudiu Manoil <claudiu.manoil@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    26cb7085
    enetc: Remove the mdio bus on PF probe bailout
    Claudiu Manoil authored
    
    
    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 07095c02 ("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: ebfcb23d ("enetc: Add ENETC PF level external MDIO support")
    Signed-off-by: default avatarClaudiu Manoil <claudiu.manoil@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Loading