summaryrefslogtreecommitdiff
path: root/packages/linux/nslu2-kernel
diff options
context:
space:
mode:
authorJohn Bowler <jbowler@nslu2-linux.org>2005-10-08 03:47:45 +0000
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>2005-10-08 03:47:45 +0000
commitdf6d07a8e6644e02304b4aa577d658000307c818 (patch)
tree2cac9de884213c07803f9ec3b636fd2196272282 /packages/linux/nslu2-kernel
parentcf6bb61067dbcf3511164209452c0b2e7600ffe1 (diff)
nslu2-kernel_2.6.14-rc3.bb: better fix for LE flash access
patch "packages/linux/nslu2-kernel/2.6.14/10-ixp4xx-copy-from.patch" Change to use the cfi16 APIs to byte swap the 16 bit values read from the flash as required. patch "packages/linux/nslu2-kernel/2.6.14/defconfig" patch "packages/linux/openslug-kernel-2.6.14-rc3/defconfig" Change to switch on BIG_ENDIAN for the flash. patch "packages/linux/nslu2-kernel_2.6.14-rc3.bb" New revision
Diffstat (limited to 'packages/linux/nslu2-kernel')
-rw-r--r--packages/linux/nslu2-kernel/2.6.14/10-ixp4xx-copy-from.patch50
-rw-r--r--packages/linux/nslu2-kernel/2.6.14/defconfig7
2 files changed, 41 insertions, 16 deletions
diff --git a/packages/linux/nslu2-kernel/2.6.14/10-ixp4xx-copy-from.patch b/packages/linux/nslu2-kernel/2.6.14/10-ixp4xx-copy-from.patch
index 51d7e0113f..db71342ab0 100644
--- a/packages/linux/nslu2-kernel/2.6.14/10-ixp4xx-copy-from.patch
+++ b/packages/linux/nslu2-kernel/2.6.14/10-ixp4xx-copy-from.patch
@@ -1,6 +1,14 @@
---- linux-2.6.14-rc3/drivers/mtd/maps/ixp4xx.c 2005-10-05 20:35:42.916786530 -0700
-+++ linux-2.6.14-rc3/drivers/mtd/maps/ixp4xx.c 2005-10-05 22:42:25.811206514 -0700
-@@ -30,18 +30,29 @@
+--- linux-2.6.13/.pc/10-ixp4xx-copy-from.patch/drivers/mtd/maps/ixp4xx.c 2005-10-07 15:55:08.958509801 -0700
++++ linux-2.6.13/drivers/mtd/maps/ixp4xx.c 2005-10-07 19:06:22.352484966 -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,18 +31,45 @@
#include <linux/reboot.h>
@@ -9,20 +17,36 @@
+ * 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 consistently big-endian, however this is not a problem as the
-+ * access code consistently only accesses half words - so the endianness
-+ * is not determinable.
++ * up with pdp-endiannes (on an LE syste), 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 FLASHW(a) (*(__u16*)((u32)(a) ^ 2))
++#define FLASHWORD(a) (*(__u16*)((u32)(a) ^ 2))
#else
#define BYTE0(h) (((h) >> 8) & 0xFF)
#define BYTE1(h) ((h) & 0xFF)
-+#define FLASHW(a) (*(__u16*)(a))
++#define FLASHWORD(a) (*(__u16*)(a))
#endif
++#define FLASHW(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)
{
map_word val;
@@ -31,7 +55,7 @@
return val;
}
-@@ -53,19 +64,23 @@
+@@ -53,19 +81,23 @@
static void ixp4xx_copy_from(struct map_info *map, void *to,
unsigned long from, ssize_t len)
{
@@ -65,21 +89,21 @@
}
/*
-@@ -75,7 +90,7 @@
+@@ -75,7 +107,7 @@
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];
-+ FLASHW(map->map_priv_1 + adr) = d.x[0];
++ FLASHSET(map->map_priv_1 + adr, d.x[0]);
}
/*
-@@ -83,7 +98,7 @@
+@@ -83,7 +115,7 @@
*/
static void ixp4xx_write16(struct map_info *map, map_word d, unsigned long adr)
{
- *(__u16 *) (map->map_priv_1 + adr) = d.x[0];
-+ FLASHW(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/nslu2-kernel/2.6.14/defconfig b/packages/linux/nslu2-kernel/2.6.14/defconfig
index 7b1dd207a5..78261828f0 100644
--- a/packages/linux/nslu2-kernel/2.6.14/defconfig
+++ b/packages/linux/nslu2-kernel/2.6.14/defconfig
@@ -1,7 +1,7 @@
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.14-rc3
-# Wed Oct 5 20:33:54 2005
+# Fri Oct 7 19:32:33 2005
#
CONFIG_ARM=y
CONFIG_MMU=y
@@ -150,6 +150,7 @@ CONFIG_FLATMEM_MANUAL=y
CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_SPARSEMEM_STATIC is not set
+# CONFIG_LEDS is not set
CONFIG_ALIGNMENT_TRAP=y
#
@@ -412,8 +413,8 @@ CONFIG_MTD_CFI=y
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_GEN_PROBE=y
CONFIG_MTD_CFI_ADV_OPTIONS=y
-CONFIG_MTD_CFI_NOSWAP=y
-# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_NOSWAP is not set
+CONFIG_MTD_CFI_BE_BYTE_SWAP=y
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
CONFIG_MTD_CFI_GEOMETRY=y
# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set