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: [v5,2/2] usb: typec: ucsi: add firmware flashing support From: Ajay Gupta Message-Id: <20190207191813.8330-3-ajayg@nvidia.com> Date: Thu, 7 Feb 2019 11:18:13 -0800 To: heikki.krogerus@linux.intel.com Cc: linux-usb@vger.kernel.org, Ajay Gupta List-ID: RnJvbTogQWpheSBHdXB0YSA8YWpheWdAbnZpZGlhLmNvbT4KCkNDR3ggaGFzIHR3byBjb3BpZXMg b2YgdGhlIGZpcm13YXJlIGluIGFkZGl0aW9uIHRvIHRoZSBib290bG9hZGVyLgpJZiB0aGUgZGV2 aWNlIGlzIHJ1bm5pbmcgRlcxLCBGVzIgY2FuIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IHZlcnNp b24uCkR1YWwgZmlybXdhcmUgbW9kZSBhbGxvd3MgdGhlIENDRyBkZXZpY2UgdG8gc3RheSBpbiBh IFBEIGNvbnRyYWN0IGFuZApzdXBwb3J0IFVTQiBQRCBhbmQgVHlwZS1DIGZ1bmN0aW9uYWxpdHkg d2hpbGUgYSBmaXJtd2FyZSB1cGRhdGUgaXMgaW4KcHJvZ3Jlc3MuCgpGaXJzdCB3ZSByZWFkIHRo ZSBjdXJyZW50bHkgZmxhc2hlZCBmaXJtd2FyZSB2ZXJzaW9uIG9mIGJvdGgKcHJpbWFyeSBhbmQg c2Vjb25kYXJ5IGZpcm13YXJlIGFuZCB0aGVuIGNvbXBhcmUgaXQgd2l0aAp2ZXJzaW9uIG9mIGZp cm13YXJlIGZpbGUgdG8gZGV0ZXJtaW5lIGlmIGZsYXNoaW5nIGlzIHJlcXVpcmVkLgoKQ29tbWFu ZCBmcmFtZXdvcmsgaXMgYWRkZWQgdG8gc3VwcG9ydCBzZW5kaW5nIGNvbW1hbmRzIHRvIENDR3gK Y29udHJvbGxlci4gV2Ugd2FpdCBmb3IgcmVzcG9uc2UgYWZ0ZXIgc2VuZGluZyB0aGUgY29tbWFu ZCBhbmQgdGhlbgpyZWFkIHRoZSByZXNwb25zZSBmcm9tIFJBQl9SRVNQT05TRSByZWdpc3Rlci4K CkJlbG93IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQsCgktIEVOVEVSX0ZMQVNISU5HCgktIFJFU0VU CgktIFBEUE9SVF9FTkFCTEUKCS0gSlVNUF9UT19CT09UCgktIEZMQVNIX1JPV19SVwoJLSBWQUxJ REFURV9GVwoKQ29tbWFuZCBzcGVjaWZpYyBtdXRleCBsb2NrIGlzIGFsc28gYWRkZWQgdG8gc3lu YyBiZXR3ZWVuIGRyaXZlcgphbmQgdXNlciB0aHJlYWRzLgoKUEQgcG9ydCBudW1iZXIgaW5mb3Jt YXRpb24gaXMgYWRkZWQgd2hpY2ggaXMgcmVxdWlyZWQgd2hpbGUgc2VuZGluZwpQRF9QT1JUX0VO QUJMRSBjb21tYW5kCgpTaWduZWQtb2ZmLWJ5OiBBamF5IEd1cHRhIDxhamF5Z0BudmlkaWEuY29t PgotLS0KQ2hhbmdlcyBmcm9tIHY0IHRvIHY1CgktIEZpeGVkIGNvbW1lbnRzIGZyb20gT2xpdmVy IE5ldWt1bQoJCS0gVXNlZCB1MzIgZm9yIGRlbGF5IGluc3RlYWQgb2YgaW50CgkJLSBVc2VkIGdl dF91bmFsaWduZWRfbGUxNigpIGFuZCBwdXRfdW5hbGlnbmVkX2xlMTYoKQoJCS0gVXNlZCBtYXgg cG9zc2libGUgdGltZW91dCBkZWxheSBmb3IgUkVTRVQgY29tbWFuZAoKIGRyaXZlcnMvdXNiL3R5 cGVjL3Vjc2kvdWNzaV9jY2cuYyB8IDgyOCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0K IDEgZmlsZSBjaGFuZ2VkLCA4MTUgaW5zZXJ0aW9ucygrKSwgMTMgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy91c2IvdHlwZWMvdWNzaS91Y3NpX2NjZy5jIGIvZHJpdmVycy91c2Iv dHlwZWMvdWNzaS91Y3NpX2NjZy5jCmluZGV4IDM4ODRmYjQxYzcyZS4uNTUwOGJlZWMwOGUzIDEw MDY0NAotLS0gYS9kcml2ZXJzL3VzYi90eXBlYy91Y3NpL3Vjc2lfY2NnLmMKKysrIGIvZHJpdmVy cy91c2IvdHlwZWMvdWNzaS91Y3NpX2NjZy5jCkBAIC05LDYgKzksNyBAQAogICovCiAjaW5jbHVk ZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGlu dXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9t b2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTI0LDYgKzI1LDczIEBAIGVudW0g ZW51bV9md19tb2RlIHsKIAlGV19JTlZBTElELAogfTsKIAorI2RlZmluZSBDQ0dYX1JBQl9ERVZJ Q0VfTU9ERQkJCTB4MDAwMAorI2RlZmluZSBDQ0dYX1JBQl9JTlRSX1JFRwkJCTB4MDAwNgorI2Rl ZmluZSAgREVWX0lOVAkJCQlCSVQoMCkKKyNkZWZpbmUgIFBPUlQwX0lOVAkJCQlCSVQoMSkKKyNk ZWZpbmUgIFBPUlQxX0lOVAkJCQlCSVQoMikKKyNkZWZpbmUgIFVDU0lfUkVBRF9JTlQJCQkJQklU KDcpCisjZGVmaW5lIENDR1hfUkFCX0pVTVBfVE9fQk9PVAkJCTB4MDAwNworI2RlZmluZSAgVE9f Qk9PVAkJCQknSicKKyNkZWZpbmUgIFRPX0FMVF9GVwkJCQknQScKKyNkZWZpbmUgQ0NHWF9SQUJf UkVTRVRfUkVRCQkJMHgwMDA4CisjZGVmaW5lICBSRVNFVF9TSUcJCQkJJ1InCisjZGVmaW5lICBD TURfUkVTRVRfSTJDCQkJCTB4MAorI2RlZmluZSAgQ01EX1JFU0VUX0RFVgkJCQkweDEKKyNkZWZp bmUgQ0NHWF9SQUJfRU5URVJfRkxBU0hJTkcJCQkweDAwMEEKKyNkZWZpbmUgIEZMQVNIX0VOVEVS X1NJRwkJCSdQJworI2RlZmluZSBDQ0dYX1JBQl9WQUxJREFURV9GVwkJCTB4MDAwQgorI2RlZmlu ZSBDQ0dYX1JBQl9GTEFTSF9ST1dfUlcJCQkweDAwMEMKKyNkZWZpbmUgIEZMQVNIX1NJRwkJCQkn RicKKyNkZWZpbmUgIEZMQVNIX1JEX0NNRAkJCQkweDAKKyNkZWZpbmUgIEZMQVNIX1dSX0NNRAkJ CQkweDEKKyNkZWZpbmUgIEZMQVNIX0ZXQ1QxX1dSX0NNRAkJCTB4MgorI2RlZmluZSAgRkxBU0hf RldDVDJfV1JfQ01ECQkJMHgzCisjZGVmaW5lICBGTEFTSF9GV0NUX1NJR19XUl9DTUQJCQkweDQK KyNkZWZpbmUgQ0NHWF9SQUJfUkVBRF9BTExfVkVSCQkJMHgwMDEwCisjZGVmaW5lIENDR1hfUkFC X1JFQURfRlcyX1ZFUgkJCTB4MDAyMAorI2RlZmluZSBDQ0dYX1JBQl9VQ1NJX0NPTlRST0wJCQkw eDAwMzkKKyNkZWZpbmUgQ0NHWF9SQUJfVUNTSV9DT05UUk9MX1NUQVJUCQlCSVQoMCkKKyNkZWZp bmUgQ0NHWF9SQUJfVUNTSV9DT05UUk9MX1NUT1AJCUJJVCgxKQorI2RlZmluZSBDQ0dYX1JBQl9V Q1NJX0RBVEFfQkxPQ0sob2Zmc2V0KQkoMHhmMDAwIHwgKChvZmZzZXQpICYgMHhmZikpCisjZGVm aW5lIFJFR19GTEFTSF9SV19NRU0gICAgICAgIDB4MDIwMAorI2RlZmluZSBERVZfUkVHX0lEWAkJ CQlDQ0dYX1JBQl9ERVZJQ0VfTU9ERQorI2RlZmluZSBDQ0dYX1JBQl9QRFBPUlRfRU5BQkxFCQkJ MHgwMDJDCisjZGVmaW5lICBQRFBPUlRfMQkJQklUKDApCisjZGVmaW5lICBQRFBPUlRfMgkJQklU KDEpCisjZGVmaW5lIENDR1hfUkFCX1JFU1BPTlNFCQkJMHgwMDdFCisjZGVmaW5lICBBU1lOQ19F VkVOVAkJCQlCSVQoNykKKworLyogQ0NHeCBldmVudHMgJiBhc3luYyBtc2cgY29kZXMgKi8KKyNk ZWZpbmUgUkVTRVRfQ09NUExFVEUJCTB4ODAKKyNkZWZpbmUgRVZFTlRfSU5ERVgJCVJFU0VUX0NP TVBMRVRFCisjZGVmaW5lIFBPUlRfQ09OTkVDVF9ERVQJMHg4NAorI2RlZmluZSBQT1JUX0RJU0NP Tk5FQ1RfREVUCTB4ODUKKyNkZWZpbmUgUk9MRV9TV0FQX0NPTVBFTEVURQkweDg3CisKKy8qIGNj ZyBmaXJtd2FyZSAqLworI2RlZmluZSBDWUFDRF9MSU5FX1NJWkUgICAgICAgICA1MjcKKyNkZWZp bmUgQ0NHNF9ST1dfU0laRSAgICAgICAgICAgMjU2CisjZGVmaW5lIEZXMV9NRVRBREFUQV9ST1cg ICAgICAgIDB4MUZGCisjZGVmaW5lIEZXMl9NRVRBREFUQV9ST1cgICAgICAgIDB4MUZFCisjZGVm aW5lIEZXX0NGR19UQUJMRV9TSUdfU0laRQkyNTYKKworc3RhdGljIGludCBzZWNvbmRhcnlfZndf bWluX3ZlciA9IDQxOworCitlbnVtIGVudW1fZmxhc2hfbW9kZSB7CisJU0VDT05EQVJZX0JMLAkv KiB1cGRhdGUgc2Vjb25kYXJ5IHVzaW5nIGJvb3Rsb2FkZXIgKi8KKwlQUklNQVJZLAkvKiB1cGRh dGUgcHJpbWFyeSB1c2luZyBzZWNvbmRhcnkgKi8KKwlTRUNPTkRBUlksCS8qIHVwZGF0ZSBzZWNv bmRhcnkgdXNpbmcgcHJpbWFyeSAqLworCUZMQVNIX05PVF9ORUVERUQsCS8qIHVwZGF0ZSBub3Qg cmVxdWlyZWQgKi8KKwlGTEFTSF9JTlZBTElELAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBj b25zdCBjY2dfZndfbmFtZXNbXSA9IHsKKwkiY2NnX2Jvb3QuY3lhY2QiLAorCSJjY2dfcHJpbWFy eS5jeWFjZCIsCisJImNjZ19zZWNvbmRhcnkuY3lhY2QiCit9OworCiBzdHJ1Y3QgY2NnX2Rldl9p bmZvIHsKICNkZWZpbmUgQ0NHX0RFVklORk9fRldNT0RFX1NISUZUICgwKQogI2RlZmluZSBDQ0df REVWSU5GT19GV01PREVfTUFTSyAoMHgzIDw8IENDR19ERVZJTkZPX0ZXTU9ERV9TSElGVCkKQEAg LTUwLDYgKzExOCw1MCBAQCBzdHJ1Y3QgdmVyc2lvbl9pbmZvIHsKIAlzdHJ1Y3QgdmVyc2lvbl9m b3JtYXQgYXBwOwogfTsKIAorc3RydWN0IGZ3X2NvbmZpZ190YWJsZSB7CisJdTMyIGlkZW50aXR5 OworCXUxNiB0YWJsZV9zaXplOworCXU4IGZ3Y3RfdmVyc2lvbjsKKwl1OCBpc19rZXlfY2hhbmdl OworCXU4IGd1aWRbMTZdOworCXN0cnVjdCB2ZXJzaW9uX2Zvcm1hdCBiYXNlOworCXN0cnVjdCB2 ZXJzaW9uX2Zvcm1hdCBhcHA7CisJdTggcHJpbWFyeV9md19kaWdlc3RbMzJdOworCXUzMiBrZXlf ZXhwX2xlbmd0aDsKKwl1OCBrZXlfbW9kdWx1c1syNTZdOworCXU4IGtleV9leHBbNF07Cit9Owor CisvKiBDQ0d4IHJlc3BvbnNlIGNvZGVzICovCitlbnVtIGNjZ19yZXNwX2NvZGUgeworCUNNRF9O T19SRVNQICAgICAgICAgICAgID0gMHgwMCwKKwlDTURfU1VDQ0VTUyAgICAgICAgICAgICA9IDB4 MDIsCisJRkxBU0hfREFUQV9BVkFJTEFCTEUgICAgPSAweDAzLAorCUNNRF9JTlZBTElEICAgICAg ICAgICAgID0gMHgwNSwKKwlGTEFTSF9VUERBVEVfRkFJTCAgICAgICA9IDB4MDcsCisJSU5WQUxJ RF9GVyAgICAgICAgICAgICAgPSAweDA4LAorCUlOVkFMSURfQVJHICAgICAgICAgICAgID0gMHgw OSwKKwlDTURfTk9UX1NVUFBPUlQgICAgICAgICA9IDB4MEEsCisJVFJBTlNBQ1RJT05fRkFJTCAg ICAgICAgPSAweDBDLAorCVBEX0NNRF9GQUlMICAgICAgICAgICAgID0gMHgwRCwKKwlVTkRFRl9F UlJPUiAgICAgICAgICAgICA9IDB4MEYsCisJSU5WQUxJRF9SRVNQCQk9IDB4MTAsCit9OworCisj ZGVmaW5lIENDR19FVkVOVF9NQVgJKEVWRU5UX0lOREVYICsgNDMpCisKK3N0cnVjdCBjY2dfY21k IHsKKwl1MTYgcmVnOworCXUzMiBkYXRhOworCWludCBsZW47CisJdTMyIGRlbGF5OyAvKiBtcyBk ZWxheSBmb3IgY21kIHRpbWVvdXQgICovCit9OworCitzdHJ1Y3QgY2NnX3Jlc3AgeworCXU4IGNv ZGU7CisJdTggbGVuZ3RoOworfTsKKwogc3RydWN0IHVjc2lfY2NnIHsKIAlzdHJ1Y3QgZGV2aWNl ICpkZXY7CiAJc3RydWN0IHVjc2kgKnVjc2k7CkBAIC01OCwxNyArMTcwLDE4IEBAIHN0cnVjdCB1 Y3NpX2NjZyB7CiAJc3RydWN0IGNjZ19kZXZfaW5mbyBpbmZvOwogCS8qIHZlcnNpb24gaW5mbyBm b3IgYm9vdCwgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5ICovCiAJc3RydWN0IHZlcnNpb25faW5mbyB2 ZXJzaW9uW0ZXMiArIDFdOworCS8qIENDRyBIUEkgY29tbXVuaWNhdGlvbiBmbGFncyAqLworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisjZGVmaW5lIFJFU0VUX1BFTkRJTkcJMAorI2RlZmluZSBERVZf Q01EX1BFTkRJTkcJMQorCXN0cnVjdCBjY2dfcmVzcCBkZXZfcmVzcDsKKwl1OCBjbWRfcmVzcDsK KwlpbnQgcG9ydF9udW07CisJaW50IGlycTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlz dHJ1Y3QgbXV0ZXggbG9jazsgLyogdG8gc3luYyBiZXR3ZWVuIHVzZXIgYW5kIGRyaXZlciB0aHJl YWQgKi8KIH07CiAKLSNkZWZpbmUgQ0NHWF9SQUJfREVWSUNFX01PREUJCQkweDAwMDAKLSNkZWZp bmUgQ0NHWF9SQUJfSU5UUl9SRUcJCQkweDAwMDYKLSNkZWZpbmUgQ0NHWF9SQUJfUkVBRF9BTExf VkVSCQkJMHgwMDEwCi0jZGVmaW5lIENDR1hfUkFCX1JFQURfRlcyX1ZFUgkJCTB4MDAyMAotI2Rl ZmluZSBDQ0dYX1JBQl9VQ1NJX0NPTlRST0wJCQkweDAwMzkKLSNkZWZpbmUgQ0NHWF9SQUJfVUNT SV9DT05UUk9MX1NUQVJUCQlCSVQoMCkKLSNkZWZpbmUgQ0NHWF9SQUJfVUNTSV9DT05UUk9MX1NU T1AJCUJJVCgxKQotI2RlZmluZSBDQ0dYX1JBQl9VQ1NJX0RBVEFfQkxPQ0sob2Zmc2V0KQkoMHhm MDAwIHwgKChvZmZzZXQpICYgMHhmZikpCi0KIHN0YXRpYyBpbnQgY2NnX3JlYWQoc3RydWN0IHVj c2lfY2NnICp1YywgdTE2IHJhYiwgdTggKmRhdGEsIHUzMiBsZW4pCiB7CiAJc3RydWN0IGkyY19j bGllbnQgKmNsaWVudCA9IHVjLT5jbGllbnQ7CkBAIC0yNzYsNiArMzg5LDY3OSBAQCBzdGF0aWMg aW50IGdldF9md19pbmZvKHN0cnVjdCB1Y3NpX2NjZyAqdWMpCiAJcmV0dXJuIDA7CiB9CiAKK3N0 YXRpYyBpbmxpbmUgYm9vbCBpbnZhbGlkX2FzeW5jX2V2dChpbnQgY29kZSkKK3sKKwlyZXR1cm4g KGNvZGUgPj0gQ0NHX0VWRU5UX01BWCkgfHwgKGNvZGUgPCBFVkVOVF9JTkRFWCk7Cit9CisKK3N0 YXRpYyB2b2lkIGNjZ19wcm9jZXNzX3Jlc3BvbnNlKHN0cnVjdCB1Y3NpX2NjZyAqdWMpCit7CisJ c3RydWN0IGRldmljZSAqZGV2ID0gdWMtPmRldjsKKworCWlmICh1Yy0+ZGV2X3Jlc3AuY29kZSAm IEFTWU5DX0VWRU5UKSB7CisJCWlmICh1Yy0+ZGV2X3Jlc3AuY29kZSA9PSBSRVNFVF9DT01QTEVU RSkgeworCQkJaWYgKHRlc3RfYml0KFJFU0VUX1BFTkRJTkcsICZ1Yy0+ZmxhZ3MpKQorCQkJCXVj LT5jbWRfcmVzcCA9IHVjLT5kZXZfcmVzcC5jb2RlOworCQkJZ2V0X2Z3X2luZm8odWMpOworCQl9 CisJCWlmIChpbnZhbGlkX2FzeW5jX2V2dCh1Yy0+ZGV2X3Jlc3AuY29kZSkpCisJCQlkZXZfZXJy KGRldiwgImludmFsaWQgYXN5bmMgZXZ0ICVkXG4iLAorCQkJCXVjLT5kZXZfcmVzcC5jb2RlKTsK Kwl9IGVsc2UgeworCQlpZiAodGVzdF9iaXQoREVWX0NNRF9QRU5ESU5HLCAmdWMtPmZsYWdzKSkg eworCQkJdWMtPmNtZF9yZXNwID0gdWMtPmRldl9yZXNwLmNvZGU7CisJCQljbGVhcl9iaXQoREVW X0NNRF9QRU5ESU5HLCAmdWMtPmZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoZGV2LCAi ZGV2IHJlc3AgMHglMDR4IGJ1dCBubyBjbWQgcGVuZGluZ1xuIiwKKwkJCQl1Yy0+ZGV2X3Jlc3Au Y29kZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgY2NnX3JlYWRfcmVzcG9uc2Uoc3RydWN0 IHVjc2lfY2NnICp1YykKK3sKKwl1bnNpZ25lZCBsb25nIHRhcmdldCA9IGppZmZpZXMgKyBtc2Vj c190b19qaWZmaWVzKDEwMDApOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVjLT5kZXY7CisJdTgg aW50dmFsOworCWludCBzdGF0dXM7CisKKwkvKiB3YWl0IGZvciBpbnRlcnJ1cHQgc3RhdHVzIHRv IGdldCB1cGRhdGVkICovCisJZG8geworCQlzdGF0dXMgPSBjY2dfcmVhZCh1YywgQ0NHWF9SQUJf SU5UUl9SRUcsICZpbnR2YWwsCisJCQkJICBzaXplb2YoaW50dmFsKSk7CisJCWlmIChzdGF0dXMg PCAwKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlpZiAoaW50dmFsICYgREVWX0lOVCkKKwkJCWJy ZWFrOworCQl1c2xlZXBfcmFuZ2UoNTAwLCA2MDApOworCX0gd2hpbGUgKHRpbWVfaXNfYWZ0ZXJf amlmZmllcyh0YXJnZXQpKTsKKworCWlmICh0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKHRhcmdldCkp IHsKKwkJZGV2X2VycihkZXYsICJyZXNwb25zZSB0aW1lb3V0IGVycm9yXG4iKTsKKwkJcmV0dXJu IC1FVElNRTsKKwl9CisKKwlzdGF0dXMgPSBjY2dfcmVhZCh1YywgQ0NHWF9SQUJfUkVTUE9OU0Us ICh1OCAqKSZ1Yy0+ZGV2X3Jlc3AsCisJCQkgIHNpemVvZih1Yy0+ZGV2X3Jlc3ApKTsKKwlpZiAo c3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXN0YXR1cyA9IGNjZ193cml0ZSh1Yywg Q0NHWF9SQUJfSU5UUl9SRUcsICZpbnR2YWwsIHNpemVvZihpbnR2YWwpKTsKKwlpZiAoc3RhdHVz IDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZXIgbXVz dCBob2xkIHVjLT5sb2NrICovCitzdGF0aWMgaW50IGNjZ19zZW5kX2NvbW1hbmQoc3RydWN0IHVj c2lfY2NnICp1Yywgc3RydWN0IGNjZ19jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYg PSB1Yy0+ZGV2OworCWludCByZXQ7CisKKwlzd2l0Y2ggKGNtZC0+cmVnICYgMHhGMDAwKSB7CisJ Y2FzZSBERVZfUkVHX0lEWDoKKwkJc2V0X2JpdChERVZfQ01EX1BFTkRJTkcsICZ1Yy0+ZmxhZ3Mp OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgImludmFsaWQgY21kIHJlZ2lz dGVyXG4iKTsKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gY2NnX3dyaXRlKHVjLCBjbWQtPnJlZywg KHU4ICopJmNtZC0+ZGF0YSwgY21kLT5sZW4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0 OworCisJbXNsZWVwKGNtZC0+ZGVsYXkpOworCisJcmV0ID0gY2NnX3JlYWRfcmVzcG9uc2UodWMp OworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAicmVzcG9uc2UgcmVhZCBlcnJvclxu Iik7CisJCXN3aXRjaCAoY21kLT5yZWcgJiAweEYwMDApIHsKKwkJY2FzZSBERVZfUkVHX0lEWDoK KwkJCWNsZWFyX2JpdChERVZfQ01EX1BFTkRJTkcsICZ1Yy0+ZmxhZ3MpOworCQkJYnJlYWs7CisJ CWRlZmF1bHQ6CisJCQlkZXZfZXJyKGRldiwgImludmFsaWQgY21kIHJlZ2lzdGVyXG4iKTsKKwkJ CWJyZWFrOworCQl9CisJCXJldHVybiAtRUlPOworCX0KKwljY2dfcHJvY2Vzc19yZXNwb25zZSh1 Yyk7CisKKwlyZXR1cm4gdWMtPmNtZF9yZXNwOworfQorCitzdGF0aWMgaW50IGNjZ19jbWRfZW50 ZXJfZmxhc2hpbmcoc3RydWN0IHVjc2lfY2NnICp1YykKK3sKKwlzdHJ1Y3QgY2NnX2NtZCBjbWQ7 CisJaW50IHJldDsKKworCWNtZC5yZWcgPSBDQ0dYX1JBQl9FTlRFUl9GTEFTSElORzsKKwljbWQu ZGF0YSA9IEZMQVNIX0VOVEVSX1NJRzsKKwljbWQubGVuID0gMTsKKwljbWQuZGVsYXkgPSA1MDsK KworCW11dGV4X2xvY2soJnVjLT5sb2NrKTsKKworCXJldCA9IGNjZ19zZW5kX2NvbW1hbmQodWMs ICZjbWQpOworCisJbXV0ZXhfdW5sb2NrKCZ1Yy0+bG9jayk7CisKKwlpZiAocmV0ICE9IENNRF9T VUNDRVNTKSB7CisJCWRldl9lcnIodWMtPmRldiwgImVudGVyIGZsYXNoaW5nIGZhaWxlZCByZXQ9 JWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgY2NnX2NtZF9yZXNldChzdHJ1Y3QgdWNzaV9jY2cgKnVjKQoreworCXN0cnVjdCBjY2df Y21kIGNtZDsKKwl1OCAqcDsKKwlpbnQgcmV0OworCisJcCA9ICh1OCAqKSZjbWQuZGF0YTsKKwlj bWQucmVnID0gQ0NHWF9SQUJfUkVTRVRfUkVROworCXBbMF0gPSBSRVNFVF9TSUc7CisJcFsxXSA9 IENNRF9SRVNFVF9ERVY7CisJY21kLmxlbiA9IDI7CisJY21kLmRlbGF5ID0gNTAwMDsKKworCW11 dGV4X2xvY2soJnVjLT5sb2NrKTsKKworCXNldF9iaXQoUkVTRVRfUEVORElORywgJnVjLT5mbGFn cyk7CisKKwlyZXQgPSBjY2dfc2VuZF9jb21tYW5kKHVjLCAmY21kKTsKKwlpZiAocmV0ICE9IFJF U0VUX0NPTVBMRVRFKQorCQlnb3RvIGVycl9jbGVhcl9mbGFnOworCisJcmV0ID0gMDsKKworZXJy X2NsZWFyX2ZsYWc6CisJY2xlYXJfYml0KFJFU0VUX1BFTkRJTkcsICZ1Yy0+ZmxhZ3MpOworCisJ bXV0ZXhfdW5sb2NrKCZ1Yy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50 IGNjZ19jbWRfcG9ydF9jb250cm9sKHN0cnVjdCB1Y3NpX2NjZyAqdWMsIGJvb2wgZW5hYmxlKQor eworCXN0cnVjdCBjY2dfY21kIGNtZDsKKwlpbnQgcmV0OworCisJY21kLnJlZyA9IENDR1hfUkFC X1BEUE9SVF9FTkFCTEU7CisJaWYgKGVuYWJsZSkKKwkJY21kLmRhdGEgPSAodWMtPnBvcnRfbnVt ID09IDEpID8KKwkJCSAgICBQRFBPUlRfMSA6IChQRFBPUlRfMSB8IFBEUE9SVF8yKTsKKwllbHNl CisJCWNtZC5kYXRhID0gMHgwOworCWNtZC5sZW4gPSAxOworCWNtZC5kZWxheSA9IDEwOworCisJ bXV0ZXhfbG9jaygmdWMtPmxvY2spOworCisJcmV0ID0gY2NnX3NlbmRfY29tbWFuZCh1YywgJmNt ZCk7CisKKwltdXRleF91bmxvY2soJnVjLT5sb2NrKTsKKworCWlmIChyZXQgIT0gQ01EX1NVQ0NF U1MpIHsKKwkJZGV2X2Vycih1Yy0+ZGV2LCAicG9ydCBjb250cm9sIGZhaWxlZCByZXQ9JWRcbiIs IHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNj Z19jbWRfanVtcF9ib290X21vZGUoc3RydWN0IHVjc2lfY2NnICp1YywgaW50IGJsX21vZGUpCit7 CisJc3RydWN0IGNjZ19jbWQgY21kOworCWludCByZXQ7CisKKwljbWQucmVnID0gQ0NHWF9SQUJf SlVNUF9UT19CT09UOworCisJaWYgKGJsX21vZGUpCisJCWNtZC5kYXRhID0gVE9fQk9PVDsKKwll bHNlCisJCWNtZC5kYXRhID0gVE9fQUxUX0ZXOworCisJY21kLmxlbiA9IDE7CisJY21kLmRlbGF5 ID0gMTAwOworCisJbXV0ZXhfbG9jaygmdWMtPmxvY2spOworCisJc2V0X2JpdChSRVNFVF9QRU5E SU5HLCAmdWMtPmZsYWdzKTsKKworCXJldCA9IGNjZ19zZW5kX2NvbW1hbmQodWMsICZjbWQpOwor CWlmIChyZXQgIT0gUkVTRVRfQ09NUExFVEUpCisJCWdvdG8gZXJyX2NsZWFyX2ZsYWc7CisKKwly ZXQgPSAwOworCitlcnJfY2xlYXJfZmxhZzoKKwljbGVhcl9iaXQoUkVTRVRfUEVORElORywgJnVj LT5mbGFncyk7CisKKwltdXRleF91bmxvY2soJnVjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9 CisKK3N0YXRpYyBpbnQKK2NjZ19jbWRfd3JpdGVfZmxhc2hfcm93KHN0cnVjdCB1Y3NpX2NjZyAq dWMsIHUxNiByb3csCisJCQljb25zdCB2b2lkICpkYXRhLCB1OCBmY21kKQoreworCXN0cnVjdCBp MmNfY2xpZW50ICpjbGllbnQgPSB1Yy0+Y2xpZW50OworCXN0cnVjdCBjY2dfY21kIGNtZDsKKwl1 OCBidWZbQ0NHNF9ST1dfU0laRSArIDJdOworCXU4ICpwOworCWludCByZXQ7CisKKwkvKiBDb3B5 IHRoZSBkYXRhIGludG8gdGhlIGZsYXNoIHJlYWQvd3JpdGUgbWVtb3J5LiAqLworCXB1dF91bmFs aWduZWRfbGUxNihSRUdfRkxBU0hfUldfTUVNLCBidWYpOworCisJbWVtY3B5KGJ1ZiArIDIsIGRh dGEsIENDRzRfUk9XX1NJWkUpOworCisJbXV0ZXhfbG9jaygmdWMtPmxvY2spOworCisJcmV0ID0g aTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCBDQ0c0X1JPV19TSVpFICsgMik7CisJaWYgKHJl dCAhPSBDQ0c0X1JPV19TSVpFICsgMikgeworCQlkZXZfZXJyKHVjLT5kZXYsICJSRUdfRkxBU0hf UldfTUVNIHdyaXRlIGZhaWwgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQgPCAwID8gcmV0IDog LUVJTzsKKwl9CisKKwkvKiBVc2UgdGhlIEZMQVNIX1JPV19SRUFEX1dSSVRFIHJlZ2lzdGVyIHRv IHRyaWdnZXIgKi8KKwkvKiB3cml0aW5nIG9mIGRhdGEgdG8gdGhlIGRlc2lyZWQgZmxhc2ggcm93 ICovCisJcCA9ICh1OCAqKSZjbWQuZGF0YTsKKwljbWQucmVnID0gQ0NHWF9SQUJfRkxBU0hfUk9X X1JXOworCXBbMF0gPSBGTEFTSF9TSUc7CisJcFsxXSA9IGZjbWQ7CisJcHV0X3VuYWxpZ25lZF9s ZTE2KHJvdywgJnBbMl0pOworCWNtZC5sZW4gPSA0OworCWNtZC5kZWxheSA9IDUwOworCWlmIChm Y21kID09IEZMQVNIX0ZXQ1RfU0lHX1dSX0NNRCkKKwkJY21kLmRlbGF5ICs9IDQwMDsKKwlpZiAo cm93ID09IDUxMCkKKwkJY21kLmRlbGF5ICs9IDIyMDsKKwlyZXQgPSBjY2dfc2VuZF9jb21tYW5k KHVjLCAmY21kKTsKKworCW11dGV4X3VubG9jaygmdWMtPmxvY2spOworCisJaWYgKHJldCAhPSBD TURfU1VDQ0VTUykgeworCQlkZXZfZXJyKHVjLT5kZXYsICJ3cml0ZSBmbGFzaCByb3cgZmFpbGVk IHJldD0lZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBjY2dfY21kX3ZhbGlkYXRlX2Z3KHN0cnVjdCB1Y3NpX2NjZyAqdWMsIHVuc2ln bmVkIGludCBmd2lkKQoreworCXN0cnVjdCBjY2dfY21kIGNtZDsKKwlpbnQgcmV0OworCisJY21k LnJlZyA9IENDR1hfUkFCX1ZBTElEQVRFX0ZXOworCWNtZC5kYXRhID0gZndpZDsKKwljbWQubGVu ID0gMTsKKwljbWQuZGVsYXkgPSA1MDA7CisKKwltdXRleF9sb2NrKCZ1Yy0+bG9jayk7CisKKwly ZXQgPSBjY2dfc2VuZF9jb21tYW5kKHVjLCAmY21kKTsKKworCW11dGV4X3VubG9jaygmdWMtPmxv Y2spOworCisJaWYgKHJldCAhPSBDTURfU1VDQ0VTUykKKwkJcmV0dXJuIHJldDsKKworCXJldHVy biAwOworfQorCitzdGF0aWMgYm9vbCBjY2dfY2hlY2tfdmVuZG9yX3ZlcnNpb24oc3RydWN0IHVj c2lfY2NnICp1YywKKwkJCQkgICAgIHN0cnVjdCB2ZXJzaW9uX2Zvcm1hdCAqYXBwLAorCQkJCSAg ICAgc3RydWN0IGZ3X2NvbmZpZ190YWJsZSAqZndfY2ZnKQoreworCXN0cnVjdCBkZXZpY2UgKmRl diA9IHVjLT5kZXY7CisKKwkvKiBDaGVjayBpZiB0aGUgZncgYnVpbGQgaXMgZm9yIHN1cHBvcnRl ZCB2ZW5kb3JzLgorCSAqIEFkZCBhbGwgc3VwcG9ydGVkIHZlbmRvcnMgaGVyZS4KKwkgKi8KKwlp ZiAoYXBwLT5idWlsZCAhPSAoKCduJyA8PCA4KSB8ICd2JykpIHsKKwkJZGV2X2luZm8oZGV2LCAi Y3VycmVudCBmdyBpcyBub3QgZnJvbSBzdXBwb3J0ZWQgdmVuZG9yXG4iKTsKKwkJcmV0dXJuIGZh bHNlOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBuZXcgZncgYnVpbGQgaXMgZm9yIHN1cHBvcnRl ZCB2ZW5kb3JzCisJICogQWRkIGFsbCBzdXBwb3J0ZWQgdmVuZG9ycyBoZXJlLgorCSAqLworCWlm IChmd19jZmctPmFwcC5idWlsZCAhPSAoKCduJyA8PCA4KSB8ICd2JykpIHsKKwkJZGV2X2luZm8o ZGV2LCAibmV3IGZ3IGlzIG5vdCBmcm9tIHN1cHBvcnRlZCB2ZW5kb3JcbiIpOworCQlyZXR1cm4g ZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjY2dfY2hlY2tfZndf dmVyc2lvbihzdHJ1Y3QgdWNzaV9jY2cgKnVjLCBjb25zdCBjaGFyICpmd19uYW1lLAorCQkJCSBz dHJ1Y3QgdmVyc2lvbl9mb3JtYXQgKmFwcCkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3 ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1Yy0+ZGV2OworCXN0cnVjdCBmd19jb25m aWdfdGFibGUgZndfY2ZnOworCXUzMiBjdXJfdmVyc2lvbiwgbmV3X3ZlcnNpb247CisJYm9vbCBp c19sYXRlciA9IGZhbHNlOworCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCBk ZXYpICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogRmFpbGVkIHRvIG9wZW4gY3lhY2Qg ZmlsZSAlc1xuIiwgZndfbmFtZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIGNo ZWNrIGlmIHNpZ25lZCBmdworCSAqIGxhc3QgcGFydCBvZiBmdyBpbWFnZSBpcyBmdyBjZmcgdGFi bGUgYW5kIHNpZ25hdHVyZQorCSAqLworCWlmIChmdy0+c2l6ZSA8IHNpemVvZihmd19jZmcpICsg RldfQ0ZHX1RBQkxFX1NJR19TSVpFKQorCQlnb3RvIG5vdF9zaWduZWRfZnc7CisKKwltZW1jcHko KHVpbnQ4X3QgKikmZndfY2ZnLCBmdy0+ZGF0YSArIGZ3LT5zaXplIC0KKwkgICAgICAgc2l6ZW9m KGZ3X2NmZykgLSBGV19DRkdfVEFCTEVfU0lHX1NJWkUsIHNpemVvZihmd19jZmcpKTsKKworCWlm IChmd19jZmcuaWRlbnRpdHkgIT0gKCdGJyB8ICdXJyA8PCA4IHwgJ0MnIDw8IDE2IHwgJ1QnIDw8 IDI0KSkgeworCQlkZXZfaW5mbyhkZXYsICJub3QgYSBzaWduZWQgaW1hZ2VcbiIpOworCQlnb3Rv IG5vdF9zaWduZWRfZnc7CisJfQorCisJLyogY29tcGFyZSBpbnB1dCB2ZXJzaW9uIHdpdGggRldD VCB2ZXJzaW9uICovCisJY3VyX3ZlcnNpb24gPSBhcHAtPmJ1aWxkIHwgYXBwLT5wYXRjaCA8PCAx NiB8IGFwcC0+dmVyIDw8IDI0OworCisJbmV3X3ZlcnNpb24gPSBmd19jZmcuYXBwLmJ1aWxkIHwg ZndfY2ZnLmFwcC5wYXRjaCA8PCAxNiB8CisJCQlmd19jZmcuYXBwLnZlciA8PCAyNDsKKworCWlm ICghY2NnX2NoZWNrX3ZlbmRvcl92ZXJzaW9uKHVjLCBhcHAsICZmd19jZmcpKQorCQlnb3RvIG5v dF9zdXBwb3J0ZWRfdmVyc2lvbjsKKworCWlmIChuZXdfdmVyc2lvbiA+IGN1cl92ZXJzaW9uKQor CQlpc19sYXRlciA9IHRydWU7CisKK25vdF9zdXBwb3J0ZWRfdmVyc2lvbjoKK25vdF9zaWduZWRf Znc6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJcmV0dXJuIGlzX2xhdGVyOworfQorCitzdGF0 aWMgaW50IGNjZ19md191cGRhdGVfbmVlZGVkKHN0cnVjdCB1Y3NpX2NjZyAqdWMsCisJCQkJZW51 bSBlbnVtX2ZsYXNoX21vZGUgKm1vZGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdWMtPmRl djsKKwlpbnQgZXJyOworCXN0cnVjdCB2ZXJzaW9uX2luZm8gdmVyc2lvblszXTsKKworCWVyciA9 IGNjZ19yZWFkKHVjLCBDQ0dYX1JBQl9ERVZJQ0VfTU9ERSwgKHU4ICopKCZ1Yy0+aW5mbyksCisJ CSAgICAgICBzaXplb2YodWMtPmluZm8pKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAi cmVhZCBkZXZpY2UgbW9kZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9 IGNjZ19yZWFkKHVjLCBDQ0dYX1JBQl9SRUFEX0FMTF9WRVIsICh1OCAqKXZlcnNpb24sCisJCSAg ICAgICBzaXplb2YodmVyc2lvbikpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJyZWFk IGRldmljZSBtb2RlIGZhaWxlZFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG1lbWNt cCgmdmVyc2lvbltGVzFdLCAiXDBcMFwwXDBcMFwwXDBcMCIsCisJCSAgIHNpemVvZihzdHJ1Y3Qg dmVyc2lvbl9pbmZvKSkgPT0gMCkgeworCQlkZXZfaW5mbyhkZXYsICJzZWNvbmRhcnkgZncgaXMg bm90IGZsYXNoZWRcbiIpOworCQkqbW9kZSA9IFNFQ09OREFSWV9CTDsKKwl9IGVsc2UgaWYgKHZl cnNpb25bRlcxXS5iYXNlLmJ1aWxkIDwgc2Vjb25kYXJ5X2Z3X21pbl92ZXIpIHsKKwkJZGV2X2lu Zm8oZGV2LCAic2Vjb25kYXJ5IGZ3IHZlcnNpb24gaXMgdG9vIGxvdyAoPCAlZClcbiIsCisJCQkg c2Vjb25kYXJ5X2Z3X21pbl92ZXIpOworCQkqbW9kZSA9IFNFQ09OREFSWTsKKwl9IGVsc2UgaWYg KG1lbWNtcCgmdmVyc2lvbltGVzJdLCAiXDBcMFwwXDBcMFwwXDBcMCIsCisJCSAgIHNpemVvZihz dHJ1Y3QgdmVyc2lvbl9pbmZvKSkgPT0gMCkgeworCQlkZXZfaW5mbyhkZXYsICJwcmltYXJ5IGZ3 IGlzIG5vdCBmbGFzaGVkXG4iKTsKKwkJKm1vZGUgPSBQUklNQVJZOworCX0gZWxzZSBpZiAoY2Nn X2NoZWNrX2Z3X3ZlcnNpb24odWMsIGNjZ19md19uYW1lc1tQUklNQVJZXSwKKwkJICAgJnZlcnNp b25bRlcyXS5hcHApKSB7CisJCWRldl9pbmZvKGRldiwgImZvdW5kIHByaW1hcnkgZncgd2l0aCBs YXRlciB2ZXJzaW9uXG4iKTsKKwkJKm1vZGUgPSBQUklNQVJZOworCX0gZWxzZSB7CisJCWRldl9p bmZvKGRldiwgInNlY29uZGFyeSBhbmQgcHJpbWFyeSBmdyBhcmUgdGhlIGxhdGVzdFxuIik7CisJ CSptb2RlID0gRkxBU0hfTk9UX05FRURFRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgZG9fZmxhc2goc3RydWN0IHVjc2lfY2NnICp1YywgZW51bSBlbnVtX2ZsYXNoX21vZGUgbW9k ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1Yy0+ZGV2OworCWNvbnN0IHN0cnVjdCBmaXJt d2FyZSAqZncgPSBOVUxMOworCWNvbnN0IGNoYXIgKnAsICpzOworCWNvbnN0IGNoYXIgKmVvZjsK KwlpbnQgZXJyLCByb3csIGxlbiwgbGluZV9zeiwgbGluZV9jbnQgPSAwOworCXVuc2lnbmVkIGxv bmcgc3RhcnRfdGltZSA9IGppZmZpZXM7CisJc3RydWN0IGZ3X2NvbmZpZ190YWJsZSAgZndfY2Zn OworCXU4IGZ3X2NmZ19zaWdbRldfQ0ZHX1RBQkxFX1NJR19TSVpFXTsKKwl1OCAqd3JfYnVmOwor CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGNjZ19md19uYW1lc1ttb2RlXSwgZGV2KTsK KwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAicmVxdWVzdCAlcyBmYWlsZWQgZXJyPSVkXG4i LAorCQkJY2NnX2Z3X25hbWVzW21vZGVdLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlm ICgoKHVjLT5pbmZvLm1vZGUgJiBDQ0dfREVWSU5GT19GV01PREVfTUFTSykgPj4KKwkJCUNDR19E RVZJTkZPX0ZXTU9ERV9TSElGVCkgPT0gRlcyKSB7CisJCWVyciA9IGNjZ19jbWRfcG9ydF9jb250 cm9sKHVjLCBmYWxzZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byByZWxlYXNlX2Z3OworCQll cnIgPSBjY2dfY21kX2p1bXBfYm9vdF9tb2RlKHVjLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQln b3RvIHJlbGVhc2VfZnc7CisJfQorCisJZW9mID0gZnctPmRhdGEgKyBmdy0+c2l6ZTsKKworCS8q CisJICogY2hlY2sgaWYgc2lnbmVkIGZ3CisJICogbGFzdCBwYXJ0IG9mIGZ3IGltYWdlIGlzIGZ3 IGNmZyB0YWJsZSBhbmQgc2lnbmF0dXJlCisJICovCisJaWYgKGZ3LT5zaXplIDwgc2l6ZW9mKGZ3 X2NmZykgKyBzaXplb2YoZndfY2ZnX3NpZykpCisJCWdvdG8gbm90X3NpZ25lZF9mdzsKKworCW1l bWNweSgodWludDhfdCAqKSZmd19jZmcsIGZ3LT5kYXRhICsgZnctPnNpemUgLQorCSAgICAgICBz aXplb2YoZndfY2ZnKSAtIHNpemVvZihmd19jZmdfc2lnKSwgc2l6ZW9mKGZ3X2NmZykpOworCisJ aWYgKGZ3X2NmZy5pZGVudGl0eSAhPSAoJ0YnIHwgKCdXJyA8PCA4KSB8ICgnQycgPDwgMTYpIHwg KCdUJyA8PCAyNCkpKSB7CisJCWRldl9pbmZvKGRldiwgIm5vdCBhIHNpZ25lZCBpbWFnZVxuIik7 CisJCWdvdG8gbm90X3NpZ25lZF9mdzsKKwl9CisJZW9mID0gZnctPmRhdGEgKyBmdy0+c2l6ZSAt IHNpemVvZihmd19jZmcpIC0gc2l6ZW9mKGZ3X2NmZ19zaWcpOworCisJbWVtY3B5KCh1aW50OF90 ICopJmZ3X2NmZ19zaWcsCisJICAgICAgIGZ3LT5kYXRhICsgZnctPnNpemUgLSBzaXplb2YoZndf Y2ZnX3NpZyksIHNpemVvZihmd19jZmdfc2lnKSk7CisKKwkvKiBmbGFzaCBmdyBjb25maWcgdGFi bGUgYW5kIHNpZ25hdHVyZSBmaXJzdCAqLworCWVyciA9IGNjZ19jbWRfd3JpdGVfZmxhc2hfcm93 KHVjLCAwLCAodTggKikmZndfY2ZnLAorCQkJCSAgICAgIEZMQVNIX0ZXQ1QxX1dSX0NNRCk7CisJ aWYgKGVycikKKwkJZ290byByZWxlYXNlX2Z3OworCisJZXJyID0gY2NnX2NtZF93cml0ZV9mbGFz aF9yb3codWMsIDAsICh1OCAqKSZmd19jZmcgKyBDQ0c0X1JPV19TSVpFLAorCQkJCSAgICAgIEZM QVNIX0ZXQ1QyX1dSX0NNRCk7CisJaWYgKGVycikKKwkJZ290byByZWxlYXNlX2Z3OworCisJZXJy ID0gY2NnX2NtZF93cml0ZV9mbGFzaF9yb3codWMsIDAsICZmd19jZmdfc2lnLAorCQkJCSAgICAg IEZMQVNIX0ZXQ1RfU0lHX1dSX0NNRCk7CisJaWYgKGVycikKKwkJZ290byByZWxlYXNlX2Z3Owor Citub3Rfc2lnbmVkX2Z3OgorCXdyX2J1ZiA9IGt6YWxsb2MoQ0NHNF9ST1dfU0laRSArIDQsIEdG UF9LRVJORUwpOworCWlmICghd3JfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IGNj Z19jbWRfZW50ZXJfZmxhc2hpbmcodWMpOworCWlmIChlcnIpCisJCWdvdG8gcmVsZWFzZV9tZW07 CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKKwkgKiBDQ0cgZmlybXdhcmUgaW1hZ2UgKC5jeWFjZCkgZmlsZSBsaW5l IGZvcm1hdAorCSAqCisJICogOjAwcnJycmxsbGxbZGQuLi4uXWNjL3IvbgorCSAqCisJICogOjAw ICAgaGVhZGVyCisJICogcnJyciBpcyByb3cgbnVtYmVyIHRvIGZsYXNoCQkJCSg0IGNoYXIpCisJ ICogbGxsbCBpcyBkYXRhIGxlbiB0byBmbGFzaAkJCQkoNCBjaGFyKQorCSAqIGRkICAgaXMgYSBk YXRhIGZpZWxkIHJlcHJlc2VudHMgb25lIGJ5dGUgb2YgZGF0YQkoNTEyIGNoYXIpCisJICogY2Mg ICBpcyBjaGVja3N1bQkJCQkJKDIgY2hhcikKKwkgKiBcclxuIG5ld2xpbmUKKwkgKgorCSAqIFRv dGFsIGxlbmd0aDogMyArIDQgKyA0ICsgNTEyICsgMiArIDIgPSA1MjcKKwkgKgorCSAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Ki8KKworCXAgPSBzdHJuY2hyKGZ3LT5kYXRhLCBmdy0+c2l6ZSwgJzonKTsKKwl3aGlsZSAocCA8 IGVvZikgeworCQlzID0gc3RybmNocihwICsgMSwgZW9mIC0gcCAtIDEsICc6Jyk7CisKKwkJaWYg KCFzKQorCQkJcyA9IGVvZjsKKworCQlsaW5lX3N6ID0gcyAtIHA7CisKKwkJaWYgKGxpbmVfc3og IT0gQ1lBQ0RfTElORV9TSVpFKSB7CisJCQlkZXZfZXJyKGRldiwgIkJhZCBGVyBmb3JtYXQgbGlu ZV9zej0lZFxuIiwgbGluZV9zeik7CisJCQllcnIgPSAgLUVJTlZBTDsKKwkJCWdvdG8gcmVsZWFz ZV9tZW07CisJCX0KKworCQlpZiAoaGV4MmJpbih3cl9idWYsIHAgKyAzLCBDQ0c0X1JPV19TSVpF ICsgNCkpIHsKKwkJCWVyciA9ICAtRUlOVkFMOworCQkJZ290byByZWxlYXNlX21lbTsKKwkJfQor CisJCXJvdyA9IGdldF91bmFsaWduZWRfYmUxNih3cl9idWYpOworCQlsZW4gPSBnZXRfdW5hbGln bmVkX2JlMTYoJndyX2J1ZlsyXSk7CisKKwkJaWYgKGxlbiAhPSBDQ0c0X1JPV19TSVpFKSB7CisJ CQllcnIgPSAgLUVJTlZBTDsKKwkJCWdvdG8gcmVsZWFzZV9tZW07CisJCX0KKworCQllcnIgPSBj Y2dfY21kX3dyaXRlX2ZsYXNoX3Jvdyh1Yywgcm93LCB3cl9idWYgKyA0LAorCQkJCQkgICAgICBG TEFTSF9XUl9DTUQpOworCQlpZiAoZXJyKQorCQkJZ290byByZWxlYXNlX21lbTsKKworCQlsaW5l X2NudCsrOworCQlwID0gczsKKwl9CisKKwlkZXZfaW5mbyhkZXYsICJ0b3RhbCAlZCByb3cgZmxh c2hlZC4gdGltZTogJWRtc1xuIiwKKwkJIGxpbmVfY250LCBqaWZmaWVzX3RvX21zZWNzKGppZmZp ZXMgLSBzdGFydF90aW1lKSk7CisKKwllcnIgPSBjY2dfY21kX3ZhbGlkYXRlX2Z3KHVjLCAobW9k ZSA9PSBQUklNQVJZKSA/IEZXMiA6ICBGVzEpOworCWlmIChlcnIpCisJCWRldl9lcnIoZGV2LCAi JXMgdmFsaWRhdGlvbiBmYWlsZWQgZXJyPSVkXG4iLAorCQkJKG1vZGUgPT0gUFJJTUFSWSkgPyAi RlcyIiA6ICAiRlcxIiwgZXJyKTsKKwllbHNlCisJCWRldl9pbmZvKGRldiwgIiVzIHZhbGlkYXRl ZFxuIiwKKwkJCSAobW9kZSA9PSBQUklNQVJZKSA/ICJGVzIiIDogICJGVzEiKTsKKworCWVyciA9 IGNjZ19jbWRfcG9ydF9jb250cm9sKHVjLCBmYWxzZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8g cmVsZWFzZV9tZW07CisKKwllcnIgPSBjY2dfY21kX3Jlc2V0KHVjKTsKKwlpZiAoZXJyIDwgMCkK KwkJZ290byByZWxlYXNlX21lbTsKKworCWVyciA9IGNjZ19jbWRfcG9ydF9jb250cm9sKHVjLCB0 cnVlKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byByZWxlYXNlX21lbTsKKworcmVsZWFzZV9tZW06 CisJa2ZyZWUod3JfYnVmKTsKKworcmVsZWFzZV9mdzoKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsK KwlyZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ0NHNCBoYXMg dHdvIGNvcGllcyBvZiB0aGUgZmlybXdhcmUgaW4gYWRkaXRpb24gdG8gdGhlIGJvb3Rsb2FkZXIu CisgKiBJZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgRlcxLCBGVzIgY2FuIGJlIHVwZGF0ZWQgd2l0 aCB0aGUgbmV3IHZlcnNpb24uCisgKiBEdWFsIGZpcm13YXJlIG1vZGUgYWxsb3dzIHRoZSBDQ0cg ZGV2aWNlIHRvIHN0YXkgaW4gYSBQRCBjb250cmFjdCBhbmQgc3VwcG9ydAorICogVVNCIFBEIGFu ZCBUeXBlLUMgZnVuY3Rpb25hbGl0eSB3aGlsZSBhIGZpcm13YXJlIHVwZGF0ZSBpcyBpbiBwcm9n cmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGNjZ19md191cGRhdGUo c3RydWN0IHVjc2lfY2NnICp1YywgZW51bSBlbnVtX2ZsYXNoX21vZGUgZmxhc2hfbW9kZSkKK3sK KwlpbnQgZXJyOworCisJd2hpbGUgKGZsYXNoX21vZGUgIT0gRkxBU0hfTk9UX05FRURFRCkgewor CQllcnIgPSBkb19mbGFzaCh1YywgZmxhc2hfbW9kZSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0 dXJuIGVycjsKKwkJZXJyID0gY2NnX2Z3X3VwZGF0ZV9uZWVkZWQodWMsICZmbGFzaF9tb2RlKTsK KwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlkZXZfaW5mbyh1Yy0+ZGV2LCAi Q0NHIEZXIHVwZGF0ZSBzdWNjZXNzZnVsXG4iKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp YyBpbnQgY2NnX3Jlc3RhcnQoc3RydWN0IHVjc2lfY2NnICp1YykKK3sKKwlzdHJ1Y3QgZGV2aWNl ICpkZXYgPSB1Yy0+ZGV2OworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSB1Y3NpX2NjZ19pbml0 KHVjKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZXJyKGRldiwgInVjc2lfY2NnX3N0YXJ0 IGZhaWwsIGVycj0lZFxuIiwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0 dXMgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh1Yy0+aXJxLCBOVUxMLCBjY2dfaXJxX2hhbmRsZXIs CisJCQkJICAgICAgSVJRRl9PTkVTSE9UIHwgSVJRRl9UUklHR0VSX0hJR0gsCisJCQkJICAgICAg ZGV2X25hbWUoZGV2KSwgdWMpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAi cmVxdWVzdF90aHJlYWRlZF9pcnEgZmFpbGVkIC0gJWRcbiIsIHN0YXR1cyk7CisJCXJldHVybiBz dGF0dXM7CisJfQorCisJdWMtPnVjc2kgPSB1Y3NpX3JlZ2lzdGVyX3BwbShkZXYsICZ1Yy0+cHBt KTsKKwlpZiAoSVNfRVJSKHVjLT51Y3NpKSkgeworCQlkZXZfZXJyKHVjLT5kZXYsICJ1Y3NpX3Jl Z2lzdGVyX3BwbSBmYWlsZWRcbiIpOworCQlyZXR1cm4gUFRSX0VSUih1Yy0+dWNzaSk7CisJfQor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNjZ191cGRhdGVfZmlybXdhcmUoc3RydWN0 IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB1Y3NpX2NjZyAqdWMgPSBjb250YWluZXJf b2Yod29yaywgc3RydWN0IHVjc2lfY2NnLCB3b3JrKTsKKwllbnVtIGVudW1fZmxhc2hfbW9kZSBm bGFzaF9tb2RlOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBjY2dfZndfdXBkYXRlX25lZWRl ZCh1YywgJmZsYXNoX21vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm47CisKKwlpZiAo Zmxhc2hfbW9kZSAhPSBGTEFTSF9OT1RfTkVFREVEKSB7CisJCXVjc2lfdW5yZWdpc3Rlcl9wcG0o dWMtPnVjc2kpOworCQlmcmVlX2lycSh1Yy0+aXJxLCB1Yyk7CisKKwkJY2NnX2Z3X3VwZGF0ZSh1 YywgZmxhc2hfbW9kZSk7CisJCWNjZ19yZXN0YXJ0KHVjKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6 ZV90IGRvX2ZsYXNoX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBk ZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qg bikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsID0gdG9faTJjX2NsaWVudChkZXYpOwor CXN0cnVjdCB1Y3NpX2NjZyAqdWMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjX2NsKTsKKwl1bnNp Z25lZCBpbnQgbW9kZTsKKworCWlmIChrc3RydG91aW50KGJ1ZiwgMTAsICZtb2RlKSkKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwlpZiAobW9kZSkKKwkJc2NoZWR1bGVfd29yaygmdWMtPndvcmspOwor CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRvX2ZsYXNoX3Nob3coc3RydWN0IGRl dmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAq YnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIltVc2FnZV1cbiIKKwkJIjEpIGNvcHkgY2Nn X2Jvb3QuY3lhY2QgL2xpYi9maXJtd2FyZS9cbiIKKwkJIjIpIGNvcHkgY2NnX3ByaW1hcnkuY3lh Y2QgL2xpYi9maXJtd2FyZS9cbiIKKwkJIjMpIGNvcHkgY2NnX3NlY29uZGFyeS5jeWFjZCAvbGli L2Zpcm13YXJlL1xuIgorCQkiNCkgZWNobyAxID4gZG9fZmxhc2hcbiIpOworfQorCitzdGF0aWMg REVWSUNFX0FUVFJfUlcoZG9fZmxhc2gpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqCit1 Y3NpX2NjZ19zeXNmc19hdHRyc1tdID0geworCSZkZXZfYXR0cl9kb19mbGFzaC5hdHRyLAorCU5V TEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cAordWNzaV9jY2dfYXR0cl9n cm91cCA9IHsKKwkuYXR0cnMgPSB1Y3NpX2NjZ19zeXNmc19hdHRycywKK307CisKIHN0YXRpYyBp bnQgdWNzaV9jY2dfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgY29uc3Qg c3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewpAQCAtMjk2LDYgKzEwODIsOCBAQCBzdGF0aWMg aW50IHVjc2lfY2NnX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJdWMtPnBwbS5z eW5jID0gdWNzaV9jY2dfc3luYzsKIAl1Yy0+ZGV2ID0gZGV2OwogCXVjLT5jbGllbnQgPSBjbGll bnQ7CisJbXV0ZXhfaW5pdCgmdWMtPmxvY2spOworCUlOSVRfV09SSygmdWMtPndvcmssIGNjZ191 cGRhdGVfZmlybXdhcmUpOwogCiAJLyogcmVzZXQgY2NnIGRldmljZSBhbmQgaW5pdGlhbGl6ZSB1 Y3NpICovCiAJc3RhdHVzID0gdWNzaV9jY2dfaW5pdCh1Yyk7CkBAIC0zMTAsMTUgKzEwOTgsMjEg QEAgc3RhdGljIGludCB1Y3NpX2NjZ19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAog CQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCXN0YXR1cyA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9p cnEoZGV2LCBjbGllbnQtPmlycSwgTlVMTCwKLQkJCQkJICAgY2NnX2lycV9oYW5kbGVyLAotCQkJ CQkgICBJUlFGX09ORVNIT1QgfCBJUlFGX1RSSUdHRVJfSElHSCwKLQkJCQkJICAgZGV2X25hbWUo ZGV2KSwgdWMpOworCXVjLT5wb3J0X251bSA9IDE7CisKKwlpZiAodWMtPmluZm8ubW9kZSAmIEND R19ERVZJTkZPX1BEUE9SVFNfTUFTSykKKwkJdWMtPnBvcnRfbnVtKys7CisKKwlzdGF0dXMgPSBy ZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwgTlVMTCwgY2NnX2lycV9oYW5kbGVyLAor CQkJCSAgICAgIElSUUZfT05FU0hPVCB8IElSUUZfVFJJR0dFUl9ISUdILAorCQkJCSAgICAgIGRl dl9uYW1lKGRldiksIHVjKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkZXZfZXJyKHVjLT5kZXYs ICJyZXF1ZXN0X3RocmVhZGVkX2lycSBmYWlsZWQgLSAlZFxuIiwgc3RhdHVzKTsKIAkJcmV0dXJu IHN0YXR1czsKIAl9CiAKKwl1Yy0+aXJxID0gY2xpZW50LT5pcnE7CisKIAl1Yy0+dWNzaSA9IHVj c2lfcmVnaXN0ZXJfcHBtKGRldiwgJnVjLT5wcG0pOwogCWlmIChJU19FUlIodWMtPnVjc2kpKSB7 CiAJCWRldl9lcnIodWMtPmRldiwgInVjc2lfcmVnaXN0ZXJfcHBtIGZhaWxlZFxuIik7CkBAIC0z MzUsNiArMTEyOSwxMSBAQCBzdGF0aWMgaW50IHVjc2lfY2NnX3Byb2JlKHN0cnVjdCBpMmNfY2xp ZW50ICpjbGllbnQsCiAJfQogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdWMpOworCisJ c3RhdHVzID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ1Yy0+ZGV2LT5rb2JqLCAmdWNzaV9jY2dfYXR0 cl9ncm91cCk7CisJaWYgKHN0YXR1cykKKwkJZGV2X2Vycih1Yy0+ZGV2LCAiY2Fubm90IGNyZWF0 ZSBzeXNmcyBncm91cDogJWRcbiIsIHN0YXR1cyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQy LDcgKzExNDEsMTAgQEAgc3RhdGljIGludCB1Y3NpX2NjZ19yZW1vdmUoc3RydWN0IGkyY19jbGll bnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgdWNzaV9jY2cgKnVjID0gaTJjX2dldF9jbGllbnRkYXRh KGNsaWVudCk7CiAKKwljYW5jZWxfd29ya19zeW5jKCZ1Yy0+d29yayk7CiAJdWNzaV91bnJlZ2lz dGVyX3BwbSh1Yy0+dWNzaSk7CisJZnJlZV9pcnEodWMtPmlycSwgdWMpOworCXN5c2ZzX3JlbW92 ZV9ncm91cCgmdWMtPmRldi0+a29iaiwgJnVjc2lfY2NnX2F0dHJfZ3JvdXApOwogCiAJcmV0dXJu IDA7CiB9Cg==