• Alexey Brodkin's avatar
    stmmac: check IRQ availability early on probe · 8f02d8da
    Alexey Brodkin authored
    Currently we're getting IRQs after lots of resources are already
    allocated:
     * netdev
     * clocks
     * MDIO bus
    Also HW gets initialized by the time when checking IRQs as well.
    
    Now there's a possibility for master interrupt controller to be not
    probed yet. This will lead to exit from GMAC probe routine with "-
    EPROBE_DEFER" and so deferred probe will hapen later on.
    
    But since we exited the first GMAC probe without release of all
    allocated resources there could be conflicts on subsequent probes.
    
    For example this is what happens for me:
     --->8---
     stmmaceth e0018000.ethernet: no reset control found
     stmmac - user ID: 0x10, Synopsys ID: 0x37
      Ring mode enabled
      DMA HW capability register supported
      Normal descriptors
      RX Checksum Offload Engine supported (type 2)
      TX Checksum insertion supported
      Enable RX Mitigation via HW Watchdog Timer
     libphy: stmmac: probed
     eth0: PHY ID 20005c7a at 1 IRQ POLL (stmmac-0:01) active
     platform e0018000.ethernet: Driver stmmaceth requests probe deferral
     ...
     ...
     ...
     stmmaceth e0018000.ethernet: no reset control found
     stmmac - user ID: 0x10, Synopsys ID: 0x37
      Ring mode enabled
      DMA HW capability register supported
      Normal descriptors
      RX Checksum Offload Engine supported (type 2)
      TX Checksum insertion supported
      Enable RX Mitigation via HW Watchdog Timer
     ------------[ cut here ]------------
     WARNING: CPU: 0 PID: 6 at fs/sysfs/dir.c:31 sysfs_warn_dup+0x4e/0x68()
     sysfs: cannot create duplicate filename
    '/devices/platform/axs10x_mb/e0018000.ethernet/mdio_bus/stmmac-0'
     CPU: 0 PID: 6 Comm: kworker/u2:0 Not tainted 4.0.0-rc1-next-20150303+#8
     Workqueue: deferwq deferred_probe_work_func
    
     Stack Trace:
      arc_unwind_core+0xb8/0x114
      warn_slowpath_common+0x5a/0x8c
      warn_slowpath_fmt+0x2e/0x38
      sysfs_warn_dup+0x4e/0x68
      sysfs_create_dir_ns+0x98/0xa0
      kobject_add_internal+0x8c/0x2e8
      kobject_add+0x4a/0x8c
      device_add+0xc6/0x448
      mdiobus_register+0x6c/0x164
      stmmac_mdio_register+0x112/0x264
      stmmac_dvr_probe+0x6c0/0x85c
      stmmac_pltfr_probe+0x2e4/0x50c
      platform_drv_probe+0x26/0x5c
      really_probe+0x76/0x1dc
      bus_for_each_drv+0x42/0x7c
      device_attach+0x64/0x6c
      bus_probe_device+0x74/0xa4
      deferred_probe_work_func+0x50/0x84
      process_one_work+0xf8/0x2cc
      worker_thread+0x110/0x478
      kthread+0x8a/0x9c
      ret_from_fork+0x14/0x18
     ---[ end trace a2dfaa7d630c8be1 ]---
     ------------[ cut here ]------------
     WARNING: CPU: 0 PID: 6 at lib/kobject.c:240
    kobject_add_internal+0x218/0x2e8()
     kobject_add_internal failed for stmmac-0 with -EEXIST, don't try to
    register things with the same name in the same di.
     CPU: 0 PID: 6 Comm: kworker/u2:0 Tainted: G        W
    4.0.0-rc1-next-20150303+ #8
     Workqueue: deferwq deferred_probe_work_func
    
     Stack Trace:
      arc_unwind_core+0xb8/0x114
      warn_slowpath_common+0x5a/0x8c
      warn_slowpath_fmt+0x2e/0x38
      kobject_add_internal+0x218/0x2e8
      kobject_add+0x4a/0x8c
      device_add+0xc6/0x448
      mdiobus_register+0x6c/0x164
      stmmac_mdio_register+0x112/0x264
      stmmac_dvr_probe+0x6c0/0x85c
      stmmac_pltfr_probe+0x2e4/0x50c
      platform_drv_probe+0x26/0x5c
      really_probe+0x76/0x1dc
      bus_for_each_drv+0x42/0x7c
      device_attach+0x64/0x6c
      bus_probe_device+0x74/0xa4
      deferred_probe_work_func+0x50/0x84
      process_one_work+0xf8/0x2cc
      worker_thread+0x110/0x478
      kthread+0x8a/0x9c
      ret_from_fork+0x14/0x18
     ---[ end trace a2dfaa7d630c8be2 ]---
     libphy: mii_bus stmmac-0 failed to register
     : Cannot register as MDIO bus
     stmmac_pltfr_probe: main driver probe failed
     stmmaceth: probe of e0018000.ethernet failed with error -22
     --->8---
    
    Essential fix is to check for IRQs availability as early as possible and
    then safely go to deferred probe if IRQs are not there yet.
    Signed-off-by: default avatarAlexey Brodkin <abrodkin@synopsys.com>
    Cc: Vineet Gupta <vgupta@synopsys.com>
    Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Giuseppe Cavallaro <peppe.cavallaro@st.com>
    Cc: Sonic Zhang <sonic.zhang@analog.com>
    Cc: David S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8f02d8da
stmmac_platform.c 13.5 KB