--- 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 {