]> err.no Git - linux-2.6/commitdiff
[AVR32] Remove optimization of unaligned word loads
authorHaavard Skinnemoen <hskinnemoen@atmel.com>
Wed, 20 Jun 2007 13:29:15 +0000 (15:29 +0200)
committerHaavard Skinnemoen <hskinnemoen@atmel.com>
Wed, 18 Jul 2007 18:45:51 +0000 (20:45 +0200)
If we let unaligned word loads bypass the generic unaligned handling,
gcc may combine it with a swap.b instruction and turn it into a ldwsp
instruction, which does not work with unaligned addresses.

Revert the optimization to prevent the RNDIS driver from crashing.
Hopefully we'll figure something out later (it may be better to do the
optimization in gcc.)

Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
include/asm-avr32/unaligned.h

index 791361786fcc6b40c9a39b7a291e95107a7e8648..36f5fd430543ec5d088335f52d357d58e7c75ea7 100644 (file)
@@ -6,31 +6,11 @@
  * implementation.  The AVR32 AP implementation can handle unaligned
  * words, but halfwords must be halfword-aligned, and doublewords must
  * be word-aligned.
+ *
+ * However, swapped word loads must be word-aligned so we can't
+ * optimize word loads in general.
  */
 
 #include <asm-generic/unaligned.h>
 
-#ifdef CONFIG_CPU_AT32AP7000
-
-/* REVISIT calling memmove() may be smaller for 64-bit values ... */
-
-#undef get_unaligned
-#define get_unaligned(ptr) \
-       ___get_unaligned(ptr, sizeof((*ptr)))
-#define ___get_unaligned(ptr, size) \
-       ((size == 4) ? *(ptr) : __get_unaligned(ptr, size))
-
-#undef put_unaligned
-#define put_unaligned(val, ptr) \
-       ___put_unaligned((__u64)(val), ptr, sizeof((*ptr)))
-#define ___put_unaligned(val, ptr, size)               \
-do {                                                   \
-       if (size == 4)                                  \
-               *(ptr) = (val);                         \
-       else                                            \
-               __put_unaligned(val, ptr, size);        \
-} while (0)
-
-#endif
-
 #endif /* __ASM_AVR32_UNALIGNED_H */