From patchwork Tue Mar 25 08:19:57 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 3886331 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id E3C239F2E8 for ; Tue, 25 Mar 2014 09:28:11 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 02B42202AE for ; Tue, 25 Mar 2014 09:28:11 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 10F0D2026C for ; Tue, 25 Mar 2014 09:28:10 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMuN-0000OK-Q1; Tue, 25 Mar 2014 08:40:32 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMtP-0003Q1-UT; Tue, 25 Mar 2014 08:39:31 +0000 Received: from bombadil.infradead.org ([2001:1868:205::9]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMrz-0003B8-9y for linux-arm-kernel@merlin.infradead.org; Tue, 25 Mar 2014 08:38:03 +0000 Received: from mail-wi0-f173.google.com ([209.85.212.173]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WSMcS-0002F2-6K for linux-arm-kernel@lists.infradead.org; Tue, 25 Mar 2014 08:22:00 +0000 Received: by mail-wi0-f173.google.com with SMTP id f8so3188207wiw.0 for ; Tue, 25 Mar 2014 01:21:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ASFh+I8Sf9SkicaUoSz80YTcw+lcvzZ9yR92uq6IHjE=; b=KtxX1/i22hYp4+zMB5V1oT00IryFr3iorrIStBdZpNj0UBxyfM9tP/6a/AtrLegYvq HHE6rtvtvrd1aaLAZgT+6OViCNOnKBc/A/+XsN/De5fHG47hOx9v0iyhwNfxMO329/2Y 0BBbms5cEvj9xwmKVOtG0vgxFznCuHo5M3WAHjMGLFCkr7dqUpjboavzDf5pAMwwhIYu OHzY7TKHyKLOmjIcZ9aWEopx67dOKNWKKfOfXwtO/2WE9GQw+DVPXNrSRAKImi92dsRE Ko9bja3PR+A9S+AV/LMbef1x5Lyb4OIned5Cbvi94K3Klb9T2nYyLexGV9STILm+iK5L pdTg== X-Gm-Message-State: ALoCoQliDHz3WEQ4iyemalYXgsQz9ESqLe2vu22RfJdfkczpNC7RmAMIY1X6WgCSTxlt9lEQEXtR X-Received: by 10.180.164.69 with SMTP id yo5mr20904200wib.55.1395735694363; Tue, 25 Mar 2014 01:21:34 -0700 (PDT) Received: from lee--X1.home (host109-148-113-193.range109-148.btcentralplus.com. [109.148.113.193]) by mx.google.com with ESMTPSA id k4sm5567676wib.19.2014.03.25.01.21.32 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 25 Mar 2014 01:21:33 -0700 (PDT) From: Lee Jones To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [RFC 40/47] mtd: nand: stm_nand_bch: MTD erase (BCH) Date: Tue, 25 Mar 2014 08:19:57 +0000 Message-Id: <1395735604-26706-41-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1395735604-26706-1-git-send-email-lee.jones@linaro.org> References: <1395735604-26706-1-git-send-email-lee.jones@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140325_012200_386514_C7894B69 X-CRM114-Status: GOOD ( 12.42 ) X-Spam-Score: -0.7 (/) Cc: angus.clark@st.com, kernel@stlinux.com, lee.jones@linaro.org, linux-mtd@lists.infradead.org, pekon@ti.com, computersforpeace@gmail.com, dwmw2@infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Carry out the normal checks, then attempt to erase a given block. Signed-off-by: Lee Jones --- drivers/mtd/nand/stm_nand_bch.c | 85 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/drivers/mtd/nand/stm_nand_bch.c b/drivers/mtd/nand/stm_nand_bch.c index 75c5c9b..55f4a4c 100644 --- a/drivers/mtd/nand/stm_nand_bch.c +++ b/drivers/mtd/nand/stm_nand_bch.c @@ -1218,6 +1218,89 @@ static int flex_do_write_ops(struct nandi_controller *nandi, return 0; } +static int bch_mtd_erase(struct mtd_info *mtd, struct erase_info *instr) +{ + struct nand_chip *chip = mtd->priv; + struct nandi_controller *nandi = chip->priv; + uint64_t block_mask = mtd->erasesize - 1; + uint64_t offs_cached; + loff_t offs = instr->addr; + size_t len = instr->len; + uint8_t status; + int ret; + + dev_dbg(nandi->dev, "%s: 0x%012llx @ 0x%012llx\n", __func__, + (unsigned long long)len, offs); + + if (offs & block_mask) { + dev_err(nandi->dev, + "attempt to erase from non-block-aligned offset\n"); + return -EINVAL; + } + + if (len & block_mask) { + dev_err(nandi->dev, + "attempt to erase non-block-aligned length\n"); + return -EINVAL; + } + + if ((offs + len) > mtd->size) { + dev_err(nandi->dev, "attempt to erase past end of device\n"); + return -EINVAL; + } + + nand_get_device(mtd, FL_ERASING); + instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN; + + if (flex_check_wp(nandi)) { + dev_dbg(nandi->dev, "device is write-protected\n"); + instr->state = MTD_ERASE_FAILED; + goto erase_exit; + } + + /* Offset of block containing cached page */ + offs_cached = ((uint64_t)nandi->cached_page << nandi->page_shift) & + ~block_mask; + + instr->state = MTD_ERASING; + while (len) { + if (mtd_block_isbad(mtd, offs)) { + dev_err(nandi->dev, + "attempt to erase a bad block at 0x%012llx\n", + offs); + instr->state = MTD_ERASE_FAILED; + instr->fail_addr = offs; + goto erase_exit; + } + + if (offs == offs_cached) + nandi->cached_page = -1; + + status = bch_erase_block(nandi, offs); + + if (status & NAND_STATUS_FAIL) { + dev_err(nandi->dev, + "failed to erase block at 0x%012llx\n", offs); + instr->state = MTD_ERASE_FAILED; + instr->fail_addr = offs; + goto erase_exit; + } + + len -= mtd->erasesize; + offs += mtd->erasesize; + } + instr->state = MTD_ERASE_DONE; + + erase_exit: + nand_release_device(mtd); + + ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO; + if (ret == 0) + mtd_erase_callback(instr); + + return ret; +} + static void nandi_dump_bad_blocks(struct nandi_controller *nandi) { int bad_count = 0; @@ -1321,6 +1404,8 @@ static void nandi_set_mtd_defaults(struct nandi_controller *nandi, mtd->oobavail = 0; mtd->subpage_sft = 0; + mtd->_erase = bch_mtd_erase; + mtd->_point = NULL; mtd->_unpoint = NULL; mtd->_lock = NULL;