|| ||Andrew Miklas <firstname.lastname@example.org>|
|| ||Linksys WRT54G: Part 2|
|| ||Sun, 28 Sep 2003 19:14:24 -0400|
A few months ago, I wrote to the kernel list describing the
relationship between Linksys (now business unit of Cisco Systems),
their WRT54G 802.11g wireless home gateway, and Linux. At the time,
we had recently discovered that the WRT54G was using a great deal of
software made available under the GPL, but was not giving credit to
the authors, or providing the source as required by the GPL.
After a bit of public pressure, Linksys posted their "GPL Code Center"
, where they claim that "the GPL source code contained in this
product is available for free download" . Shortly after the code
center was made available, a group of developers pointed out to
Linksys that their source code, particularly their Linux kernel code,
Previously, it was thought that the WRT54G source releases had only
neglected to include the source code for the various kernel modules
used to run the ethernet and wireless interfaces. However, at this
time, it is clear that the kernel proper of the WRT54G itself has had
functionality added to it. This functionality is not present in the
kernel code that Linksys has provided at their "GPL Code Center".
That is to say, there is code STATICALLY LINKED with the Linux kernel
running this device that is not present in the source download. This
code seems to be shared between the Broadcom ethernet and wireless
chips. It appears to be primarily responsible for configuring the
Sonics' SiliconBackplane and handling DMA transactions for both
The incompleteness of the kernel source can be demonstrated as follows:
1. Download the kernel source provided by Linksys from:
(Note: at this time, the kernel source provided for firmware versions
1.30.1, 1.30.7, and 1.41.2 are identical, so it doesn't actually
matter which one you download.)
2. Untar the archive and run:
3. Notice it fails:
drivers/net/Config.in: 5: unable to open drivers/net/hnd/Config.in
make: *** [kconfig.tk] Error 1
make: Leaving directory `/home/andrew/linux-kernel/linux/scripts'
make: *** [xconfig] Error 2
5. When it asks:
Network device support (CONFIG_NETDEVICES) [Y/n/?]
6. Notice it fails:
scripts/Configure: line 5: drivers/net/hnd/Config.in: No such file or
make: *** [config] Error 1
7. As you can see, it is not possible to compile a kernel with the
provided build utilities with networking support.
1. Download a copy of the firmware image for the 1.30.7 firmware from:
2. Extract the CramFS filesystem and kernel image:
dd if=WRT54G_1.30.7_US_code.bin of=cramfs.image bs=786464 skip=1
dd if=WRT54G_1.30.7_US_code.bin bs=60 skip=1 | zcat > kernel
3. Mount the filesystem, and run "nm" against the wireless driver:
(You'll need to have CramFS compiled in or available as a module.)
mount cramfs.image /mnt/rom -o loop
nm /mnt/rom/lib/modules/2.4.5/kernel/drivers/net/wl/wl.o > wl_syms.txt
For convenience, a copy of the output of this command is available at:
4. Notice that the driver wl.o makes several imports from the kernel
that are not included in a stock 2.4.5 kernel. In particular, note
that the symbols bcm_*, pkt*, dma_*, sb_*, osl_*, and srom_* are
imported by the module, but not included in the kernel source.
5. Verify that the symbols aren't provided by another module by
running "nm" on them.
6. Download a copy of ksyms_sorted.txt:
This is a copy of the /proc/ksyms file from a running WRT54G
(firmware 1.30.7). The entries have been sorted by address to make
reading it a bit more convenient.
The raw, unsorted output is also available:
Find the symbols that were missing from the kernel image:
You can also find the symbol names in the kernel by grepping through
the output of "strings" on the kernel image produced in step two.
Note that the addresses at which these symbols are located are used by
the kernel proper. Kernel modules get loaded to a different address
range. Also note that these symbols are surrounded by other symbols
included in a stock Linux kernel.
The above analysis shows that the kernel source provided by Linksys
cannot be compiled in a configuration that would be of use on the
WRT54G. Even if it could, functions necessary for the networking
subsystem would be missing, making the loading of the ethernet and
wireless drivers impossible. Clearly, the kernel source that Linksys
provided cannot be used to recreate the kernel that they are shipping
with their product. Therefore, they have been, and still remain in
violation of the GPL.
Until now, we have held off highlighting this fact in the hopes that
Linksys would realize their omission and correct it. Unfortunately,
after three releases of their firmware (1.30.1, 1.30.7, 1.41.2), and
numerous notices from many individuals explaining this oversight, it
seems that Linksys has no intention of correcting this problem.
The lack of complete source code for the kernel present on the WRT54G
is hindering a number of very interesting development efforts. The
SeattleWireless WRT54G group  is working toward creating completely
new firmware images for the WRT54G. However, they are unable to
create a kernel for this device, largely because any kernel they
compile will be unable to load the modules necessary to support the
ethernet and wireless devices. This limits the functionality that
they can add to their project.
The Linux Broadcom 4301 project  is attempting to create a driver
to support the Broadcom 43xx series of wireless devices on generic
hardware. Their work would be greatly lessened if they could at least
be sent the source code for the parts of the wireless driver
implemented in the kernel proper.
It is also worth noting that this is not the only Linksys device that
uses Linux and other software licensed under the GPL without adhering
to the license. For example, the Samba team has expressed some
concern over the use of Samba in the Linksys EFG80 network accessible
storage device .
Also, the following products seem to be based on the same general
design as the WRT54G, and therefore suffer from the same problem
described above. However, at this time, no source for either device
is available from the "GPL Code Center". - Linksys WRT55AG Dual-Band
Wireless Router  - Linksys WAP54G Wireless-G Access Point 
Unfortunately, neither group knows how to proceed in obtaining this
code. While Linksys has shown some interest in releasing the source
for software licensed under the GPL, they have not responded to the
issues outlined in this post.
If anyone wishes to contact Linksys concerning this matter, we'd
recommend you try the following address: [opensource () linksys !
com]. However, since we have never received a response to messages
directed at this box, you may want to CC any messages to [pr ()
linksys ! com] or perhaps [mailroom () linksys ! com] as well. With
any luck, we will eventually sort out this issue.
The data contained in this post were produced by many individuals
working on a variety of Linksys products. Therefore, while every
effort has been made to ensure that the information contained in this
post is accurate, it is entirely possible that we've made some errors.
If that is the case, please let us know and we will correct the
(in alphabetical order)
jra () samba ! org
andersen () codepoet ! org
kendallb () eden ! rutgers ! edu
Linux Broadcom 4301 Driver Project
Jim () Buzbee ! net
alan () lxorguk ! ukuu ! org ! uk
rob () oreillynet ! com
SeattleWireless WRT54G Project
Christopher R. Hertel
crh () samba ! org
Samba Team and jCIFS Team Member
kaloz () dune ! hu
public () mikl ! as
Linux Broadcom 4301 Driver Project
brettw () riseup ! com
Linux Broadcom 4301 Driver Project
 Linksys GPL Code Center
 WRT54G firmware download page
 Linux Broadcom 4301 Driver Project
 Linksys EFG80 Network Attachable Storage Product Page
 WRT55AG Dual-Band Wireless A+G Broadband Router
 WAP54G Wireless-G Access Point
For some reason, there doesn't appear to be a link to the
firmware from this page, but it can be downloaded from
the following address:
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to email@example.com
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
to post comments)