# This patch fixes ixp4xx_copy_from for cases where the 'from' # pointer is odd - that would cause all the accesses to be # misaligned in the old code. --- linux-2.6.12.2/.pc/ixp4xx_copy_from.patch/drivers/mtd/maps/ixp4xx.c 2005-09-21 22:35:38.761014739 -0700 +++ linux-2.6.12.2/drivers/mtd/maps/ixp4xx.c 2005-09-23 01:27:54.696223365 -0700 @@ -54,19 +54,23 @@ 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; + if (len <= 0) + return; - for (i = 0; i < (len / 2); i++) { - data = src[i]; - dest[i * 2] = BYTE0(data); - dest[i * 2 + 1] = BYTE1(data); + u8 *dest = (u8 *) to; + u8 *src = (u8 *) (map->map_priv_1 + from); + if (from & 1) + *dest++ = BYTE1(*(u16 *)(src-1)), ++src, --len; + + while (len >= 2) { + u16 data = *(u16 *)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(*(u16 *)src); } /*