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 X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 19EA3C43381 for ; Mon, 4 Mar 2019 11:21:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id DE7F12070B for ; Mon, 4 Mar 2019 11:21:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726463AbfCDLVg convert rfc822-to-8bit (ORCPT ); Mon, 4 Mar 2019 06:21:36 -0500 Received: from relay4-d.mail.gandi.net ([217.70.183.196]:44797 "EHLO relay4-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726090AbfCDLVg (ORCPT ); Mon, 4 Mar 2019 06:21:36 -0500 X-Originating-IP: 90.88.147.150 Received: from xps13 (aaubervilliers-681-1-27-150.w90-88.abo.wanadoo.fr [90.88.147.150]) (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id BA094E0014; Mon, 4 Mar 2019 11:21:31 +0000 (UTC) Date: Mon, 4 Mar 2019 12:21:30 +0100 From: Miquel Raynal To: Schrempf Frieder Cc: "bbrezillon@kernel.org" , "richard@nod.at" , "linux-kernel@vger.kernel.org" , "linux-mtd@lists.infradead.org" , David Woodhouse , Brian Norris , Marek Vasut Subject: Re: [PATCH v4 5/7] mtd: rawnand: Support bad block markers in first, second or last page Message-ID: <20190304122130.4b659bee@xps13> In-Reply-To: <20190218104122.18788-6-frieder.schrempf@kontron.de> References: <20190218104122.18788-1-frieder.schrempf@kontron.de> <20190218104122.18788-6-frieder.schrempf@kontron.de> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Schrempf, Schrempf Frieder wrote on Mon, 18 Feb 2019 10:42:45 +0000: > From: Frieder Schrempf > > Currently supported bad block marker positions within the block are: > * in first page only > * in last page only > * in first or second page > > Some ESMT NANDs are known to have been shipped by the manufacturer > with bad block markers in the first or last page, instead of the > first or second page. > > Also the datasheets for Cypress/Spansion/AMD NANDs claim that the > first, second *and* last page needs to be checked. > > Therefore we make it possible to set NAND_BBM_FIRSTPAGE, > NAND_BBM_SECONDPAGE and NAND_BBM_LASTPAGE independently in any > combination. > > To simplify the code, the logic to evaluate the flags is moved to a > a new function nand_bbm_get_next_page(). > > Signed-off-by: Frieder Schrempf > Reviewed-by: Boris Brezillon > --- > drivers/mtd/nand/raw/internals.h | 1 + > drivers/mtd/nand/raw/nand_base.c | 62 ++++++++++++++++++++++++----------- > drivers/mtd/nand/raw/nand_bbt.c | 29 +++++++--------- > 3 files changed, 55 insertions(+), 37 deletions(-) > > diff --git a/drivers/mtd/nand/raw/internals.h b/drivers/mtd/nand/raw/internals.h > index fbf6ca015cd7..97ae67e009d5 100644 > --- a/drivers/mtd/nand/raw/internals.h > +++ b/drivers/mtd/nand/raw/internals.h > @@ -76,6 +76,7 @@ extern const struct nand_manufacturer_ops toshiba_nand_manuf_ops; > > /* Core functions */ > const struct nand_manufacturer *nand_get_manufacturer(u8 id); > +int nand_bbm_get_next_page(struct nand_chip *chip, int page); > int nand_markbad_bbm(struct nand_chip *chip, loff_t ofs); > int nand_erase_nand(struct nand_chip *chip, struct erase_info *instr, > int allowbbt); > diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c > index 9ef7b86cdc42..7bc20c1fe23c 100644 > --- a/drivers/mtd/nand/raw/nand_base.c > +++ b/drivers/mtd/nand/raw/nand_base.c > @@ -285,6 +285,31 @@ static void nand_release_device(struct nand_chip *chip) > spin_unlock(&chip->controller->lock); > } > > +/** > + * nand_bbm_get_next_page - Get the next page for bad block markers > + * @chip: NAND chip object > + * @index: Current page, only pages beyond this will be considered Why pages *beyond*? Can't you change the logic to use the page from where to start searching? I am not sure such a change would be clearer in the rest of the code but I don't like the tests against "-1". Maybe you could just check negative values instead. > + * > + * Returns an integer that corresponds to the page offset within a block, for > + * a page that is used to store bad block markers. If no more pages are > + * available, -1 is returned. > + */ > +int nand_bbm_get_next_page(struct nand_chip *chip, int page) > +{ > + struct mtd_info *mtd = nand_to_mtd(chip); > + int last_page = ((mtd->erasesize - mtd->writesize) >> > + chip->page_shift) & chip->pagemask; > + > + if (page < 0 && chip->options & NAND_BBM_FIRSTPAGE) > + return 0; > + else if (page < 1 && chip->options & NAND_BBM_SECONDPAGE) > + return 1; > + else if (page < last_page && chip->options & NAND_BBM_LASTPAGE) > + return last_page; > + > + return -1; I would prefer a named value (like -EINVAL) and checks against a negative value (not -1). > +} > + > /** > * nand_block_bad - [DEFAULT] Read bad block marker from the chip > * @chip: NAND chip object > @@ -294,19 +319,14 @@ static void nand_release_device(struct nand_chip *chip) > */ > static int nand_block_bad(struct nand_chip *chip, loff_t ofs) > { > - struct mtd_info *mtd = nand_to_mtd(chip); > - int page, page_end, res; > + int page_offset; > + int res, first_page = (int)(ofs >> chip->page_shift) & chip->pagemask; Maybe: int first_page, page_offset; int res; u8 bad; first_page = (int)(ofs >> chip->page_shift) & chip->pagemask; page_offset = nand_bbm_get_next_page(chip, -1); > u8 bad; > > - if (chip->options & NAND_BBM_LASTPAGE) > - ofs += mtd->erasesize - mtd->writesize; > + page_offset = nand_bbm_get_next_page(chip, -1); > > - page = (int)(ofs >> chip->page_shift) & chip->pagemask; > - page_end = page + (((chip->options & NAND_BBM_FIRSTPAGE) && > - (chip->options & NAND_BBM_SECONDPAGE)) ? 2 : 1); > - > - for (; page < page_end; page++) { > - res = chip->ecc.read_oob(chip, page); > + while (page_offset != -1) { > + res = chip->ecc.read_oob(chip, first_page + page_offset); > if (res < 0) > return res; > > @@ -318,6 +338,8 @@ static int nand_block_bad(struct nand_chip *chip, loff_t ofs) > res = hweight8(bad) < chip->badblockbits; > if (res) > return res; > + > + page_offset = nand_bbm_get_next_page(chip, page_offset); > } > > return 0; > @@ -528,7 +550,7 @@ static int nand_default_block_markbad(struct nand_chip *chip, loff_t ofs) > struct mtd_info *mtd = nand_to_mtd(chip); > struct mtd_oob_ops ops; > uint8_t buf[2] = { 0, 0 }; > - int ret = 0, res, i = 0; > + int ret = 0, res, page_offset; > > memset(&ops, 0, sizeof(ops)); > ops.oobbuf = buf; > @@ -541,18 +563,18 @@ static int nand_default_block_markbad(struct nand_chip *chip, loff_t ofs) > } > ops.mode = MTD_OPS_PLACE_OOB; > > - /* Write to first/last page(s) if necessary */ > - if (chip->options & NAND_BBM_LASTPAGE) > - ofs += mtd->erasesize - mtd->writesize; > - do { > - res = nand_do_write_oob(chip, ofs, &ops); > + page_offset = nand_bbm_get_next_page(chip, -1); > + > + while (page_offset != -1) { > + res = nand_do_write_oob(chip, > + ofs + page_offset * mtd->writesize, > + &ops); > + > if (!ret) > ret = res; > > - i++; > - ofs += mtd->writesize; > - } while ((chip->options & NAND_BBM_FIRSTPAGE) && > - (chip->options & NAND_BBM_SECONDPAGE) && i < 2); > + page_offset = nand_bbm_get_next_page(chip, page_offset); > + } > > return ret; > } > diff --git a/drivers/mtd/nand/raw/nand_bbt.c b/drivers/mtd/nand/raw/nand_bbt.c > index 7463afddc7ac..09603c502931 100644 > --- a/drivers/mtd/nand/raw/nand_bbt.c > +++ b/drivers/mtd/nand/raw/nand_bbt.c > @@ -415,11 +415,12 @@ static void read_abs_bbts(struct nand_chip *this, uint8_t *buf, > > /* Scan a given block partially */ > static int scan_block_fast(struct nand_chip *this, struct nand_bbt_descr *bd, > - loff_t offs, uint8_t *buf, int numpages) > + loff_t offs, uint8_t *buf) > { > struct mtd_info *mtd = nand_to_mtd(this); > + > struct mtd_oob_ops ops; > - int j, ret; > + int ret, page_offset; > > ops.ooblen = mtd->oobsize; > ops.oobbuf = buf; > @@ -427,12 +428,15 @@ static int scan_block_fast(struct nand_chip *this, struct nand_bbt_descr *bd, > ops.datbuf = NULL; > ops.mode = MTD_OPS_PLACE_OOB; > > - for (j = 0; j < numpages; j++) { > + page_offset = nand_bbm_get_next_page(this, -1); > + > + while (page_offset != -1) { > /* > * Read the full oob until read_oob is fixed to handle single > * byte reads for 16 bit buswidth. > */ > - ret = mtd_read_oob(mtd, offs, &ops); > + ret = mtd_read_oob(mtd, offs + page_offset * mtd->writesize, Can you add '(' & ')' please? > + &ops); > /* Ignore ECC errors when checking for BBM */ > if (ret && !mtd_is_bitflip_or_eccerr(ret)) > return ret; > @@ -440,8 +444,9 @@ static int scan_block_fast(struct nand_chip *this, struct nand_bbt_descr *bd, > if (check_short_pattern(buf, bd)) > return 1; > > - offs += mtd->writesize; > + page_offset = nand_bbm_get_next_page(this, page_offset); > } > + > return 0; > } > > @@ -460,18 +465,11 @@ static int create_bbt(struct nand_chip *this, uint8_t *buf, > struct nand_bbt_descr *bd, int chip) > { > struct mtd_info *mtd = nand_to_mtd(this); > - int i, numblocks, numpages; > - int startblock; > + int i, numblocks, startblock; > loff_t from; > > pr_info("Scanning device for bad blocks\n"); > > - if ((this->options & NAND_BBM_FIRSTPAGE) && > - (this->options & NAND_BBM_SECONDPAGE)) > - numpages = 2; > - else > - numpages = 1; > - > if (chip == -1) { > numblocks = mtd->size >> this->bbt_erase_shift; > startblock = 0; > @@ -488,15 +486,12 @@ static int create_bbt(struct nand_chip *this, uint8_t *buf, > from = (loff_t)startblock << this->bbt_erase_shift; > } > > - if (this->options & NAND_BBM_LASTPAGE) > - from += mtd->erasesize - (mtd->writesize * numpages); > - > for (i = startblock; i < numblocks; i++) { > int ret; > > BUG_ON(bd->options & NAND_BBT_NO_OOB); > > - ret = scan_block_fast(this, bd, from, buf, numpages); > + ret = scan_block_fast(this, bd, from, buf); > if (ret < 0) > return ret; > 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 X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 339A6C43381 for ; Mon, 4 Mar 2019 11:21:46 +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 022982070B for ; Mon, 4 Mar 2019 11:21:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="f1rRTQUv" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 022982070B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject: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=t5fyq6SKfAfDkdam36oY86fipsDzC8ex9rIl548mZkk=; b=f1rRTQUvBoOnXP mazj7iAXOBfF+stS2iAjpexXblNrxfOs3aN5sLFLUBh4oL6Vi0USNulI8CYZdgjkbBcDDkJA+TYT/ zpLhMqcZZuLrE0xlM/JdS5CLKX+TA2OPD1nU81fmV/trpRSQ8m6b8ZMxbHYiU836CxUbNFNnqxJy7 givgP7J8e3pzpREzxQ/mmHaNjlUWW4ypcq0J+zCT0QRmFbwf04WJSUEnht83xUD+pGRn/C6FCD1Ph 2SGexQXEjP4Vmw7EAzDJEasU6kItr82bkztL12Ra3YtFio7FxrxUuVYPLADdB51YIbrdHxDyF5QiG TAhef2mruA0it0uNlGYQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1h0lfD-0008He-DV; Mon, 04 Mar 2019 11:21:43 +0000 Received: from relay4-d.mail.gandi.net ([217.70.183.196]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1h0lfA-0008Gt-2b for linux-mtd@lists.infradead.org; Mon, 04 Mar 2019 11:21:42 +0000 X-Originating-IP: 90.88.147.150 Received: from xps13 (aaubervilliers-681-1-27-150.w90-88.abo.wanadoo.fr [90.88.147.150]) (Authenticated sender: miquel.raynal@bootlin.com) by relay4-d.mail.gandi.net (Postfix) with ESMTPSA id BA094E0014; Mon, 4 Mar 2019 11:21:31 +0000 (UTC) Date: Mon, 4 Mar 2019 12:21:30 +0100 From: Miquel Raynal To: Schrempf Frieder Subject: Re: [PATCH v4 5/7] mtd: rawnand: Support bad block markers in first, second or last page Message-ID: <20190304122130.4b659bee@xps13> In-Reply-To: <20190218104122.18788-6-frieder.schrempf@kontron.de> References: <20190218104122.18788-1-frieder.schrempf@kontron.de> <20190218104122.18788-6-frieder.schrempf@kontron.de> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (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-20190304_032140_465879_89228565 X-CRM114-Status: GOOD ( 29.33 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "bbrezillon@kernel.org" , "richard@nod.at" , "linux-kernel@vger.kernel.org" , Marek Vasut , "linux-mtd@lists.infradead.org" , Brian Norris , David Woodhouse 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 SGkgU2NocmVtcGYsCgpTY2hyZW1wZiBGcmllZGVyIDxmcmllZGVyLnNjaHJlbXBmQGtvbnRyb24u ZGU+IHdyb3RlIG9uIE1vbiwgMTggRmViCjIwMTkgMTA6NDI6NDUgKzAwMDA6Cgo+IEZyb206IEZy aWVkZXIgU2NocmVtcGYgPGZyaWVkZXIuc2NocmVtcGZAa29udHJvbi5kZT4KPiAKPiBDdXJyZW50 bHkgc3VwcG9ydGVkIGJhZCBibG9jayBtYXJrZXIgcG9zaXRpb25zIHdpdGhpbiB0aGUgYmxvY2sg YXJlOgo+ICogaW4gZmlyc3QgcGFnZSBvbmx5Cj4gKiBpbiBsYXN0IHBhZ2Ugb25seQo+ICogaW4g Zmlyc3Qgb3Igc2Vjb25kIHBhZ2UKPiAKPiBTb21lIEVTTVQgTkFORHMgYXJlIGtub3duIHRvIGhh dmUgYmVlbiBzaGlwcGVkIGJ5IHRoZSBtYW51ZmFjdHVyZXIKPiB3aXRoIGJhZCBibG9jayBtYXJr ZXJzIGluIHRoZSBmaXJzdCBvciBsYXN0IHBhZ2UsIGluc3RlYWQgb2YgdGhlCj4gZmlyc3Qgb3Ig c2Vjb25kIHBhZ2UuCj4gCj4gQWxzbyB0aGUgZGF0YXNoZWV0cyBmb3IgQ3lwcmVzcy9TcGFuc2lv bi9BTUQgTkFORHMgY2xhaW0gdGhhdCB0aGUKPiBmaXJzdCwgc2Vjb25kICphbmQqIGxhc3QgcGFn ZSBuZWVkcyB0byBiZSBjaGVja2VkLgo+IAo+IFRoZXJlZm9yZSB3ZSBtYWtlIGl0IHBvc3NpYmxl IHRvIHNldCBOQU5EX0JCTV9GSVJTVFBBR0UsCj4gTkFORF9CQk1fU0VDT05EUEFHRSBhbmQgTkFO RF9CQk1fTEFTVFBBR0UgaW5kZXBlbmRlbnRseSBpbiBhbnkKPiBjb21iaW5hdGlvbi4KPiAKPiBU byBzaW1wbGlmeSB0aGUgY29kZSwgdGhlIGxvZ2ljIHRvIGV2YWx1YXRlIHRoZSBmbGFncyBpcyBt b3ZlZCB0byBhCj4gYSBuZXcgZnVuY3Rpb24gbmFuZF9iYm1fZ2V0X25leHRfcGFnZSgpLgo+IAo+ IFNpZ25lZC1vZmYtYnk6IEZyaWVkZXIgU2NocmVtcGYgPGZyaWVkZXIuc2NocmVtcGZAa29udHJv bi5kZT4KPiBSZXZpZXdlZC1ieTogQm9yaXMgQnJlemlsbG9uIDxiYnJlemlsbG9uQGtlcm5lbC5v cmc+Cj4gLS0tCj4gIGRyaXZlcnMvbXRkL25hbmQvcmF3L2ludGVybmFscy5oIHwgIDEgKwo+ICBk cml2ZXJzL210ZC9uYW5kL3Jhdy9uYW5kX2Jhc2UuYyB8IDYyICsrKysrKysrKysrKysrKysrKysr KysrKy0tLS0tLS0tLS0tCj4gIGRyaXZlcnMvbXRkL25hbmQvcmF3L25hbmRfYmJ0LmMgIHwgMjkg KysrKysrKy0tLS0tLS0tLQo+ICAzIGZpbGVzIGNoYW5nZWQsIDU1IGluc2VydGlvbnMoKyksIDM3 IGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jhdy9pbnRl cm5hbHMuaCBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L2ludGVybmFscy5oCj4gaW5kZXggZmJmNmNh MDE1Y2Q3Li45N2FlNjdlMDA5ZDUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9yYXcv aW50ZXJuYWxzLmgKPiArKysgYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9pbnRlcm5hbHMuaAo+IEBA IC03Niw2ICs3Niw3IEBAIGV4dGVybiBjb25zdCBzdHJ1Y3QgbmFuZF9tYW51ZmFjdHVyZXJfb3Bz IHRvc2hpYmFfbmFuZF9tYW51Zl9vcHM7Cj4gIAo+ICAvKiBDb3JlIGZ1bmN0aW9ucyAqLwo+ICBj b25zdCBzdHJ1Y3QgbmFuZF9tYW51ZmFjdHVyZXIgKm5hbmRfZ2V0X21hbnVmYWN0dXJlcih1OCBp ZCk7Cj4gK2ludCBuYW5kX2JibV9nZXRfbmV4dF9wYWdlKHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAs IGludCBwYWdlKTsKPiAgaW50IG5hbmRfbWFya2JhZF9iYm0oc3RydWN0IG5hbmRfY2hpcCAqY2hp cCwgbG9mZl90IG9mcyk7Cj4gIGludCBuYW5kX2VyYXNlX25hbmQoc3RydWN0IG5hbmRfY2hpcCAq Y2hpcCwgc3RydWN0IGVyYXNlX2luZm8gKmluc3RyLAo+ICAJCSAgICBpbnQgYWxsb3diYnQpOwo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jhdy9uYW5kX2Jhc2UuYyBiL2RyaXZlcnMv bXRkL25hbmQvcmF3L25hbmRfYmFzZS5jCj4gaW5kZXggOWVmN2I4NmNkYzQyLi43YmMyMGMxZmUy M2MgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvbmFuZF9iYXNlLmMKPiArKysg Yi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9uYW5kX2Jhc2UuYwo+IEBAIC0yODUsNiArMjg1LDMxIEBA IHN0YXRpYyB2b2lkIG5hbmRfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCkK PiAgCXNwaW5fdW5sb2NrKCZjaGlwLT5jb250cm9sbGVyLT5sb2NrKTsKPiAgfQo+ICAKPiArLyoq Cj4gKyAqIG5hbmRfYmJtX2dldF9uZXh0X3BhZ2UgLSBHZXQgdGhlIG5leHQgcGFnZSBmb3IgYmFk IGJsb2NrIG1hcmtlcnMKPiArICogQGNoaXA6IE5BTkQgY2hpcCBvYmplY3QKPiArICogQGluZGV4 OiBDdXJyZW50IHBhZ2UsIG9ubHkgcGFnZXMgYmV5b25kIHRoaXMgd2lsbCBiZSBjb25zaWRlcmVk CgpXaHkgcGFnZXMgKmJleW9uZCo/IENhbid0IHlvdSBjaGFuZ2UgdGhlIGxvZ2ljIHRvIHVzZSB0 aGUgcGFnZSBmcm9tCndoZXJlIHRvIHN0YXJ0IHNlYXJjaGluZz8gSSBhbSBub3Qgc3VyZSBzdWNo IGEgY2hhbmdlIHdvdWxkIGJlCmNsZWFyZXIgaW4gdGhlIHJlc3Qgb2YgdGhlIGNvZGUgYnV0IEkg ZG9uJ3QgbGlrZSB0aGUgdGVzdHMgYWdhaW5zdAoiLTEiLiBNYXliZSB5b3UgY291bGQganVzdCBj aGVjayBuZWdhdGl2ZSB2YWx1ZXMgaW5zdGVhZC4KCj4gKyAqCj4gKyAqIFJldHVybnMgYW4gaW50 ZWdlciB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBwYWdlIG9mZnNldCB3aXRoaW4gYSBibG9jaywg Zm9yCj4gKyAqIGEgcGFnZSB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgYmFkIGJsb2NrIG1hcmtlcnMu IElmIG5vIG1vcmUgcGFnZXMgYXJlCj4gKyAqIGF2YWlsYWJsZSwgLTEgaXMgcmV0dXJuZWQuCj4g KyAqLwo+ICtpbnQgbmFuZF9iYm1fZ2V0X25leHRfcGFnZShzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCBpbnQgcGFnZSkKPiArewo+ICsJc3RydWN0IG10ZF9pbmZvICptdGQgPSBuYW5kX3RvX210ZChj aGlwKTsKPiArCWludCBsYXN0X3BhZ2UgPSAoKG10ZC0+ZXJhc2VzaXplIC0gbXRkLT53cml0ZXNp emUpID4+Cj4gKwkJCSBjaGlwLT5wYWdlX3NoaWZ0KSAmIGNoaXAtPnBhZ2VtYXNrOwo+ICsKPiAr CWlmIChwYWdlIDwgMCAmJiBjaGlwLT5vcHRpb25zICYgTkFORF9CQk1fRklSU1RQQUdFKQo+ICsJ CXJldHVybiAwOwo+ICsJZWxzZSBpZiAocGFnZSA8IDEgJiYgY2hpcC0+b3B0aW9ucyAmIE5BTkRf QkJNX1NFQ09ORFBBR0UpCj4gKwkJcmV0dXJuIDE7Cj4gKwllbHNlIGlmIChwYWdlIDwgbGFzdF9w YWdlICYmIGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JCTV9MQVNUUEFHRSkKPiArCQlyZXR1cm4gbGFz dF9wYWdlOwo+ICsKPiArCXJldHVybiAtMTsKCkkgd291bGQgcHJlZmVyIGEgbmFtZWQgdmFsdWUg KGxpa2UgLUVJTlZBTCkgYW5kIGNoZWNrcyBhZ2FpbnN0IGEKbmVnYXRpdmUgdmFsdWUgKG5vdCAt MSkuCgo+ICt9Cj4gKwo+ICAvKioKPiAgICogbmFuZF9ibG9ja19iYWQgLSBbREVGQVVMVF0gUmVh ZCBiYWQgYmxvY2sgbWFya2VyIGZyb20gdGhlIGNoaXAKPiAgICogQGNoaXA6IE5BTkQgY2hpcCBv YmplY3QKPiBAQCAtMjk0LDE5ICszMTksMTQgQEAgc3RhdGljIHZvaWQgbmFuZF9yZWxlYXNlX2Rl dmljZShzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQo+ICAgKi8KPiAgc3RhdGljIGludCBuYW5kX2Js b2NrX2JhZChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLCBsb2ZmX3Qgb2ZzKQo+ICB7Cj4gLQlzdHJ1 Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKGNoaXApOwo+IC0JaW50IHBhZ2UsIHBhZ2Vf ZW5kLCByZXM7Cj4gKwlpbnQgcGFnZV9vZmZzZXQ7Cj4gKwlpbnQgcmVzLCBmaXJzdF9wYWdlID0g KGludCkob2ZzID4+IGNoaXAtPnBhZ2Vfc2hpZnQpICYgY2hpcC0+cGFnZW1hc2s7CgpNYXliZToK CiAgICAgICAgaW50IGZpcnN0X3BhZ2UsIHBhZ2Vfb2Zmc2V0OwogICAgICAgIGludCByZXM7CiAg ICAgICAgdTggYmFkOwoKICAgICAgICBmaXJzdF9wYWdlID0gKGludCkob2ZzID4+IGNoaXAtPnBh Z2Vfc2hpZnQpICYgY2hpcC0+cGFnZW1hc2s7CiAgICAgICAgcGFnZV9vZmZzZXQgPSBuYW5kX2Ji bV9nZXRfbmV4dF9wYWdlKGNoaXAsIC0xKTsKCj4gIAl1OCBiYWQ7Cj4gIAo+IC0JaWYgKGNoaXAt Pm9wdGlvbnMgJiBOQU5EX0JCTV9MQVNUUEFHRSkKPiAtCQlvZnMgKz0gbXRkLT5lcmFzZXNpemUg LSBtdGQtPndyaXRlc2l6ZTsKPiArCXBhZ2Vfb2Zmc2V0ID0gbmFuZF9iYm1fZ2V0X25leHRfcGFn ZShjaGlwLCAtMSk7Cj4gIAo+IC0JcGFnZSA9IChpbnQpKG9mcyA+PiBjaGlwLT5wYWdlX3NoaWZ0 KSAmIGNoaXAtPnBhZ2VtYXNrOwo+IC0JcGFnZV9lbmQgPSBwYWdlICsgKCgoY2hpcC0+b3B0aW9u cyAmIE5BTkRfQkJNX0ZJUlNUUEFHRSkgJiYKPiAtCQkJICAgIChjaGlwLT5vcHRpb25zICYgTkFO RF9CQk1fU0VDT05EUEFHRSkpID8gMiA6IDEpOwo+IC0KPiAtCWZvciAoOyBwYWdlIDwgcGFnZV9l bmQ7IHBhZ2UrKykgewo+IC0JCXJlcyA9IGNoaXAtPmVjYy5yZWFkX29vYihjaGlwLCBwYWdlKTsK PiArCXdoaWxlIChwYWdlX29mZnNldCAhPSAtMSkgewo+ICsJCXJlcyA9IGNoaXAtPmVjYy5yZWFk X29vYihjaGlwLCBmaXJzdF9wYWdlICsgcGFnZV9vZmZzZXQpOwo+ICAJCWlmIChyZXMgPCAwKQo+ ICAJCQlyZXR1cm4gcmVzOwo+ICAKPiBAQCAtMzE4LDYgKzMzOCw4IEBAIHN0YXRpYyBpbnQgbmFu ZF9ibG9ja19iYWQoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgbG9mZl90IG9mcykKPiAgCQkJcmVz ID0gaHdlaWdodDgoYmFkKSA8IGNoaXAtPmJhZGJsb2NrYml0czsKPiAgCQlpZiAocmVzKQo+ICAJ CQlyZXR1cm4gcmVzOwo+ICsKPiArCQlwYWdlX29mZnNldCA9IG5hbmRfYmJtX2dldF9uZXh0X3Bh Z2UoY2hpcCwgcGFnZV9vZmZzZXQpOwo+ICAJfQo+ICAKPiAgCXJldHVybiAwOwo+IEBAIC01Mjgs NyArNTUwLDcgQEAgc3RhdGljIGludCBuYW5kX2RlZmF1bHRfYmxvY2tfbWFya2JhZChzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwLCBsb2ZmX3Qgb2ZzKQo+ICAJc3RydWN0IG10ZF9pbmZvICptdGQgPSBu YW5kX3RvX210ZChjaGlwKTsKPiAgCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7Cj4gIAl1aW50OF90 IGJ1ZlsyXSA9IHsgMCwgMCB9Owo+IC0JaW50IHJldCA9IDAsIHJlcywgaSA9IDA7Cj4gKwlpbnQg cmV0ID0gMCwgcmVzLCBwYWdlX29mZnNldDsKPiAgCj4gIAltZW1zZXQoJm9wcywgMCwgc2l6ZW9m KG9wcykpOwo+ICAJb3BzLm9vYmJ1ZiA9IGJ1ZjsKPiBAQCAtNTQxLDE4ICs1NjMsMTggQEAgc3Rh dGljIGludCBuYW5kX2RlZmF1bHRfYmxvY2tfbWFya2JhZChzdHJ1Y3QgbmFuZF9jaGlwICpjaGlw LCBsb2ZmX3Qgb2ZzKQo+ICAJfQo+ICAJb3BzLm1vZGUgPSBNVERfT1BTX1BMQUNFX09PQjsKPiAg Cj4gLQkvKiBXcml0ZSB0byBmaXJzdC9sYXN0IHBhZ2UocykgaWYgbmVjZXNzYXJ5ICovCj4gLQlp ZiAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQkJNX0xBU1RQQUdFKQo+IC0JCW9mcyArPSBtdGQtPmVy YXNlc2l6ZSAtIG10ZC0+d3JpdGVzaXplOwo+IC0JZG8gewo+IC0JCXJlcyA9IG5hbmRfZG9fd3Jp dGVfb29iKGNoaXAsIG9mcywgJm9wcyk7Cj4gKwlwYWdlX29mZnNldCA9IG5hbmRfYmJtX2dldF9u ZXh0X3BhZ2UoY2hpcCwgLTEpOwo+ICsKPiArCXdoaWxlIChwYWdlX29mZnNldCAhPSAtMSkgewo+ ICsJCXJlcyA9IG5hbmRfZG9fd3JpdGVfb29iKGNoaXAsCj4gKwkJCQkJb2ZzICsgcGFnZV9vZmZz ZXQgKiBtdGQtPndyaXRlc2l6ZSwKPiArCQkJCQkmb3BzKTsKPiArCj4gIAkJaWYgKCFyZXQpCj4g IAkJCXJldCA9IHJlczsKPiAgCj4gLQkJaSsrOwo+IC0JCW9mcyArPSBtdGQtPndyaXRlc2l6ZTsK PiAtCX0gd2hpbGUgKChjaGlwLT5vcHRpb25zICYgTkFORF9CQk1fRklSU1RQQUdFKSAmJgo+IC0J CSAoY2hpcC0+b3B0aW9ucyAmIE5BTkRfQkJNX1NFQ09ORFBBR0UpICYmIGkgPCAyKTsKPiArCQlw YWdlX29mZnNldCA9IG5hbmRfYmJtX2dldF9uZXh0X3BhZ2UoY2hpcCwgcGFnZV9vZmZzZXQpOwo+ ICsJfQo+ICAKPiAgCXJldHVybiByZXQ7Cj4gIH0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQv bmFuZC9yYXcvbmFuZF9iYnQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L25hbmRfYmJ0LmMKPiBp bmRleCA3NDYzYWZkZGM3YWMuLjA5NjAzYzUwMjkzMSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL210 ZC9uYW5kL3Jhdy9uYW5kX2JidC5jCj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvbmFuZF9i YnQuYwo+IEBAIC00MTUsMTEgKzQxNSwxMiBAQCBzdGF0aWMgdm9pZCByZWFkX2Fic19iYnRzKHN0 cnVjdCBuYW5kX2NoaXAgKnRoaXMsIHVpbnQ4X3QgKmJ1ZiwKPiAgCj4gIC8qIFNjYW4gYSBnaXZl biBibG9jayBwYXJ0aWFsbHkgKi8KPiAgc3RhdGljIGludCBzY2FuX2Jsb2NrX2Zhc3Qoc3RydWN0 IG5hbmRfY2hpcCAqdGhpcywgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCwKPiAtCQkJICAgbG9m Zl90IG9mZnMsIHVpbnQ4X3QgKmJ1ZiwgaW50IG51bXBhZ2VzKQo+ICsJCQkgICBsb2ZmX3Qgb2Zm cywgdWludDhfdCAqYnVmKQo+ICB7Cj4gIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9f bXRkKHRoaXMpOwo+ICsKPiAgCXN0cnVjdCBtdGRfb29iX29wcyBvcHM7Cj4gLQlpbnQgaiwgcmV0 Owo+ICsJaW50IHJldCwgcGFnZV9vZmZzZXQ7Cj4gIAo+ICAJb3BzLm9vYmxlbiA9IG10ZC0+b29i c2l6ZTsKPiAgCW9wcy5vb2JidWYgPSBidWY7Cj4gQEAgLTQyNywxMiArNDI4LDE1IEBAIHN0YXRp YyBpbnQgc2Nhbl9ibG9ja19mYXN0KHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIHN0cnVjdCBuYW5k X2JidF9kZXNjciAqYmQsCj4gIAlvcHMuZGF0YnVmID0gTlVMTDsKPiAgCW9wcy5tb2RlID0gTVRE X09QU19QTEFDRV9PT0I7Cj4gIAo+IC0JZm9yIChqID0gMDsgaiA8IG51bXBhZ2VzOyBqKyspIHsK PiArCXBhZ2Vfb2Zmc2V0ID0gbmFuZF9iYm1fZ2V0X25leHRfcGFnZSh0aGlzLCAtMSk7Cj4gKwo+ ICsJd2hpbGUgKHBhZ2Vfb2Zmc2V0ICE9IC0xKSB7Cj4gIAkJLyoKPiAgCQkgKiBSZWFkIHRoZSBm dWxsIG9vYiB1bnRpbCByZWFkX29vYiBpcyBmaXhlZCB0byBoYW5kbGUgc2luZ2xlCj4gIAkJICog Ynl0ZSByZWFkcyBmb3IgMTYgYml0IGJ1c3dpZHRoLgo+ICAJCSAqLwo+IC0JCXJldCA9IG10ZF9y ZWFkX29vYihtdGQsIG9mZnMsICZvcHMpOwo+ICsJCXJldCA9IG10ZF9yZWFkX29vYihtdGQsIG9m ZnMgKyBwYWdlX29mZnNldCAqIG10ZC0+d3JpdGVzaXplLAoKQ2FuIHlvdSBhZGQgJygnICYgJykn IHBsZWFzZT8KCj4gKwkJCQkgICAmb3BzKTsKPiAgCQkvKiBJZ25vcmUgRUNDIGVycm9ycyB3aGVu IGNoZWNraW5nIGZvciBCQk0gKi8KPiAgCQlpZiAocmV0ICYmICFtdGRfaXNfYml0ZmxpcF9vcl9l Y2NlcnIocmV0KSkKPiAgCQkJcmV0dXJuIHJldDsKPiBAQCAtNDQwLDggKzQ0NCw5IEBAIHN0YXRp YyBpbnQgc2Nhbl9ibG9ja19mYXN0KHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIHN0cnVjdCBuYW5k X2JidF9kZXNjciAqYmQsCj4gIAkJaWYgKGNoZWNrX3Nob3J0X3BhdHRlcm4oYnVmLCBiZCkpCj4g IAkJCXJldHVybiAxOwo+ICAKPiAtCQlvZmZzICs9IG10ZC0+d3JpdGVzaXplOwo+ICsJCXBhZ2Vf b2Zmc2V0ID0gbmFuZF9iYm1fZ2V0X25leHRfcGFnZSh0aGlzLCBwYWdlX29mZnNldCk7Cj4gIAl9 Cj4gKwo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gQEAgLTQ2MCwxOCArNDY1LDExIEBAIHN0YXRp YyBpbnQgY3JlYXRlX2JidChzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLCB1aW50OF90ICpidWYsCj4g IAkJICAgICAgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCwgaW50IGNoaXApCj4gIHsKPiAgCXN0 cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQodGhpcyk7Cj4gLQlpbnQgaSwgbnVtYmxv Y2tzLCBudW1wYWdlczsKPiAtCWludCBzdGFydGJsb2NrOwo+ICsJaW50IGksIG51bWJsb2Nrcywg c3RhcnRibG9jazsKPiAgCWxvZmZfdCBmcm9tOwo+ICAKPiAgCXByX2luZm8oIlNjYW5uaW5nIGRl dmljZSBmb3IgYmFkIGJsb2Nrc1xuIik7Cj4gIAo+IC0JaWYgKCh0aGlzLT5vcHRpb25zICYgTkFO RF9CQk1fRklSU1RQQUdFKSAmJgo+IC0JICAgICh0aGlzLT5vcHRpb25zICYgTkFORF9CQk1fU0VD T05EUEFHRSkpCj4gLQkJbnVtcGFnZXMgPSAyOwo+IC0JZWxzZQo+IC0JCW51bXBhZ2VzID0gMTsK PiAtCj4gIAlpZiAoY2hpcCA9PSAtMSkgewo+ICAJCW51bWJsb2NrcyA9IG10ZC0+c2l6ZSA+PiB0 aGlzLT5iYnRfZXJhc2Vfc2hpZnQ7Cj4gIAkJc3RhcnRibG9jayA9IDA7Cj4gQEAgLTQ4OCwxNSAr NDg2LDEyIEBAIHN0YXRpYyBpbnQgY3JlYXRlX2JidChzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLCB1 aW50OF90ICpidWYsCj4gIAkJZnJvbSA9IChsb2ZmX3Qpc3RhcnRibG9jayA8PCB0aGlzLT5iYnRf ZXJhc2Vfc2hpZnQ7Cj4gIAl9Cj4gIAo+IC0JaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JCTV9M QVNUUEFHRSkKPiAtCQlmcm9tICs9IG10ZC0+ZXJhc2VzaXplIC0gKG10ZC0+d3JpdGVzaXplICog bnVtcGFnZXMpOwo+IC0KPiAgCWZvciAoaSA9IHN0YXJ0YmxvY2s7IGkgPCBudW1ibG9ja3M7IGkr Kykgewo+ICAJCWludCByZXQ7Cj4gIAo+ICAJCUJVR19PTihiZC0+b3B0aW9ucyAmIE5BTkRfQkJU X05PX09PQik7Cj4gIAo+IC0JCXJldCA9IHNjYW5fYmxvY2tfZmFzdCh0aGlzLCBiZCwgZnJvbSwg YnVmLCBudW1wYWdlcyk7Cj4gKwkJcmV0ID0gc2Nhbl9ibG9ja19mYXN0KHRoaXMsIGJkLCBmcm9t LCBidWYpOwo+ICAJCWlmIChyZXQgPCAwKQo+ICAJCQlyZXR1cm4gcmV0Owo+ICAKCgoKClRoYW5r cywKTWlxdcOobAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9uIG1haWxpbmcgbGlzdApodHRwOi8vbGlzdHMu aW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW10ZC8K