lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 055/757] ixgbe: fix probing of multi-port devices with one MDIO
    Date
    From: Jakub Kicinski <kuba@kernel.org>

    [ Upstream commit bd7f14df9492e7d3772812a215fca66e6737e598 ]

    Ian reports that after upgrade from v5.8.14 to v5.9 only one
    of his 4 ixgbe netdevs appear in the system.

    Quoting the comment on ixgbe_x550em_a_has_mii():
    * Returns true if hw points to lowest numbered PCI B:D.F x550_em_a device in
    * the SoC. There are up to 4 MACs sharing a single MDIO bus on the x550em_a,
    * but we only want to register one MDIO bus.

    This matches the symptoms, since the return value from
    ixgbe_mii_bus_init() is no longer ignored we need to handle
    the higher ports of x550em without an error.

    Fixes: 09ef193fef7e ("net: ethernet: ixgbe: check the return value of ixgbe_mii_bus_init()")
    Reported-by: Ian Kumlien <ian.kumlien@gmail.com>
    Tested-by: Ian Kumlien <ian.kumlien@gmail.com>
    Acked-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
    Link: https://lore.kernel.org/r/20201016232006.3352947-1-kuba@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 23 ++++++++++++++---------
    1 file changed, 14 insertions(+), 9 deletions(-)

    --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
    +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c
    @@ -901,15 +901,13 @@ static bool ixgbe_x550em_a_has_mii(struc
    **/
    s32 ixgbe_mii_bus_init(struct ixgbe_hw *hw)
    {
    + s32 (*write)(struct mii_bus *bus, int addr, int regnum, u16 val);
    + s32 (*read)(struct mii_bus *bus, int addr, int regnum);
    struct ixgbe_adapter *adapter = hw->back;
    struct pci_dev *pdev = adapter->pdev;
    struct device *dev = &adapter->netdev->dev;
    struct mii_bus *bus;

    - bus = devm_mdiobus_alloc(dev);
    - if (!bus)
    - return -ENOMEM;
    -
    switch (hw->device_id) {
    /* C3000 SoCs */
    case IXGBE_DEV_ID_X550EM_A_KR:
    @@ -922,16 +920,23 @@ s32 ixgbe_mii_bus_init(struct ixgbe_hw *
    case IXGBE_DEV_ID_X550EM_A_1G_T:
    case IXGBE_DEV_ID_X550EM_A_1G_T_L:
    if (!ixgbe_x550em_a_has_mii(hw))
    - return -ENODEV;
    - bus->read = &ixgbe_x550em_a_mii_bus_read;
    - bus->write = &ixgbe_x550em_a_mii_bus_write;
    + return 0;
    + read = &ixgbe_x550em_a_mii_bus_read;
    + write = &ixgbe_x550em_a_mii_bus_write;
    break;
    default:
    - bus->read = &ixgbe_mii_bus_read;
    - bus->write = &ixgbe_mii_bus_write;
    + read = &ixgbe_mii_bus_read;
    + write = &ixgbe_mii_bus_write;
    break;
    }

    + bus = devm_mdiobus_alloc(dev);
    + if (!bus)
    + return -ENOMEM;
    +
    + bus->read = read;
    + bus->write = write;
    +
    /* Use the position of the device in the PCI hierarchy as the id */
    snprintf(bus->id, MII_BUS_ID_SIZE, "%s-mdio-%s", ixgbe_driver_name,
    pci_name(pdev));

    \
     
     \ /
      Last update: 2020-10-27 17:11    [W:4.048 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site