I got the following link error in 2.4.23-rc1:
<-- snip -->
...
ld -m elf_i386 -r -o built-in.o net2280.o g_zero.o g_ether.o
g_ether.o(.text+0x1bc0): In function `usb_gadget_get_string':
: multiple definition of `usb_gadget_get_string'
g_zero.o(.text+0x1100): first defined here
make[3]: *** [built-in.o] Error 1
make[3]: Leaving directory
`/home/bunk/linux/kernel-2.4/linux-2.4.23-rc1-full/drivers/usb/gadget'
<-- snip -->
.config contained the following:
<-- snip -->
...
#
# Support for USB gadgets
#
CONFIG_USB_GADGET=y
#
# USB Peripheral Controller Drivers
#
# CONFIG_USB_GADGET_CONTROLLER is not set
CONFIG_USB_NET2280=y
CONFIG_USB_GADGET_CONTROLLER=y
#
# USB Gadget Drivers
#
CONFIG_USB_ZERO=y
CONFIG_USB_ZERO_NET2280=y
CONFIG_USB_ETH=y
CONFIG_USB_ETH_NET2280=y
...
<-- snip -->
The patch below fixes this issue.
The main change is to remove the problematic
define_tristate CONFIG_USB_GADGET_CONTROLLER n
and solving it different, and allowing a statically CONFIG_USB_ETH only
when CONFIG_USB_ZERO isn't statically.
cu
Adrian
--- linux-2.4.23-rc1-full/drivers/usb/gadget/Config.in.old 2003-11-18 02:39:48.000000000 +0100
+++ linux-2.4.23-rc1-full/drivers/usb/gadget/Config.in 2003-11-18 12:06:12.000000000 +0100
@@ -5,8 +5,7 @@
# Long term, this likely doesn't all belong in one directory
# Plan to split it up eventually.
#
-# CAREFUL! Some versions of "xconfig" don't execute this correctly.
-#
+
mainmenu_option next_comment
comment 'Support for USB gadgets'
@@ -19,16 +18,15 @@
#
comment 'USB Peripheral Controller Drivers'
- # assume all the dependencies may be undefined ("== true", yeech)
- define_tristate CONFIG_USB_GADGET_CONTROLLER n
- if [ "$CONFIG_PCI" = "y" ] ; then
- tristate ' NetChip 2280 support' CONFIG_USB_NET2280
+ dep_tristate ' NetChip 2280 support' CONFIG_USB_NET2280 $CONFIG_PCI
+
+ if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then
define_tristate CONFIG_USB_GADGET_CONTROLLER $CONFIG_USB_NET2280
+ else
+ define_tristate CONFIG_USB_GADGET_CONTROLLER n
fi
- # pxa2xx_udc, goku_udc, and others also work on 2.4 ...
-
- if [ "$CONFIG_USB_GADGET_CONTROLLER" = "y" -o "$CONFIG_USB_GADGET_CONTROLLER" = "m" ] ; then
+ if [ "$CONFIG_USB_GADGET_CONTROLLER" != "n" ]; then
#
# no reason not to enable more than one gadget driver module, but
@@ -43,9 +41,20 @@
#
# (b) specific hardware features like iso endpoints may be required
#
+ # at most one gadget driver is allowed to be compiled statically
+ # into the kernel
+ #
+
comment 'USB Gadget Drivers'
- dep_tristate ' Gadget Zero (DEVELOPMENT)' CONFIG_USB_ZERO $CONFIG_USB_GADGET_CONTROLLER
+ dep_tristate ' Gadget Zero (DEVELOPMENT)' CONFIG_USB_ZERO $CONFIG_USB_GADGET_CONTROLLER
+
+ if [ "$CONFIG_USB_ZERO" != "y" ]; then
+ dep_tristate ' Ethernet Gadget (EXPERIMENTAL)' CONFIG_USB_ETH $CONFIG_USB_GADGET_CONTROLLER $CONFIG_NET $CONFIG_EXPERIMENTAL
+ else
+ dep_tristate ' Ethernet Gadget (EXPERIMENTAL)' CONFIG_USB_ETH $CONFIG_NET $CONFIG_EXPERIMENTAL m
+ fi
+
if [ "$CONFIG_USB_ZERO" = "y" -o "$CONFIG_USB_ZERO" = "m" ]; then
if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then
define_bool CONFIG_USB_ZERO_NET2280 y
@@ -56,8 +65,7 @@
fi fi fi
# ...
fi
-
- dep_tristate ' Ethernet Gadget (EXPERIMENTAL)' CONFIG_USB_ETH $CONFIG_USB_GADGET_CONTROLLER $CONFIG_NET
+
if [ "$CONFIG_USB_ETH" = "y" -o "$CONFIG_USB_ETH" = "m" ]; then
if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then
define_bool CONFIG_USB_ETH_NET2280 y
#
# USB device-side configuration
# for 2.4 kbuild, drivers/usb/gadget/Config.in
#
# Long term, this likely doesn't all belong in one directory
# Plan to split it up eventually.
#
# CAREFUL! Some versions of "xconfig" don't execute this correctly.
#
mainmenu_option next_comment
comment 'Support for USB gadgets'
bool 'Support for USB Gadgets' CONFIG_USB_GADGET
if [ "$CONFIG_USB_GADGET" = "y" ]; then
#
# really want _exactly one_ device controller driver at a time,
# since they control compile options for gadget drivers.
#
comment 'USB Peripheral Controller Drivers'
# assume all the dependencies may be undefined ("== true", yeech)
define_tristate CONFIG_USB_GADGET_CONTROLLER n
if [ "$CONFIG_PCI" = "" ] ; then
define_bool CONFIG_PCI n
fi
if [ "$CONFIG_ARCH_PXA" = "" ] ; then
define_bool CONFIG_ARCH_PXA n
fi
if [ "$CONFIG_ARCH_SUPERH" = "" ] ; then
define_bool CONFIG_ARCH_SUPERH n
fi
if [ "$CONFIG_USB_GADGET_CONTROLLER" = "n" ] ; then
dep_tristate ' NetChip 2280 support' CONFIG_USB_NET2280 $CONFIG_PCI
define_tristate CONFIG_USB_GADGET_CONTROLLER $CONFIG_USB_NET2280
fi
if [ "$CONFIG_USB_GADGET_CONTROLLER" = "n" ] ; then
dep_tristate ' PXA 2xx UDC support' CONFIG_USB_PXA2XX $CONFIG_ARCH_PXA
define_tristate CONFIG_USB_GADGET_CONTROLLER $CONFIG_USB_PXA2XX
fi
if [ "$CONFIG_USB_GADGET_CONTROLLER" = "n" ] ; then
dep_tristate ' Toshiba TC86C001 (Goku-S) support' CONFIG_USB_GOKU $CONFIG_PCI
define_tristate CONFIG_USB_GADGET_CONTROLLER $CONFIG_USB_GOKU
fi
if [ "$CONFIG_USB_GADGET_CONTROLLER" = "n" ] ; then
dep_tristate ' Renesas SH7705/7727 UDC support' CONFIG_USB_SUPERH $CONFIG_SUPERH
define_tristate CONFIG_USB_GADGET_CONTROLLER $CONFIG_USB_SUPERH
fi
if [ "$CONFIG_USB_GADGET_CONTROLLER" = "y" -o "$CONFIG_USB_GADGET_CONTROLLER" = "m" ] ; then
#
# no reason not to enable more than one gadget driver module, but
# for static linking that would make no sense since the usb model
# has exactly one of these upstream connections and only one
# lowest-level driver can control it.
#
# gadget drivers are compiled to work on specific hardware, since
#
# (a) gadget driver need hardware-specific configuration, like what
# endpoint names and numbers to use, maxpacket sizes, etc
#
# (b) specific hardware features like iso endpoints may be required
#
comment 'USB Gadget Drivers'
dep_tristate ' Gadget Zero (DEVELOPMENT)' CONFIG_USB_ZERO $CONFIG_USB_GADGET_CONTROLLER
if [ "$CONFIG_USB_ZERO" = "y" -o "$CONFIG_USB_ZERO" = "m" ]; then
if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then
define_bool CONFIG_USB_ZERO_NET2280 y
else if [ "$CONFIG_USB_PXA2XX" = "y" -o "$CONFIG_USB_PXA2XX" = "m" ]; then
define_bool CONFIG_USB_ZERO_PXA2XX y
else if [ "$CONFIG_USB_GOKU" = "y" -o "$CONFIG_USB_GOKU" = "m" ]; then
define_bool CONFIG_USB_ZERO_GOKU y
else if [ "$CONFIG_USB_SUPERH" = "y" -o "$CONFIG_USB_SUPERH" = "m" ]; then
define_bool CONFIG_USB_ZERO_SUPERH y
fi fi fi fi
# ...
fi
dep_tristate ' Ethernet Gadget (EXPERIMENTAL)' CONFIG_USB_ETH $CONFIG_USB_GADGET_CONTROLLER $CONFIG_NET
if [ "$CONFIG_USB_ETH" = "y" -o "$CONFIG_USB_ETH" = "m" ]; then
if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then
define_bool CONFIG_USB_ETH_NET2280 y
else if [ "$CONFIG_USB_PXA2XX" = "y" -o "$CONFIG_USB_PXA2XX" = "m" ]; then
define_bool CONFIG_USB_ETH_PXA2XX y
else if [ "$CONFIG_USB_GOKU" = "y" -o "$CONFIG_USB_GOKU" = "m" ]; then
define_bool CONFIG_USB_ETH_GOKU y
else if [ "$CONFIG_USB_SUPERH" = "y" -o "$CONFIG_USB_SUPERH" = "m" ]; then
define_bool CONFIG_USB_ETH_SUPERH y
fi fi fi fi
# ...
fi
dep_tristate ' Gadget Filesystem API (EXPERIMENTAL)' CONFIG_USB_GADGETFS $CONFIG_USB_GADGET_CONTROLLER
if [ "$CONFIG_USB_GADGETFS" = "y" -o "$CONFIG_USB_GADGETFS" = "m" ]; then
if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then
define_bool CONFIG_USB_GADGETFS_NET2280 y
else if [ "$CONFIG_USB_PXA2XX" = "y" -o "$CONFIG_USB_PXA2XX" = "m" ]; then
define_bool CONFIG_USB_GADGETFS_PXA2XX y
else if [ "$CONFIG_USB_GOKU" = "y" -o "$CONFIG_USB_GOKU" = "m" ]; then
define_bool CONFIG_USB_GADGETFS_GOKU y
else if [ "$CONFIG_USB_SUPERH" = "y" -o "$CONFIG_USB_SUPERH" = "m" ]; then
define_bool CONFIG_USB_GADGETFS_SUPERH y
fi fi fi fi
# ...
fi
dep_tristate ' File-backed Storage Gadget (DEVELOPMENT)' CONFIG_USB_FILE_STORAGE $CONFIG_USB_GADGET_CONTROLLER
if [ "$CONFIG_USB_FILE_STORAGE" = "y" -o "$CONFIG_USB_FILE_STORAGE" = "m" ]; then
if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then
define_bool CONFIG_USB_FILE_STORAGE_NET2280 y
else if [ "$CONFIG_USB_PXA2XX" = "y" -o "$CONFIG_USB_PXA2XX" = "m" ]; then
define_bool CONFIG_USB_FILE_STORAGE_PXA2XX y
else if [ "$CONFIG_USB_GOKU" = "y" -o "$CONFIG_USB_GOKU" = "m" ]; then
define_bool CONFIG_USB_FILE_STORAGE_GOKU y
else if [ "$CONFIG_USB_SUPERH" = "y" -o "$CONFIG_USB_SUPERH" = "m" ]; then
define_bool CONFIG_USB_FILE_STORAGE_SUPERH y
fi fi fi fi
# ...
fi
dep_tristate ' Serial Gadget (EXPERIMENTAL)' CONFIG_USB_G_SERIAL $CONFIG_USB_GADGET_CONTROLLER
if [ "$CONFIG_USB_G_SERIAL" = "y" -o "$CONFIG_USB_G_SERIAL" = "m" ]; then
if [ "$CONFIG_USB_NET2280" = "y" -o "$CONFIG_USB_NET2280" = "m" ]; then
define_bool CONFIG_USB_G_SERIAL_NET2280 y
else if [ "$CONFIG_USB_PXA2XX" = "y" -o "$CONFIG_USB_PXA2XX" = "m" ]; then
define_bool CONFIG_USB_G_SERIAL_PXA2XX y
else if [ "$CONFIG_USB_GOKU" = "y" -o "$CONFIG_USB_GOKU" = "m" ]; then
define_bool CONFIG_USB_G_SERIAL_GOKU y
else if [ "$CONFIG_USB_SUPERH" = "y" -o "$CONFIG_USB_SUPERH" = "m" ]; then
define_bool CONFIG_USB_G_SERIAL_SUPERH y
fi fi fi fi
# ...
fi
# ... or other gadget drivers: printer class, hid, etc ...
fi
fi
endmenu