android_kernel_oneplus_msm8998/drivers/net/ethernet/stmicro/stmmac
Alexey Brodkin 8f02d8da96 stmmac: check IRQ availability early on probe
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: Alexey 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: David S. Miller <davem@davemloft.net>
2015-03-04 15:43:26 -05:00
..
chain_mode.c stmmac: fix dma api misuse 2014-08-29 19:54:36 -07:00
common.h stmmac: document common header file 2014-11-19 15:04:57 -05:00
descs.h
descs_com.h
dwmac-meson.c stmmac: platform: fix sparse warnings 2014-11-07 12:25:23 -05:00
dwmac-rk.c net: stmmac: dwmac-rk: Use standard devicetree property for phy regulator 2015-01-24 17:17:07 -08:00
dwmac-socfpga.c stmmac: platform: fix sparse warnings 2014-11-07 12:25:23 -05:00
dwmac-sti.c stmmac: dwmac-sti: Pass sysconfig register offset via syscon dt property. 2015-01-11 18:53:34 -05:00
dwmac-sunxi.c stmmac: review driver when run kernel-doc 2014-11-19 15:04:58 -05:00
dwmac100.h
dwmac100_core.c net: stmmac: Support devicetree configs for mcast and ucast filter entries 2014-07-31 14:13:29 -07:00
dwmac100_dma.c stmmac: dity-up and rework the driver debug levels 2013-07-02 16:04:53 -07:00
dwmac1000.h stmmac: prevent false carrier sense detection 2014-08-29 19:54:36 -07:00
dwmac1000_core.c stmmac: correct mc_filter local variable in set_filter and set_mac_addr call 2014-10-10 14:48:02 -04:00
dwmac1000_dma.c stmmac: remove BUS_MODE_DA 2014-11-05 16:14:43 -05:00
dwmac_dma.h stmicro: Remove extern from function prototypes 2013-09-24 12:54:08 -07:00
dwmac_lib.c stmmac: dity-up and rework the driver debug levels 2013-07-02 16:04:53 -07:00
enh_desc.c net: stmmac: Correct duplicate if/then/else case found by cppcheck 2014-07-02 18:37:54 -07:00
Kconfig stmmac: split to core library and probe drivers 2014-11-11 14:34:39 -05:00
Makefile GMAC: add driver for Rockchip RK3288 SoCs integrated GMAC 2014-12-31 19:14:05 -05:00
mmc.h stmmac: fix tipo on mmc crc error 2014-08-29 19:54:36 -07:00
mmc_core.c stmmac: fix tipo on mmc crc error 2014-08-29 19:54:36 -07:00
norm_desc.c stmmac: dity-up and rework the driver debug levels 2013-07-02 16:04:53 -07:00
ring_mode.c stmmac: fix dma api misuse 2014-08-29 19:54:36 -07:00
stmmac.h stmmac: split to core library and probe drivers 2014-11-11 14:34:39 -05:00
stmmac_ethtool.c stmmac: fix max coal timer parameter 2014-12-09 13:25:18 -05:00
stmmac_hwtstamp.c driver:stmmac: Adjust time stamp increase for 0.465 ns accurate only when Time stamp binary rollover is set. 2013-09-04 14:37:02 -04:00
stmmac_main.c net: stmmac: Use setup_timer and mod_timer 2015-03-01 13:40:23 -05:00
stmmac_mdio.c drivers/net: Convert remaining uses of pr_warning to pr_warn 2014-09-09 20:37:08 -07:00
stmmac_pci.c stmmac: pci: add MSI support for Intel Quark X1000 2015-01-27 21:08:08 -08:00
stmmac_platform.c stmmac: check IRQ availability early on probe 2015-03-04 15:43:26 -05:00
stmmac_platform.h GMAC: add driver for Rockchip RK3288 SoCs integrated GMAC 2014-12-31 19:14:05 -05:00
stmmac_ptp.c stmmac: set ptp_clock to NULL while unregister 2014-08-25 15:33:10 -07:00
stmmac_ptp.h stmmac: ptp: fix the reference clock 2014-08-29 19:54:36 -07:00