summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/linux/nas100d-kernel.inc242
-rw-r--r--packages/linux/nas100d-kernel/.mtn2git_empty0
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/.mtn2git_empty0
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/10-ixp4xx-copy-from.patch73
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/10-ixp4xx-le.patch54
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/10-mtdpart-redboot-fis-byteswap.patch44
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/15-ixp4xx-writesb-l-w.patch31
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/18-ixp4xx-io-h-addr.patch287
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/28-spinlock-up.patch32
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/29-ipv4-route-c-spinlock.patch11
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/90-ixp4xx-pci-le.patch11
-rw-r--r--packages/linux/nas100d-kernel/2.6.14/defconfig1552
-rw-r--r--packages/linux/nas100d-kernel_2.6.14.bb38
-rw-r--r--packages/meta/ludeos-image.bb1
-rw-r--r--packages/meta/ludeos-packages.bb1
15 files changed, 2377 insertions, 0 deletions
diff --git a/packages/linux/nas100d-kernel.inc b/packages/linux/nas100d-kernel.inc
new file mode 100644
index 0000000000..0c97f3c08a
--- /dev/null
+++ b/packages/linux/nas100d-kernel.inc
@@ -0,0 +1,242 @@
+# nas100d-kernel.inc
+#
+# Standard definitions for any NAS 100d Linux kernel.
+# Include this file in a .bb which specifies, at least,
+# PN,PV,PR for the desired kernel
+#
+# Define the following *before* including this file as
+# required:
+#
+# N1K_FILES - kernel-tree path of files to install
+# N1K_PATCHES - full list of patches to apply
+#
+# N1K_SUFFIX - the suffix to add after 'zImage-' in the
+# deploy/images directory - defaults to "ludeos"
+#
+# --------------------------------------------------------------
+#
+# Within this file bitbake variables local to the file are
+# named N1K_FOO
+#
+SECTION = "kernel"
+DESCRIPTION = "Linux kernel for the Iomega NAS 100d device"
+LICENSE = "GPL"
+MAINTAINER = "John Bowler <jbowler@acm.org>"
+
+DEPENDS += "devio-native"
+
+# Linux kernel source has the general form linux-X.Y.Z-patchP,
+# X.Y is the major version number, Z (which may have multiple
+# parts) is a sub-version and 'patch' is something like 'mm' or
+# 'ac' with a patch version. The original bz2 archive will be
+# in a directory/file vX.Y/linux-X.Y.Z.tar.bz2. The unpacked
+# source will be in the directory linux-X.Y.Z and this directory
+# name corresponds to the module directory (in /lib/modules).
+#
+# The corresponding .bb file should be called:
+#
+# package_X.Y.Z-patchP
+#
+# Giving PN=package PV=X.Y.Z-patchP (and PR is set in the .bb
+# file). Files, including the all important defconfig, are
+# searched for in the following directories (last one first):
+#
+# ludeos-kernel-2.6.11.2
+# nas100d-kernel/files
+# nas100d-kernel/X.Y
+# nas100d-kernel/X.Y.Z
+# nas100d-kernel/X.Y.Z-patch
+# nas100d-kernel/X.Y.Z-patchP
+# package-X.Y.Z-patchP
+#
+# This allows sharing of patch files and other useful source!
+# To share a file or patch with an earlier version put it in
+# the shared directory - e.g. to use foo.patch on 2.6.11.2 and
+# 2.6.11.4 it should be in directory nas100d-kernel/2.6.11.
+#
+# Note that when there are multiple patches the X.Y.Z-patch form
+# uses base-patch (e.g. 2.6.12-mm) whereas X.Y.Z-patchP has the
+# full form, for example 2.6.12-rc3-mm1 (in the same case).
+
+#PN=package-name
+#PV=package-version (full)
+
+# The patch has the general form (rcN|preN|acN|mmN|bkN)* with the
+# separate patch items being separated by '-' characters. The
+# rc patch is first and has the important property that it
+# requires the *preceding* kernel base version and that this
+# will be the source directory name.
+python () {
+ # The patches list may be empty. This code starts with the base
+ # kernel version and steps through the patches. Because the rc and
+ # pre patches actually require the *preceding* kernel version the code
+ # fixes that up appropriately.
+ pv = bb.data.getVar("PV",d,1).split('-')
+ kernel = pv[0].split('.')
+ base = pv[0]
+ name = [base]
+ major = '.'.join(name[0].split('.')[0:2])
+ minor = '.'.join(name[0].split('.')[0:3])
+ patch_uri = [ None ]
+ filedir = "${FILE_DIRNAME}/nas100d-kernel/%s"
+ # This entry will become the last one (everything is inserted before it)
+ filepath = [ filedir % "files" ]
+ for patch in pv[1:]:
+ name.append(patch)
+ pname = '-'.join(name)
+ filepath[0:0] = [ filedir % pname ]
+ base = pname
+
+ base = '.'.join(kernel)
+ patch_uri[0] = "ftp://ftp.kernel.org/pub/linux/kernel/v%s/linux-%s.tar.bz2" % (major, base)
+ filepath[-1:-1] = [ filedir % base ]
+ if base != minor:
+ filepath[-1:-1] = [ filedir % minor ]
+ filepath[-1:-1] = [ filedir % major ]
+
+ bb.data.setVar("N1K_SRCMAJ", major, d)
+ # bb.note("N1K_SRCMAJ := %s" % major)
+ bb.data.setVar("N1K_SRCVER", base, d)
+ # bb.note("N1K_SRCVER := %s" % base)
+ bb.data.setVar("N1K_SRCURI", ' '.join(patch_uri), d)
+ # bb.note("N1K_SRCURI := %s" % ' '.join(patch_uri))
+ bb.data.setVar("N1K_FILESPATH", ':'.join(filepath), d)
+ # bb.note("N1K_FILESPATH := %s" % ' '.join(filepath))
+ bb.data.setVar("DEFAULT_PREFERENCE", pref-mmac, d)
+}
+
+# FILESPATH: this list is in order last-searched-first, therefore
+# the first entry is the *latest* and/or most specific
+FILESPATH = "${N1K_FILESPATH}:${FILE_DIRNAME}/nas100d-kernel/"
+
+# The working directory will be the 'base' version (which may not be the
+# same as implied by the PV variable because it corresponds to the prior
+# minor version for rc and pre patched versions).
+S = "${WORKDIR}/linux-${N1K_SRCVER}"
+
+# N1K_FILES is a list of additional files added to the source, these are
+# put in place before the patches, so may themselves be patched. The list
+# gives the path name relative to the base of the kernel source tree, the
+# base file name is used to *find* the file.
+N1K_FILES ?= ""
+
+N1K_SRCFILES = "${@( ' '.join([ ("file://" + n2k_file.split('/')[-1]) for n2k_file in bb.data.getVar("N1K_FILES",d,1).split(None) ]) )}"
+
+# N1K_PATCHES is a list of additional patches, the list specified
+# here comes from the ludeos-2.6.11.2 kernel, typically extra
+# patches will be required and very often patches will need to
+# be removed (i.e. the default is typically not very useful!)
+N1K_PATCHES ?= ""
+
+N1K_SUFFIX ?= "ludeos"
+
+SRC_URI = "${N1K_SRCURI}"
+SRC_URI += "${N1K_SRCFILES}"
+SRC_URI += "${N1K_PATCHES}"
+SRC_URI += "file://defconfig"
+
+COMPATIBLE_HOST = 'arm.*-linux'
+
+inherit kernel
+
+ARCH = "arm"
+KERNEL_IMAGETYPE = "zImage"
+# To specify the console set KERNEL_CONSOLE in the .bb file.
+# CMDLINE_ROOT contains the boot options, CMDLINE_KERNEL_OPTIONS
+# contains the things for a specific kernel.
+CMDLINE_KERNEL_OPTIONS ?= "reboot=s"
+CMDLINE_ROOT ?= "root=/dev/mtdblock4 rw rootfstype=jffs2 mem=32M@0x00000000 init=/linuxrc"
+# Add distro specific debug (or non-debug) options to this
+CMDLINE_DEBUG ?= ""
+CMDLINE = "${CMDLINE_ROOT} ${CMDLINE_KERNEL_OPTIONS} ${CMDLINE_DEBUG} ${CMDLINE_CONSOLE}"
+
+# Add the architecture compiler flags to KERNEL_CC and KERNEL_LD as
+# required. Notice that this has to be done for each separately built
+# module as well!
+KERNEL_CC += "${TARGET_CC_KERNEL_ARCH}"
+KERNEL_LD += "${TARGET_LD_KERNEL_ARCH}"
+
+# Set EXTRAVERSION and LOCALVERSION to "" so that the kernel version
+# remains pinned to the x.y.z form, also turn off the directory
+# printing which provides almost all the output of an incremental build.
+EXTRA_OEMAKE += "EXTRAVERSION="
+EXTRA_OEMAKE += "LOCALVERSION="
+EXTRA_OEMAKE += "MAKEFLAGS='--no-print-directory'"
+
+# By putting the added files in place in a separate task before
+# do_patch it becomes possible to patch these files.
+do_unpacklocal() {
+ for f in ${N1K_FILES}
+ do
+ s="$(basename "$f")"
+ install -m 0644 "${WORKDIR}/$s" "${S}/$f"
+ done
+}
+
+addtask unpacklocal before do_patch after do_unpack
+
+do_configure_prepend() {
+ install -m 0644 ${WORKDIR}/defconfig ${S}/.config
+ if test '${ARCH_BYTE_SEX}' = le
+ then
+ sed -i '/CONFIG_CPU_BIG_ENDIAN/d' '${S}/.config'
+ else
+ echo 'CONFIG_CPU_BIG_ENDIAN=y' >>'${S}/.config'
+ fi
+ echo "CONFIG_CMDLINE=\"${CMDLINE}\"" >> ${S}/.config
+ rm -rf ${S}/include/asm-arm/arch ${S}/include/asm-arm/proc \
+ ${S}/include/asm-arm/.proc ${S}/include/asm-arm/.arch
+}
+
+# This function adds the required prefix to the image to deal with two
+# problems:
+#
+# 1) The machine type set by RedBoot is wrong - the type for an ixdp425, not an NAS 100d
+# e3a01c02 e3811055
+# 2) For LE kernels it is necessary to prefix change-to-le code to the kernel image:
+# ee110f10 e3c00080 ee010f10
+# and to byte swap the (LE) image to match the BE flash layout
+#
+# The argument to the function is the destination directory
+redboot_fixup_armeb() {
+ rm -f "$1".new
+ devio '<<arch/${ARCH}/boot/${KERNEL_IMAGETYPE}' >"$1".new \
+ 'wb 0xe3a01c02,4' \
+ 'wb 0xe3811055,4' \
+ 'cp$'
+ mv "$1".new "$1"
+}
+
+redboot_fixup_arm() {
+ rm -f "$1".new
+ devio '<<arch/${ARCH}/boot/${KERNEL_IMAGETYPE}' >"$1".new \
+ 'wb 0xe3a01c02,4' \
+ 'wb 0xe3811055,4' \
+ 'wb 0xee110f10,4' \
+ 'wb 0xe3c00080,4' \
+ 'wb 0xee010f10,4' \
+ 'xp $,4' || {
+ echo 'ERROR: arch/${ARCH}/boot/${KERNEL_IMAGETYPE}: failed to byteswap zImage' >&2
+ return 1
+ }
+ mv "$1".new "$1"
+}
+
+do_install_append() {
+ redboot_fixup '${STAGING_KERNEL_DIR}/${KERNEL_IMAGETYPE}'
+}
+
+do_deploy[dirs] = "${S}"
+do_deploy() {
+ install -d ${DEPLOY_DIR}/images
+ redboot_fixup '${DEPLOY_DIR}/images/${KERNEL_IMAGETYPE}-${N1K_SUFFIX}'
+}
+
+addtask deploy before do_build after do_compile
+
+python () {
+ # Don't build the kernel unless we're targeting an nas100d
+ mach = bb.data.getVar("MACHINE", d, 1)
+ if mach != 'nas100d':
+ raise bb.parse.SkipPackage("LudeOS only builds for the Iomega NAS 100d")
+}
diff --git a/packages/linux/nas100d-kernel/.mtn2git_empty b/packages/linux/nas100d-kernel/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/linux/nas100d-kernel/.mtn2git_empty
diff --git a/packages/linux/nas100d-kernel/2.6.14/.mtn2git_empty b/packages/linux/nas100d-kernel/2.6.14/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/.mtn2git_empty
diff --git a/packages/linux/nas100d-kernel/2.6.14/10-ixp4xx-copy-from.patch b/packages/linux/nas100d-kernel/2.6.14/10-ixp4xx-copy-from.patch
new file mode 100644
index 0000000000..f3da2e093f
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/10-ixp4xx-copy-from.patch
@@ -0,0 +1,73 @@
+--- linux-2.6.14/drivers/mtd/maps/ixp4xx.c 2005-10-27 17:02:08.000000000 -0700
++++ linux-2.6.14/drivers/mtd/maps/ixp4xx.c 2005-10-29 23:11:24.990820968 -0700
+@@ -38,10 +38,14 @@
+ #define BYTE1(h) ((h) & 0xFF)
+ #endif
+
++#define FLASHWORD(a) (*(__u16*)(a))
++#define FLASHVAL(a) FLASHWORD(a)
++#define FLASHSET(a,v) do { FLASHWORD(a) = (v); } while (0)
++
+ static map_word ixp4xx_read16(struct map_info *map, unsigned long ofs)
+ {
+ map_word val;
+- val.x[0] = *(__u16 *) (map->map_priv_1 + ofs);
++ val.x[0] = FLASHVAL(map->map_priv_1 + ofs);
+ return val;
+ }
+
+@@ -53,19 +57,25 @@ static map_word ixp4xx_read16(struct map
+ static void ixp4xx_copy_from(struct map_info *map, void *to,
+ unsigned long from, ssize_t len)
+ {
+- int i;
+- u8 *dest = (u8 *) to;
+- u16 *src = (u16 *) (map->map_priv_1 + from);
+- u16 data;
+-
+- for (i = 0; i < (len / 2); i++) {
+- data = src[i];
+- dest[i * 2] = BYTE0(data);
+- dest[i * 2 + 1] = BYTE1(data);
++ u8 *dest, *src;
++
++ if (len <= 0)
++ return;
++
++ dest = (u8 *) to;
++ src = (u8 *) (map->map_priv_1 + from);
++ if (from & 1)
++ *dest++ = BYTE1(FLASHVAL(src-1)), ++src, --len;
++
++ while (len >= 2) {
++ u16 data = FLASHVAL(src); src += 2;
++ *dest++ = BYTE0(data);
++ *dest++ = BYTE1(data);
++ len -= 2;
+ }
+
+- if (len & 1)
+- dest[len - 1] = BYTE0(src[i]);
++ if (len > 0)
++ *dest++ = BYTE0(FLASHVAL(src));
+ }
+
+ /*
+@@ -75,7 +85,7 @@ static void ixp4xx_copy_from(struct map_
+ static void ixp4xx_probe_write16(struct map_info *map, map_word d, unsigned long adr)
+ {
+ if (!(adr & 1))
+- *(__u16 *) (map->map_priv_1 + adr) = d.x[0];
++ FLASHSET(map->map_priv_1 + adr, d.x[0]);
+ }
+
+ /*
+@@ -83,7 +93,7 @@ static void ixp4xx_probe_write16(struct
+ */
+ static void ixp4xx_write16(struct map_info *map, map_word d, unsigned long adr)
+ {
+- *(__u16 *) (map->map_priv_1 + adr) = d.x[0];
++ FLASHSET(map->map_priv_1 + adr, d.x[0]);
+ }
+
+ struct ixp4xx_flash_info {
diff --git a/packages/linux/nas100d-kernel/2.6.14/10-ixp4xx-le.patch b/packages/linux/nas100d-kernel/2.6.14/10-ixp4xx-le.patch
new file mode 100644
index 0000000000..0b50e4e1a0
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/10-ixp4xx-le.patch
@@ -0,0 +1,54 @@
+--- linux-2.6.14/drivers/mtd/maps/ixp4xx.c 2005-10-27 17:02:08.000000000 -0700
++++ linux-2.6.14/drivers/mtd/maps/ixp4xx.c 2005-10-29 23:11:24.990820968 -0700
+@@ -22,6 +22,7 @@
+ #include <linux/string.h>
+ #include <linux/mtd/mtd.h>
+ #include <linux/mtd/map.h>
++#include <linux/mtd/cfi_endian.h>
+ #include <linux/mtd/partitions.h>
+ #include <linux/ioport.h>
+ #include <linux/device.h>
+@@ -30,17 +31,40 @@
+
+ #include <linux/reboot.h>
+
++/* On a little-endian IXP4XX system (tested on NSLU2) an LDRH or STRH
++ * will flip the second address bit - i.e. XOR the address with 10b.
++ * This causes the cfi commands (sent to the command address, 0xAA for
++ * 16 bit flash) to fail. This is fixed here by XOR'ing the address
++ * before use with 10b. The cost of this is that the flash layout ends
++ * up with pdp-endiannes (on an LE system), however this is not a problem
++ * as the access code consistently only accesses half words - so the
++ * endianness is not determinable on stuff which is written and read
++ * consistently in the little endian world.
++ *
++ * For flash data from the big-endian world, however, the results are
++ * weird - the pdp-endianness results in the data apparently being
++ * 2-byte swapped (as in dd conv=swab). To work round this the 16
++ * bit values are written and read using cpu_to_cfi16 and cfi16_to_cpu,
++ * by default these are no-ops, but if the MTD driver is configed with
++ * CONFIG_MTD_CFI_BE_BYTE_SWAP the macros will byte swap the data,
++ * resulting in a consistently BE view of the flash on both BE (no
++ * op) and LE systems. This config setting also causes the command
++ * data from the CFI implementation to get swapped - as is required
++ * so that this code will *unswap* it and give the correct command
++ * data to the flash.
++ */
+ #ifndef __ARMEB__
+ #define BYTE0(h) ((h) & 0xFF)
+ #define BYTE1(h) (((h) >> 8) & 0xFF)
++#define FLASHWORD(a) (*(__u16*)((u32)(a) ^ 2))
+ #else
+ #define BYTE0(h) (((h) >> 8) & 0xFF)
+ #define BYTE1(h) ((h) & 0xFF)
++#define FLASHWORD(a) (*(__u16*)(a))
+ #endif
+
+-#define FLASHWORD(a) (*(__u16*)(a))
+-#define FLASHVAL(a) FLASHWORD(a)
+-#define FLASHSET(a,v) do { FLASHWORD(a) = (v); } while (0)
++#define FLASHVAL(a) cfi16_to_cpu(FLASHWORD(a))
++#define FLASHSET(a,v) (FLASHWORD(a) = cpu_to_cfi16(v))
+
+ static map_word ixp4xx_read16(struct map_info *map, unsigned long ofs)
+ {
diff --git a/packages/linux/nas100d-kernel/2.6.14/10-mtdpart-redboot-fis-byteswap.patch b/packages/linux/nas100d-kernel/2.6.14/10-mtdpart-redboot-fis-byteswap.patch
new file mode 100644
index 0000000000..37d19bd1b0
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/10-mtdpart-redboot-fis-byteswap.patch
@@ -0,0 +1,44 @@
+On IXP4XX systems the FIS directory is big endian even with a little
+endian kernel. This patch recognises the FIS directory on such a
+system and byte swaps it to obtain a valid table based on the 'size'
+field of the FIS directory (the size field is know to always match the
+erase block size on such systems, and probably all systems.)
+
+--- linux-2.6.13/.pc/10-mtdpart-redboot-fis-byteswap.patch/drivers/mtd/redboot.c 2005-08-28 16:41:01.000000000 -0700
++++ linux-2.6.13/drivers/mtd/redboot.c 2005-10-23 21:44:59.999694674 -0700
+@@ -89,8 +89,34 @@
+ i = numslots;
+ break;
+ }
+- if (!memcmp(buf[i].name, "FIS directory", 14))
++ if (!memcmp(buf[i].name, "FIS directory", 14)) {
++ /* This is apparently the FIS directory entry for the
++ * FIS directory itself. The FIS directory size is
++ * one erase block, if the buf[i].size field is
++ * swab32(erasesize) then we know we are looking at
++ * a byte swapped FIS directory - swap all the entries!
++ * (NOTE: this is 'size' not 'data_length', size is
++ * the full size of the entry.)
++ */
++ if (swab32(buf[i].size) == master->erasesize) {
++ int j;
++ for (j = 0; j < numslots && buf[j].name[0] != 0xff; ++j) {
++ /* The unsigned long fields were written with the
++ * wrong byte sex, name and pad have no byte sex.
++ */
++# define do_swab32(x) (x) = swab32(x)
++ do_swab32(buf[j].flash_base);
++ do_swab32(buf[j].mem_base);
++ do_swab32(buf[j].size);
++ do_swab32(buf[j].entry_point);
++ do_swab32(buf[j].data_length);
++ do_swab32(buf[j].desc_cksum);
++ do_swab32(buf[j].file_cksum);
++# undef do_swab32
++ }
++ }
+ break;
++ }
+ }
+ if (i == numslots) {
+ /* Didn't find it */
diff --git a/packages/linux/nas100d-kernel/2.6.14/15-ixp4xx-writesb-l-w.patch b/packages/linux/nas100d-kernel/2.6.14/15-ixp4xx-writesb-l-w.patch
new file mode 100644
index 0000000000..6ac0807f1e
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/15-ixp4xx-writesb-l-w.patch
@@ -0,0 +1,31 @@
+# The inline caller of these APIs were changed to have
+# const vaddr parameters...
+--- linux-2.6.13/include/asm-arm/arch-ixp4xx/io.h.orig 2005-09-24 17:06:19.968099976 -0700
++++ linux-2.6.13/include/asm-arm/arch-ixp4xx/io.h 2005-09-24 17:06:52.542149731 -0700
+@@ -113,7 +113,7 @@
+ }
+
+ static inline void
+-__ixp4xx_writesb(u32 bus_addr, u8 *vaddr, int count)
++__ixp4xx_writesb(u32 bus_addr, const u8 *vaddr, int count)
+ {
+ while (count--)
+ writeb(*vaddr++, bus_addr);
+@@ -136,7 +136,7 @@
+ }
+
+ static inline void
+-__ixp4xx_writesw(u32 bus_addr, u16 *vaddr, int count)
++__ixp4xx_writesw(u32 bus_addr, const u16 *vaddr, int count)
+ {
+ while (count--)
+ writew(*vaddr++, bus_addr);
+@@ -154,7 +154,7 @@
+ }
+
+ static inline void
+-__ixp4xx_writesl(u32 bus_addr, u32 *vaddr, int count)
++__ixp4xx_writesl(u32 bus_addr, const u32 *vaddr, int count)
+ {
+ while (count--)
+ writel(*vaddr++, bus_addr);
diff --git a/packages/linux/nas100d-kernel/2.6.14/18-ixp4xx-io-h-addr.patch b/packages/linux/nas100d-kernel/2.6.14/18-ixp4xx-io-h-addr.patch
new file mode 100644
index 0000000000..5813bbb7ac
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/18-ixp4xx-io-h-addr.patch
@@ -0,0 +1,287 @@
+--- linux-2.6.14/include/asm-arm/arch-ixp4xx/io.h 2005-10-29 23:33:21.757679882 -0700
++++ linux-2.6.14/include/asm-arm/arch-ixp4xx/io.h 2005-10-29 23:47:02.581331058 -0700
+@@ -80,9 +80,9 @@ __ixp4xx_iounmap(void __iomem *addr)
+ #define __arch_ioremap(a, s, f, x) __ixp4xx_ioremap(a, s, f, x)
+ #define __arch_iounmap(a) __ixp4xx_iounmap(a)
+
+-#define writeb(p, v) __ixp4xx_writeb(p, v)
+-#define writew(p, v) __ixp4xx_writew(p, v)
+-#define writel(p, v) __ixp4xx_writel(p, v)
++#define writeb(v, p) __ixp4xx_writeb(v, p)
++#define writew(v, p) __ixp4xx_writew(v, p)
++#define writel(v, p) __ixp4xx_writel(v, p)
+
+ #define writesb(p, v, l) __ixp4xx_writesb(p, v, l)
+ #define writesw(p, v, l) __ixp4xx_writesw(p, v, l)
+@@ -97,8 +97,9 @@ __ixp4xx_iounmap(void __iomem *addr)
+ #define readsl(p, v, l) __ixp4xx_readsl(p, v, l)
+
+ static inline void
+-__ixp4xx_writeb(u8 value, u32 addr)
++__ixp4xx_writeb(u8 value, volatile void __iomem *p)
+ {
++ u32 addr = (u32)p;
+ u32 n, byte_enables, data;
+
+ if (addr >= VMALLOC_START) {
+@@ -113,15 +114,16 @@ __ixp4xx_writeb(u8 value, u32 addr)
+ }
+
+ static inline void
+-__ixp4xx_writesb(u32 bus_addr, const u8 *vaddr, int count)
++__ixp4xx_writesb(volatile void __iomem *bus_addr, const u8 *vaddr, int count)
+ {
+ while (count--)
+ writeb(*vaddr++, bus_addr);
+ }
+
+ static inline void
+-__ixp4xx_writew(u16 value, u32 addr)
++__ixp4xx_writew(u16 value, volatile void __iomem *p)
+ {
++ u32 addr = (u32)p;
+ u32 n, byte_enables, data;
+
+ if (addr >= VMALLOC_START) {
+@@ -136,15 +138,16 @@ __ixp4xx_writew(u16 value, u32 addr)
+ }
+
+ static inline void
+-__ixp4xx_writesw(u32 bus_addr, const u16 *vaddr, int count)
++__ixp4xx_writesw(volatile void __iomem *bus_addr, const u16 *vaddr, int count)
+ {
+ while (count--)
+ writew(*vaddr++, bus_addr);
+ }
+
+ static inline void
+-__ixp4xx_writel(u32 value, u32 addr)
++__ixp4xx_writel(u32 value, volatile void __iomem *p)
+ {
++ u32 addr = (u32)p;
+ if (addr >= VMALLOC_START) {
+ __raw_writel(value, addr);
+ return;
+@@ -154,15 +157,16 @@ __ixp4xx_writel(u32 value, u32 addr)
+ }
+
+ static inline void
+-__ixp4xx_writesl(u32 bus_addr, const u32 *vaddr, int count)
++__ixp4xx_writesl(volatile void __iomem *bus_addr, const u32 *vaddr, int count)
+ {
+ while (count--)
+ writel(*vaddr++, bus_addr);
+ }
+
+ static inline unsigned char
+-__ixp4xx_readb(u32 addr)
++__ixp4xx_readb(const volatile void __iomem *p)
+ {
++ u32 addr = (u32)p;
+ u32 n, byte_enables, data;
+
+ if (addr >= VMALLOC_START)
+@@ -177,15 +181,16 @@ __ixp4xx_readb(u32 addr)
+ }
+
+ static inline void
+-__ixp4xx_readsb(u32 bus_addr, u8 *vaddr, u32 count)
++__ixp4xx_readsb(const volatile void __iomem *bus_addr, u8 *vaddr, u32 count)
+ {
+ while (count--)
+ *vaddr++ = readb(bus_addr);
+ }
+
+ static inline unsigned short
+-__ixp4xx_readw(u32 addr)
++__ixp4xx_readw(const volatile void __iomem *p)
+ {
++ u32 addr = (u32)p;
+ u32 n, byte_enables, data;
+
+ if (addr >= VMALLOC_START)
+@@ -200,15 +205,16 @@ __ixp4xx_readw(u32 addr)
+ }
+
+ static inline void
+-__ixp4xx_readsw(u32 bus_addr, u16 *vaddr, u32 count)
++__ixp4xx_readsw(const volatile void __iomem *bus_addr, u16 *vaddr, u32 count)
+ {
+ while (count--)
+ *vaddr++ = readw(bus_addr);
+ }
+
+ static inline unsigned long
+-__ixp4xx_readl(u32 addr)
++__ixp4xx_readl(const volatile void __iomem *p)
+ {
++ u32 addr = (u32)p;
+ u32 data;
+
+ if (addr >= VMALLOC_START)
+@@ -221,7 +227,7 @@ __ixp4xx_readl(u32 addr)
+ }
+
+ static inline void
+-__ixp4xx_readsl(u32 bus_addr, u32 *vaddr, u32 count)
++__ixp4xx_readsl(const volatile void __iomem *bus_addr, u32 *vaddr, u32 count)
+ {
+ while (count--)
+ *vaddr++ = readl(bus_addr);
+@@ -239,7 +245,7 @@ __ixp4xx_readsl(u32 bus_addr, u32 *vaddr
+ eth_copy_and_sum((s),__mem_pci(c),(l),(b))
+
+ static inline int
+-check_signature(unsigned long bus_addr, const unsigned char *signature,
++check_signature(const unsigned char __iomem *bus_addr, const unsigned char *signature,
+ int length)
+ {
+ int retval = 0;
+@@ -389,7 +395,7 @@ __ixp4xx_insl(u32 io_addr, u32 *vaddr, u
+ #define __is_io_address(p) (((unsigned long)p >= PIO_OFFSET) && \
+ ((unsigned long)p <= (PIO_MASK + PIO_OFFSET)))
+ static inline unsigned int
+-__ixp4xx_ioread8(void __iomem *addr)
++__ixp4xx_ioread8(const void __iomem *addr)
+ {
+ unsigned long port = (unsigned long __force)addr;
+ if (__is_io_address(port))
+@@ -398,12 +404,12 @@ __ixp4xx_ioread8(void __iomem *addr)
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ return (unsigned int)__raw_readb(port);
+ #else
+- return (unsigned int)__ixp4xx_readb(port);
++ return (unsigned int)__ixp4xx_readb(addr);
+ #endif
+ }
+
+ static inline void
+-__ixp4xx_ioread8_rep(void __iomem *addr, void *vaddr, u32 count)
++__ixp4xx_ioread8_rep(const void __iomem *addr, void *vaddr, u32 count)
+ {
+ unsigned long port = (unsigned long __force)addr;
+ if (__is_io_address(port))
+@@ -412,12 +418,12 @@ __ixp4xx_ioread8_rep(void __iomem *addr,
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ __raw_readsb(addr, vaddr, count);
+ #else
+- __ixp4xx_readsb(port, vaddr, count);
++ __ixp4xx_readsb(addr, vaddr, count);
+ #endif
+ }
+
+ static inline unsigned int
+-__ixp4xx_ioread16(void __iomem *addr)
++__ixp4xx_ioread16(const void __iomem *addr)
+ {
+ unsigned long port = (unsigned long __force)addr;
+ if (__is_io_address(port))
+@@ -426,12 +432,12 @@ __ixp4xx_ioread16(void __iomem *addr)
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ return le16_to_cpu(__raw_readw((u32)port));
+ #else
+- return (unsigned int)__ixp4xx_readw((u32)port);
++ return (unsigned int)__ixp4xx_readw(addr);
+ #endif
+ }
+
+ static inline void
+-__ixp4xx_ioread16_rep(void __iomem *addr, void *vaddr, u32 count)
++__ixp4xx_ioread16_rep(const void __iomem *addr, void *vaddr, u32 count)
+ {
+ unsigned long port = (unsigned long __force)addr;
+ if (__is_io_address(port))
+@@ -440,12 +446,12 @@ __ixp4xx_ioread16_rep(void __iomem *addr
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ __raw_readsw(addr, vaddr, count);
+ #else
+- __ixp4xx_readsw(port, vaddr, count);
++ __ixp4xx_readsw(addr, vaddr, count);
+ #endif
+ }
+
+ static inline unsigned int
+-__ixp4xx_ioread32(void __iomem *addr)
++__ixp4xx_ioread32(const void __iomem *addr)
+ {
+ unsigned long port = (unsigned long __force)addr;
+ if (__is_io_address(port))
+@@ -454,13 +460,13 @@ __ixp4xx_ioread32(void __iomem *addr)
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ return le32_to_cpu(__raw_readl((u32)port));
+ #else
+- return (unsigned int)__ixp4xx_readl((u32)port);
++ return (unsigned int)__ixp4xx_readl(addr);
+ #endif
+ }
+ }
+
+ static inline void
+-__ixp4xx_ioread32_rep(void __iomem *addr, void *vaddr, u32 count)
++__ixp4xx_ioread32_rep(const void __iomem *addr, void *vaddr, u32 count)
+ {
+ unsigned long port = (unsigned long __force)addr;
+ if (__is_io_address(port))
+@@ -469,7 +475,7 @@ __ixp4xx_ioread32_rep(void __iomem *addr
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ __raw_readsl(addr, vaddr, count);
+ #else
+- __ixp4xx_readsl(port, vaddr, count);
++ __ixp4xx_readsl(addr, vaddr, count);
+ #endif
+ }
+
+@@ -483,7 +489,7 @@ __ixp4xx_iowrite8(u8 value, void __iomem
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ __raw_writeb(value, port);
+ #else
+- __ixp4xx_writeb(value, port);
++ __ixp4xx_writeb(value, addr);
+ #endif
+ }
+
+@@ -497,7 +503,7 @@ __ixp4xx_iowrite8_rep(void __iomem *addr
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ __raw_writesb(addr, vaddr, count);
+ #else
+- __ixp4xx_writesb(port, vaddr, count);
++ __ixp4xx_writesb(addr, vaddr, count);
+ #endif
+ }
+
+@@ -511,7 +517,7 @@ __ixp4xx_iowrite16(u16 value, void __iom
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ __raw_writew(cpu_to_le16(value), addr);
+ #else
+- __ixp4xx_writew(value, port);
++ __ixp4xx_writew(value, addr);
+ #endif
+ }
+
+@@ -525,7 +531,7 @@ __ixp4xx_iowrite16_rep(void __iomem *add
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ __raw_writesw(addr, vaddr, count);
+ #else
+- __ixp4xx_writesw(port, vaddr, count);
++ __ixp4xx_writesw(addr, vaddr, count);
+ #endif
+ }
+
+@@ -539,7 +545,7 @@ __ixp4xx_iowrite32(u32 value, void __iom
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ __raw_writel(cpu_to_le32(value), port);
+ #else
+- __ixp4xx_writel(value, port);
++ __ixp4xx_writel(value, addr);
+ #endif
+ }
+
+@@ -553,7 +559,7 @@ __ixp4xx_iowrite32_rep(void __iomem *add
+ #ifndef CONFIG_IXP4XX_INDIRECT_PCI
+ __raw_writesl(addr, vaddr, count);
+ #else
+- __ixp4xx_writesl(port, vaddr, count);
++ __ixp4xx_writesl(addr, vaddr, count);
+ #endif
+ }
+
diff --git a/packages/linux/nas100d-kernel/2.6.14/28-spinlock-up.patch b/packages/linux/nas100d-kernel/2.6.14/28-spinlock-up.patch
new file mode 100644
index 0000000000..3ae5178cff
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/28-spinlock-up.patch
@@ -0,0 +1,32 @@
+--- linux-2.6.14-rc5/include/linux/spinlock_up.h 2005-10-26 08:37:20.164248408 -0700
++++ patched/include/linux/spinlock_up.h 2005-10-26 12:15:13.458898975 -0700
+@@ -47,6 +47,14 @@ static inline void __raw_spin_unlock(raw
+ lock->slock = 1;
+ }
+
++#else /* DEBUG_SPINLOCK */
++#define __raw_spin_is_locked(lock) ((void)(lock), 0)
++/* for sched.c and kernel_lock.c: */
++# define __raw_spin_lock(lock) do { (void)(lock); } while (0)
++# define __raw_spin_unlock(lock) do { (void)(lock); } while (0)
++# define __raw_spin_trylock(lock) ({ (void)(lock); 1; })
++#endif /* DEBUG_SPINLOCK */
++
+ /*
+ * Read-write spinlocks. No debug version.
+ */
+@@ -57,14 +65,6 @@ static inline void __raw_spin_unlock(raw
+ #define __raw_read_unlock(lock) do { (void)(lock); } while (0)
+ #define __raw_write_unlock(lock) do { (void)(lock); } while (0)
+
+-#else /* DEBUG_SPINLOCK */
+-#define __raw_spin_is_locked(lock) ((void)(lock), 0)
+-/* for sched.c and kernel_lock.c: */
+-# define __raw_spin_lock(lock) do { (void)(lock); } while (0)
+-# define __raw_spin_unlock(lock) do { (void)(lock); } while (0)
+-# define __raw_spin_trylock(lock) ({ (void)(lock); 1; })
+-#endif /* DEBUG_SPINLOCK */
+-
+ #define __raw_read_can_lock(lock) (((void)(lock), 1))
+ #define __raw_write_can_lock(lock) (((void)(lock), 1))
+
diff --git a/packages/linux/nas100d-kernel/2.6.14/29-ipv4-route-c-spinlock.patch b/packages/linux/nas100d-kernel/2.6.14/29-ipv4-route-c-spinlock.patch
new file mode 100644
index 0000000000..93e070518c
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/29-ipv4-route-c-spinlock.patch
@@ -0,0 +1,11 @@
+--- linux-2.6.14-rc5/net/ipv4/route.c 2005-10-26 08:37:20.752285410 -0700
++++ patched/net/ipv4/route.c 2005-10-26 12:17:00.761651111 -0700
+@@ -231,7 +231,7 @@ static spinlock_t *rt_hash_locks;
+ spin_lock_init(&rt_hash_locks[i]); \
+ }
+ #else
+-# define rt_hash_lock_addr(slot) NULL
++# define rt_hash_lock_addr(slot) ((spinlock_t*)NULL)
+ # define rt_hash_lock_init()
+ #endif
+
diff --git a/packages/linux/nas100d-kernel/2.6.14/90-ixp4xx-pci-le.patch b/packages/linux/nas100d-kernel/2.6.14/90-ixp4xx-pci-le.patch
new file mode 100644
index 0000000000..1a37b13a79
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/90-ixp4xx-pci-le.patch
@@ -0,0 +1,11 @@
+--- linux-2.6.13/.pc/90-ixp4xx-pci-le.patch/arch/arm/mach-ixp4xx/common-pci.c 2005-08-28 16:41:01.000000000 -0700
++++ linux-2.6.13/arch/arm/mach-ixp4xx/common-pci.c 2005-10-26 15:24:30.337542292 -0700
+@@ -427,7 +427,7 @@ void __init ixp4xx_pci_preinit(void)
+ #ifdef __ARMEB__
+ *PCI_CSR = PCI_CSR_IC | PCI_CSR_ABE | PCI_CSR_PDS | PCI_CSR_ADS;
+ #else
+- *PCI_CSR = PCI_CSR_IC;
++ *PCI_CSR = PCI_CSR_IC | PCI_CSR_ABE;
+ #endif
+
+ pr_debug("DONE\n");
diff --git a/packages/linux/nas100d-kernel/2.6.14/defconfig b/packages/linux/nas100d-kernel/2.6.14/defconfig
new file mode 100644
index 0000000000..564bffa17e
--- /dev/null
+++ b/packages/linux/nas100d-kernel/2.6.14/defconfig
@@ -0,0 +1,1552 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.14-rc4
+# Fri Oct 21 16:13:58 2005
+#
+CONFIG_ARM=y
+CONFIG_MMU=y
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_CLEAN_COMPILE=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_HOTPLUG=y
+CONFIG_KOBJECT_UEVENT=y
+# CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_EMBEDDED=y
+# CONFIG_KALLSYMS is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+# CONFIG_BASE_FULL is not set
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SHMEM=y
+CONFIG_CC_ALIGN_FUNCTIONS=0
+CONFIG_CC_ALIGN_LABELS=0
+CONFIG_CC_ALIGN_LOOPS=0
+CONFIG_CC_ALIGN_JUMPS=0
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=1
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP3XX is not set
+CONFIG_ARCH_IXP4XX=y
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_AAEC2000 is not set
+CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
+
+#