All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michal Simek <monstr@monstr.eu>
To: microblaze-uclinux@itee.uq.edu.au
Cc: LKML <linux-kernel@vger.kernel.org>,
	Remis Lima Baima <remis.developer@googlemail.com>,
	Arnd Bergmann <arnd@arndb.de>
Subject: Re: [microblaze-uclinux] [PATCH 08/11] microblaze: use the generic lib/checksum.c
Date: Wed, 01 Jul 2009 13:35:22 +0200	[thread overview]
Message-ID: <4A4B49FA.4030001@monstr.eu> (raw)
In-Reply-To: <612591dcc1943bc8d518d6447b37df26053068fb.1245347640.git.arnd@arndb.de>

added to next branch for test.

Thanks,
Michal

Arnd Bergmann wrote:
> From: Remis Lima Baima <remis.developer@googlemail.com>
> 
> The microblaze checksum code is mostly identical to
> the asm-generic+lib version, so use that instead.
> 
> Signed-off-by: Remis Lima Baima <remis.developer@googlemail.com>
> ---
>  arch/microblaze/Kconfig                |    3 +
>  arch/microblaze/include/asm/checksum.h |  134 ++++++------------------
>  arch/microblaze/lib/Makefile           |    2 +-
>  arch/microblaze/lib/checksum.c         |  172 --------------------------------
>  4 files changed, 38 insertions(+), 273 deletions(-)
>  rewrite arch/microblaze/include/asm/checksum.h (69%)
>  delete mode 100644 arch/microblaze/lib/checksum.c
> 
> diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
> index 8b4de19..8ee1c85 100644
> --- a/arch/microblaze/Kconfig
> +++ b/arch/microblaze/Kconfig
> @@ -56,6 +56,9 @@ config GENERIC_GPIO
>  config GENERIC_SYSCALL_TABLE
>  	def_bool y
>  
> +config GENERIC_CSUM
> +	def_bool y
> +
>  config PCI
>  	def_bool n
>  
> diff --git a/arch/microblaze/include/asm/checksum.h b/arch/microblaze/include/asm/checksum.h
> dissimilarity index 69%
> index 97ea46b..128bf03 100644
> --- a/arch/microblaze/include/asm/checksum.h
> +++ b/arch/microblaze/include/asm/checksum.h
> @@ -1,100 +1,34 @@
> -/*
> - * Copyright (C) 2008 Michal Simek <monstr@monstr.eu>
> - * Copyright (C) 2006 Atmark Techno, Inc.
> - *
> - * This file is subject to the terms and conditions of the GNU General Public
> - * License. See the file "COPYING" in the main directory of this archive
> - * for more details.
> - */
> -
> -#ifndef _ASM_MICROBLAZE_CHECKSUM_H
> -#define _ASM_MICROBLAZE_CHECKSUM_H
> -
> -#include <linux/in6.h>
> -
> -/*
> - * computes the checksum of the TCP/UDP pseudo-header
> - * returns a 16-bit checksum, already complemented
> - */
> -static inline __wsum
> -csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
> -		   unsigned short proto, __wsum sum)
> -{
> -	__asm__("add %0, %0, %1\n\t"
> -		"addc %0, %0, %2\n\t"
> -		"addc %0, %0, %3\n\t"
> -		"addc %0, %0, r0\n\t"
> -		: "+&d" (sum)
> -		: "d" (saddr), "d" (daddr), "d" (len + proto));
> -
> -	return sum;
> -}
> -
> -/*
> - * computes the checksum of a memory block at buff, length len,
> - * and adds in "sum" (32-bit)
> - *
> - * returns a 32-bit number suitable for feeding into itself
> - * or csum_tcpudp_magic
> - *
> - * this function must be called with even lengths, except
> - * for the last fragment, which may be odd
> - *
> - * it's best to have buff aligned on a 32-bit boundary
> - */
> -extern __wsum csum_partial(const void *buff, int len, __wsum sum);
> -
> -/*
> - * the same as csum_partial, but copies from src while it
> - * checksums
> - *
> - * here even more important to align src and dst on a 32-bit (or even
> - * better 64-bit) boundary
> - */
> -extern __wsum csum_partial_copy(const void *src, void *dst, int len,
> -								__wsum sum);
> -
> -/*
> - * the same as csum_partial_copy, but copies from user space.
> - *
> - * here even more important to align src and dst on a 32-bit (or even
> - * better 64-bit) boundary
> - */
> -extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
> -					int len, __wsum sum, int *csum_err);
> -
> -#define csum_partial_copy_nocheck(src, dst, len, sum)	\
> -	csum_partial_copy((src), (dst), (len), (sum))
> -
> -/*
> - *	This is a version of ip_compute_csum() optimized for IP headers,
> - *	which always checksum on 4 octet boundaries.
> - *
> - */
> -extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
> -
> -/*
> - *	Fold a partial checksum
> - */
> -static inline __sum16 csum_fold(__wsum csum)
> -{
> -	u32 sum = (__force u32)csum;
> -	sum = (sum & 0xffff) + (sum >> 16);
> -	sum = (sum & 0xffff) + (sum >> 16);
> -	return (__force __sum16)~sum;
> -}
> -
> -static inline __sum16
> -csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
> -		  unsigned short proto, __wsum sum)
> -{
> -	return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
> -}
> -
> -/*
> - * this routine is used for miscellaneous IP-like checksums, mainly
> - * in icmp.c
> - */
> -extern __sum16 ip_compute_csum(const void *buff, int len);
> -
> -#endif /* _ASM_MICROBLAZE_CHECKSUM_H */
> +/*
> + * Copyright (C) 2008 Michal Simek <monstr@monstr.eu>
> + * Copyright (C) 2006 Atmark Techno, Inc.
> + *
> + * This file is subject to the terms and conditions of the GNU General Public
> + * License. See the file "COPYING" in the main directory of this archive
> + * for more details.
> + */
> +
> +#ifndef _ASM_MICROBLAZE_CHECKSUM_H
> +#define _ASM_MICROBLAZE_CHECKSUM_H
> +
> +/*
> + * computes the checksum of the TCP/UDP pseudo-header
> + * returns a 16-bit checksum, already complemented
> + */
> +#define csum_tcpudp_nofold	csum_tcpudp_nofold
> +static inline __wsum
> +csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
> +		   unsigned short proto, __wsum sum)
> +{
> +	__asm__("add %0, %0, %1\n\t"
> +		"addc %0, %0, %2\n\t"
> +		"addc %0, %0, %3\n\t"
> +		"addc %0, %0, r0\n\t"
> +		: "+&d" (sum)
> +		: "d" (saddr), "d" (daddr), "d" (len + proto));
> +
> +	return sum;
> +}
> +
> +#include <asm-generic/checksum.h>
> +
> +#endif /* _ASM_MICROBLAZE_CHECKSUM_H */
> diff --git a/arch/microblaze/lib/Makefile b/arch/microblaze/lib/Makefile
> index 71c8cb6..b579db0 100644
> --- a/arch/microblaze/lib/Makefile
> +++ b/arch/microblaze/lib/Makefile
> @@ -2,7 +2,7 @@
>  # Makefile
>  #
>  
> -lib-y :=  memset.o checksum.o
> +lib-y :=  memset.o
>  
>  ifeq ($(CONFIG_OPT_LIB_ASM),y)
>  lib-y += fastcopy.o
> diff --git a/arch/microblaze/lib/checksum.c b/arch/microblaze/lib/checksum.c
> deleted file mode 100644
> index f08e745..0000000
> --- a/arch/microblaze/lib/checksum.c
> +++ /dev/null
> @@ -1,172 +0,0 @@
> -/*
> - *
> - * INET		An implementation of the TCP/IP protocol suite for the LINUX
> - *		operating system.  INET is implemented using the  BSD Socket
> - *		interface as the means of communication with the user level.
> - *
> - *		IP/TCP/UDP checksumming routines
> - *
> - * Authors:	Jorge Cwik, <jorge@laser.satlink.net>
> - *		Arnt Gulbrandsen, <agulbra@nvg.unit.no>
> - *		Tom May, <ftom@netcom.com>
> - *		Andreas Schwab, <schwab@issan.informatik.uni-dortmund.de>
> - *		Lots of code moved from tcp.c and ip.c; see those files
> - *		for more names.
> - *
> - * 03/02/96	Jes Sorensen, Andreas Schwab, Roman Hodek:
> - *		Fixed some nasty bugs, causing some horrible crashes.
> - *		A: At some points, the sum (%0) was used as
> - *		length-counter instead of the length counter
> - *		(%1). Thanks to Roman Hodek for pointing this out.
> - *		B: GCC seems to mess up if one uses too many
> - *		data-registers to hold input values and one tries to
> - *		specify d0 and d1 as scratch registers. Letting gcc
> - *		choose these registers itself solves the problem.
> - *
> - *		This program is free software; you can redistribute it and/or
> - *		modify it under the terms of the GNU General Public License
> - *		as published by the Free Software Foundation; either version
> - *		2 of the License, or (at your option) any later version.
> - */
> -
> -/* Revised by Kenneth Albanowski for m68knommu. Basic problem: unaligned access
> - kills, so most of the assembly has to go. */
> -
> -#include <linux/module.h>
> -#include <net/checksum.h>
> -
> -#include <asm/byteorder.h>
> -
> -static inline unsigned short from32to16(unsigned long x)
> -{
> -	/* add up 16-bit and 16-bit for 16+c bit */
> -	x = (x & 0xffff) + (x >> 16);
> -	/* add up carry.. */
> -	x = (x & 0xffff) + (x >> 16);
> -	return x;
> -}
> -
> -static unsigned int do_csum(const unsigned char *buff, int len)
> -{
> -	int odd, count;
> -	unsigned long result = 0;
> -
> -	if (len <= 0)
> -		goto out;
> -	odd = 1 & (unsigned long) buff;
> -	if (odd) {
> -		result = *buff;
> -		len--;
> -		buff++;
> -	}
> -	count = len >> 1;		/* nr of 16-bit words.. */
> -	if (count) {
> -		if (2 & (unsigned long) buff) {
> -			result += *(unsigned short *) buff;
> -			count--;
> -			len -= 2;
> -			buff += 2;
> -		}
> -		count >>= 1;		/* nr of 32-bit words.. */
> -		if (count) {
> -			unsigned long carry = 0;
> -			do {
> -				unsigned long w = *(unsigned long *) buff;
> -				count--;
> -				buff += 4;
> -				result += carry;
> -				result += w;
> -				carry = (w > result);
> -			} while (count);
> -			result += carry;
> -			result = (result & 0xffff) + (result >> 16);
> -		}
> -		if (len & 2) {
> -			result += *(unsigned short *) buff;
> -			buff += 2;
> -		}
> -	}
> -	if (len & 1)
> -		result += (*buff << 8);
> -	result = from32to16(result);
> -	if (odd)
> -		result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
> -out:
> -	return result;
> -}
> -
> -/*
> - *	This is a version of ip_compute_csum() optimized for IP headers,
> - *	which always checksum on 4 octet boundaries.
> - */
> -__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
> -{
> -	return (__force __sum16)~do_csum(iph, ihl*4);
> -}
> -EXPORT_SYMBOL(ip_fast_csum);
> -
> -/*
> - * computes the checksum of a memory block at buff, length len,
> - * and adds in "sum" (32-bit)
> - *
> - * returns a 32-bit number suitable for feeding into itself
> - * or csum_tcpudp_magic
> - *
> - * this function must be called with even lengths, except
> - * for the last fragment, which may be odd
> - *
> - * it's best to have buff aligned on a 32-bit boundary
> - */
> -__wsum csum_partial(const void *buff, int len, __wsum wsum)
> -{
> -	unsigned int sum = (__force unsigned int)wsum;
> -	unsigned int result = do_csum(buff, len);
> -
> -	/* add in old sum, and carry.. */
> -	result += sum;
> -	if (sum > result)
> -		result += 1;
> -	return (__force __wsum)result;
> -}
> -EXPORT_SYMBOL(csum_partial);
> -
> -/*
> - * this routine is used for miscellaneous IP-like checksums, mainly
> - * in icmp.c
> - */
> -__sum16 ip_compute_csum(const void *buff, int len)
> -{
> -	return (__force __sum16)~do_csum(buff, len);
> -}
> -EXPORT_SYMBOL(ip_compute_csum);
> -
> -/*
> - * copy from fs while checksumming, otherwise like csum_partial
> - */
> -__wsum
> -csum_partial_copy_from_user(const void __user *src, void *dst, int len,
> -						__wsum sum, int *csum_err)
> -{
> -	int missing;
> -
> -	missing = __copy_from_user(dst, src, len);
> -	if (missing) {
> -		memset(dst + len - missing, 0, missing);
> -		*csum_err = -EFAULT;
> -	} else
> -		*csum_err = 0;
> -
> -	return csum_partial(dst, len, sum);
> -}
> -EXPORT_SYMBOL(csum_partial_copy_from_user);
> -
> -/*
> - * copy from ds while checksumming, otherwise like csum_partial
> - */
> -__wsum
> -csum_partial_copy(const void *src, void *dst, int len, __wsum sum)
> -{
> -	memcpy(dst, src, len);
> -	return csum_partial(dst, len, sum);
> -}
> -EXPORT_SYMBOL(csum_partial_copy);

-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854

  reply	other threads:[~2009-07-01 11:35 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-18 17:55 [PATCH 00/11] microblaze: use generic headers Arnd Bergmann
2009-06-18 17:55 ` [PATCH 01/11] ipc: use __ARCH_WANT_IPC_PARSE_VERSION in ipc/util.h Arnd Bergmann
2009-06-18 17:55   ` [PATCH 02/11] microblaze: remove init_mm Arnd Bergmann
2009-06-18 17:55   ` [PATCH 03/11] microblaze: fall back on generic header files for the ABI Arnd Bergmann
2009-07-01 11:34     ` [microblaze-uclinux] " Michal Simek
2009-07-01 11:42       ` Arnd Bergmann
2009-07-01 12:09         ` Michal Simek
2009-07-01 13:41           ` Arnd Bergmann
2009-07-01 22:52       ` John Williams
2009-07-02  9:36         ` Arnd Bergmann
2009-07-03  5:55           ` Michal Simek
2009-07-03 17:16             ` Arnd Bergmann
2009-06-18 17:55   ` [PATCH 04/11] microblaze: use generic unistd.h syscall list Arnd Bergmann
2009-06-18 17:55   ` [PATCH 05/11] microblaze: clean up signal handling Arnd Bergmann
2009-06-18 17:55   ` [PATCH 06/11] microblaze: use generic syscalls.h Arnd Bergmann
2009-06-18 17:55   ` [PATCH 07/11] microblaze: make syscall_table implementation generic Arnd Bergmann
2009-06-18 17:55   ` [PATCH 08/11] microblaze: use the generic lib/checksum.c Arnd Bergmann
2009-07-01 11:35     ` Michal Simek [this message]
2009-06-18 17:55   ` [PATCH 09/11] microblaze: convert all simple headers to use asm-generic Arnd Bergmann
2009-07-01 11:35     ` [microblaze-uclinux] " Michal Simek
2009-06-18 17:55   ` [PATCH 10/11] microblaze: use generic system.h Arnd Bergmann
2009-07-01 11:19     ` [microblaze-uclinux] " Michal Simek
2009-07-01 11:39       ` Arnd Bergmann
2009-07-01 11:51         ` Michal Simek
2009-06-18 17:55   ` [PATCH 11/11] microblaze: remove sys_ipc Arnd Bergmann
2009-06-18 22:31   ` [PATCH 01/11] ipc: use __ARCH_WANT_IPC_PARSE_VERSION in ipc/util.h Arnd Bergmann
2009-06-20  1:09     ` [patch] ipc: unbreak 32-bit shmctl/semctl/msgctl Johannes Weiner
2009-06-20  8:20       ` Arnd Bergmann
2009-06-21 19:01         ` Johannes Weiner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A4B49FA.4030001@monstr.eu \
    --to=monstr@monstr.eu \
    --cc=arnd@arndb.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=microblaze-uclinux@itee.uq.edu.au \
    --cc=remis.developer@googlemail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.