From patchwork Mon Jul 12 09:04:20 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Dong, Chuanxiao" X-Patchwork-Id: 58602 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id C1574B6EF0 for ; Mon, 12 Jul 2010 22:12:51 +1000 (EST) Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.72 #1 (Red Hat Linux)) id 1OYHqW-0000kp-3S; Mon, 12 Jul 2010 12:10:52 +0000 Received: from mga09.intel.com ([134.134.136.24]) by bombadil.infradead.org with esmtp (Exim 4.72 #1 (Red Hat Linux)) id 1OYHqR-0000jP-Jp for linux-mtd@lists.infradead.org; Mon, 12 Jul 2010 12:10:48 +0000 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 12 Jul 2010 02:04:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.55,187,1278313200"; d="scan'208,223";a="534515360" Received: from pgsmsx601.gar.corp.intel.com ([10.221.43.69]) by orsmga002.jf.intel.com with ESMTP; 12 Jul 2010 02:05:26 -0700 Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by pgsmsx601.gar.corp.intel.com (10.221.43.69) with Microsoft SMTP Server (TLS) id 8.2.176.0; Mon, 12 Jul 2010 17:04:41 +0800 Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by shsmsx601.ccr.corp.intel.com ([10.239.4.112]) with mapi; Mon, 12 Jul 2010 17:04:22 +0800 From: "Dong, Chuanxiao" To: "Woodhouse, David" , "linux-mtd@lists.infradead.org" Date: Mon, 12 Jul 2010 17:04:20 +0800 Subject: [PATCH 3/5]mtd/nand/denali.c: enabled multi connected NAND feature Thread-Topic: [PATCH 3/5]mtd/nand/denali.c: enabled multi connected NAND feature Thread-Index: AcshoTbiVTpWDkX2TOafIMt8MJd3LA== Message-ID: <5D8008F58939784290FAB48F549751981D09B718B5@shsmsx502.ccr.corp.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: acceptlanguage: en-US MIME-Version: 1.0 X-CRM114-Version: 20090807-BlameThorstenAndJenny ( TRE 0.7.6 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20100712_081047_900886_7A352AF6 X-CRM114-Status: GOOD ( 16.44 ) X-Spam-Score: -2.3 (--) X-Spam-Report: SpamAssassin version 3.3.1 on bombadil.infradead.org summary: Content analysis details: (-2.3 points) pts rule name description ---- ---------------------- -------------------------------------------------- -2.3 RCVD_IN_DNSWL_MED RBL: Sender listed at http://www.dnswl.org/, medium trust [134.134.136.24 listed in list.dnswl.org] -0.0 T_RP_MATCHES_RCVD Envelope sender domain matches handover relay domain Cc: "Dong, Chuanxiao" , "Gao, Yunpeng" , "Yuan, Hang" X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From e82af5ab049d25233709f998464f7813f4fc2ca1 Mon Sep 17 00:00:00 2001 From: Chuanxiao Dong Date: Mon, 21 Jun 2010 18:34:30 +0800 Subject: [PATCH 3/5] [MTD/denali] enabled multi connected NAND feature Signed-off-by: Chuanxiao Dong --- drivers/mtd/nand/denali.c | 28 +++++++++++++++++++++++++--- drivers/mtd/nand/denali.h | 2 ++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c index fbdd9f0..57818eb 100644 --- a/drivers/mtd/nand/denali.c +++ b/drivers/mtd/nand/denali.c @@ -1415,8 +1415,9 @@ static bool handle_ecc(struct denali_nand_info *denali, uint8_t *buf, sector number * sector size + offset in sector */ - int offset = err_sector * ECC_SECTOR_SIZE + - err_byte; + int offset = (err_sector * ECC_SECTOR_SIZE + + err_byte) * denali->devnum + + err_device; if (offset < denali->mtd.writesize) { /* correct the ECC error */ buf[offset] ^= err_correction_value; @@ -2032,6 +2033,27 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) goto failed_nand; } + /* support for multi nand + * MTD known nothing about multi nand, + * so we should tell it the real pagesize + * and anything necessery, + * Some NAND chip has a spectial OOB size, so here do + * a recheck */ + denali->mtd.oobsize = ioread32(denali->flash_reg + + DEVICE_SPARE_AREA_SIZE); + denali->devnum = ioread32(denali->flash_reg + DEVICES_CONNECTED); + denali->nand.chipsize <<= (denali->devnum - 1); + denali->nand.page_shift += (denali->devnum - 1); + denali->nand.pagemask = (denali->nand.chipsize >> + denali->nand.page_shift) - 1; + denali->nand.bbt_erase_shift += (denali->devnum - 1); + denali->nand.phys_erase_shift = denali->nand.bbt_erase_shift; + denali->nand.chip_shift += (denali->devnum - 1); + denali->mtd.writesize <<= (denali->devnum - 1); + denali->mtd.oobsize <<= (denali->devnum - 1); + denali->mtd.erasesize <<= (denali->devnum - 1); + denali->mtd.size = denali->nand.numchips * denali->nand.chipsize; + /* second stage of the NAND scan * this stage requires information regarding ECC and * bad block management. */ @@ -2060,7 +2082,7 @@ static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) denali->nand.ecc.hwctl = denali_ecc_hwctl; /* override the default read operations */ - denali->nand.ecc.size = denali->mtd.writesize; + denali->nand.ecc.size = denali->mtd.writesize * denali->devnum; denali->nand.ecc.read_page = denali_read_page; denali->nand.ecc.read_page_raw = denali_read_page_raw; denali->nand.ecc.write_page = denali_write_page; diff --git a/drivers/mtd/nand/denali.h b/drivers/mtd/nand/denali.h index fc6be39..2bee4cb 100644 --- a/drivers/mtd/nand/denali.h +++ b/drivers/mtd/nand/denali.h @@ -802,6 +802,8 @@ struct denali_nand_info { uint32_t irq_status; int irq_debug_array[32]; int idx; + + uint32_t devnum; /* represent how many nands connected */ }; #endif /*_LLD_NAND_*/