Commit ff30bf1c authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Greg Kroah-Hartman

USB: remove optional bus bindings in isp1760, fixing runtime warning

Roland Reported the following:
| kmem_cache_create: duplicate cache isp1760_qtd
| Pid: 461, comm: modprobe Tainted: G        W  2.6.28-rc2-git3-default #4
| Call Trace:
|  [<c017540e>] kmem_cache_create+0xc9/0x3a3
|  [<c0159a8d>] free_pages_bulk+0x16c/0x1c9
|  [<f165c05f>] isp1760_init+0x0/0xb [isp1760]
|  [<f165c018>] init_kmem_once+0x18/0x5f [isp1760]
|  [<f165c064>] isp1760_init+0x5/0xb [isp1760]
|  [<c010113d>] _stext+0x4d/0x148
|  [<c0142936>] load_module+0x12cd/0x142e
|  [<c01743c4>] kmem_cache_destroy+0x0/0xd7
|  [<c0142b1e>] sys_init_module+0x87/0x176
|  [<c01039eb>] sysenter_do_call+0x12/0x2f

The reason, is that ret is initialized with ENODEV instead of 0 _or_
the kmem cache is not freed in error case with no bus binding.

The difference between OF+PCI and OF only is
| 15148     804      32   15984    3e70 isp1760-of-pci.o
| 13748     676       8   14432    3860 isp1760-of.o

about 1.5 KiB.

Until there is a checkbox where the user *must* select atleast one item,
and may select multiple entries I don't make it selectable anymore.
Having a driver which can't be used under any circumstances is broken
anyway and I've seen distros shipping it that way.
Reported-by: default avatarRoland Kletzing <devzero@web.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>a
Cc: stable <stable@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 9a18e75f
...@@ -110,29 +110,18 @@ config USB_ISP116X_HCD ...@@ -110,29 +110,18 @@ config USB_ISP116X_HCD
config USB_ISP1760_HCD config USB_ISP1760_HCD
tristate "ISP 1760 HCD support" tristate "ISP 1760 HCD support"
depends on USB && EXPERIMENTAL depends on USB && EXPERIMENTAL && (PCI || PPC_OF)
---help--- ---help---
The ISP1760 chip is a USB 2.0 host controller. The ISP1760 chip is a USB 2.0 host controller.
This driver does not support isochronous transfers or OTG. This driver does not support isochronous transfers or OTG.
This USB controller is usually attached to a non-DMA-Master
capable bus. NXP's eval kit brings this chip on PCI card
where the chip itself is behind a PLB to simulate such
a bus.
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called isp1760-hcd. module will be called isp1760.
config USB_ISP1760_PCI
bool "Support for the PCI bus"
depends on USB_ISP1760_HCD && PCI
---help---
Enables support for the device present on the PCI bus.
This should only be required if you happen to have the eval kit from
NXP and you are going to test it.
config USB_ISP1760_OF
bool "Support for the OF platform bus"
depends on USB_ISP1760_HCD && PPC_OF
---help---
Enables support for the device present on the PowerPC
OpenFirmware platform bus.
config USB_OHCI_HCD config USB_OHCI_HCD
tristate "OHCI HCD support" tristate "OHCI HCD support"
......
...@@ -14,16 +14,16 @@ ...@@ -14,16 +14,16 @@
#include "../core/hcd.h" #include "../core/hcd.h"
#include "isp1760-hcd.h" #include "isp1760-hcd.h"
#ifdef CONFIG_USB_ISP1760_OF #ifdef CONFIG_PPC_OF
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#endif #endif
#ifdef CONFIG_USB_ISP1760_PCI #ifdef CONFIG_PCI
#include <linux/pci.h> #include <linux/pci.h>
#endif #endif
#ifdef CONFIG_USB_ISP1760_OF #ifdef CONFIG_PPC_OF
static int of_isp1760_probe(struct of_device *dev, static int of_isp1760_probe(struct of_device *dev,
const struct of_device_id *match) const struct of_device_id *match)
{ {
...@@ -128,7 +128,7 @@ static struct of_platform_driver isp1760_of_driver = { ...@@ -128,7 +128,7 @@ static struct of_platform_driver isp1760_of_driver = {
}; };
#endif #endif
#ifdef CONFIG_USB_ISP1760_PCI #ifdef CONFIG_PCI
static u32 nxp_pci_io_base; static u32 nxp_pci_io_base;
static u32 iolength; static u32 iolength;
static u32 pci_mem_phy0; static u32 pci_mem_phy0;
...@@ -288,28 +288,28 @@ static struct pci_driver isp1761_pci_driver = { ...@@ -288,28 +288,28 @@ static struct pci_driver isp1761_pci_driver = {
static int __init isp1760_init(void) static int __init isp1760_init(void)
{ {
int ret = -ENODEV; int ret;
init_kmem_once(); init_kmem_once();
#ifdef CONFIG_USB_ISP1760_OF #ifdef CONFIG_PPC_OF
ret = of_register_platform_driver(&isp1760_of_driver); ret = of_register_platform_driver(&isp1760_of_driver);
if (ret) { if (ret) {
deinit_kmem_cache(); deinit_kmem_cache();
return ret; return ret;
} }
#endif #endif
#ifdef CONFIG_USB_ISP1760_PCI #ifdef CONFIG_PCI
ret = pci_register_driver(&isp1761_pci_driver); ret = pci_register_driver(&isp1761_pci_driver);
if (ret) if (ret)
goto unreg_of; goto unreg_of;
#endif #endif
return ret; return ret;
#ifdef CONFIG_USB_ISP1760_PCI #ifdef CONFIG_PCI
unreg_of: unreg_of:
#endif #endif
#ifdef CONFIG_USB_ISP1760_OF #ifdef CONFIG_PPC_OF
of_unregister_platform_driver(&isp1760_of_driver); of_unregister_platform_driver(&isp1760_of_driver);
#endif #endif
deinit_kmem_cache(); deinit_kmem_cache();
...@@ -319,10 +319,10 @@ module_init(isp1760_init); ...@@ -319,10 +319,10 @@ module_init(isp1760_init);
static void __exit isp1760_exit(void) static void __exit isp1760_exit(void)
{ {
#ifdef CONFIG_USB_ISP1760_OF #ifdef CONFIG_PPC_OF
of_unregister_platform_driver(&isp1760_of_driver); of_unregister_platform_driver(&isp1760_of_driver);
#endif #endif
#ifdef CONFIG_USB_ISP1760_PCI #ifdef CONFIG_PCI
pci_unregister_driver(&isp1761_pci_driver); pci_unregister_driver(&isp1761_pci_driver);
#endif #endif
deinit_kmem_cache(); deinit_kmem_cache();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment