From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v3,2/3] spi: add FTDI MPSSE SPI controller driver From: Anatolij Gustschin Message-Id: <20181127175438.16116-3-agust@denx.de> Date: Tue, 27 Nov 2018 18:54:37 +0100 To: linux-usb@vger.kernel.org, linux-spi@vger.kernel.org, linux-fpga@vger.kernel.org, linux-kernel@vger.kernel.org Cc: gregkh@linuxfoundation.org, broonie@kernel.org, atull@kernel.org, mdf@kernel.org List-ID: QWRkIFNQSSBidXMgY29udHJvbGxlciBkcml2ZXIgZm9yIEZUREkgTVBTU0UgbW9kZS4gVGhpcyBk cml2ZXIKaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoIHRoZSBGVDIzMkggaW50 ZXJmYWNlIGRyaXZlcgpmb3IgRlBHQSBjb25maWd1cmF0aW9uIGluIGRyaXZlcnMvdXNiL21pc2Mv ZnQyMzJoLWludGYuYyB3aGljaAphZGRzIGFuIG1wc3NlIHNwaSBwbGF0Zm9ybSBkZXZpY2UgZGVz Y3JpYmluZyBVU0IgU1BJIGJ1cyB3aXRoCmF0dGFjaGVkIFNQSSBzbGF2ZSBkZXZpY2VzLgoKU2ln bmVkLW9mZi1ieTogQW5hdG9saWogR3VzdHNjaGluIDxhZ3VzdEBkZW54LmRlPgotLS0KIGRyaXZl cnMvc3BpL0tjb25maWcgICAgICAgICAgfCAgIDcgKwogZHJpdmVycy9zcGkvTWFrZWZpbGUgICAg ICAgICB8ICAgMSArCiBkcml2ZXJzL3NwaS9zcGktZnRkaS1tcHNzZS5jIHwgNjUxICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDY1OSBpbnNlcnRp b25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zcGkvc3BpLWZ0ZGktbXBzc2UuYwoK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmlu ZGV4IDdkM2E1Yzk0NzI3ZS4uMmNiMjRlMjhjNDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9L Y29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTI1OSw2ICsyNTksMTMgQEAgY29u ZmlnIFNQSV9GU0xfTFBTUEkKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgRnJlZXNjYWxlIGkuTVgg TFBTUEkgY29udHJvbGxlcnMgaW4gbWFzdGVyIG1vZGUuCiAKK2NvbmZpZyBTUElfRlRESV9NUFNT RQorCXRyaXN0YXRlICJGVERJIE1QU1NFIFNQSSBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gVVNC X0ZUMjMySF9JTlRGIHx8IENPTVBJTEVfVEVTVAorCWhlbHAKKwkgIEZUMjMySCBzdXBwb3J0cyBT UEkgaW4gTVBTU0UgbW9kZS4gVGhpcyBkcml2ZXIgcHJvdmlkZXMgTVBTU0UKKwkgIFNQSSBjb250 cm9sbGVyIGluIG1hc3RlciBtb2RlLgorCiBjb25maWcgU1BJX0dQSU8KIAl0cmlzdGF0ZSAiR1BJ Ty1iYXNlZCBiaXRiYW5naW5nIFNQSSBNYXN0ZXIiCiAJZGVwZW5kcyBvbiBHUElPTElCIHx8IENP TVBJTEVfVEVTVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvTWFrZWZpbGUgYi9kcml2ZXJzL3Nw aS9NYWtlZmlsZQppbmRleCAzNTc1MjA1YzVjMjcuLjA2NTI0MGEwMmIzMSAxMDA2NDQKLS0tIGEv ZHJpdmVycy9zcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTQ1LDYg KzQ1LDcgQEAgb2JqLSQoQ09ORklHX1NQSV9GU0xfTElCKQkJKz0gc3BpLWZzbC1saWIubwogb2Jq LSQoQ09ORklHX1NQSV9GU0xfRVNQSSkJCSs9IHNwaS1mc2wtZXNwaS5vCiBvYmotJChDT05GSUdf U1BJX0ZTTF9MUFNQSSkJCSs9IHNwaS1mc2wtbHBzcGkubwogb2JqLSQoQ09ORklHX1NQSV9GU0xf U1BJKQkJKz0gc3BpLWZzbC1zcGkubworb2JqLSQoQ09ORklHX1NQSV9GVERJX01QU1NFKQkJKz0g c3BpLWZ0ZGktbXBzc2Uubwogb2JqLSQoQ09ORklHX1NQSV9HUElPKQkJCSs9IHNwaS1ncGlvLm8K IG9iai0kKENPTkZJR19TUElfSU1HX1NQRkkpCQkrPSBzcGktaW1nLXNwZmkubwogb2JqLSQoQ09O RklHX1NQSV9JTVgpCQkJKz0gc3BpLWlteC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkt ZnRkaS1tcHNzZS5jIGIvZHJpdmVycy9zcGkvc3BpLWZ0ZGktbXBzc2UuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmFlODQ0MmViNDA1MgotLS0gL2Rldi9udWxsCisr KyBiL2RyaXZlcnMvc3BpL3NwaS1mdGRpLW1wc3NlLmMKQEAgLTAsMCArMSw2NTEgQEAKKy8vIFNQ RFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvLworLy8gRlRESSBGVDIzMkggTVBTU0Ug U1BJIGNvbnRyb2xsZXIgZHJpdmVyCisvLworLy8gQ29weXJpZ2h0IChDKSAyMDE3IC0gMjAxOCBE RU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisvLyBBbmF0b2xpaiBHdXN0c2NoaW4gPGFndXN0QGRl bnguZGU+CisvLworCisjaW5jbHVkZSA8bGludXgvYml0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2Rl bGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2dw aW8vbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1 ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxs aW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51 eC9zaXplcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9m dDIzMmgtaW50Zi5oPgorCitlbnVtIGdwaW9sIHsKKwlNUFNTRV9TSwk9IEJJVCgwKSwKKwlNUFNT RV9ETwk9IEJJVCgxKSwKKwlNUFNTRV9ESQk9IEJJVCgyKSwKKwlNUFNTRV9DUwk9IEJJVCgzKSwK K307CisKK3N0cnVjdCBmdGRpX3NwaSB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsK KwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXIgKm1h c3RlcjsKKwljb25zdCBzdHJ1Y3QgZnQyMzJoX2ludGZfb3BzICppb3BzOworCXN0cnVjdCBncGlv ZF9sb29rdXBfdGFibGUgKmxvb2t1cFtGVERJX01QU1NFX0dQSU9TXTsKKwlzdHJ1Y3QgZ3Bpb19k ZXNjICoqY3NfZ3Bpb3M7CisKKwl1OCB0eHJ4X2NtZDsKKwl1OCByeF9jbWQ7CisJdTggdHhfY21k OworCXU4IHhmZXJfYnVmW1NaXzY0S107CisJdTE2IGxhc3RfbW9kZTsKK307CisKK3N0YXRpYyB2 b2lkIGZ0ZGlfc3BpX3NldF9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIGVuYWJsZSkK K3sKKwlzdHJ1Y3QgZnRkaV9zcGkgKnByaXYgPSBzcGlfY29udHJvbGxlcl9nZXRfZGV2ZGF0YShz cGktPm1hc3Rlcik7CisJdTE2IGNzID0gc3BpLT5jaGlwX3NlbGVjdDsKKworCWRldl9kYmcoJnBy aXYtPnBkZXYtPmRldiwgIiVzOiBDUyAldSwgY3MgbW9kZSAlZCwgdmFsICVkXG4iLAorCQlfX2Z1 bmNfXywgY3MsIChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCksIGVuYWJsZSk7CisKKwlncGlvZF9z ZXRfcmF3X3ZhbHVlX2NhbnNsZWVwKHByaXYtPmNzX2dwaW9zW2NzXSwgZW5hYmxlKTsKK30KKwor c3RhdGljIGlubGluZSB1OCBmdGRpX3NwaV90eHJ4X2J5dGVfY21kKHN0cnVjdCBzcGlfZGV2aWNl ICpzcGkpCit7CisJdTggbW9kZSA9IHNwaS0+bW9kZSAmIChTUElfQ1BPTCB8IFNQSV9DUEhBKTsK Kwl1OCBjbWQ7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkgeworCQlzd2l0Y2gg KG1vZGUpIHsKKwkJY2FzZSBTUElfTU9ERV8wOgorCQljYXNlIFNQSV9NT0RFXzE6CisJCQljbWQg PSBUWEZfUlhSX0JZVEVTX0xTQjsKKwkJCWJyZWFrOworCQljYXNlIFNQSV9NT0RFXzI6CisJCWNh c2UgU1BJX01PREVfMzoKKwkJCWNtZCA9IFRYUl9SWEZfQllURVNfTFNCOworCQkJYnJlYWs7CisJ CX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBTUElfTU9ERV8wOgorCQlj YXNlIFNQSV9NT0RFXzE6CisJCQljbWQgPSBUWEZfUlhSX0JZVEVTX01TQjsKKwkJCWJyZWFrOwor CQljYXNlIFNQSV9NT0RFXzI6CisJCWNhc2UgU1BJX01PREVfMzoKKwkJCWNtZCA9IFRYUl9SWEZf QllURVNfTVNCOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGNtZDsKK30KKworc3RhdGlj IGlubGluZSBpbnQgZnRkaV9zcGlfbG9vcGJhY2tfY2ZnKHN0cnVjdCBmdGRpX3NwaSAqcHJpdiwg aW50IG9uKQoreworCWludCByZXQ7CisKKwlwcml2LT54ZmVyX2J1ZlswXSA9IG9uID8gTE9PUEJB Q0tfT04gOiBMT09QQkFDS19PRkY7CisKKwlyZXQgPSBwcml2LT5pb3BzLT53cml0ZV9kYXRhKHBy aXYtPmludGYsIHByaXYtPnhmZXJfYnVmLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X3dhcm4o JnByaXYtPnBkZXYtPmRldiwgImxvb3BiYWNrICVkIGZhaWxlZFxuIiwgb24pOworCXJldHVybiBy ZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnRkaV9zcGlfdHhfcngoc3RydWN0IGZ0ZGlfc3BpICpwcml2 LCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQor eworCWNvbnN0IHN0cnVjdCBmdDIzMmhfaW50Zl9vcHMgKm9wcyA9IHByaXYtPmlvcHM7CisJc3Ry dWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBkZXYtPmRldjsKKwl2b2lkICpyeF9vZmZzOworCWNv bnN0IHZvaWQgKnR4X29mZnM7CisJc2l6ZV90IHJlbWFpbmluZywgc3RyaWRlOworCXNpemVfdCBy eF9zdHJpZGU7CisJaW50IHJldCwgdG91dCA9IDEwOworCWNvbnN0IHU4ICp0eF9kYXRhID0gdC0+ dHhfYnVmOworCXU4ICpyeF9kYXRhID0gdC0+cnhfYnVmOworCisJb3BzLT5sb2NrKHByaXYtPmlu dGYpOworCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9MT09QKSB7CisJCXJldCA9IGZ0ZGlfc3BpX2xv b3BiYWNrX2NmZyhwcml2LCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsKKwl9CisK KwlyZW1haW5pbmcgPSB0LT5sZW47CisJcnhfb2ZmcyA9IHJ4X2RhdGE7CisJdHhfb2ZmcyA9IHR4 X2RhdGE7CisKKwl3aGlsZSAocmVtYWluaW5nKSB7CisJCXN0cmlkZSA9IG1pbl90KHNpemVfdCwg cmVtYWluaW5nLCBTWl81MTIgLSAzKTsKKworCQlwcml2LT54ZmVyX2J1ZlswXSA9IHByaXYtPnR4 cnhfY21kOworCQlwcml2LT54ZmVyX2J1ZlsxXSA9IHN0cmlkZSAtIDE7CisJCXByaXYtPnhmZXJf YnVmWzJdID0gKHN0cmlkZSAtIDEpID4+IDg7CisJCW1lbWNweSgmcHJpdi0+eGZlcl9idWZbM10s IHR4X29mZnMsIHN0cmlkZSk7CisJCXByaW50X2hleF9kdW1wX2RlYnVnKCJXUjogIiwgRFVNUF9Q UkVGSVhfT0ZGU0VULCAxNiwgMSwKKwkJCQkgICAgIHByaXYtPnhmZXJfYnVmLCBzdHJpZGUgKyAz LCAxKTsKKworCQlyZXQgPSBvcHMtPndyaXRlX2RhdGEocHJpdi0+aW50ZiwgcHJpdi0+eGZlcl9i dWYsIHN0cmlkZSArIDMpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICIlczog eGZlciBmYWlsZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJZ290byBmYWlsOworCQl9CisJ CWRldl9kYmcoZGV2LCAiJXM6IFdSICV6dSBieXRlKHMpLCBUWFJYIENNRCAweCUwMnhcbiIsCisJ CQlfX2Z1bmNfXywgc3RyaWRlLCBwcml2LT50eHJ4X2NtZCk7CisKKwkJcnhfc3RyaWRlID0gbWlu X3Qoc2l6ZV90LCBzdHJpZGUsIFNaXzUxMik7CisKKwkJcmV0ID0gb3BzLT5yZWFkX2RhdGEocHJp di0+aW50ZiwgcHJpdi0+eGZlcl9idWYsIHJ4X3N0cmlkZSk7CisJCXdoaWxlIChyZXQgPT0gMCkg eworCQkJLyogSWYgbm8gZGF0YSB5ZXQsIHdhaXQgYW5kIHJlcGVhdCAqLworCQkJdXNsZWVwX3Jh bmdlKDUwMDAsIDUxMDApOworCQkJcmV0ID0gb3BzLT5yZWFkX2RhdGEocHJpdi0+aW50ZiwgcHJp di0+eGZlcl9idWYsCisJCQkJCSAgICAgcnhfc3RyaWRlKTsKKwkJCWRldl9kYmcoZGV2LCAiV2Fp dGluZyBkYXRhIHJlYWR5LCByZWFkOiAlZFxuIiwgcmV0KTsKKwkJCWlmICghLS10b3V0KSB7CisJ CQkJZGV2X2VycihkZXYsICJSZWFkIHRpbWVvdXRcbiIpOworCQkJCXJldCA9IC1FVElNRURPVVQ7 CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9CisKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZh aWw7CisKKwkJcHJpbnRfaGV4X2R1bXBfZGVidWcoIlJEOiAiLCBEVU1QX1BSRUZJWF9PRkZTRVQs IDE2LCAxLAorCQkJCSAgICAgcHJpdi0+eGZlcl9idWYsIHJ4X3N0cmlkZSwgMSk7CisJCW1lbWNw eShyeF9vZmZzLCBwcml2LT54ZmVyX2J1ZiwgcmV0KTsKKwkJcnhfb2ZmcyArPSByZXQ7CisKKwkJ cmVtYWluaW5nIC09IHN0cmlkZTsKKwkJdHhfb2ZmcyArPSBzdHJpZGU7CisJCWRldl9kYmcoZGV2 LCAiJXM6IFdSIHJlbWFpbnMgJXp1XG4iLCBfX2Z1bmNfXywgcmVtYWluaW5nKTsKKwl9CisKKwly ZXQgPSAwOworCitmYWlsOgorCWlmIChzcGktPm1vZGUgJiBTUElfTE9PUCkKKwkJZnRkaV9zcGlf bG9vcGJhY2tfY2ZnKHByaXYsIDApOworCitlcnI6CisJb3BzLT51bmxvY2socHJpdi0+aW50Zik7 CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdGRpX3NwaV9wdXNoX2J1ZihzdHJ1Y3Qg ZnRkaV9zcGkgKnByaXYsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3Qg Ynl0ZXNsZWZ0ID0gbGVuOworCWludCByZXQ7CisKKwlkbyB7CisJCXJldCA9IHByaXYtPmlvcHMt PndyaXRlX2RhdGEocHJpdi0+aW50ZiwgYnVmLCBieXRlc2xlZnQpOworCQlpZiAocmV0IDwgMCkK KwkJCXJldHVybiByZXQ7CisKKwkJYnVmICs9IHJldDsKKwkJYnl0ZXNsZWZ0IC09IHJldDsKKwl9 IHdoaWxlIChieXRlc2xlZnQpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBmdGRp X3NwaV90eChzdHJ1Y3QgZnRkaV9zcGkgKnByaXYsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIp Cit7CisJY29uc3Qgdm9pZCAqdHhfb2ZmczsKKwlzaXplX3QgcmVtYWluaW5nLCBzdHJpZGU7CisJ aW50IHJldDsKKworCXByaXYtPmlvcHMtPmxvY2socHJpdi0+aW50Zik7CisKKwl0eF9vZmZzID0g eGZlci0+dHhfYnVmOworCXJlbWFpbmluZyA9IHhmZXItPmxlbjsKKworCWRvIHsKKwkJc3RyaWRl ID0gbWluX3Qoc2l6ZV90LCByZW1haW5pbmcsIHNpemVvZihwcml2LT54ZmVyX2J1ZikgLSAzKTsK KworCQlwcml2LT54ZmVyX2J1ZlswXSA9IHByaXYtPnR4X2NtZDsKKwkJcHJpdi0+eGZlcl9idWZb MV0gPSBzdHJpZGUgLSAxOworCQlwcml2LT54ZmVyX2J1ZlsyXSA9IChzdHJpZGUgLSAxKSA+PiA4 OworCisJCW1lbWNweSgmcHJpdi0+eGZlcl9idWZbM10sIHR4X29mZnMsIHN0cmlkZSk7CisKKwkJ cmV0ID0gZnRkaV9zcGlfcHVzaF9idWYocHJpdiwgcHJpdi0+eGZlcl9idWYsIHN0cmlkZSArIDMp OworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LCAiJXM6IHR4 IGZhaWxlZCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJ CWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwgIiVzOiAlenUgYnl0ZShzKSBkb25lXG4iLAorCQkJ X19mdW5jX18sIHN0cmlkZSk7CisJCXJlbWFpbmluZyAtPSBzdHJpZGU7CisJCXR4X29mZnMgKz0g c3RyaWRlOworCX0gd2hpbGUgKHJlbWFpbmluZyk7CisKKwlyZXQgPSAwOworZXJyOgorCXByaXYt PmlvcHMtPnVubG9jayhwcml2LT5pbnRmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50 IGZ0ZGlfc3BpX3J4KHN0cnVjdCBmdGRpX3NwaSAqcHJpdiwgc3RydWN0IHNwaV90cmFuc2ZlciAq eGZlcikKK3sKKwljb25zdCBzdHJ1Y3QgZnQyMzJoX2ludGZfb3BzICpvcHMgPSBwcml2LT5pb3Bz OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT5wZGV2LT5kZXY7CisJc2l6ZV90IHJlbWFp bmluZywgc3RyaWRlOworCWludCByZXQsIHRvdXQgPSAxMDsKKwl2b2lkICpyeF9vZmZzOworCisJ ZGV2X2RiZyhkZXYsICIlczogQ01EIDB4JTAyeCwgbGVuICV1XG4iLAorCQlfX2Z1bmNfXywgcHJp di0+cnhfY21kLCB4ZmVyLT5sZW4pOworCisJcHJpdi0+eGZlcl9idWZbMF0gPSBwcml2LT5yeF9j bWQ7CisJcHJpdi0+eGZlcl9idWZbMV0gPSB4ZmVyLT5sZW4gLSAxOworCXByaXYtPnhmZXJfYnVm WzJdID0gKHhmZXItPmxlbiAtIDEpID4+IDg7CisKKwlvcHMtPmxvY2socHJpdi0+aW50Zik7CisK KwlyZXQgPSBvcHMtPndyaXRlX2RhdGEocHJpdi0+aW50ZiwgcHJpdi0+eGZlcl9idWYsIDMpOwor CWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXJlbWFpbmluZyA9IHhmZXItPmxlbjsKKwly eF9vZmZzID0geGZlci0+cnhfYnVmOworCisJZG8geworCQlzdHJpZGUgPSBtaW5fdChzaXplX3Qs IHJlbWFpbmluZywgU1pfNTEyKTsKKworCQlyZXQgPSBvcHMtPnJlYWRfZGF0YShwcml2LT5pbnRm LCBwcml2LT54ZmVyX2J1Ziwgc3RyaWRlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsK KworCQlpZiAoIXJldCkgeworCQkJZGV2X2RiZyhkZXYsICJXYWl0aW5nIGZvciBkYXRhIChyZWFk OiAlMDJYKSwgdG91dCAlZFxuIiwKKwkJCQlyZXQsIHRvdXQpOworCQkJaWYgKC0tdG91dCkKKwkJ CQljb250aW51ZTsKKworCQkJZGV2X2RiZyhkZXYsICJyZWFkIHRpbWVvdXQuLi5cbiIpOworCQkJ cmV0ID0gLUVUSU1FRE9VVDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJbWVtY3B5KHJ4X29mZnMs IHByaXYtPnhmZXJfYnVmLCByZXQpOworCisJCWRldl9kYmcoZGV2LCAiJXM6ICVkIGJ5dGUocylc biIsIF9fZnVuY19fLCByZXQpOworCQlyeF9vZmZzICs9IHJldDsKKwkJcmVtYWluaW5nIC09IHJl dDsKKwl9IHdoaWxlIChyZW1haW5pbmcpOworCisJcmV0ID0gMDsKK2VycjoKKwlvcHMtPnVubG9j ayhwcml2LT5pbnRmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZ0ZGlfc3BpX3Ry YW5zZmVyX29uZShzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXIgKmN0bHIsCisJCQkJIHN0cnVjdCBzcGlf ZGV2aWNlICpzcGksCisJCQkJIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0 IGZ0ZGlfc3BpICpwcml2ID0gc3BpX2NvbnRyb2xsZXJfZ2V0X2RldmRhdGEoY3Rscik7CisJc3Ry dWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBkZXYtPmRldjsKKwlpbnQgcmV0ID0gMDsKKworCWlm ICgheGZlci0+bGVuKQorCQlyZXR1cm4gMDsKKworCWlmIChwcml2LT5sYXN0X21vZGUgIT0gc3Bp LT5tb2RlKSB7CisJCXU4IHNwaV9tb2RlID0gc3BpLT5tb2RlICYgKFNQSV9DUE9MIHwgU1BJX0NQ SEEpOworCQl1OCBwaW5zID0gMDsKKworCQlkZXZfZGJnKGRldiwgIiVzOiBNT0RFIDB4JXhcbiIs IF9fZnVuY19fLCBzcGktPm1vZGUpOworCisJCWlmIChzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNU KSB7CisJCQlzd2l0Y2ggKHNwaV9tb2RlKSB7CisJCQljYXNlIFNQSV9NT0RFXzA6CisJCQljYXNl IFNQSV9NT0RFXzM6CisJCQkJcHJpdi0+dHhfY21kID0gVFhfQllURVNfRkVfTFNCOworCQkJCXBy aXYtPnJ4X2NtZCA9IFJYX0JZVEVTX1JFX0xTQjsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1BJX01P REVfMToKKwkJCWNhc2UgU1BJX01PREVfMjoKKwkJCQlwcml2LT50eF9jbWQgPSBUWF9CWVRFU19S RV9MU0I7CisJCQkJcHJpdi0+cnhfY21kID0gUlhfQllURVNfRkVfTFNCOworCQkJCWJyZWFrOwor CQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChzcGlfbW9kZSkgeworCQkJY2FzZSBTUElfTU9E RV8wOgorCQkJY2FzZSBTUElfTU9ERV8zOgorCQkJCXByaXYtPnR4X2NtZCA9IFRYX0JZVEVTX0ZF X01TQjsKKwkJCQlwcml2LT5yeF9jbWQgPSBSWF9CWVRFU19SRV9NU0I7CisJCQkJYnJlYWs7CisJ CQljYXNlIFNQSV9NT0RFXzE6CisJCQljYXNlIFNQSV9NT0RFXzI6CisJCQkJcHJpdi0+dHhfY21k ID0gVFhfQllURVNfUkVfTVNCOworCQkJCXByaXYtPnJ4X2NtZCA9IFJYX0JZVEVTX0ZFX01TQjsK KwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXByaXYtPnR4cnhfY21kID0gZnRkaV9zcGlfdHhy eF9ieXRlX2NtZChzcGkpOworCisJCXN3aXRjaCAoc3BpX21vZGUpIHsKKwkJY2FzZSBTUElfTU9E RV8yOgorCQljYXNlIFNQSV9NT0RFXzM6CisJCQlwaW5zIHw9IE1QU1NFX1NLOworCQkJYnJlYWs7 CisJCX0KKworCQlyZXQgPSBwcml2LT5pb3BzLT5jZmdfYnVzX3BpbnMocHJpdi0+aW50ZiwKKwkJ CQkJICAgICAgIE1QU1NFX1NLIHwgTVBTU0VfRE8sIHBpbnMpOworCQlpZiAocmV0IDwgMCkgewor CQkJZGV2X2VycihkZXYsICJJTyBjZmcgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiBy ZXQ7CisJCX0KKwkJcHJpdi0+bGFzdF9tb2RlID0gc3BpLT5tb2RlOworCX0KKworCWRldl9kYmco ZGV2LCAiJXM6IG1vZGUgMHgleCwgQ01EIFJYL1RYIDB4JXgvMHgleFxuIiwKKwkJX19mdW5jX18s IHNwaS0+bW9kZSwgcHJpdi0+cnhfY21kLCBwcml2LT50eF9jbWQpOworCisJaWYgKHhmZXItPnR4 X2J1ZiAmJiB4ZmVyLT5yeF9idWYpCisJCXJldCA9IGZ0ZGlfc3BpX3R4X3J4KHByaXYsIHNwaSwg eGZlcik7CisJZWxzZSBpZiAoeGZlci0+dHhfYnVmKQorCQlyZXQgPSBmdGRpX3NwaV90eChwcml2 LCB4ZmVyKTsKKwllbHNlIGlmICh4ZmVyLT5yeF9idWYpCisJCXJldCA9IGZ0ZGlfc3BpX3J4KHBy aXYsIHhmZXIpOworCisJZGV2X2RiZyhkZXYsICIlczogeGZlciByZXQgJWRcbiIsIF9fZnVuY19f LCByZXQpOworCisJc3BpX2ZpbmFsaXplX2N1cnJlbnRfdHJhbnNmZXIoY3Rscik7CisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGludCBmdGRpX21wc3NlX2luaXQoc3RydWN0IGZ0ZGlfc3BpICpw cml2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBwcml2LT5wZGV2OworCWlu dCByZXQ7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJNUFNTRSBpbml0XG4iKTsKKworCS8qIFNl dHVwIGFuZCBzZW5kIG9mZiB0aGUgSGktU3BlZWQgc3BlY2lmaWMgY29tbWFuZHMgZm9yIHRoZSBG VHgyMzJIICovCisJcHJpdi0+eGZlcl9idWZbMF0gPSBESVNfRElWXzU7ICAgICAgLyogVXNlIDYw TUh6IG1hc3RlciBjbG9jayAqLworCXByaXYtPnhmZXJfYnVmWzFdID0gRElTX0FEQVBUSVZFOyAg IC8qIFR1cm4gb2ZmIGFkYXB0aXZlIGNsb2NraW5nICovCisJcHJpdi0+eGZlcl9idWZbMl0gPSBE SVNfM19QSEFTRTsgICAgLyogRGlzYWJsZSB0aHJlZS1waGFzZSBjbG9ja2luZyAqLworCisJcHJp di0+aW9wcy0+bG9jayhwcml2LT5pbnRmKTsKKworCXJldCA9IHByaXYtPmlvcHMtPndyaXRlX2Rh dGEocHJpdi0+aW50ZiwgcHJpdi0+eGZlcl9idWYsIDMpOworCWlmIChyZXQgPCAwKSB7CisJCWRl dl9lcnIoJnBkZXYtPmRldiwgIkNsayBjZmcgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcHJpdi0+ aW9wcy0+dW5sb2NrKHByaXYtPmludGYpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaXYtPnhm ZXJfYnVmWzBdID0gVENLX0RJVklTT1I7CisJcHJpdi0+eGZlcl9idWZbMV0gPSBkaXZfdmFsdWUo NjAwMDAwMDApOworCXByaXYtPnhmZXJfYnVmWzJdID0gZGl2X3ZhbHVlKDYwMDAwMDAwKSA+PiA4 OworCWRldl9kYmcoJnBkZXYtPmRldiwgIlRDS19ESVZJU09SOiAweCUwNHggMHglMDR4XG4iLAor CQlwcml2LT54ZmVyX2J1ZlsxXSwgcHJpdi0+eGZlcl9idWZbMl0pOworCisJcmV0ID0gcHJpdi0+ aW9wcy0+d3JpdGVfZGF0YShwcml2LT5pbnRmLCBwcml2LT54ZmVyX2J1ZiwgMyk7CisJaWYgKHJl dCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2xrIGNmZyBmYWlsZWQ6ICVkXG4iLCBy ZXQpOworCQlwcml2LT5pb3BzLT51bmxvY2socHJpdi0+aW50Zik7CisJCXJldHVybiByZXQ7CisJ fQorCisJcHJpdi0+aW9wcy0+dW5sb2NrKHByaXYtPmludGYpOworCisJcmV0ID0gcHJpdi0+aW9w cy0+Y2ZnX2J1c19waW5zKHByaXYtPmludGYsIE1QU1NFX1NLIHwgTVBTU0VfRE8sIDApOworCWlm IChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGluaXQgU1BJIGJ1cyBw aW5zOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBmdGRpX3NwaV9pbml0X2lvKHN0cnVjdCBzcGlfY29udHJvbGxlciAqbWFzdGVy LCB1bnNpZ25lZCBpbnQgZGV2X2lkeCkKK3sKKwlzdHJ1Y3QgZnRkaV9zcGkgKnByaXYgPSBzcGlf Y29udHJvbGxlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXYgPSBwcml2LT5wZGV2OworCWNvbnN0IHN0cnVjdCBtcHNzZV9zcGlfcGxhdGZvcm1fZGF0 YSAqcGQ7CisJY29uc3Qgc3RydWN0IG1wc3NlX3NwaV9kZXZfZGF0YSAqZGF0YTsKKwlzdHJ1Y3Qg Z3Bpb2RfbG9va3VwX3RhYmxlICpsb29rdXA7CisJc2l6ZV90IGxvb2t1cF9zaXplLCBzaXplOwor CWNoYXIgKmxhYmVsOworCXVuc2lnbmVkIGludCBpOworCXUxNiBjczsKKworCXBkID0gcGRldi0+ ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlkYXRhID0gcGQtPnNwaV9pbmZvW2Rldl9pZHhdLnBsYXRm b3JtX2RhdGE7CisJaWYgKCFkYXRhIHx8IGRhdGEtPm1hZ2ljICE9IEZURElfTVBTU0VfSU9fREVT Q19NQUdJQykKKwkJcmV0dXJuIDA7CisKKwlzaXplID0gZGF0YS0+ZGVzY19sZW4gKyAxOworCisJ bG9va3VwX3NpemUgPSBzaXplb2YoKmxvb2t1cCkgKyBzaXplICogc2l6ZW9mKHN0cnVjdCBncGlv ZF9sb29rdXApOworCWxvb2t1cCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBsb29rdXBfc2l6 ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb29rdXApCisJCXJldHVybiAtRU5PTUVNOworCisJY3Mg PSBwZC0+c3BpX2luZm9bZGV2X2lkeF0uY2hpcF9zZWxlY3Q7CisKKwlsb29rdXAtPmRldl9pZCA9 IGRldm1fa2FzcHJpbnRmKCZwZGV2LT5kZXYsIEdGUF9LRVJORUwsICJzcGklZC4lZCIsCisJCQkJ CW1hc3Rlci0+YnVzX251bSwgY3MpOworCWlmICghbG9va3VwLT5kZXZfaWQpIHsKKwkJZGV2bV9r ZnJlZSgmcGRldi0+ZGV2LCBsb29rdXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGV2X2Ri ZygmcGRldi0+ZGV2LCAiTE9PS1VQIElEICclcydcbiIsIGxvb2t1cC0+ZGV2X2lkKTsKKworCWxh YmVsID0gZGV2bV9rYXNwcmludGYoJnBkZXYtPmRldiwgR0ZQX0tFUk5FTCwgImZ0ZGktbXBzc2Ut Z3Bpby4lZCIsCisJCQkgICAgICAgcGRldi0+aWQpOworCWlmICghbGFiZWwpIHsKKwkJZGV2bV9r ZnJlZSgmcGRldi0+ZGV2LCAodm9pZCAqKWxvb2t1cC0+ZGV2X2lkKTsKKwkJZGV2bV9rZnJlZSgm cGRldi0+ZGV2LCBsb29rdXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAw OyBpIDwgZGF0YS0+ZGVzY19sZW47IGkrKykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjb25f aWQ6ICclcycgaWR4OiAlZCwgZmxhZ3M6IDB4JXhcbiIsCisJCQlkYXRhLT5kZXNjW2ldLmNvbl9p ZCwgZGF0YS0+ZGVzY1tpXS5pZHgsCisJCQlkYXRhLT5kZXNjW2ldLmZsYWdzKTsKKwkJbG9va3Vw LT50YWJsZVtpXS5jaGlwX2xhYmVsID0gbGFiZWw7CisJCWxvb2t1cC0+dGFibGVbaV0uY2hpcF9o d251bSA9IGRhdGEtPmRlc2NbaV0uaWR4OworCQlsb29rdXAtPnRhYmxlW2ldLmlkeCA9IDA7CisJ CWxvb2t1cC0+dGFibGVbaV0uY29uX2lkID0gZGF0YS0+ZGVzY1tpXS5jb25faWQ7CisJCWxvb2t1 cC0+dGFibGVbaV0uZmxhZ3MgPSBkYXRhLT5kZXNjW2ldLmZsYWdzOworCX0KKworCXByaXYtPmxv b2t1cFtjc10gPSBsb29rdXA7CisJZ3Bpb2RfYWRkX2xvb2t1cF90YWJsZShsb29rdXApOworCXJl dHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0ZGlfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IG1wc3NlX3NwaV9wbGF0Zm9ybV9kYXRhICpw ZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzcGlfY29udHJv bGxlciAqbWFzdGVyOworCXN0cnVjdCBmdGRpX3NwaSAqcHJpdjsKKwlzdHJ1Y3QgZ3Bpb19kZXNj ICpkZXNjOworCXUxNiBudW1fY3MsIG1heF9jcyA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJaW50 IHJldDsKKworCXBkID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCWlmICghcGQpIHsKKwkJZGV2X2Vy cihkZXYsICJNaXNzaW5nIHBsYXRmb3JtIGRhdGEuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJaWYgKCFwZC0+b3BzIHx8CisJICAgICFwZC0+b3BzLT5yZWFkX2RhdGEgfHwgIXBkLT5v cHMtPndyaXRlX2RhdGEgfHwKKwkgICAgIXBkLT5vcHMtPmxvY2sgfHwgIXBkLT5vcHMtPnVubG9j ayB8fAorCSAgICAhcGQtPm9wcy0+c2V0X2JpdG1vZGUgfHwgIXBkLT5vcHMtPnNldF9iYXVkcmF0 ZSB8fAorCSAgICAhcGQtPm9wcy0+ZGlzYWJsZV9iaXRiYW5nIHx8ICFwZC0+b3BzLT5jZmdfYnVz X3BpbnMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBkLT5zcGlfaW5mb19sZW4gPiBGVERJ X01QU1NFX0dQSU9TKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZpbmQgbWF4LiBzbGF2ZSBj aGlwc2VsZWN0IG51bWJlciAqLworCW51bV9jcyA9IHBkLT5zcGlfaW5mb19sZW47CisJZm9yIChp ID0gMDsgaSA8IG51bV9jczsgaSsrKSB7CisJCWlmIChtYXhfY3MgPCBwZC0+c3BpX2luZm9baV0u Y2hpcF9zZWxlY3QpCisJCQltYXhfY3MgPSBwZC0+c3BpX2luZm9baV0uY2hpcF9zZWxlY3Q7CisJ fQorCisJaWYgKG1heF9jcyA+IEZURElfTVBTU0VfR1BJT1MgLSAxKSB7CisJCWRldl9lcnIoZGV2 LCAiSW52YWxpZCBtYXggQ1MgaW4gcGxhdGZvcm0gZGF0YTogJXVcbiIsIG1heF9jcyk7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKwlkZXZfZGJnKGRldiwgIkNTIGNvdW50ICV1LCBtYXggQ1MgJXVc biIsIG51bV9jcywgbWF4X2NzKTsKKwltYXhfY3MgKz0gMTsgLyogaW5jbHVkaW5nIENTMCAqLwor CisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YoKnByaXYpKTsK KwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0 YShwZGV2LCBtYXN0ZXIpOworCisJcHJpdiA9IHNwaV9jb250cm9sbGVyX2dldF9kZXZkYXRhKG1h c3Rlcik7CisJcHJpdi0+bWFzdGVyID0gbWFzdGVyOworCXByaXYtPnBkZXYgPSBwZGV2OworCXBy aXYtPmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldi0+cGFyZW50KTsKKwlwcml2LT5pb3BzID0g cGQtPm9wczsKKworCW1hc3Rlci0+YnVzX251bSA9IC0xOworCW1hc3Rlci0+bW9kZV9iaXRzID0g U1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9MT09QIHwKKwkJCSAgICBTUElfQ1NfSElHSCB8IFNQ SV9MU0JfRklSU1Q7CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IG1heF9jczsKKwltYXN0ZXIt Pm1pbl9zcGVlZF9oeiA9IDQ1MDsKKwltYXN0ZXItPm1heF9zcGVlZF9oeiA9IDMwMDAwMDAwOwor CW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOworCW1hc3Rlci0+ c2V0X2NzID0gZnRkaV9zcGlfc2V0X2NzOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gZnRkaV9z cGlfdHJhbnNmZXJfb25lOworCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gZmFsc2U7CisKKwlw cml2LT5jc19ncGlvcyA9IGRldm1fa2NhbGxvYygmbWFzdGVyLT5kZXYsIG1heF9jcywgc2l6ZW9m KGRlc2MpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+Y3NfZ3Bpb3MpIHsK KwkJc3BpX2NvbnRyb2xsZXJfcHV0KG1hc3Rlcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwor CWZvciAoaSA9IDA7IGkgPCBudW1fY3M7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaWR4ID0gcGQt PnNwaV9pbmZvW2ldLmNoaXBfc2VsZWN0OworCisJCWRldl9kYmcoJnBkZXYtPmRldiwgIkNTIG51 bTogJXVcbiIsIGlkeCk7CisJCWRlc2MgPSBkZXZtX2dwaW9kX2dldF9pbmRleCgmcHJpdi0+cGRl di0+ZGV2LCAic3BpLWNzIiwKKwkJCQkJICAgIGksIEdQSU9EX09VVF9MT1cpOworCQlpZiAoSVNf RVJSKGRlc2MpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGRlc2MpOworCQkJZGV2X2VycigmcGRldi0+ ZGV2LCAiQ1MgJXUgZ3Bpb2QgZXJyOiAlZFxuIiwgaSwgcmV0KTsKKwkJCWNvbnRpbnVlOworCQl9 CisJCXByaXYtPmNzX2dwaW9zW2lkeF0gPSBkZXNjOworCX0KKworCXJldCA9IHNwaV9yZWdpc3Rl cl9jb250cm9sbGVyKG1hc3Rlcik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHNwaSBtYXN0ZXJcbiIpOworCQlzcGlfY29udHJvbGxl cl9wdXQobWFzdGVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBwcml2LT5pb3BzLT5z ZXRfYml0bW9kZShwcml2LT5pbnRmLCAweDAwLCBCSVRNT0RFX01QU1NFKTsKKwlpZiAocmV0IDwg MCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0IE1QU1NFIG1vZGVcbiIp OworCQlnb3RvIGVycjsKKwl9CisKKwlwcml2LT5sYXN0X21vZGUgPSAweGZmZmY7CisKKwlyZXQg PSBmdGRpX21wc3NlX2luaXQocHJpdik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRl di0+ZGV2LCAiTVBTU0UgaW5pdCBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlmb3Ig KGkgPSAwOyBpIDwgcGQtPnNwaV9pbmZvX2xlbjsgaSsrKSB7CisJCXN0cnVjdCBzcGlfZGV2aWNl ICpzZGV2OworCQl1MTYgY3M7CisKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAic2xhdmU6ICclcycs IENTOiAldVxuIiwKKwkJCXBkLT5zcGlfaW5mb1tpXS5tb2RhbGlhcywgcGQtPnNwaV9pbmZvW2ld LmNoaXBfc2VsZWN0KTsKKworCQlyZXQgPSBmdGRpX3NwaV9pbml0X2lvKG1hc3RlciwgaSk7CisJ CWlmIChyZXQgPCAwKSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWRkIHNsYXZl IElPOiAlZFxuIiwgcmV0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNkZXYgPSBzcGlfbmV3X2Rl dmljZShtYXN0ZXIsICZwZC0+c3BpX2luZm9baV0pOworCQlpZiAoIXNkZXYpIHsKKwkJCWNzID0g cGQtPnNwaV9pbmZvW2ldLmNoaXBfc2VsZWN0OworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkNh bid0IGFkZCBzbGF2ZSAnJXMnLCBDUyAldVxuIiwKKwkJCQkgcGQtPnNwaV9pbmZvW2ldLm1vZGFs aWFzLCBjcyk7CisJCQlpZiAocHJpdi0+bG9va3VwW2NzXSkgeworCQkJCWdwaW9kX3JlbW92ZV9s b29rdXBfdGFibGUocHJpdi0+bG9va3VwW2NzXSk7CisJCQkJcHJpdi0+bG9va3VwW2NzXSA9IE5V TEw7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBOVUxMKTsKKwlzcGlfdW5yZWdpc3Rlcl9jb250cm9sbGVyKG1hc3Rlcik7CisJ cmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdGRpX3NwaV9zbGF2ZV9yZWxlYXNlKHN0cnVj dCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0g dG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCBmdGRpX3NwaSAqcHJpdiA9IGRhdGE7CisJdTE2 IGNzID0gc3BpLT5jaGlwX3NlbGVjdDsKKworCWRldl9kYmcoZGV2LCAiJXM6IHJlbW92ZSBDUyAl dVxuIiwgX19mdW5jX18sIGNzKTsKKwlzcGlfdW5yZWdpc3Rlcl9kZXZpY2UodG9fc3BpX2Rldmlj ZShkZXYpKTsKKworCWlmIChwcml2LT5sb29rdXBbY3NdKQorCQlncGlvZF9yZW1vdmVfbG9va3Vw X3RhYmxlKHByaXYtPmxvb2t1cFtjc10pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0 ZGlfc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBz cGlfY29udHJvbGxlciAqbWFzdGVyOworCXN0cnVjdCBmdGRpX3NwaSAqcHJpdjsKKworCW1hc3Rl ciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXByaXYgPSBzcGlfY29udHJvbGxlcl9n ZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZtYXN0ZXItPmRl diwgcHJpdiwgZnRkaV9zcGlfc2xhdmVfcmVsZWFzZSk7CisKKwlzcGlfdW5yZWdpc3Rlcl9jb250 cm9sbGVyKG1hc3Rlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1f ZHJpdmVyIGZ0ZGlfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyLm5hbWUJPSAiZnRkaS1tcHNzZS1z cGkiLAorCS5wcm9iZQkJPSBmdGRpX3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IGZ0ZGlfc3BpX3Jl bW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGZ0ZGlfc3BpX2RyaXZlcik7CisKK01P RFVMRV9BTElBUygicGxhdGZvcm06ZnRkaS1tcHNzZS1zcGkiKTsKK01PRFVMRV9BVVRIT1IoIkFu YXRvbGlqIEd1c3RzY2hpbiA8YWd1c3RAZGVueC5kZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJG VERJIE1QU1NFIFNQSSBtYXN0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7 Cg==