From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030731AbcGLDEx (ORCPT ); Mon, 11 Jul 2016 23:04:53 -0400 Received: from 51.19-broadband.acttv.in ([106.51.19.86]:36854 "EHLO arvind-ThinkPad-Edge-E431" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1030704AbcGLDEs (ORCPT ); Mon, 11 Jul 2016 23:04:48 -0400 X-Greylist: delayed 30259 seconds by postgrey-1.27 at vger.kernel.org; Mon, 11 Jul 2016 23:04:47 EDT From: Arvind Yadav To: gregkh@linuxfoundation.org, ganesanr@broadcom.com Cc: nevola@gmail.com, julia.lawall@lip6.fr, brcnakalin@gmail.com, shraddha.6596@gmail.com, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org, jchandra@broadcom.com, Arvind Yadav Subject: [Patch v1] netlogic/platform_net: Catch failure to register NETLOGIC_XLR_NET device. Date: Tue, 12 Jul 2016 00:10:21 +0530 Message-Id: <1468262421-8719-1-git-send-email-arvind.yadav.cs@gmail.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This driver Kconfig is depend on CPU_XLR. If default Kconfig NETLOGIC_XLR_NET value are used with CPU_XLR then you end up with a resource. This causes __request_resource to return a conflict which then returns an -EBUSY error code. The driver netlogic/platform_net.c assumes that the platfom_device_register will always succeed. Catch this failure during xlr_net_init. Driver should not ignore return value of platform_device_register. Signed-off-by: Arvind Yadav --- drivers/staging/netlogic/platform_net.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/drivers/staging/netlogic/platform_net.c b/drivers/staging/netlogic/platform_net.c index abf4c71..d8ce50d 100644 --- a/drivers/staging/netlogic/platform_net.c +++ b/drivers/staging/netlogic/platform_net.c @@ -130,9 +130,10 @@ static struct platform_device *gmac_controller2_init(void *gmac0_addr) return &xlr_net_dev1; } -static void xls_gmac_init(void) +static int xls_gmac_init(void) { int mac; + int ret; struct platform_device *xlr_net_dev1; void __iomem *gmac0_addr = ioremap(CPHYSADDR( nlm_mmio_base(NETLOGIC_IO_GMAC_0_OFFSET)), 0xfff); @@ -171,7 +172,7 @@ static void xls_gmac_init(void) xlr_resource_init(&xlr_net0_res[0], xlr_gmac_offsets[0], xlr_gmac_irqs[0]); - platform_device_register(&xlr_net_dev0); + ret = platform_device_register(&xlr_net_dev0); /* second block is XAUI, not supported yet */ break; @@ -187,14 +188,20 @@ static void xls_gmac_init(void) xlr_gmac_irqs[mac]); } xlr_net_dev0.num_resources = 8; - platform_device_register(&xlr_net_dev0); + ret = platform_device_register(&xlr_net_dev0); xlr_net_dev1 = gmac_controller2_init(gmac0_addr); - platform_device_register(xlr_net_dev1); + if (ret == 0) { + ret = platform_device_register(xlr_net_dev1); + if (ret) + platform_driver_unregister(&xlr_net_dev0); + } + } + return ret; } -static void xlr_gmac_init(void) +static int xlr_gmac_init(void) { int mac; @@ -228,17 +235,18 @@ static void xlr_gmac_init(void) xlr_net_dev0.num_resources = 8; xlr_net_dev0.resource = xlr_net0_res; - platform_device_register(&xlr_net_dev0); + return platform_device_register(&xlr_net_dev0); } static int __init xlr_net_init(void) { + int ret; if (nlm_chip_is_xls()) - xls_gmac_init(); + ret = xls_gmac_init(); else - xlr_gmac_init(); + ret = xlr_gmac_init(); - return 0; + return ret; } arch_initcall(xlr_net_init); -- 1.9.1