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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 21914C4332F for ; Thu, 25 Nov 2021 12:50:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348643AbhKYMxT (ORCPT ); Thu, 25 Nov 2021 07:53:19 -0500 Received: from mail.kernel.org ([198.145.29.99]:45580 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353415AbhKYMvp (ORCPT ); Thu, 25 Nov 2021 07:51:45 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id AFF5D6113D; Thu, 25 Nov 2021 12:46:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1637844399; bh=G2rKjdlzxb1XNs2lbCrBQXhcMuLp67aIGgdoCkybPjY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eEq9SR3JH7/OWh15A1+wZOPKWoTqJbLSnrH+8yz3ixHgFXG37Tq+W1uFKWpszTXRq XlP4+1v9Q7gzV9LE9RXylQmGsaWIVLcxLg63XATtmj430LS1g4o4EDWAcGuwgYKCKK BpyzTsP4MMoujXGVuohFEClGOtXEsHizpDRIJuRm6RbyS9ILXJXPHyum4FH/zmvnNy 5/G6MlhCqrSE5fREYPd7Xqxy/ciNCzznS+GxQq9G8PEO2QVWJ3WV8w3djJNE8mcfd6 /G5Dx4JntuZvmVP6Wtj9vWJvBKnhkAqtdAYaQ9gUAidalAqqTSaOH5im36C3HPVcrC y7fTtPZz9q7Fg== Received: by pali.im (Postfix) id 6EA43EDE; Thu, 25 Nov 2021 13:46:38 +0100 (CET) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Thomas Petazzoni , Lorenzo Pieralisi , Rob Herring , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Bjorn Helgaas , =?UTF-8?q?Marek=20Beh=C3=BAn?= Cc: linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 08/15] PCI: mvebu: Propagate errors when updating PCI_IO_BASE and PCI_MEM_BASE registers Date: Thu, 25 Nov 2021 13:45:58 +0100 Message-Id: <20211125124605.25915-9-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20211125124605.25915-1-pali@kernel.org> References: <20211125124605.25915-1-pali@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Properly propagate failure from mvebu_pcie_add_windows() function back to the caller mvebu_pci_bridge_emul_base_conf_write() and correctly updates PCI_IO_BASE, PCI_MEM_BASE and PCI_IO_BASE_UPPER16 registers on error. On error set base value higher than limit value which indicates that address range is disabled. When IO is unsupported then let IO registers zeroed as required by PCIe base specification. Signed-off-by: Pali Rohár Cc: stable@vger.kernel.org --- drivers/pci/controller/pci-mvebu.c | 82 ++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 27 deletions(-) diff --git a/drivers/pci/controller/pci-mvebu.c b/drivers/pci/controller/pci-mvebu.c index a0b661972436..12afa565bfcf 100644 --- a/drivers/pci/controller/pci-mvebu.c +++ b/drivers/pci/controller/pci-mvebu.c @@ -315,7 +315,7 @@ static void mvebu_pcie_del_windows(struct mvebu_pcie_port *port, * areas each having a power of two size. We start from the largest * one (i.e highest order bit set in the size). */ -static void mvebu_pcie_add_windows(struct mvebu_pcie_port *port, +static int mvebu_pcie_add_windows(struct mvebu_pcie_port *port, unsigned int target, unsigned int attribute, phys_addr_t base, size_t size, phys_addr_t remap) @@ -336,7 +336,7 @@ static void mvebu_pcie_add_windows(struct mvebu_pcie_port *port, &base, &end, ret); mvebu_pcie_del_windows(port, base - size_mapped, size_mapped); - return; + return ret; } size -= sz; @@ -345,16 +345,20 @@ static void mvebu_pcie_add_windows(struct mvebu_pcie_port *port, if (remap != MVEBU_MBUS_NO_REMAP) remap += sz; } + + return 0; } -static void mvebu_pcie_set_window(struct mvebu_pcie_port *port, +static int mvebu_pcie_set_window(struct mvebu_pcie_port *port, unsigned int target, unsigned int attribute, const struct mvebu_pcie_window *desired, struct mvebu_pcie_window *cur) { + int ret; + if (desired->base == cur->base && desired->remap == cur->remap && desired->size == cur->size) - return; + return 0; if (cur->size != 0) { mvebu_pcie_del_windows(port, cur->base, cur->size); @@ -369,30 +373,35 @@ static void mvebu_pcie_set_window(struct mvebu_pcie_port *port, } if (desired->size == 0) - return; + return 0; + + ret = mvebu_pcie_add_windows(port, target, attribute, desired->base, + desired->size, desired->remap); + if (ret) { + cur->size = 0; + cur->base = 0; + return ret; + } - mvebu_pcie_add_windows(port, target, attribute, desired->base, - desired->size, desired->remap); *cur = *desired; + return 0; } -static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port) +static int mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port) { struct mvebu_pcie_window desired = {}; struct pci_bridge_emul_conf *conf = &port->bridge.conf; /* Are the new iobase/iolimit values invalid? */ if (conf->iolimit < conf->iobase || - conf->iolimitupper < conf->iobaseupper) { - mvebu_pcie_set_window(port, port->io_target, port->io_attr, - &desired, &port->iowin); - return; - } + conf->iolimitupper < conf->iobaseupper) + return mvebu_pcie_set_window(port, port->io_target, port->io_attr, + &desired, &port->iowin); if (!mvebu_has_ioport(port)) { dev_WARN(&port->pcie->pdev->dev, "Attempt to set IO when IO is disabled\n"); - return; + return -EOPNOTSUPP; } /* @@ -410,21 +419,19 @@ static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port) desired.remap) + 1; - mvebu_pcie_set_window(port, port->io_target, port->io_attr, &desired, - &port->iowin); + return mvebu_pcie_set_window(port, port->io_target, port->io_attr, &desired, + &port->iowin); } -static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port) +static int mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port) { struct mvebu_pcie_window desired = {.remap = MVEBU_MBUS_NO_REMAP}; struct pci_bridge_emul_conf *conf = &port->bridge.conf; /* Are the new membase/memlimit values invalid? */ - if (conf->memlimit < conf->membase) { - mvebu_pcie_set_window(port, port->mem_target, port->mem_attr, - &desired, &port->memwin); - return; - } + if (conf->memlimit < conf->membase) + return mvebu_pcie_set_window(port, port->mem_target, port->mem_attr, + &desired, &port->memwin); /* * We read the PCI-to-PCI bridge emulated registers, and @@ -436,8 +443,8 @@ static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port) desired.size = (((conf->memlimit & 0xFFF0) << 16) | 0xFFFFF) - desired.base + 1; - mvebu_pcie_set_window(port, port->mem_target, port->mem_attr, &desired, - &port->memwin); + return mvebu_pcie_set_window(port, port->mem_target, port->mem_attr, &desired, + &port->memwin); } static pci_bridge_emul_read_status_t @@ -522,15 +529,36 @@ mvebu_pci_bridge_emul_base_conf_write(struct pci_bridge_emul *bridge, break; case PCI_IO_BASE: - mvebu_pcie_handle_iobase_change(port); + if ((mask & 0xffff) && mvebu_pcie_handle_iobase_change(port)) { + /* On error disable IO range */ + conf->iobase &= ~0xf0; + conf->iolimit &= ~0xf0; + conf->iobaseupper = cpu_to_le16(0x0000); + conf->iolimitupper = cpu_to_le16(0x0000); + if (mvebu_has_ioport(port)) + conf->iobase |= 0xf0; + } break; case PCI_MEMORY_BASE: - mvebu_pcie_handle_membase_change(port); + if (mvebu_pcie_handle_membase_change(port)) { + /* On error disable mem range */ + conf->membase = cpu_to_le16(le16_to_cpu(conf->membase) & ~0xfff0); + conf->memlimit = cpu_to_le16(le16_to_cpu(conf->memlimit) & ~0xfff0); + conf->membase = cpu_to_le16(le16_to_cpu(conf->membase) | 0xfff0); + } break; case PCI_IO_BASE_UPPER16: - mvebu_pcie_handle_iobase_change(port); + if (mvebu_pcie_handle_iobase_change(port)) { + /* On error disable IO range */ + conf->iobase &= ~0xf0; + conf->iolimit &= ~0xf0; + conf->iobaseupper = cpu_to_le16(0x0000); + conf->iolimitupper = cpu_to_le16(0x0000); + if (mvebu_has_ioport(port)) + conf->iobase |= 0xf0; + } break; case PCI_PRIMARY_BUS: -- 2.20.1 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id EE0D9C433EF for ; Thu, 25 Nov 2021 12:52:16 +0000 (UTC) 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:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ACOdBOk/caehVh0owxfF3Ve4VDJzG+1BtKo+uYiSetg=; b=CLi/huQwXqym2x eNGJl4Fksmq+oLC3Zh2tbsE6GjWJyLIPv2L70PEIcvPRvkTEWGmK+bwesqye+jRtGKvthuqkqMDYe qcKr7PUPpoUuR1pqtO3qpCHfs787DaKEcmalXrBAhFITEzDr8LUSK0u8pD7EA/3B+ajh6K2uKUSH/ Rv7yAdSaKLrPLpgltyL7p9wcQRMDjbNNkPvCqsFNrrh4ZelcNK41OVB7koCeByng3k8GFKifcjB6L 8hfR0kjKrxV76sT9BajhEBo8WRJBgZO/Bq76zUg4/7xmJPCVBLSYDXb/Q7HjaDGC7+gpGj5l5C/DX YN5Mk7p7/uHf27yPTLrA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mqECk-007UYK-1c; Thu, 25 Nov 2021 12:50:22 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mqE99-007Sqa-Bg for linux-arm-kernel@lists.infradead.org; Thu, 25 Nov 2021 12:46:41 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id AFF5D6113D; Thu, 25 Nov 2021 12:46:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1637844399; bh=G2rKjdlzxb1XNs2lbCrBQXhcMuLp67aIGgdoCkybPjY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eEq9SR3JH7/OWh15A1+wZOPKWoTqJbLSnrH+8yz3ixHgFXG37Tq+W1uFKWpszTXRq XlP4+1v9Q7gzV9LE9RXylQmGsaWIVLcxLg63XATtmj430LS1g4o4EDWAcGuwgYKCKK BpyzTsP4MMoujXGVuohFEClGOtXEsHizpDRIJuRm6RbyS9ILXJXPHyum4FH/zmvnNy 5/G6MlhCqrSE5fREYPd7Xqxy/ciNCzznS+GxQq9G8PEO2QVWJ3WV8w3djJNE8mcfd6 /G5Dx4JntuZvmVP6Wtj9vWJvBKnhkAqtdAYaQ9gUAidalAqqTSaOH5im36C3HPVcrC y7fTtPZz9q7Fg== Received: by pali.im (Postfix) id 6EA43EDE; Thu, 25 Nov 2021 13:46:38 +0100 (CET) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Thomas Petazzoni , Lorenzo Pieralisi , Rob Herring , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Bjorn Helgaas , =?UTF-8?q?Marek=20Beh=C3=BAn?= Cc: linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 08/15] PCI: mvebu: Propagate errors when updating PCI_IO_BASE and PCI_MEM_BASE registers Date: Thu, 25 Nov 2021 13:45:58 +0100 Message-Id: <20211125124605.25915-9-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20211125124605.25915-1-pali@kernel.org> References: <20211125124605.25915-1-pali@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211125_044639_495203_DC3B544F X-CRM114-Status: GOOD ( 16.01 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org UHJvcGVybHkgcHJvcGFnYXRlIGZhaWx1cmUgZnJvbSBtdmVidV9wY2llX2FkZF93aW5kb3dzKCkg ZnVuY3Rpb24gYmFjayB0bwp0aGUgY2FsbGVyIG12ZWJ1X3BjaV9icmlkZ2VfZW11bF9iYXNlX2Nv bmZfd3JpdGUoKSBhbmQgY29ycmVjdGx5IHVwZGF0ZXMKUENJX0lPX0JBU0UsIFBDSV9NRU1fQkFT RSBhbmQgUENJX0lPX0JBU0VfVVBQRVIxNiByZWdpc3RlcnMgb24gZXJyb3IuCk9uIGVycm9yIHNl dCBiYXNlIHZhbHVlIGhpZ2hlciB0aGFuIGxpbWl0IHZhbHVlIHdoaWNoIGluZGljYXRlcyB0aGF0 CmFkZHJlc3MgcmFuZ2UgaXMgZGlzYWJsZWQuIFdoZW4gSU8gaXMgdW5zdXBwb3J0ZWQgdGhlbiBs ZXQgSU8gcmVnaXN0ZXJzCnplcm9lZCBhcyByZXF1aXJlZCBieSBQQ0llIGJhc2Ugc3BlY2lmaWNh dGlvbi4KClNpZ25lZC1vZmYtYnk6IFBhbGkgUm9ow6FyIDxwYWxpQGtlcm5lbC5vcmc+CkNjOiBz dGFibGVAdmdlci5rZXJuZWwub3JnCi0tLQogZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktbXZl YnUuYyB8IDgyICsrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQs IDU1IGluc2VydGlvbnMoKyksIDI3IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMv cGNpL2NvbnRyb2xsZXIvcGNpLW12ZWJ1LmMgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1t dmVidS5jCmluZGV4IGEwYjY2MTk3MjQzNi4uMTJhZmE1NjViZmNmIDEwMDY0NAotLS0gYS9kcml2 ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1tdmVidS5jCisrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xs ZXIvcGNpLW12ZWJ1LmMKQEAgLTMxNSw3ICszMTUsNyBAQCBzdGF0aWMgdm9pZCBtdmVidV9wY2ll X2RlbF93aW5kb3dzKHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQsCiAgKiBhcmVhcyBlYWNo IGhhdmluZyBhIHBvd2VyIG9mIHR3byBzaXplLiBXZSBzdGFydCBmcm9tIHRoZSBsYXJnZXN0CiAg KiBvbmUgKGkuZSBoaWdoZXN0IG9yZGVyIGJpdCBzZXQgaW4gdGhlIHNpemUpLgogICovCi1zdGF0 aWMgdm9pZCBtdmVidV9wY2llX2FkZF93aW5kb3dzKHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBv cnQsCitzdGF0aWMgaW50IG12ZWJ1X3BjaWVfYWRkX3dpbmRvd3Moc3RydWN0IG12ZWJ1X3BjaWVf cG9ydCAqcG9ydCwKIAkJCQkgICB1bnNpZ25lZCBpbnQgdGFyZ2V0LCB1bnNpZ25lZCBpbnQgYXR0 cmlidXRlLAogCQkJCSAgIHBoeXNfYWRkcl90IGJhc2UsIHNpemVfdCBzaXplLAogCQkJCSAgIHBo eXNfYWRkcl90IHJlbWFwKQpAQCAtMzM2LDcgKzMzNiw3IEBAIHN0YXRpYyB2b2lkIG12ZWJ1X3Bj aWVfYWRkX3dpbmRvd3Moc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCwKIAkJCQkmYmFzZSwg JmVuZCwgcmV0KTsKIAkJCW12ZWJ1X3BjaWVfZGVsX3dpbmRvd3MocG9ydCwgYmFzZSAtIHNpemVf bWFwcGVkLAogCQkJCQkgICAgICAgc2l6ZV9tYXBwZWQpOwotCQkJcmV0dXJuOworCQkJcmV0dXJu IHJldDsKIAkJfQogCiAJCXNpemUgLT0gc3o7CkBAIC0zNDUsMTYgKzM0NSwyMCBAQCBzdGF0aWMg dm9pZCBtdmVidV9wY2llX2FkZF93aW5kb3dzKHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQs CiAJCWlmIChyZW1hcCAhPSBNVkVCVV9NQlVTX05PX1JFTUFQKQogCQkJcmVtYXAgKz0gc3o7CiAJ fQorCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG12ZWJ1X3BjaWVfc2V0X3dpbmRvdyhz dHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0LAorc3RhdGljIGludCBtdmVidV9wY2llX3NldF93 aW5kb3coc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCwKIAkJCQkgIHVuc2lnbmVkIGludCB0 YXJnZXQsIHVuc2lnbmVkIGludCBhdHRyaWJ1dGUsCiAJCQkJICBjb25zdCBzdHJ1Y3QgbXZlYnVf cGNpZV93aW5kb3cgKmRlc2lyZWQsCiAJCQkJICBzdHJ1Y3QgbXZlYnVfcGNpZV93aW5kb3cgKmN1 cikKIHsKKwlpbnQgcmV0OworCiAJaWYgKGRlc2lyZWQtPmJhc2UgPT0gY3VyLT5iYXNlICYmIGRl c2lyZWQtPnJlbWFwID09IGN1ci0+cmVtYXAgJiYKIAkgICAgZGVzaXJlZC0+c2l6ZSA9PSBjdXIt PnNpemUpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAlpZiAoY3VyLT5zaXplICE9IDApIHsK IAkJbXZlYnVfcGNpZV9kZWxfd2luZG93cyhwb3J0LCBjdXItPmJhc2UsIGN1ci0+c2l6ZSk7CkBA IC0zNjksMzAgKzM3MywzNSBAQCBzdGF0aWMgdm9pZCBtdmVidV9wY2llX3NldF93aW5kb3coc3Ry dWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCwKIAl9CiAKIAlpZiAoZGVzaXJlZC0+c2l6ZSA9PSAw KQotCQlyZXR1cm47CisJCXJldHVybiAwOworCisJcmV0ID0gbXZlYnVfcGNpZV9hZGRfd2luZG93 cyhwb3J0LCB0YXJnZXQsIGF0dHJpYnV0ZSwgZGVzaXJlZC0+YmFzZSwKKwkJCQkgICAgIGRlc2ly ZWQtPnNpemUsIGRlc2lyZWQtPnJlbWFwKTsKKwlpZiAocmV0KSB7CisJCWN1ci0+c2l6ZSA9IDA7 CisJCWN1ci0+YmFzZSA9IDA7CisJCXJldHVybiByZXQ7CisJfQogCi0JbXZlYnVfcGNpZV9hZGRf d2luZG93cyhwb3J0LCB0YXJnZXQsIGF0dHJpYnV0ZSwgZGVzaXJlZC0+YmFzZSwKLQkJCSAgICAg ICBkZXNpcmVkLT5zaXplLCBkZXNpcmVkLT5yZW1hcCk7CiAJKmN1ciA9ICpkZXNpcmVkOworCXJl dHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtdmVidV9wY2llX2hhbmRsZV9pb2Jhc2VfY2hhbmdl KHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IG12ZWJ1X3BjaWVfaGFu ZGxlX2lvYmFzZV9jaGFuZ2Uoc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1 Y3QgbXZlYnVfcGNpZV93aW5kb3cgZGVzaXJlZCA9IHt9OwogCXN0cnVjdCBwY2lfYnJpZGdlX2Vt dWxfY29uZiAqY29uZiA9ICZwb3J0LT5icmlkZ2UuY29uZjsKIAogCS8qIEFyZSB0aGUgbmV3IGlv YmFzZS9pb2xpbWl0IHZhbHVlcyBpbnZhbGlkPyAqLwogCWlmIChjb25mLT5pb2xpbWl0IDwgY29u Zi0+aW9iYXNlIHx8Ci0JICAgIGNvbmYtPmlvbGltaXR1cHBlciA8IGNvbmYtPmlvYmFzZXVwcGVy KSB7Ci0JCW12ZWJ1X3BjaWVfc2V0X3dpbmRvdyhwb3J0LCBwb3J0LT5pb190YXJnZXQsIHBvcnQt PmlvX2F0dHIsCi0JCQkJICAgICAgJmRlc2lyZWQsICZwb3J0LT5pb3dpbik7Ci0JCXJldHVybjsK LQl9CisJICAgIGNvbmYtPmlvbGltaXR1cHBlciA8IGNvbmYtPmlvYmFzZXVwcGVyKQorCQlyZXR1 cm4gbXZlYnVfcGNpZV9zZXRfd2luZG93KHBvcnQsIHBvcnQtPmlvX3RhcmdldCwgcG9ydC0+aW9f YXR0ciwKKwkJCQkJICAgICAmZGVzaXJlZCwgJnBvcnQtPmlvd2luKTsKIAogCWlmICghbXZlYnVf aGFzX2lvcG9ydChwb3J0KSkgewogCQlkZXZfV0FSTigmcG9ydC0+cGNpZS0+cGRldi0+ZGV2LAog CQkJICJBdHRlbXB0IHRvIHNldCBJTyB3aGVuIElPIGlzIGRpc2FibGVkXG4iKTsKLQkJcmV0dXJu OworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCiAJLyoKQEAgLTQxMCwyMSArNDE5LDE5IEBA IHN0YXRpYyB2b2lkIG12ZWJ1X3BjaWVfaGFuZGxlX2lvYmFzZV9jaGFuZ2Uoc3RydWN0IG12ZWJ1 X3BjaWVfcG9ydCAqcG9ydCkKIAkJCWRlc2lyZWQucmVtYXApICsKIAkJICAgICAgIDE7CiAKLQlt dmVidV9wY2llX3NldF93aW5kb3cocG9ydCwgcG9ydC0+aW9fdGFyZ2V0LCBwb3J0LT5pb19hdHRy LCAmZGVzaXJlZCwKLQkJCSAgICAgICZwb3J0LT5pb3dpbik7CisJcmV0dXJuIG12ZWJ1X3BjaWVf c2V0X3dpbmRvdyhwb3J0LCBwb3J0LT5pb190YXJnZXQsIHBvcnQtPmlvX2F0dHIsICZkZXNpcmVk LAorCQkJCSAgICAgJnBvcnQtPmlvd2luKTsKIH0KIAotc3RhdGljIHZvaWQgbXZlYnVfcGNpZV9o YW5kbGVfbWVtYmFzZV9jaGFuZ2Uoc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCkKK3N0YXRp YyBpbnQgbXZlYnVfcGNpZV9oYW5kbGVfbWVtYmFzZV9jaGFuZ2Uoc3RydWN0IG12ZWJ1X3BjaWVf cG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgbXZlYnVfcGNpZV93aW5kb3cgZGVzaXJlZCA9IHsucmVt YXAgPSBNVkVCVV9NQlVTX05PX1JFTUFQfTsKIAlzdHJ1Y3QgcGNpX2JyaWRnZV9lbXVsX2NvbmYg KmNvbmYgPSAmcG9ydC0+YnJpZGdlLmNvbmY7CiAKIAkvKiBBcmUgdGhlIG5ldyBtZW1iYXNlL21l bWxpbWl0IHZhbHVlcyBpbnZhbGlkPyAqLwotCWlmIChjb25mLT5tZW1saW1pdCA8IGNvbmYtPm1l bWJhc2UpIHsKLQkJbXZlYnVfcGNpZV9zZXRfd2luZG93KHBvcnQsIHBvcnQtPm1lbV90YXJnZXQs IHBvcnQtPm1lbV9hdHRyLAotCQkJCSAgICAgICZkZXNpcmVkLCAmcG9ydC0+bWVtd2luKTsKLQkJ cmV0dXJuOwotCX0KKwlpZiAoY29uZi0+bWVtbGltaXQgPCBjb25mLT5tZW1iYXNlKQorCQlyZXR1 cm4gbXZlYnVfcGNpZV9zZXRfd2luZG93KHBvcnQsIHBvcnQtPm1lbV90YXJnZXQsIHBvcnQtPm1l bV9hdHRyLAorCQkJCQkgICAgICZkZXNpcmVkLCAmcG9ydC0+bWVtd2luKTsKIAogCS8qCiAJICog V2UgcmVhZCB0aGUgUENJLXRvLVBDSSBicmlkZ2UgZW11bGF0ZWQgcmVnaXN0ZXJzLCBhbmQKQEAg LTQzNiw4ICs0NDMsOCBAQCBzdGF0aWMgdm9pZCBtdmVidV9wY2llX2hhbmRsZV9tZW1iYXNlX2No YW5nZShzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0KQogCWRlc2lyZWQuc2l6ZSA9ICgoKGNv bmYtPm1lbWxpbWl0ICYgMHhGRkYwKSA8PCAxNikgfCAweEZGRkZGKSAtCiAJCSAgICAgICBkZXNp cmVkLmJhc2UgKyAxOwogCi0JbXZlYnVfcGNpZV9zZXRfd2luZG93KHBvcnQsIHBvcnQtPm1lbV90 YXJnZXQsIHBvcnQtPm1lbV9hdHRyLCAmZGVzaXJlZCwKLQkJCSAgICAgICZwb3J0LT5tZW13aW4p OworCXJldHVybiBtdmVidV9wY2llX3NldF93aW5kb3cocG9ydCwgcG9ydC0+bWVtX3RhcmdldCwg cG9ydC0+bWVtX2F0dHIsICZkZXNpcmVkLAorCQkJCSAgICAgJnBvcnQtPm1lbXdpbik7CiB9CiAK IHN0YXRpYyBwY2lfYnJpZGdlX2VtdWxfcmVhZF9zdGF0dXNfdApAQCAtNTIyLDE1ICs1MjksMzYg QEAgbXZlYnVfcGNpX2JyaWRnZV9lbXVsX2Jhc2VfY29uZl93cml0ZShzdHJ1Y3QgcGNpX2JyaWRn ZV9lbXVsICpicmlkZ2UsCiAJCWJyZWFrOwogCiAJY2FzZSBQQ0lfSU9fQkFTRToKLQkJbXZlYnVf cGNpZV9oYW5kbGVfaW9iYXNlX2NoYW5nZShwb3J0KTsKKwkJaWYgKChtYXNrICYgMHhmZmZmKSAm JiBtdmVidV9wY2llX2hhbmRsZV9pb2Jhc2VfY2hhbmdlKHBvcnQpKSB7CisJCQkvKiBPbiBlcnJv ciBkaXNhYmxlIElPIHJhbmdlICovCisJCQljb25mLT5pb2Jhc2UgJj0gfjB4ZjA7CisJCQljb25m LT5pb2xpbWl0ICY9IH4weGYwOworCQkJY29uZi0+aW9iYXNldXBwZXIgPSBjcHVfdG9fbGUxNigw eDAwMDApOworCQkJY29uZi0+aW9saW1pdHVwcGVyID0gY3B1X3RvX2xlMTYoMHgwMDAwKTsKKwkJ CWlmIChtdmVidV9oYXNfaW9wb3J0KHBvcnQpKQorCQkJCWNvbmYtPmlvYmFzZSB8PSAweGYwOwor CQl9CiAJCWJyZWFrOwogCiAJY2FzZSBQQ0lfTUVNT1JZX0JBU0U6Ci0JCW12ZWJ1X3BjaWVfaGFu ZGxlX21lbWJhc2VfY2hhbmdlKHBvcnQpOworCQlpZiAobXZlYnVfcGNpZV9oYW5kbGVfbWVtYmFz ZV9jaGFuZ2UocG9ydCkpIHsKKwkJCS8qIE9uIGVycm9yIGRpc2FibGUgbWVtIHJhbmdlICovCisJ CQljb25mLT5tZW1iYXNlID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoY29uZi0+bWVtYmFzZSkg JiB+MHhmZmYwKTsKKwkJCWNvbmYtPm1lbWxpbWl0ID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUo Y29uZi0+bWVtbGltaXQpICYgfjB4ZmZmMCk7CisJCQljb25mLT5tZW1iYXNlID0gY3B1X3RvX2xl MTYobGUxNl90b19jcHUoY29uZi0+bWVtYmFzZSkgfCAweGZmZjApOworCQl9CiAJCWJyZWFrOwog CiAJY2FzZSBQQ0lfSU9fQkFTRV9VUFBFUjE2OgotCQltdmVidV9wY2llX2hhbmRsZV9pb2Jhc2Vf Y2hhbmdlKHBvcnQpOworCQlpZiAobXZlYnVfcGNpZV9oYW5kbGVfaW9iYXNlX2NoYW5nZShwb3J0 KSkgeworCQkJLyogT24gZXJyb3IgZGlzYWJsZSBJTyByYW5nZSAqLworCQkJY29uZi0+aW9iYXNl ICY9IH4weGYwOworCQkJY29uZi0+aW9saW1pdCAmPSB+MHhmMDsKKwkJCWNvbmYtPmlvYmFzZXVw cGVyID0gY3B1X3RvX2xlMTYoMHgwMDAwKTsKKwkJCWNvbmYtPmlvbGltaXR1cHBlciA9IGNwdV90 b19sZTE2KDB4MDAwMCk7CisJCQlpZiAobXZlYnVfaGFzX2lvcG9ydChwb3J0KSkKKwkJCQljb25m LT5pb2Jhc2UgfD0gMHhmMDsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgUENJX1BSSU1BUllfQlVT OgotLSAKMi4yMC4xCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0 cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtYXJtLWtlcm5lbAo=