From patchwork Fri Sep 7 16:48:06 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akinobu Mita X-Patchwork-Id: 182422 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from merlin.infradead.org (unknown [IPv6:2001:4978:20e::2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 725472C009D for ; Sat, 8 Sep 2012 02:51:08 +1000 (EST) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1TA1kU-0000CT-Pp; Fri, 07 Sep 2012 16:49:43 +0000 Received: from mail-pz0-f49.google.com ([209.85.210.49]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TA1jH-0007n4-TM for linux-mtd@lists.infradead.org; Fri, 07 Sep 2012 16:48:34 +0000 Received: by dajq27 with SMTP id q27so1930937daj.36 for ; Fri, 07 Sep 2012 09:48:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=kq4bYL6M/mbuocyyfulmRfJP0Z+e2Y6TE0mpWRtJ5HE=; b=IkS3W2gAtYVY2udcRCzbFNiKZXNAJ7Lobfkssfimo8w5hE9oEydMPnu5F73ga+xSn+ PdJomeqLR/tfgWhCMM9Yq3fE/ITAtSpB0RCOrhUT8cPy2i2+PTPbEcW9vPtPV/9tNNgw 7Fbr3pjp+fBuuNfyaqy0kZX7xF+h/W0uKCDP92IKvIjWlqJIlyXobm6xwZ7lA7vgQ1IL AP0wjZHDik8JdLnTahL1SFO18LH6N536lSPt+BcsCSfRZ5qnrnPfqe71nZk2LVlFogGW 7azoUPlcgZIZPNhvMsPfS/X6gNT+aVZw1msNvqAYxXwt3AR8+tiBjI9Kflw/3oCzWPo5 41ag== Received: by 10.68.217.69 with SMTP id ow5mr10539465pbc.35.1347036505640; Fri, 07 Sep 2012 09:48:25 -0700 (PDT) Received: from localhost.localdomain (p4038-ipngn701hodogaya.kanagawa.ocn.ne.jp. [114.158.195.38]) by mx.google.com with ESMTPS id it10sm3399007pbc.53.2012.09.07.09.48.24 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 07 Sep 2012 09:48:25 -0700 (PDT) From: Akinobu Mita To: linux-mtd@lists.infradead.org Subject: [PATCH -next v4 1/5] mtd: mtd_nandecctest: support injecting bit error for ecc code Date: Sat, 8 Sep 2012 01:48:06 +0900 Message-Id: <1347036490-18258-2-git-send-email-akinobu.mita@gmail.com> X-Mailer: git-send-email 1.7.11.4 In-Reply-To: <1347036490-18258-1-git-send-email-akinobu.mita@gmail.com> References: <1347036490-18258-1-git-send-email-akinobu.mita@gmail.com> X-Spam-Note: CRM114 invocation failed X-Spam-Score: -2.7 (--) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-2.7 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [209.85.210.49 listed in list.dnswl.org] 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (akinobu.mita[at]gmail.com) -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature Cc: Artem Bityutskiy , David Woodhouse , Akinobu Mita X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org Currently inject_single_bit_error() is used to inject single bit error into randomly selected bit position of the 256 or 512 bytes data block. Later change will add tests which inject bit errors into the ecc code. Unfortunately, inject_single_bit_error() doesn't work for the ecc code which is not a multiple of sizeof(unsigned long). Because bit fliping at random position is done by __change_bit(). For example, flipping bit position 0 by __change_bit(0, addr) modifies 3rd byte (32bit) or 7th byte (64bit) on big-endian systems. Using little-endian version of bitops can fix this issue. But little-endian version of __change_bit is not yet available. So this defines __change_bit_le() locally in a similar fashion to asm-generic/bitops/le.h and use it. Signed-off-by: Akinobu Mita Cc: David Woodhouse Cc: linux-mtd@lists.infradead.org Cc: Artem Bityutskiy --- * v4 - remove include asm/byteorder.h - add comment for __change_bit_le() drivers/mtd/tests/mtd_nandecctest.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/mtd/tests/mtd_nandecctest.c b/drivers/mtd/tests/mtd_nandecctest.c index d3e8873..d90daf8 100644 --- a/drivers/mtd/tests/mtd_nandecctest.c +++ b/drivers/mtd/tests/mtd_nandecctest.c @@ -9,11 +9,25 @@ #if defined(CONFIG_MTD_NAND) || defined(CONFIG_MTD_NAND_MODULE) +/* + * The reason for this __change_bit_le() instead of __change_bit() is to inject + * bit error properly within the region which is not a multiple of + * sizeof(unsigned long) on big-endian systems + */ +#ifdef __LITTLE_ENDIAN +#define __change_bit_le(nr, addr) __change_bit(nr, addr) +#elif defined(__BIG_ENDIAN) +#define __change_bit_le(nr, addr) \ + __change_bit((nr) ^ ((BITS_PER_LONG - 1) & ~0x7), addr) +#else +#error "Unknown byte order" +#endif + static void inject_single_bit_error(void *data, size_t size) { - unsigned long offset = random32() % (size * BITS_PER_BYTE); + unsigned int offset = random32() % (size * BITS_PER_BYTE); - __change_bit(offset, data); + __change_bit_le(offset, data); } static void dump_data_ecc(void *error_data, void *error_ecc, void *correct_data,