03 Nov, 2009
3 commits
-
When do_csum gets unaligned data, we really need to treat
the first byte as an even byte, not an odd byte, because
we swap the two halves later.Found by Mike's checksum-selftest module.
Reported-by: Mike Frysinger
Signed-off-by: Arnd Bergmann -
Mike Frysinger suggested that do_csum should be optional
so that an architecture can use the generic checksum code
but still provide an optimized fast-path for the most
critical function.This can mean an implementation using inline assembly,
or in case of Alpha one using 64-bit arithmetic in C.Cc: Mike Frysinger
Signed-off-by: Arnd Bergmann -
The use of 'unsigned long' variables in the 32-bit part of do_csum()
is confusing at best, and potentially broken for long input on 64-bit
machines.This changes the code to use 'unsigned int' instead, which makes
the code behave in the same (correct) way on both 32 and 64 bit
machines.Reported-by: Linus Torvalds
Signed-off-by: Arnd Bergmann
19 Jun, 2009
1 commit
-
The new generic checksum code has a small dependency on endianess and
worked only on big-endian systems. I could not find a nice efficient
way to express this, so I added an #ifdef. Using
'result += le16_to_cpu(*buff);' would have worked as well, but
would be slightly less efficient on big-endian systems and IMHO
would not be clearer.Also fix a bug that prevents this from working on 64-bit machines.
If you have a 64-bit CPU and want to use the generic checksum
code, you should probably do some more optimizations anyway, but
at least the code should not break.Reported-by: Mike Frysinger
Signed-off-by: Arnd Bergmann
12 Jun, 2009
1 commit
-
Add a generic (unoptimized) implementation of checksum.c in pure C
for use by all architectures that cannot be bother with implementing
their own version.Based on microblaze code by Michal Simek
Cc: Michal Simek
Signed-off-by: Remis Lima Baima
Signed-off-by: Arnd Bergmann