The Linksys NSLU2 is a small ARM based gadget which has one Ethernet and
two USB ports.  The idea is to connect an external hard driver through USB
and use the device as a small server.  It's very popular because you can
get it for under $100.  There is a large user community at
http://www.nslu2-linux.org/

The firmware is based on RedBoot but there is also functionality which
allows you to put the device into upgrade mode and then upgrade the
firmware via the network.  There's a utility in Debian called upslug2 which
can do this.  Even though the NSLU2 is based on RedBoot, there are some
restrictions we need to work around.  Instead of using the FIS table to
locate the kernel and initrd, specific values of their locations are
hard coded.  In practice, this means that there is only 1 MB of space for
the kernel because the initrd starts 1 MB after the kernel.

Since we want to use a generic ixp4xx kernel, we've worked around this
limitation by using a 2nd boot loader, APEX.  We put APEX in flash at the
point where RedBoot loads the 'kernel' from and then we split the kernel in
two parts - this is because NSLU2's RedBoot expects to find a specific
header at the start of the initrd and the kernel will use this space now.
Effectively, this means that there is:
 - A partition for APEX
 - A partition for the kernel: the kernel is split in two and each parts
   have a header
 - A partition for the initrd

A description of the NSLU2's flash layout can be found at
http://www.nslu2-linux.org/wiki/Info/BootFlash

There is also a problem with Ethernet: the ixp4xx chip has built-in
Ethernet but requires a microcode.  The network driver is included in
the mainline kernel and the microcode can be found in non-free.

Apart from this, the NSLU2 is pretty easy to support.

