From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 769B2C433F5 for ; Fri, 15 Oct 2021 06:13:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5723C61040 for ; Fri, 15 Oct 2021 06:13:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231992AbhJOGPY convert rfc822-to-8bit (ORCPT ); Fri, 15 Oct 2021 02:15:24 -0400 Received: from relay1-d.mail.gandi.net ([217.70.183.193]:58987 "EHLO relay1-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231445AbhJOGPX (ORCPT ); Fri, 15 Oct 2021 02:15:23 -0400 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id 550D224000A; Fri, 15 Oct 2021 06:13:15 +0000 (UTC) Date: Fri, 15 Oct 2021 08:13:13 +0200 From: Miquel Raynal To: Paul Cercueil Cc: Richard Weinberger , Vignesh Raghavendra , Harvey Hunt , list@opendingux.net, linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org, stable@vger.kernel.org Subject: Re: [PATCH 2/3] mtd: rawnand: Export nand_read_page_hwecc_oob_first() Message-ID: <20211015081313.60018976@xps13> In-Reply-To: <20211009184952.24591-3-paul@crapouillou.net> References: <20211009184952.24591-1-paul@crapouillou.net> <20211009184952.24591-3-paul@crapouillou.net> Organization: Bootlin X-Mailer: Claws Mail 3.17.7 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-mips@vger.kernel.org Hi Paul, paul@crapouillou.net wrote on Sat, 9 Oct 2021 20:49:51 +0200: > Move the function nand_read_page_hwecc_oob_first() (previously > nand_davinci_read_page_hwecc_oob_first()) to nand_base.c, and export it > as a GPL symbol, so that it can be used by more modules. > > Cc: # v5.2 > Fixes: a0ac778eb82c ("mtd: rawnand: ingenic: Add support for the JZ4740") > Signed-off-by: Paul Cercueil > --- > drivers/mtd/nand/raw/davinci_nand.c | 70 +---------------------------- > drivers/mtd/nand/raw/nand_base.c | 69 ++++++++++++++++++++++++++++ > include/linux/mtd/rawnand.h | 2 + > 3 files changed, 72 insertions(+), 69 deletions(-) > > diff --git a/drivers/mtd/nand/raw/davinci_nand.c b/drivers/mtd/nand/raw/davinci_nand.c > index 89de24d3bb7a..45fec8c192ab 100644 > --- a/drivers/mtd/nand/raw/davinci_nand.c > +++ b/drivers/mtd/nand/raw/davinci_nand.c > @@ -371,74 +371,6 @@ static int nand_davinci_correct_4bit(struct nand_chip *chip, u_char *data, > return corrected; > } > > -/** > - * nand_read_page_hwecc_oob_first - hw ecc, read oob first > - * @chip: nand chip info structure > - * @buf: buffer to store read data > - * @oob_required: caller requires OOB data read to chip->oob_poi > - * @page: page number to read > - * > - * Hardware ECC for large page chips, require OOB to be read first. For this > - * ECC mode, the write_page method is re-used from ECC_HW. These methods > - * read/write ECC from the OOB area, unlike the ECC_HW_SYNDROME support with > - * multiple ECC steps, follows the "infix ECC" scheme and reads/writes ECC from > - * the data area, by overwriting the NAND manufacturer bad block markings. > - */ > -static int nand_davinci_read_page_hwecc_oob_first(struct nand_chip *chip, > - uint8_t *buf, > - int oob_required, int page) > -{ > - struct mtd_info *mtd = nand_to_mtd(chip); > - int i, eccsize = chip->ecc.size, ret; > - int eccbytes = chip->ecc.bytes; > - int eccsteps = chip->ecc.steps; > - uint8_t *p = buf; > - uint8_t *ecc_code = chip->ecc.code_buf; > - unsigned int max_bitflips = 0; > - > - /* Read the OOB area first */ > - ret = nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize); > - if (ret) > - return ret; > - > - ret = nand_read_page_op(chip, page, 0, NULL, 0); > - if (ret) > - return ret; > - > - ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0, > - chip->ecc.total); > - if (ret) > - return ret; > - > - for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { > - int stat; > - > - chip->ecc.hwctl(chip, NAND_ECC_READ); > - > - ret = nand_read_data_op(chip, p, eccsize, false, false); > - if (ret) > - return ret; > - > - stat = chip->ecc.correct(chip, p, &ecc_code[i], NULL); > - if (stat == -EBADMSG && > - (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) { > - /* check for empty pages with bitflips */ > - stat = nand_check_erased_ecc_chunk(p, eccsize, > - &ecc_code[i], > - eccbytes, NULL, 0, > - chip->ecc.strength); > - } > - > - if (stat < 0) { > - mtd->ecc_stats.failed++; > - } else { > - mtd->ecc_stats.corrected += stat; > - max_bitflips = max_t(unsigned int, max_bitflips, stat); > - } > - } > - return max_bitflips; > -} > - > /*----------------------------------------------------------------------*/ > > /* An ECC layout for using 4-bit ECC with small-page flash, storing > @@ -648,7 +580,7 @@ static int davinci_nand_attach_chip(struct nand_chip *chip) > } else if (chunks == 4 || chunks == 8) { > mtd_set_ooblayout(mtd, > nand_get_large_page_ooblayout()); > - chip->ecc.read_page = nand_davinci_read_page_hwecc_oob_first; > + chip->ecc.read_page = nand_read_page_hwecc_oob_first; > } else { > return -EIO; > } > diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c > index 3d6c6e880520..cb5f343b9fa2 100644 > --- a/drivers/mtd/nand/raw/nand_base.c > +++ b/drivers/mtd/nand/raw/nand_base.c > @@ -3160,6 +3160,75 @@ static int nand_read_page_hwecc(struct nand_chip *chip, uint8_t *buf, > return max_bitflips; > } > > +/** > + * nand_read_page_hwecc_oob_first - Hardware ECC page read with ECC > + * data read from OOB area > + * @chip: nand chip info structure > + * @buf: buffer to store read data > + * @oob_required: caller requires OOB data read to chip->oob_poi > + * @page: page number to read > + * > + * Hardware ECC for large page chips, require OOB to be read first. For this requires With this ECC configuration? > + * ECC mode, the write_page method is re-used from ECC_HW. These methods I do not understand this sentence nor the next one about syndrome. I believe it is related to your engine and should not leak into the core. > + * read/write ECC from the OOB area, unlike the ECC_HW_SYNDROME support with > + * multiple ECC steps, follows the "infix ECC" scheme and reads/writes ECC from > + * the data area, by overwriting the NAND manufacturer bad block markings. That's a sentence I don't like. What do you mean exactly? What "Infix ECC" scheme is? Do you mean that unlike the syndrome mode it *does not* overwrite the BBM ? > + */ > +int nand_read_page_hwecc_oob_first(struct nand_chip *chip, uint8_t *buf, > + int oob_required, int page) > +{ > + struct mtd_info *mtd = nand_to_mtd(chip); > + int i, eccsize = chip->ecc.size, ret; > + int eccbytes = chip->ecc.bytes; > + int eccsteps = chip->ecc.steps; > + uint8_t *p = buf; > + uint8_t *ecc_code = chip->ecc.code_buf; > + unsigned int max_bitflips = 0; > + > + /* Read the OOB area first */ > + ret = nand_read_oob_op(chip, page, 0, chip->oob_poi, mtd->oobsize); > + if (ret) > + return ret; > + > + ret = nand_read_page_op(chip, page, 0, NULL, 0); Definitely not, your are requesting the chip to do the read_page operation twice. You only need a nand_change_read_column I believe. > + if (ret) > + return ret; > + > + ret = mtd_ooblayout_get_eccbytes(mtd, ecc_code, chip->oob_poi, 0, > + chip->ecc.total); > + if (ret) > + return ret; > + > + for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) { > + int stat; > + > + chip->ecc.hwctl(chip, NAND_ECC_READ); > + > + ret = nand_read_data_op(chip, p, eccsize, false, false); > + if (ret) > + return ret; > + > + stat = chip->ecc.correct(chip, p, &ecc_code[i], NULL); > + if (stat == -EBADMSG && > + (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) { > + /* check for empty pages with bitflips */ > + stat = nand_check_erased_ecc_chunk(p, eccsize, > + &ecc_code[i], > + eccbytes, NULL, 0, > + chip->ecc.strength); > + } > + > + if (stat < 0) { > + mtd->ecc_stats.failed++; > + } else { > + mtd->ecc_stats.corrected += stat; > + max_bitflips = max_t(unsigned int, max_bitflips, stat); > + } > + } > + return max_bitflips; > +} > +EXPORT_SYMBOL_GPL(nand_read_page_hwecc_oob_first); > + > /** > * nand_read_page_syndrome - [REPLACEABLE] hardware ECC syndrome based page read > * @chip: nand chip info structure > diff --git a/include/linux/mtd/rawnand.h b/include/linux/mtd/rawnand.h > index b2f9dd3cbd69..5b88cd51fadb 100644 > --- a/include/linux/mtd/rawnand.h > +++ b/include/linux/mtd/rawnand.h > @@ -1539,6 +1539,8 @@ int nand_read_data_op(struct nand_chip *chip, void *buf, unsigned int len, > bool force_8bit, bool check_only); > int nand_write_data_op(struct nand_chip *chip, const void *buf, > unsigned int len, bool force_8bit); > +int nand_read_page_hwecc_oob_first(struct nand_chip *chip, uint8_t *buf, > + int oob_required, int page); You certainly want to add this symbol closer to the other read/write page helpers? > > /* Scan and identify a NAND device */ > int nand_scan_with_ids(struct nand_chip *chip, unsigned int max_chips, Thanks, Miquèl From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1D125C433EF for ; Fri, 15 Oct 2021 06:14:23 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id BE90B60F59 for ; Fri, 15 Oct 2021 06:14:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org BE90B60F59 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=339dvJYG8rokzemux/GuSjg9yhPLQtuQ+O8sDUFCyoM=; b=l5rKCgMj4orK8L /BLeBP+RzPC5mNchIq8EFuSVUTguKsKQ+BJ4qyHCCvgOZpPvyrwRmjZwzzQ6nYWkOWKaTZhiWzCnp Xx3XBtRmjD8CbzmaLnTaz/zrGOZIelWqSzI7c3kp4+AC5oPHX5ATIwLfSXqa8t+vm1uaOPmR13Mic 3ELJ2aYtJvpMnP27lH3K0OEkOq8tIQR9FeEFbXPtq7aVmaPezi2V5mhONVGQcKw8Op4bAjkuBni30 A6dYp5TgaO3lzMANe/rhux6xawNxiB62XDvpJRDRGJg533xXewwa06s4VwnKY8LZgRHPGDIw1/asx L15a6SrtaQdr3nkJR6Fg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mbGT8-005UFb-9N; Fri, 15 Oct 2021 06:13:26 +0000 Received: from relay1-d.mail.gandi.net ([217.70.183.193]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mbGT3-005UEk-Rt for linux-mtd@lists.infradead.org; Fri, 15 Oct 2021 06:13:24 +0000 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay1-d.mail.gandi.net (Postfix) with ESMTPSA id 550D224000A; Fri, 15 Oct 2021 06:13:15 +0000 (UTC) Date: Fri, 15 Oct 2021 08:13:13 +0200 From: Miquel Raynal To: Paul Cercueil Cc: Richard Weinberger , Vignesh Raghavendra , Harvey Hunt , list@opendingux.net, linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org, stable@vger.kernel.org Subject: Re: [PATCH 2/3] mtd: rawnand: Export nand_read_page_hwecc_oob_first() Message-ID: <20211015081313.60018976@xps13> In-Reply-To: <20211009184952.24591-3-paul@crapouillou.net> References: <20211009184952.24591-1-paul@crapouillou.net> <20211009184952.24591-3-paul@crapouillou.net> Organization: Bootlin X-Mailer: Claws Mail 3.17.7 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211014_231322_222863_77AB19C0 X-CRM114-Status: GOOD ( 31.34 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgUGF1bCwKCnBhdWxAY3JhcG91aWxsb3UubmV0IHdyb3RlIG9uIFNhdCwgIDkgT2N0IDIwMjEg MjA6NDk6NTEgKzAyMDA6Cgo+IE1vdmUgdGhlIGZ1bmN0aW9uIG5hbmRfcmVhZF9wYWdlX2h3ZWNj X29vYl9maXJzdCgpIChwcmV2aW91c2x5Cj4gbmFuZF9kYXZpbmNpX3JlYWRfcGFnZV9od2VjY19v b2JfZmlyc3QoKSkgdG8gbmFuZF9iYXNlLmMsIGFuZCBleHBvcnQgaXQKPiBhcyBhIEdQTCBzeW1i b2wsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgbW9yZSBtb2R1bGVzLgo+IAo+IENjOiA8c3Rh YmxlQHZnZXIua2VybmVsLm9yZz4gIyB2NS4yCj4gRml4ZXM6IGEwYWM3NzhlYjgyYyAoIm10ZDog cmF3bmFuZDogaW5nZW5pYzogQWRkIHN1cHBvcnQgZm9yIHRoZSBKWjQ3NDAiKQo+IFNpZ25lZC1v ZmYtYnk6IFBhdWwgQ2VyY3VlaWwgPHBhdWxAY3JhcG91aWxsb3UubmV0Pgo+IC0tLQo+ICBkcml2 ZXJzL210ZC9uYW5kL3Jhdy9kYXZpbmNpX25hbmQuYyB8IDcwICstLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCj4gIGRyaXZlcnMvbXRkL25hbmQvcmF3L25hbmRfYmFzZS5jICAgIHwgNjkgKysr KysrKysrKysrKysrKysrKysrKysrKysrKwo+ICBpbmNsdWRlL2xpbnV4L210ZC9yYXduYW5kLmgg ICAgICAgICB8ICAyICsKPiAgMyBmaWxlcyBjaGFuZ2VkLCA3MiBpbnNlcnRpb25zKCspLCA2OSBk ZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvZGF2aW5j aV9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9kYXZpbmNpX25hbmQuYwo+IGluZGV4IDg5 ZGUyNGQzYmI3YS4uNDVmZWM4YzE5MmFiIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQv cmF3L2RhdmluY2lfbmFuZC5jCj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvZGF2aW5jaV9u YW5kLmMKPiBAQCAtMzcxLDc0ICszNzEsNiBAQCBzdGF0aWMgaW50IG5hbmRfZGF2aW5jaV9jb3Jy ZWN0XzRiaXQoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdV9jaGFyICpkYXRhLAo+ICAJcmV0dXJu IGNvcnJlY3RlZDsKPiAgfQo+ICAKPiAtLyoqCj4gLSAqIG5hbmRfcmVhZF9wYWdlX2h3ZWNjX29v Yl9maXJzdCAtIGh3IGVjYywgcmVhZCBvb2IgZmlyc3QKPiAtICogQGNoaXA6IG5hbmQgY2hpcCBp bmZvIHN0cnVjdHVyZQo+IC0gKiBAYnVmOiBidWZmZXIgdG8gc3RvcmUgcmVhZCBkYXRhCj4gLSAq IEBvb2JfcmVxdWlyZWQ6IGNhbGxlciByZXF1aXJlcyBPT0IgZGF0YSByZWFkIHRvIGNoaXAtPm9v Yl9wb2kKPiAtICogQHBhZ2U6IHBhZ2UgbnVtYmVyIHRvIHJlYWQKPiAtICoKPiAtICogSGFyZHdh cmUgRUNDIGZvciBsYXJnZSBwYWdlIGNoaXBzLCByZXF1aXJlIE9PQiB0byBiZSByZWFkIGZpcnN0 LiBGb3IgdGhpcwo+IC0gKiBFQ0MgbW9kZSwgdGhlIHdyaXRlX3BhZ2UgbWV0aG9kIGlzIHJlLXVz ZWQgZnJvbSBFQ0NfSFcuIFRoZXNlIG1ldGhvZHMKPiAtICogcmVhZC93cml0ZSBFQ0MgZnJvbSB0 aGUgT09CIGFyZWEsIHVubGlrZSB0aGUgRUNDX0hXX1NZTkRST01FIHN1cHBvcnQgd2l0aAo+IC0g KiBtdWx0aXBsZSBFQ0Mgc3RlcHMsIGZvbGxvd3MgdGhlICJpbmZpeCBFQ0MiIHNjaGVtZSBhbmQg cmVhZHMvd3JpdGVzIEVDQyBmcm9tCj4gLSAqIHRoZSBkYXRhIGFyZWEsIGJ5IG92ZXJ3cml0aW5n IHRoZSBOQU5EIG1hbnVmYWN0dXJlciBiYWQgYmxvY2sgbWFya2luZ3MuCj4gLSAqLwo+IC1zdGF0 aWMgaW50IG5hbmRfZGF2aW5jaV9yZWFkX3BhZ2VfaHdlY2Nfb29iX2ZpcnN0KHN0cnVjdCBuYW5k X2NoaXAgKmNoaXAsCj4gLQkJCQkJCSAgdWludDhfdCAqYnVmLAo+IC0JCQkJCQkgIGludCBvb2Jf cmVxdWlyZWQsIGludCBwYWdlKQo+IC17Cj4gLQlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRf dG9fbXRkKGNoaXApOwo+IC0JaW50IGksIGVjY3NpemUgPSBjaGlwLT5lY2Muc2l6ZSwgcmV0Owo+ IC0JaW50IGVjY2J5dGVzID0gY2hpcC0+ZWNjLmJ5dGVzOwo+IC0JaW50IGVjY3N0ZXBzID0gY2hp cC0+ZWNjLnN0ZXBzOwo+IC0JdWludDhfdCAqcCA9IGJ1ZjsKPiAtCXVpbnQ4X3QgKmVjY19jb2Rl ID0gY2hpcC0+ZWNjLmNvZGVfYnVmOwo+IC0JdW5zaWduZWQgaW50IG1heF9iaXRmbGlwcyA9IDA7 Cj4gLQo+IC0JLyogUmVhZCB0aGUgT09CIGFyZWEgZmlyc3QgKi8KPiAtCXJldCA9IG5hbmRfcmVh ZF9vb2Jfb3AoY2hpcCwgcGFnZSwgMCwgY2hpcC0+b29iX3BvaSwgbXRkLT5vb2JzaXplKTsKPiAt CWlmIChyZXQpCj4gLQkJcmV0dXJuIHJldDsKPiAtCj4gLQlyZXQgPSBuYW5kX3JlYWRfcGFnZV9v cChjaGlwLCBwYWdlLCAwLCBOVUxMLCAwKTsKPiAtCWlmIChyZXQpCj4gLQkJcmV0dXJuIHJldDsK PiAtCj4gLQlyZXQgPSBtdGRfb29ibGF5b3V0X2dldF9lY2NieXRlcyhtdGQsIGVjY19jb2RlLCBj aGlwLT5vb2JfcG9pLCAwLAo+IC0JCQkJCSBjaGlwLT5lY2MudG90YWwpOwo+IC0JaWYgKHJldCkK PiAtCQlyZXR1cm4gcmV0Owo+IC0KPiAtCWZvciAoaSA9IDA7IGVjY3N0ZXBzOyBlY2NzdGVwcy0t LCBpICs9IGVjY2J5dGVzLCBwICs9IGVjY3NpemUpIHsKPiAtCQlpbnQgc3RhdDsKPiAtCj4gLQkJ Y2hpcC0+ZWNjLmh3Y3RsKGNoaXAsIE5BTkRfRUNDX1JFQUQpOwo+IC0KPiAtCQlyZXQgPSBuYW5k X3JlYWRfZGF0YV9vcChjaGlwLCBwLCBlY2NzaXplLCBmYWxzZSwgZmFsc2UpOwo+IC0JCWlmIChy ZXQpCj4gLQkJCXJldHVybiByZXQ7Cj4gLQo+IC0JCXN0YXQgPSBjaGlwLT5lY2MuY29ycmVjdChj aGlwLCBwLCAmZWNjX2NvZGVbaV0sIE5VTEwpOwo+IC0JCWlmIChzdGF0ID09IC1FQkFETVNHICYm Cj4gLQkJICAgIChjaGlwLT5lY2Mub3B0aW9ucyAmIE5BTkRfRUNDX0dFTkVSSUNfRVJBU0VEX0NI RUNLKSkgewo+IC0JCQkvKiBjaGVjayBmb3IgZW1wdHkgcGFnZXMgd2l0aCBiaXRmbGlwcyAqLwo+ IC0JCQlzdGF0ID0gbmFuZF9jaGVja19lcmFzZWRfZWNjX2NodW5rKHAsIGVjY3NpemUsCj4gLQkJ CQkJCQkgICAmZWNjX2NvZGVbaV0sCj4gLQkJCQkJCQkgICBlY2NieXRlcywgTlVMTCwgMCwKPiAt CQkJCQkJCSAgIGNoaXAtPmVjYy5zdHJlbmd0aCk7Cj4gLQkJfQo+IC0KPiAtCQlpZiAoc3RhdCA8 IDApIHsKPiAtCQkJbXRkLT5lY2Nfc3RhdHMuZmFpbGVkKys7Cj4gLQkJfSBlbHNlIHsKPiAtCQkJ bXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHN0YXQ7Cj4gLQkJCW1heF9iaXRmbGlwcyA9IG1h eF90KHVuc2lnbmVkIGludCwgbWF4X2JpdGZsaXBzLCBzdGF0KTsKPiAtCQl9Cj4gLQl9Cj4gLQly ZXR1cm4gbWF4X2JpdGZsaXBzOwo+IC19Cj4gLQo+ICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwo+ICAKPiAg LyogQW4gRUNDIGxheW91dCBmb3IgdXNpbmcgNC1iaXQgRUNDIHdpdGggc21hbGwtcGFnZSBmbGFz aCwgc3RvcmluZwo+IEBAIC02NDgsNyArNTgwLDcgQEAgc3RhdGljIGludCBkYXZpbmNpX25hbmRf YXR0YWNoX2NoaXAoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCkKPiAgCQkJfSBlbHNlIGlmIChjaHVu a3MgPT0gNCB8fCBjaHVua3MgPT0gOCkgewo+ICAJCQkJbXRkX3NldF9vb2JsYXlvdXQobXRkLAo+ ICAJCQkJCQkgIG5hbmRfZ2V0X2xhcmdlX3BhZ2Vfb29ibGF5b3V0KCkpOwo+IC0JCQkJY2hpcC0+ ZWNjLnJlYWRfcGFnZSA9IG5hbmRfZGF2aW5jaV9yZWFkX3BhZ2VfaHdlY2Nfb29iX2ZpcnN0Owo+ ICsJCQkJY2hpcC0+ZWNjLnJlYWRfcGFnZSA9IG5hbmRfcmVhZF9wYWdlX2h3ZWNjX29vYl9maXJz dDsKPiAgCQkJfSBlbHNlIHsKPiAgCQkJCXJldHVybiAtRUlPOwo+ICAJCQl9Cj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L25hbmRfYmFzZS5jIGIvZHJpdmVycy9tdGQvbmFuZC9y YXcvbmFuZF9iYXNlLmMKPiBpbmRleCAzZDZjNmU4ODA1MjAuLmNiNWYzNDNiOWZhMiAxMDA2NDQK PiAtLS0gYS9kcml2ZXJzL210ZC9uYW5kL3Jhdy9uYW5kX2Jhc2UuYwo+ICsrKyBiL2RyaXZlcnMv bXRkL25hbmQvcmF3L25hbmRfYmFzZS5jCj4gQEAgLTMxNjAsNiArMzE2MCw3NSBAQCBzdGF0aWMg aW50IG5hbmRfcmVhZF9wYWdlX2h3ZWNjKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHVpbnQ4X3Qg KmJ1ZiwKPiAgCXJldHVybiBtYXhfYml0ZmxpcHM7Cj4gIH0KPiAgCj4gKy8qKgo+ICsgKiBuYW5k X3JlYWRfcGFnZV9od2VjY19vb2JfZmlyc3QgLSBIYXJkd2FyZSBFQ0MgcGFnZSByZWFkIHdpdGgg RUNDCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgcmVhZCBmcm9t IE9PQiBhcmVhCj4gKyAqIEBjaGlwOiBuYW5kIGNoaXAgaW5mbyBzdHJ1Y3R1cmUKPiArICogQGJ1 ZjogYnVmZmVyIHRvIHN0b3JlIHJlYWQgZGF0YQo+ICsgKiBAb29iX3JlcXVpcmVkOiBjYWxsZXIg cmVxdWlyZXMgT09CIGRhdGEgcmVhZCB0byBjaGlwLT5vb2JfcG9pCj4gKyAqIEBwYWdlOiBwYWdl IG51bWJlciB0byByZWFkCj4gKyAqCj4gKyAqIEhhcmR3YXJlIEVDQyBmb3IgbGFyZ2UgcGFnZSBj aGlwcywgcmVxdWlyZSBPT0IgdG8gYmUgcmVhZCBmaXJzdC4gRm9yIHRoaXMKCnJlcXVpcmVzCgpX aXRoIHRoaXMgRUNDIGNvbmZpZ3VyYXRpb24/Cgo+ICsgKiBFQ0MgbW9kZSwgdGhlIHdyaXRlX3Bh Z2UgbWV0aG9kIGlzIHJlLXVzZWQgZnJvbSBFQ0NfSFcuIFRoZXNlIG1ldGhvZHMKCkkgZG8gbm90 IHVuZGVyc3RhbmQgdGhpcyBzZW50ZW5jZSBub3IgdGhlIG5leHQgb25lIGFib3V0IHN5bmRyb21l LiBJCmJlbGlldmUgaXQgaXMgcmVsYXRlZCB0byB5b3VyIGVuZ2luZSBhbmQgc2hvdWxkIG5vdCBs ZWFrIGludG8gdGhlIGNvcmUuCgo+ICsgKiByZWFkL3dyaXRlIEVDQyBmcm9tIHRoZSBPT0IgYXJl YSwgdW5saWtlIHRoZSBFQ0NfSFdfU1lORFJPTUUgc3VwcG9ydCB3aXRoCj4gKyAqIG11bHRpcGxl IEVDQyBzdGVwcywgZm9sbG93cyB0aGUgImluZml4IEVDQyIgc2NoZW1lIGFuZCByZWFkcy93cml0 ZXMgRUNDIGZyb20KPiArICogdGhlIGRhdGEgYXJlYSwgYnkgb3ZlcndyaXRpbmcgdGhlIE5BTkQg bWFudWZhY3R1cmVyIGJhZCBibG9jayBtYXJraW5ncy4KClRoYXQncyBhIHNlbnRlbmNlIEkgZG9u J3QgbGlrZS4gV2hhdCBkbyB5b3UgbWVhbiBleGFjdGx5PwoKV2hhdCAiSW5maXggRUNDIiBzY2hl bWUgaXM/CgpEbyB5b3UgbWVhbiB0aGF0IHVubGlrZSB0aGUgc3luZHJvbWUgIG1vZGUgaXQgKmRv ZXMgbm90KiBvdmVyd3JpdGUgdGhlCkJCTSA/Cgo+ICsgKi8KPiAraW50IG5hbmRfcmVhZF9wYWdl X2h3ZWNjX29vYl9maXJzdChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCB1aW50OF90ICpidWYsCj4g KwkJCQkgICBpbnQgb29iX3JlcXVpcmVkLCBpbnQgcGFnZSkKPiArewo+ICsJc3RydWN0IG10ZF9p bmZvICptdGQgPSBuYW5kX3RvX210ZChjaGlwKTsKPiArCWludCBpLCBlY2NzaXplID0gY2hpcC0+ ZWNjLnNpemUsIHJldDsKPiArCWludCBlY2NieXRlcyA9IGNoaXAtPmVjYy5ieXRlczsKPiArCWlu dCBlY2NzdGVwcyA9IGNoaXAtPmVjYy5zdGVwczsKPiArCXVpbnQ4X3QgKnAgPSBidWY7Cj4gKwl1 aW50OF90ICplY2NfY29kZSA9IGNoaXAtPmVjYy5jb2RlX2J1ZjsKPiArCXVuc2lnbmVkIGludCBt YXhfYml0ZmxpcHMgPSAwOwo+ICsKPiArCS8qIFJlYWQgdGhlIE9PQiBhcmVhIGZpcnN0ICovCj4g KwlyZXQgPSBuYW5kX3JlYWRfb29iX29wKGNoaXAsIHBhZ2UsIDAsIGNoaXAtPm9vYl9wb2ksIG10 ZC0+b29ic2l6ZSk7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJcmV0ID0g bmFuZF9yZWFkX3BhZ2Vfb3AoY2hpcCwgcGFnZSwgMCwgTlVMTCwgMCk7CgpEZWZpbml0ZWx5IG5v dCwgeW91ciBhcmUgcmVxdWVzdGluZyB0aGUgY2hpcCB0byBkbyB0aGUgcmVhZF9wYWdlCm9wZXJh dGlvbiB0d2ljZS4gWW91IG9ubHkgbmVlZCBhIG5hbmRfY2hhbmdlX3JlYWRfY29sdW1uIEkgYmVs aWV2ZS4KCj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJcmV0ID0gbXRkX29v YmxheW91dF9nZXRfZWNjYnl0ZXMobXRkLCBlY2NfY29kZSwgY2hpcC0+b29iX3BvaSwgMCwKPiAr CQkJCQkgY2hpcC0+ZWNjLnRvdGFsKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiAr Cj4gKwlmb3IgKGkgPSAwOyBlY2NzdGVwczsgZWNjc3RlcHMtLSwgaSArPSBlY2NieXRlcywgcCAr PSBlY2NzaXplKSB7Cj4gKwkJaW50IHN0YXQ7Cj4gKwo+ICsJCWNoaXAtPmVjYy5od2N0bChjaGlw LCBOQU5EX0VDQ19SRUFEKTsKPiArCj4gKwkJcmV0ID0gbmFuZF9yZWFkX2RhdGFfb3AoY2hpcCwg cCwgZWNjc2l6ZSwgZmFsc2UsIGZhbHNlKTsKPiArCQlpZiAocmV0KQo+ICsJCQlyZXR1cm4gcmV0 Owo+ICsKPiArCQlzdGF0ID0gY2hpcC0+ZWNjLmNvcnJlY3QoY2hpcCwgcCwgJmVjY19jb2RlW2ld LCBOVUxMKTsKPiArCQlpZiAoc3RhdCA9PSAtRUJBRE1TRyAmJgo+ICsJCSAgICAoY2hpcC0+ZWNj Lm9wdGlvbnMgJiBOQU5EX0VDQ19HRU5FUklDX0VSQVNFRF9DSEVDSykpIHsKPiArCQkJLyogY2hl Y2sgZm9yIGVtcHR5IHBhZ2VzIHdpdGggYml0ZmxpcHMgKi8KPiArCQkJc3RhdCA9IG5hbmRfY2hl Y2tfZXJhc2VkX2VjY19jaHVuayhwLCBlY2NzaXplLAo+ICsJCQkJCQkJICAgJmVjY19jb2RlW2ld LAo+ICsJCQkJCQkJICAgZWNjYnl0ZXMsIE5VTEwsIDAsCj4gKwkJCQkJCQkgICBjaGlwLT5lY2Mu c3RyZW5ndGgpOwo+ICsJCX0KPiArCj4gKwkJaWYgKHN0YXQgPCAwKSB7Cj4gKwkJCW10ZC0+ZWNj X3N0YXRzLmZhaWxlZCsrOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJl Y3RlZCArPSBzdGF0Owo+ICsJCQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG1h eF9iaXRmbGlwcywgc3RhdCk7Cj4gKwkJfQo+ICsJfQo+ICsJcmV0dXJuIG1heF9iaXRmbGlwczsK PiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChuYW5kX3JlYWRfcGFnZV9od2VjY19vb2JfZmlyc3Qp Owo+ICsKPiAgLyoqCj4gICAqIG5hbmRfcmVhZF9wYWdlX3N5bmRyb21lIC0gW1JFUExBQ0VBQkxF XSBoYXJkd2FyZSBFQ0Mgc3luZHJvbWUgYmFzZWQgcGFnZSByZWFkCj4gICAqIEBjaGlwOiBuYW5k IGNoaXAgaW5mbyBzdHJ1Y3R1cmUKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvcmF3 bmFuZC5oIGIvaW5jbHVkZS9saW51eC9tdGQvcmF3bmFuZC5oCj4gaW5kZXggYjJmOWRkM2NiZDY5 Li41Yjg4Y2Q1MWZhZGIgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvcmF3bmFuZC5o Cj4gKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcmF3bmFuZC5oCj4gQEAgLTE1MzksNiArMTUzOSw4 IEBAIGludCBuYW5kX3JlYWRfZGF0YV9vcChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCB2b2lkICpi dWYsIHVuc2lnbmVkIGludCBsZW4sCj4gIAkJICAgICAgYm9vbCBmb3JjZV84Yml0LCBib29sIGNo ZWNrX29ubHkpOwo+ICBpbnQgbmFuZF93cml0ZV9kYXRhX29wKHN0cnVjdCBuYW5kX2NoaXAgKmNo aXAsIGNvbnN0IHZvaWQgKmJ1ZiwKPiAgCQkgICAgICAgdW5zaWduZWQgaW50IGxlbiwgYm9vbCBm b3JjZV84Yml0KTsKPiAraW50IG5hbmRfcmVhZF9wYWdlX2h3ZWNjX29vYl9maXJzdChzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwLCB1aW50OF90ICpidWYsCj4gKwkJCQkgICBpbnQgb29iX3JlcXVpcmVk LCBpbnQgcGFnZSk7CgpZb3UgY2VydGFpbmx5IHdhbnQgdG8gYWRkIHRoaXMgc3ltYm9sIGNsb3Nl ciB0byB0aGUgb3RoZXIgcmVhZC93cml0ZQpwYWdlIGhlbHBlcnM/Cgo+ICAKPiAgLyogU2NhbiBh bmQgaWRlbnRpZnkgYSBOQU5EIGRldmljZSAqLwo+ICBpbnQgbmFuZF9zY2FuX3dpdGhfaWRzKHN0 cnVjdCBuYW5kX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBtYXhfY2hpcHMsCgoKVGhhbmtzLApN aXF1w6hsCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KTGludXggTVREIGRpc2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbXRkLwo=