On Mon, 2005-01-10 at 13:05 +0000, Maciej W. Rozycki wrote: > On Thu, 6 Jan 2005, Herbert Valerio Riedel wrote: > > > jfyi, this change broke mtd and au1xxx-usb on big endian au1xxx systems, > > as the _raw calls do suddenly byteswapping :-( > > > > was this intended? > > It was. Generic code elsewhere expects it and the MIPS implementation > used to be broken because of that. Note these functions are intended for > PCI/EISA/ISA accesses only and these buses are little-endian by > definition. More specifically __raw_ calls are mainly for PIO copying > to/from memory over these buses when you want to keep byte ordering the > same as it would be for a DMA transfer. > If you have a driver that handles a non-PCI/EISA/ISA device you may and > probably should use bus_ calls to get a non-swapped access. so this means, the mtd subsystem should use them and that the patch below is the way to fix it? (hoping it won't brake on other systems?) Index: map.h =================================================================== RCS file: /home/cvs/linux/include/linux/mtd/map.h,v retrieving revision 1.12 diff -u -r1.12 map.h --- map.h 25 Oct 2004 20:44:46 -0000 1.12 +++ map.h 10 Jan 2005 14:45:00 -0000 @@ -343,14 +343,14 @@ map_word r; if (map_bankwidth_is_1(map)) - r.x[0] = __raw_readb(map->virt + ofs); + r.x[0] = readb(map->virt + ofs); else if (map_bankwidth_is_2(map)) - r.x[0] = __raw_readw(map->virt + ofs); + r.x[0] = readw(map->virt + ofs); else if (map_bankwidth_is_4(map)) - r.x[0] = __raw_readl(map->virt + ofs); + r.x[0] = readl(map->virt + ofs); #if BITS_PER_LONG >= 64 else if (map_bankwidth_is_8(map)) - r.x[0] = __raw_readq(map->virt + ofs); + r.x[0] = readq(map->virt + ofs); #endif else if (map_bankwidth_is_large(map)) memcpy_fromio(r.x, map->virt+ofs, map->bankwidth); @@ -361,14 +361,14 @@ static inline void inline_map_write(struct map_info *map, const map_word datum, unsigned long ofs) { if (map_bankwidth_is_1(map)) - __raw_writeb(datum.x[0], map->virt + ofs); + writeb(datum.x[0], map->virt + ofs); else if (map_bankwidth_is_2(map)) - __raw_writew(datum.x[0], map->virt + ofs); + writew(datum.x[0], map->virt + ofs); else if (map_bankwidth_is_4(map)) - __raw_writel(datum.x[0], map->virt + ofs); + writel(datum.x[0], map->virt + ofs); #if BITS_PER_LONG >= 64 else if (map_bankwidth_is_8(map)) - __raw_writeq(datum.x[0], map->virt + ofs); + writeq(datum.x[0], map->virt + ofs); #endif else if (map_bankwidth_is_large(map)) memcpy_toio(map->virt+ofs, datum.x, map->bankwidth); -- Herbert Valerio Riedel <hvr@xxxxxxxxxxxxxxxxx>