Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=7ef416c4b878685a419a3b2f133ab5e7283f96b0
Commit:     7ef416c4b878685a419a3b2f133ab5e7283f96b0
Parent:     10c03f69680e9e2acd8a9409a230aef37295ac49
Author:     Russell King <[EMAIL PROTECTED]>
AuthorDate: Thu Dec 21 20:59:37 2006 +0000
Committer:  Russell King <[EMAIL PROTECTED]>
CommitDate: Tue Feb 6 16:46:46 2007 +0000

    [ARM] Improve csum_fold, cleanup csum_tcpudp_magic()
    
    csum_fold doesn't need two assembly instructions to perform its task,
    it can simply add the high and low parts together by rotating by 16
    bits, and the carry into the upper-16 bits will automatically happen.
    
    Also, since csum_tcpudp_magic() is just csum_tcpudp_nofold + csum_fold,
    use those two functions to achieve this.  Also note that there is a
    csum_fold() at the end of ip_fast_csum() as well, so use the real
    csum_fold() there as well.
    
    Boot tested on Versatile.
    
    Signed-off-by: Russell King <[EMAIL PROTECTED]>
---
 include/asm-arm/checksum.h |   56 ++++++++++++++-----------------------------
 1 files changed, 18 insertions(+), 38 deletions(-)

diff --git a/include/asm-arm/checksum.h b/include/asm-arm/checksum.h
index 8c0bb5b..eaa0efd 100644
--- a/include/asm-arm/checksum.h
+++ b/include/asm-arm/checksum.h
@@ -40,13 +40,27 @@ __wsum
 csum_partial_copy_from_user(const void __user *src, void *dst, int len, __wsum 
sum, int *err_ptr);
 
 /*
+ *     Fold a partial checksum without adding pseudo headers
+ */
+static inline __sum16 csum_fold(__wsum sum)
+{
+       __asm__(
+       "add    %0, %1, %1, ror #16     @ csum_fold"
+       : "=r" (sum)
+       : "r" (sum)
+       : "cc");
+       return (__force __sum16)(~(__force u32)sum >> 16);
+}
+
+/*
  *     This is a version of ip_compute_csum() optimized for IP headers,
  *     which always checksum on 4 octet boundaries.
  */
 static inline __sum16
 ip_fast_csum(const void *iph, unsigned int ihl)
 {
-       unsigned int sum, tmp1;
+       unsigned int tmp1;
+       __wsum sum;
 
        __asm__ __volatile__(
        "ldr    %0, [%1], #4            @ ip_fast_csum          \n\
@@ -62,29 +76,11 @@ ip_fast_csum(const void *iph, unsigned int ihl)
        subne   %2, %2, #1              @ without destroying    \n\
        bne     1b                      @ the carry flag        \n\
        adcs    %0, %0, %3                                      \n\
-       adc     %0, %0, #0                                      \n\
-       adds    %0, %0, %0, lsl #16                             \n\
-       addcs   %0, %0, #0x10000                                \n\
-       mvn     %0, %0                                          \n\
-       mov     %0, %0, lsr #16"
+       adc     %0, %0, #0"
        : "=r" (sum), "=r" (iph), "=r" (ihl), "=r" (tmp1)
        : "1" (iph), "2" (ihl)
        : "cc", "memory");
-       return (__force __sum16)sum;
-}
-
-/*
- *     Fold a partial checksum without adding pseudo headers
- */
-static inline __sum16 csum_fold(__wsum sum)
-{
-       __asm__(
-       "adds   %0, %1, %1, lsl #16     @ csum_fold             \n\
-       addcs   %0, %0, #0x10000"
-       : "=r" (sum)
-       : "r" (sum)
-       : "cc");
-       return (__force __sum16)(~(__force u32)sum >> 16);
+       return csum_fold(sum);
 }
 
 static inline __wsum
@@ -114,23 +110,7 @@ static inline __sum16
 csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
                  unsigned short proto, __wsum sum)
 {
-       __asm__(
-       "adds   %0, %1, %2              @ csum_tcpudp_magic     \n\
-       adcs    %0, %0, %3                                      \n"
-#ifdef __ARMEB__
-       "adcs   %0, %0, %4                                      \n"
-#else
-       "adcs   %0, %0, %4, lsl #8                              \n"
-#endif
-       "adcs   %0, %0, %5                                      \n\
-       adc     %0, %0, #0                                      \n\
-       adds    %0, %0, %0, lsl #16                             \n\
-       addcs   %0, %0, #0x10000                                \n\
-       mvn     %0, %0"
-       : "=&r"(sum)
-       : "r" (sum), "r" (daddr), "r" (saddr), "r" (len), "Ir" (htons(proto))
-       : "cc");
-       return (__force __sum16)((__force u32)sum >> 16);
+       return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
 }
 
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to