Skip to content
  • Geert Uytterhoeven's avatar
    of_mdio: Fix broken PHY IRQ in case of probe deferral · 66bdede4
    Geert Uytterhoeven authored
    
    
    If an Ethernet PHY is initialized before the interrupt controller it is
    connected to, a message like the following is printed:
    
        irq: no irq domain found for /interrupt-controller@e61c0000 !
    
    However, the actual error is ignored, leading to a non-functional (POLL)
    PHY interrupt later:
    
        Micrel KSZ8041RNLI ee700000.ethernet-ffffffff:01: attached PHY driver [Micrel KSZ8041RNLI] (mii_bus:phy_addr=ee700000.ethernet-ffffffff:01, irq=POLL)
    
    Depending on whether the PHY driver will fall back to polling, Ethernet
    may or may not work.
    
    To fix this:
      1. Switch of_mdiobus_register_phy() from irq_of_parse_and_map() to
         of_irq_get().
         Unlike the former, the latter returns -EPROBE_DEFER if the
         interrupt controller is not yet available, so this condition can be
         detected.
         Other errors are handled the same as before, i.e. use the passed
         mdio->irq[addr] as interrupt.
      2. Propagate and handle errors from of_mdiobus_register_phy() and
         of_mdiobus_register_device().
    
    Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    66bdede4