From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alan Cox Subject: Re: PATCH: Add support for IT8212 IDE controllers Date: Mon, 02 Aug 2004 00:05:24 +0100 Sender: linux-ide-owner@vger.kernel.org Message-ID: <1091401522.31305.0.camel@localhost.localdomain> References: <20040731232227.GA28455@devserv.devel.redhat.com> <200408012022.42516.ianh@iahastie.local.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-ku2X0uBFfx26/lJ9XND+" Return-path: Received: from the-village.bc.nu ([81.2.110.252]:15282 "EHLO localhost.localdomain") by vger.kernel.org with ESMTP id S266207AbUHBAH7 (ORCPT ); Sun, 1 Aug 2004 20:07:59 -0400 In-Reply-To: <200408012022.42516.ianh@iahastie.local.net> List-Id: linux-ide@vger.kernel.org To: Ian Hastie Cc: Linux Kernel Mailing List , linux-ide@vger.kernel.org, Alan Cox --=-ku2X0uBFfx26/lJ9XND+ Content-Type: text/plain Content-Transfer-Encoding: 7bit Ok try this --=-ku2X0uBFfx26/lJ9XND+ Content-Disposition: inline; filename=it8212.c Content-Transfer-Encoding: base64 Content-Type: text/x-csrc; name=it8212.c; charset=UTF-8 LyoNCiAqIGxpbnV4L2RyaXZlcnMvaWRlL3BjaS9pdDgyMTIuYwkJVmVyc2lvbiAwLjAyCUF1Z3Vz dCAyMDA0DQogKg0KICogQ29weXJpZ2h0IChDKSAyMDA0CQlSZWQgSGF0IDxhbGFuQHJlZGhhdC5j b20+DQogKg0KICogIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KICoNCiAqICBEb2N1bWVudGF0aW9uIGF2 YWlsYWJsZSBmcm9tDQogKiAJaHR0cDovL3d3dy5pdGUuY29tLnR3L3BjL0lUODIxMkZfVjA0LnBk Zg0KICoNCiAqICBUaGUgSVRFODIxMiBpc24ndCBleGFjdGx5IGEgc3RhbmRhcmQgSURFIGNvbnRy b2xsZXIuIEl0IGhhcyB0d28NCiAqICBtb2Rlcy4gSW4gcGFzcyB0aHJvdWdoIG1vZGUgdGhlbiBp dCBpcyBhbiBJREUgY29udHJvbGxlci4gSW4gaXRzIHNtYXJ0DQogKiAgbW9kZSBpdHMgYWN0dWFs bHkgcXVpdGUgYSBjYXBhYmxlIGhhcmR3YXJlIHJhaWQgY29udHJvbGxlciBkaXNndWlzZWQNCiAq ICBhcyBhbiBJREUgY29udHJvbGxlci4NCiAqDQogKiAgRXJyYXRhOg0KICoJUmV2IDB4MTAgYWxz byByZXF1aXJlcyBtYXN0ZXIvc2xhdmUgdXNlIHRoZSBzYW1lIFVETUEgdGltaW5nIGFuZA0KICoJ Y2Fubm90IGRvIEFUQVBJIERNQSwgd2hpbGUgdGhlIG90aGVyIHJldmlzaW9ucyBjYW4gZG8gQVRB UEkgVURNQQ0KICoJYnV0IG5vdCBNV0RNQS4NCiAqDQogKiAgVGhpcyBoYXMgYSBmZXcgaW1wYWN0 cyBvbiB0aGUgZHJpdmVyDQogKiAgLSBJbiBwYXNzIHRocm91Z2ggbW9kZSB3ZSBkbyBhbGwgdGhl IHdvcmsgeW91IHdvdWxkIGV4cGVjdA0KICogIC0gSW4gc21hcnQgbW9kZSB0aGUgY2xvY2tpbmcg c2V0IHVwIGlzIGRvbmUgYnkgdGhlIGNvbnRyb2xsZXIgZ2VuZXJhbGx5DQogKiAgLSBUaGVyZSBh cmUgYSBmZXcgZXh0cmEgdmVuZG9yIGNvbW1hbmRzIHRoYXQgYWN0dWFsbHkgdGFsayB0byB0aGUg DQogKiAgICBjb250cm9sbGVyIGJ1dCBvbmx5IHdvcmsgUElPIHdpdGggbm8gSVJRLg0KICoNCiAq ICBWZW5kb3IgYXJlYXMgb2YgdGhlIGlkZW50aWZ5IGJsb2NrIGluIHNtYXJ0IG1vZGUgYXJlIHVz ZWQgZm9yIHRoZQ0KICogIHRpbWluZyBhbmQgcG9saWN5IHNldCB1cC4gRWFjaCBIREQgaW4gcmFp ZCBtb2RlIGFsc28gaGFzIGEgc2VyaWFsDQogKiAgYmxvY2sgb24gdGhlIGRpc2suIFRoZSBoYXJk d2FyZSBleHRyYSBjb21tYW5kcyBhcmUgZ2V0L3NldCBjaGlwIHN0YXR1cywNCiAqICByZWJ1aWxk LCBnZXQgcmVidWlsZCBzdGF0dXMuDQogKg0KICogIEluIExpbnV4IHRoZSBkcml2ZXIgc3VwcG9y dHMgcGFzcyB0aHJvdWdoIG1vZGUgYXMgaWYgdGhlIGRldmljZSB3YXMNCiAqICBqdXN0IGFub3Ro ZXIgSURFIGNvbnRyb2xsZXIuIElmIHRoZSBzbWFydCBtb2RlIGlzIHJ1bm5pbmcgdGhlbg0KICog IHZvbHVtZXMgYXJlIG1hbmFnZWQgYnkgdGhlIGNvbnRyb2xsZXIgZmlybXdhcmUgYW5kIGVhY2gg SURFICJkaXNrIg0KICogIGlzIGEgcmFpZCB2b2x1bWUuIEV2ZW4gbW9yZSBjdXRlIC0gdGhlIGNv bnRyb2xsZXIgY2FuIGRvIGF1dG9tYXRlZA0KICogIGhvdHBsdWcgYW5kIHJlYnVpbGQuDQogKg0K ICogIFRoZSBwYXNzIHRocm91Z2ggY29udHJvbGxlciBpdHNlbGYgaXMgYSBsaXR0bGUgZGVtZW50 ZWQuIEl0IGhhcyBhDQogKiAgZmxhdyB0aGF0IGl0IGhhcyBhIHNpbmdsZSBzZXQgb2YgUElPL01X RE1BIHRpbWluZ3MgcGVyIGNoYW5uZWwgc28NCiAqICBub24gVURNQSBkZXZpY2VzIHJlc3RyaWN0 IGVhY2ggb3RoZXJzIHBlcmZvcm1hbmNlLiBJdCBhbHNvIGhhcyBhIA0KICogIHNpbmdsZSBjbG9j ayBzb3VyY2UgcGVyIGNoYW5uZWwgc28gbWl4ZWQgVURNQTEwMC8xMzMgcGVyZm9ybWFuY2UNCiAq ICBpc24ndCBwZXJmZWN0IGFuZCB3ZSBoYXZlIHRvIHBpY2sgYSBjbG9jay4gVGhhbmtmdWxseSBu b25lIG9mIHRoaXMNCiAqICBtYXR0ZXJzIGluIHNtYXJ0IG1vZGUuIEFUQVBJIERNQSBpcyBub3Qg c3VwcG9ydGVkLiANCiAqDQogKiAgVE9ETw0KICoJLQlSZXYgMHgxMCBpbiBwYXNzIHRocm91Z2gg bW9kZSBuZWVkcyBVRE1BIGNsb2NrIHdoYWNraW5nDQogKgkJdG8gd29yayBhcm91bmQgaC93IGlz c3Vlcw0KICoJLQlJcyByZXYgMHgxMCBvdXQgYW55d2hlcmUgLSB0ZXN0IGl0IGlmIHNvDQogKgkt CU1vcmUgdGVzdGluZw0KICoJLQlGaW5kIGFuIElubm92aXNpb24gODQwMUQgciBSIGJvYXJkIHNv bWV3aGVyZSB0byB0ZXN0IHRoYXQNCiAqCS0JU2VlIGlmIHdlIGNhbiBraWNrIHRoZSBjaGVhcG8g Ym9hcmQgaW50byBzbWFydCBtb2RlDQogKgkJb3Vyc2VsdmVzIDgpDQogKgktCUFUQVBJIFVETUEg aXMgb2sgYnV0IG5vdCBNV0RNQSBpdCBzZWVtcw0KICoJLQlSQUlEIGNvbmZpZ3VyYXRpb24gaW9j dGxzDQogKi8NCiANCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4NCiNpbmNsdWRlIDxsaW51eC90 eXBlcy5oPg0KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KI2luY2x1ZGUgPGxpbnV4L3BjaS5o Pg0KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+DQojaW5jbHVkZSA8bGludXgvaGRyZWcuaD4NCiNp bmNsdWRlIDxsaW51eC9pZGUuaD4NCiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+DQoNCiNpbmNsdWRl IDxhc20vaW8uaD4NCg0Kc3RydWN0IGl0ODIxMl9kZXYNCnsNCglpbnQJc21hcnQ6MSwJCS8qIEFy ZSB3ZSBpbiBzbWFydCByYWlkIG1vZGUgKi8NCgkJdGltaW5nMTA6MTsJCS8qIFJldiAweDEwICov DQoJdTgJY2xvY2tfbW9kZTsJCS8qIDAsIEFUQV81MCBvciBBVEFfNjYgKi8NCgl1OAl3YW50WzJd WzJdOwkJLyogTW9kZS9QcmkgbG9nIGZvciBtYXN0ZXIgc2xhdmUgKi8NCgkvKiBXZSBuZWVkIHRo ZXNlIGZvciBzd2l0Y2hpbmcgdGhlIGNsb2NrIHdoZW4gRE1BIGdvZXMgb24vb2ZmIA0KCSAgIFRo ZSBoaWdoIGJ5dGUgaXMgdGhlIDY2TWh6IHRpbWluZyAqLw0KCXUxNglwaW9bMl07CQkJLyogQ2Fj aGVkIFBJTyB2YWx1ZXMgKi8NCgl1MTYJbXdkbWFbMl07CQkvKiBDYWNoZWQgTVdETUEgdmFsdWVz ICovDQoJdTE2CXVkbWFbMl07CQkvKiBDYWNoZWQgVURNQSB2YWx1ZXMgKHBlciBkcml2ZSkgKi8N Cn07DQoNCiNkZWZpbmUgQVRBXzY2CQkwDQojZGVmaW5lIEFUQV81MAkJMQ0KI2RlZmluZSBBVEFf QU5ZCQkyDQoNCiNkZWZpbmUgVURNQV9PRkYJMA0KI2RlZmluZSBNV0RNQV9PRkYJMA0KDQoNCi8q Kg0KICoJaXQ4MjEyX3Byb2dyYW0JLQlwcm9ncmFtIHRoZSBQSU8vTVdETUEgcmVnaXN0ZXJzDQog KglAZHJpdmU6IGRyaXZlIHRvIHR1bmUNCiAqDQogKglQcm9ncmFtIHRoZSBQSU8vTVdETUEgdGlt aW5nIGZvciB0aGlzIGNoYW5uZWwgYWNjb3JkaW5nIHRvIHRoZQ0KICoJY3VycmVudCBjbG9jay4N CiAqLw0KIA0Kc3RhdGljIHZvaWQgaXQ4MjEyX3Byb2dyYW0oaWRlX2RyaXZlX3QgKmRyaXZlLCB1 MTYgdGltaW5nKQ0Kew0KCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsNCglzdHJ1Y3Qg aXQ4MjEyX2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOw0KCWludCBjaGFubmVs ID0gaHdpZi0+Y2hhbm5lbDsNCgl1OCBjb25mOw0KCQ0KCS8qIFByb2dyYW0gUElPL01XRE1BIHRp bWluZyBiaXRzICovDQoJaWYoaXRkZXYtPmNsb2NrX21vZGUgPT0gQVRBXzY2KQ0KCQljb25mID0g dGltaW5nID4+IDg7DQoJZWxzZQkNCgkJY29uZiA9IHRpbWluZyAmIDB4RkY7DQoJcGNpX3dyaXRl X2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTQgKyA0ICogY2hhbm5lbCwgY29uZik7DQp9 DQoNCi8qKg0KICoJaXQ4MjEyX3Byb2dyYW0JLQlwcm9ncmFtIHRoZSBQSU8vTVdETUEgcmVnaXN0 ZXJzDQogKglAZHJpdmU6IGRyaXZlIHRvIHR1bmUNCiAqDQogKglQcm9ncmFtIHRoZSBVRE1BIHRp bWluZyBmb3IgdGhpcyBkcml2ZSBhY2NvcmRpbmcgdG8gdGhlDQogKgljdXJyZW50IGNsb2NrLg0K ICovDQogDQpzdGF0aWMgdm9pZCBpdDgyMTJfcHJvZ3JhbV91ZG1hKGlkZV9kcml2ZV90ICpkcml2 ZSwgdTE2IHRpbWluZykNCnsNCglpZGVfaHdpZl90ICpod2lmCT0gSFdJRihkcml2ZSk7DQoJc3Ry dWN0IGl0ODIxMl9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsNCglpbnQgY2hh bm5lbCA9IGh3aWYtPmNoYW5uZWw7DQoJaW50IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsN Cgl1OCBjb25mOw0KCQ0KCS8qIFByb2dyYW0gVURNQSB0aW1pbmcgYml0cyAqLw0KCWlmKGl0ZGV2 LT5jbG9ja19tb2RlID09IEFUQV82NikNCgkJY29uZiA9IHRpbWluZyA+PiA4Ow0KCWVsc2UNCgkJ Y29uZiA9IHRpbWluZyAmIDB4RkY7DQoJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9k ZXYsIDB4NTYgKyA0ICogY2hhbm5lbCArIHVuaXQsIGNvbmYpOw0KfQ0KDQoNCi8qKg0KICoJaXQ4 MjEyX2Nsb2NrX3N0cmF0ZWd5DQogKglAaHdpZjogaGFyZHdhcmUgaW50ZXJmYWNlDQogKg0KICoJ U2VsZWN0IGJldHdlZW4gdGhlIDUwIGFuZCA2Nk1oeiBiYXNlIGNsb2NrcyB0byBnZXQgdGhlIGJl c3QNCiAqCXJlc3VsdHMgZm9yIHRoaXMgaW50ZXJmYWNlLg0KICovDQogDQpzdGF0aWMgdm9pZCBp dDgyMTJfY2xvY2tfc3RyYXRlZ3koaWRlX2RyaXZlX3QgKmRyaXZlKQ0Kew0KCWlkZV9od2lmX3Qg Kmh3aWYgPSBIV0lGKGRyaXZlKTsNCglzdHJ1Y3QgaXQ4MjEyX2RldiAqaXRkZXYgPSBpZGVfZ2V0 X2h3aWZkYXRhKGh3aWYpOw0KDQoJdTggdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0Ow0KCWlk ZV9kcml2ZV90ICpwYWlyID0gJmh3aWYtPmRyaXZlc1sxLXVuaXRdOw0KDQoJaW50IGNsb2NrLCBh bHRjbG9jazsNCgl1OCB2Ow0KCWludCBzZWwgPSAwOw0KDQoJaWYoaXRkZXYtPndhbnRbMF1bMF0g PiBpdGRldi0+d2FudFsxXVswXSkNCgl7DQoJCWNsb2NrID0gaXRkZXYtPndhbnRbMF1bMV07DQoJ CWFsdGNsb2NrID0gaXRkZXYtPndhbnRbMV1bMV07DQoJfQ0KCWVsc2UNCgl7DQoJCWNsb2NrID0g aXRkZXYtPndhbnRbMV1bMV07DQoJCWFsdGNsb2NrID0gaXRkZXYtPndhbnRbMF1bMV07DQoJfQ0K DQoJLyogTWFzdGVyIGRvZXNuJ3QgY2FyZSBkb2VzIHRoZSBzZWNvbmRhcnkgPyAqLw0KCWlmKGNs b2NrID09IEFUQV9BTlkpDQoJCWNsb2NrID0gYWx0Y2xvY2s7DQoJCQ0KCS8qIE5vYm9keSBjYXJl cyAtIGtlZXAgdGhlIHNhbWUgY2xvY2sgKi8NCglpZihjbG9jayA9PSBBVEFfQU5ZKQ0KCQlyZXR1 cm47DQoJLyogTm8gY2hhbmdlICovDQoJaWYoY2xvY2sgPT0gaXRkZXYtPmNsb2NrX21vZGUpDQoJ CXJldHVybjsNCgkJDQoJLyogTG9hZCB0aGlzIGludG8gdGhlIGNvbnRyb2xsZXIgPyAqLw0KCWlm KGNsb2NrID09IEFUQV82NikNCgkJaXRkZXYtPmNsb2NrX21vZGUgPSBBVEFfNjY7DQoJZWxzZQ0K CXsNCgkJaXRkZXYtPmNsb2NrX21vZGUgPSBBVEFfNTA7DQoJCXNlbCA9IDE7DQoJfQ0KCXBjaV9y ZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTAsICZ2KTsNCgl2ICY9IH4oMSA8PCAo MSArIGh3aWYtPmNoYW5uZWwpKTsNCgl2IHw9IHNlbCA8PCAoMSArIGh3aWYtPmNoYW5uZWwpOw0K CXBjaV93cml0ZV9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDUwLCB2KTsNCglwcmludGso S0VSTl9JTkZPICJpdDgyMTI6IHNlbGVjdGVkICVkTUh6IGNsb2NrLlxuIiwgaXRkZXYtPmNsb2Nr X21vZGUgPT0gQVRBXzY2PzY2OjUwKTsNCgkNCgkvKg0KCSAqCVJlcHJvZ3JhbSB0aGUgVURNQS9Q SU8gb2YgdGhlIHBhaXIgZHJpdmUgZm9yIHRoZSBzd2l0Y2gNCgkgKglNV0RNQSB3aWxsIGJlIGRl YWx0IHdpdGggYnkgdGhlIGRtYSBzd2l0Y2hlcg0KCSAqLw0KCWlmKHBhaXIgJiYgaXRkZXYtPnVk bWFbMS11bml0XSAhPSBVRE1BX09GRikNCgl7DQoJCWl0ODIxMl9wcm9ncmFtX3VkbWEocGFpciwg aXRkZXYtPnVkbWFbMS11bml0XSk7DQoJCWl0ODIxMl9wcm9ncmFtKHBhaXIsIGl0ZGV2LT5waW9b MS11bml0XSk7DQoJfQ0KCS8qDQoJICoJUmVwcm9ncmFtIHRoZSBVRE1BL1BJTyBvZiBvdXIgZHJp dmUgZm9yIHRoZSBzd2l0Y2guDQoJICoJTVdETUEgd2lsbCBiZSBkZWFsdCB3aXRoIGJ5IHRoZSBk bWEgc3dpdGNoZXINCgkgKi8NCglpZihpdGRldi0+dWRtYVt1bml0XSAhPSBVRE1BX09GRikNCgl7 DQoJCWl0ODIxMl9wcm9ncmFtX3VkbWEoZHJpdmUsIGl0ZGV2LT51ZG1hW3VuaXRdKTsNCgkJaXQ4 MjEyX3Byb2dyYW0oZHJpdmUsIGl0ZGV2LT5waW9bdW5pdF0pOw0KCX0NCn0NCg0KLyoqDQogKglp dDgyMTJfcmF0ZW1hc2sJLQlDb21wdXRlIGF2YWlsYWJsZSBtb2Rlcw0KICoJQGRyaXZlOiBJREUg ZHJpdmUNCiAqDQogKglDb21wdXRlIHRoZSBhdmFpbGFibGUgc3BlZWRzIGZvciB0aGUgZGV2aWNl cyBvbiB0aGUgaW50ZXJmYWNlLiBUaGlzDQogKglpcyBhbGwgbW9kZXMgdG8gQVRBMTMzIGNsaXBw ZWQgYnkgZHJpdmUgY2FibGUgc2V0dXAuDQogKi8NCiANCnN0YXRpYyBieXRlIGl0ODIxMl9yYXRl bWFzayAoaWRlX2RyaXZlX3QgKmRyaXZlKQ0Kew0KCXU4IG1vZGUJPSA0Ow0KCWlmICghZWlnaHR5 X25pbnR5X3RocmVlKGRyaXZlKSkNCgkJbW9kZSA9IG1pbihtb2RlLCAodTgpMSk7DQoJcmV0dXJu IG1vZGU7DQp9DQoNCi8qKg0KICoJaXQ4MjEyX3R1bmVwcm9jCS0JdHVuZSBhIGRyaXZlIA0KICoJ QGRyaXZlOiBkcml2ZSB0byB0dW5lDQogKglAbW9kZV93YW50ZWQ6IHRoZSB0YXJnZXQgb3BlcmF0 aW5nIG1vZGUNCiAqDQogKglMb2FkIHRoZSB0aW1pbmcgc2V0dGluZ3MgZm9yIHRoaXMgZGV2aWNl IG1vZGUgaW50byB0aGUNCiAqCWNvbnRyb2xsZXIuIEJ5IHRoZSB0aW1lIHdlIGFyZSBjYWxsZWQg dGhlIG1vZGUgaGFzIGJlZW4gDQogKgltb2RpZmllZCBhcyBuZWNjZXNzYXJ5IHRvIGhhbmRsZSB0 aGUgYWJzZW5jZSBvZiBzZXBlcmF0ZQ0KICoJbWFzdGVyL3NsYXZlIHRpbWVycyBmb3IgTVdETUEv UElPLg0KICoNCiAqCVRoaXMgY29kZSBpcyBvbmx5IHVzZWQgaW4gcGFzcyB0aHJvdWdoIG1vZGUu DQogKi8NCiANCnN0YXRpYyB2b2lkIGl0ODIxMl90dW5lcHJvYyAoaWRlX2RyaXZlX3QgKmRyaXZl LCBieXRlIG1vZGVfd2FudGVkKQ0Kew0KCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsN CglzdHJ1Y3QgaXQ4MjEyX2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOw0KCWlu dCB1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7DQoJDQoJLyogU3BlYyBzYXlzIDg5IHJlZiBk cml2ZXIgdXNlcyA4OCAqLw0KCXN0YXRpYyB1MTYgcGlvW10JPSB7IDB4QUE4OCwgMHhBMzgyLCAw eEExODEsIDB4MzMzMiwgMHgzMTIxIH07DQoJc3RhdGljIHU4IHBpb193YW50W10gICAgPSB7IEFU QV82NiwgQVRBXzY2LCBBVEFfNjYsIEFUQV82NiwgQVRBX0FOWSB9Ow0KCQ0KCS8qIFdlIHByZWZl ciA2Nk1oeiBjbG9jayBmb3IgUElPIDAtMywgZG9uJ3QgY2FyZSBmb3IgUElPNCAqLw0KCWl0ZGV2 LT53YW50W3VuaXRdWzFdID0gcGlvX3dhbnRbbW9kZV93YW50ZWRdOw0KCWl0ZGV2LT53YW50W3Vu aXRdWzBdID0gMTsJLyogUElPIGlzIGxvd2VzdCBwcmlvcml0eSAqLw0KCWl0ZGV2LT5waW9bdW5p dF0gPSBwaW9bbW9kZV93YW50ZWRdOw0KCWl0ODIxMl9jbG9ja19zdHJhdGVneShkcml2ZSk7DQoJ aXQ4MjEyX3Byb2dyYW0oZHJpdmUsIGl0ZGV2LT5waW9bdW5pdF0pOw0KfQ0KDQovKioNCiAqCWl0 ODIxMl90dW5lX213ZG1hCS0JdHVuZSBhIGNoYW5uZWwgZm9yIE1XRE1BDQogKglAZHJpdmU6IGRy aXZlIHRvIHNldCB1cA0KICoJQG1vZGVfd2FudGVkOiB0aGUgdGFyZ2V0IG9wZXJhdGluZyBtb2Rl DQogKg0KICoJTG9hZCB0aGUgdGltaW5nIHNldHRpbmdzIGZvciB0aGlzIGRldmljZSBtb2RlIGlu dG8gdGhlDQogKgljb250cm9sbGVyIHdoZW4gZG9pbmcgTVdETUEgaW4gcGFzcyB0aHJvdWdoIG1v ZGUuIFRoZSBjYWxsZXINCiAqCW11c3QgbWFuYWdlIHRoZSB3aG9sZSBsYWNrIG9mIHBlciBkZXZp Y2UgTVdETUEvUElPIHRpbWluZ3MgYW5kDQogKgl0aGUgc2hhcmVkIE1XRE1BL1BJTyB0aW1pbmcg cmVnaXN0ZXIuDQogKi8NCiANCnN0YXRpYyB2b2lkIGl0ODIxMl90dW5lX213ZG1hIChpZGVfZHJp dmVfdCAqZHJpdmUsIGJ5dGUgbW9kZV93YW50ZWQpDQp7DQoJaWRlX2h3aWZfdCAqaHdpZgk9IEhX SUYoZHJpdmUpOw0KCXN0cnVjdCBpdDgyMTJfZGV2ICppdGRldiA9ICh2b2lkICopaWRlX2dldF9o d2lmZGF0YShod2lmKTsNCglpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0Ow0KCWludCBj aGFubmVsID0gaHdpZi0+Y2hhbm5lbDsNCgl1OCBjb25mOw0KCQ0KCXN0YXRpYyB1MTYgZG1hW10J PSB7IDB4ODg2NiwgMHgzMjIyLCAweDMxMjEgfTsNCglzdGF0aWMgdTggbXdkbWFfd2FudFtdCT0g eyBBVEFfQU5ZLCBBVEFfNjYsIEFUQV9BTlkgfTsNCgkNCglpdGRldi0+d2FudFt1bml0XVsxXSA9 IG13ZG1hX3dhbnRbbW9kZV93YW50ZWRdOw0KCWl0ZGV2LT53YW50W3VuaXRdWzBdID0gMjsJLyog TVdETUEgaXMgbG93IHByaW9yaXR5ICovDQoJaXRkZXYtPm13ZG1hW3VuaXRdID0gZG1hW21vZGVf d2FudGVkXTsNCglpdGRldi0+dWRtYVt1bml0XSA9IFVETUFfT0ZGOw0KCQ0KCS8qIFVETUEgYml0 cyBvZmYgKi8NCglwY2lfcmVhZF9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDUwLCAmY29u Zik7DQoJY29uZiB8PSAxIDw8ICgzICsgMiAqIGNoYW5uZWwgKyB1bml0KTsNCglwY2lfd3JpdGVf Y29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgMHg1MCwgY29uZik7DQoNCglpdDgyMTJfY2xvY2tf c3RyYXRlZ3koZHJpdmUpOw0KCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIHByb2dyYW0gdGhpcyA/ ICovDQoJaXQ4MjEyX3Byb2dyYW0oZHJpdmUsIGl0ZGV2LT5td2RtYVt1bml0XSk7DQp9DQoNCi8q Kg0KICoJaXQ4MjEyX3R1bmVfdWRtYQktCXR1bmUgYSBjaGFubmVsIGZvciBVRE1BDQogKglAZHJp dmU6IGRyaXZlIHRvIHNldCB1cA0KICoJQG1vZGVfd2FudGVkOiB0aGUgdGFyZ2V0IG9wZXJhdGlu ZyBtb2RlDQogKg0KICoJTG9hZCB0aGUgdGltaW5nIHNldHRpbmdzIGZvciB0aGlzIGRldmljZSBt b2RlIGludG8gdGhlDQogKgljb250cm9sbGVyIHdoZW4gZG9pbmcgVURNQSBtb2RlcyBpbiBwYXNz IHRocm91Z2guDQogKi8NCiANCnN0YXRpYyB2b2lkIGl0ODIxMl90dW5lX3VkbWEgKGlkZV9kcml2 ZV90ICpkcml2ZSwgYnl0ZSBtb2RlX3dhbnRlZCkNCnsNCglpZGVfaHdpZl90ICpod2lmCT0gSFdJ Rihkcml2ZSk7DQoJc3RydWN0IGl0ODIxMl9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YSho d2lmKTsNCglpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0Ow0KCWludCBjaGFubmVsID0g aHdpZi0+Y2hhbm5lbDsNCgl1OCBjb25mOw0KDQoJc3RhdGljIHUxNiB1ZG1hW10JPSB7IDB4NDQz MywgMHg0MjMxLCAweDMxMjEsIDB4MjEyMSwgMHgxMTExLCAweDIyMTEsIDB4MTExMSB9Ow0KCXN0 YXRpYyB1OCB1ZG1hX3dhbnRbXQk9IHsgQVRBX0FOWSwgQVRBXzUwLCBBVEFfQU5ZLCBBVEFfNjYs IEFUQV82NiwgQVRBXzUwLCBBVEFfNjYgfTsNCgkNCglpdGRldi0+d2FudFt1bml0XVsxXSA9IHVk bWFfd2FudFttb2RlX3dhbnRlZF07DQoJaXRkZXYtPndhbnRbdW5pdF1bMF0gPSAzOwkvKiBVRE1B IGlzIGhpZ2ggcHJpb3JpdHkgKi8NCglpdGRldi0+bXdkbWFbdW5pdF0gPSBNV0RNQV9PRkY7DQoJ aXRkZXYtPnVkbWFbdW5pdF0gPSB1ZG1hW21vZGVfd2FudGVkXTsNCglpZihtb2RlX3dhbnRlZCA+ PSA1KQ0KCQlpdGRldi0+dWRtYVt1bml0XSB8PSAweDgwODA7CS8qIFVETUEgNS82IHNlbGVjdCBv biAqLw0KCQkNCgkvKiBVRE1BIG9uICovDQoJcGNpX3JlYWRfY29uZmlnX2J5dGUoaHdpZi0+cGNp X2RldiwgMHg1MCwgJmNvbmYpOw0KCWNvbmYgJj0gfiAoMSA8PCAoMyArIDIgKiBjaGFubmVsICsg dW5pdCkpOw0KCXBjaV93cml0ZV9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDUwLCBjb25m KTsNCg0KCWl0ODIxMl9jbG9ja19zdHJhdGVneShkcml2ZSk7DQoJaXQ4MjEyX3Byb2dyYW1fdWRt YShkcml2ZSwgaXRkZXYtPnVkbWFbdW5pdF0pOw0KCQ0KfQ0KDQovKioNCiAqCWNvbmZpZ19pdDgy MTJfY2hpcHNldF9mb3JfcGlvCS0Jc2V0IGRyaXZlIHRpbWluZ3MNCiAqCUBkcml2ZTogZHJpdmUg dG8gdHVuZQ0KICoJQHNwZWVkIHdlIHdhbnQNCiAqDQogKglDb21wdXRlIHRoZSBiZXN0IHBpbyBt b2RlIHdlIGNhbiBmb3IgYSBnaXZlbiBkZXZpY2UuIFdlIG11c3QNCiAqCXBpY2sgYSBzcGVlZCB0 aGF0IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zIHdpdGggdGhlIG90aGVyIGRldmljZQ0KICoJb24g dGhlIGNhYmxlLg0KICovDQogDQpzdGF0aWMgdm9pZCBjb25maWdfaXQ4MjEyX2NoaXBzZXRfZm9y X3BpbyAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIHNldF9zcGVlZCkNCnsNCgl1OCB1bml0ID0g ZHJpdmUtPnNlbGVjdC5iLnVuaXQ7DQoJaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOw0K CWlkZV9kcml2ZV90ICpwYWlyID0gJmh3aWYtPmRyaXZlc1sxLXVuaXRdOw0KCXN0cnVjdCBpdDgy MTJfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7DQoJdTggc3BlZWQgPSAwLCBz ZXRfcGlvCT0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCA0LCA1LCBOVUxMKTsNCgl1OCBw YWlyX3BpbzsNCgkNCgkvKiBXZSBoYXZlIHRvIGRlYWwgd2l0aCB0aGlzIG1lc3MgaW4gcGFpcnMg Ki8NCglpZihwYWlyICE9IE5VTEwpDQoJew0KCQlwYWlyX3BpbyA9IGlkZV9nZXRfYmVzdF9waW9f bW9kZShwYWlyLCA0LCA1LCBOVUxMKTsNCgkJLyogVHJpbSBQSU8gdG8gdGhlIHNsb3dlc3Qgb2Yg dGhlIG1hc3Rlci9zbGF2ZSAqLw0KCQlpZihwYWlyX3BpbyA8IHNldF9waW8pDQoJCQlzZXRfcGlv ID0gcGFpcl9waW87DQoJfQ0KCWlmKCFpdGRldi0+c21hcnQpDQoJCWl0ODIxMl90dW5lcHJvYyhk cml2ZSwgc2V0X3Bpbyk7DQoJc3BlZWQgPSBYRkVSX1BJT18wICsgc2V0X3BpbzsNCgkvKiBYWFgg LSBXZSB0cmltIHRvIHRoZSBsb3dlc3Qgb2YgdGhlIHBhaXIgc28gdGhlIG90aGVyIGRyaXZlDQoJ ICAgd2lsbCBhbHdheXMgYmUgZmluZSBhdCB0aGlzIHBvaW50IHVudGlsIHdlIGRvIGhvdHBsdWcg cGFzc3RocnUgKi8NCgkgICANCglpZiAoc2V0X3NwZWVkKQ0KCQkodm9pZCkgaWRlX2NvbmZpZ19k cml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpOw0KfQ0KDQpzdGF0aWMgdm9pZCBjb25maWdfY2hpcHNl dF9mb3JfcGlvIChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgc2V0X3NwZWVkKQ0Kew0KCWNvbmZp Z19pdDgyMTJfY2hpcHNldF9mb3JfcGlvKGRyaXZlLCBzZXRfc3BlZWQpOw0KfQ0KDQovKioNCiAq CWl0ODIxMl9kbWFfcmVhZAktCURNQSBob29rDQogKglAZHJpdmU6IGRyaXZlIGZvciBETUENCiAq DQogKglUaGUgSVQ4MjEyIGhhcyBhIHNpbmdsZSB0aW1pbmcgcmVnaXN0ZXIgZm9yIE1XRE1BIGFu ZCBmb3IgUElPDQogKglvcGVyYXRpb25zLiBBcyB3ZSBmbGlwIGJhY2sgYW5kIGZvcnRoIHdlIGhh dmUgdG8gcmVsb2FkIHRoZQ0KICoJY2xvY2suDQogKg0KICoJRklYTUU6IGZvciAweDEwIG1vZGVs IHdlIHNob3VsZCByZXByb2dyYW0gVURNQSBoZXJlDQogKi8NCiANCnN0YXRpYyBpbnQgaXQ4MjEy X2RtYV9iZWdpbihpZGVfZHJpdmVfdCAqZHJpdmUpDQp7DQoJaWRlX2h3aWZfdCAqaHdpZiA9IEhX SUYoZHJpdmUpOw0KCXN0cnVjdCBpdDgyMTJfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEo aHdpZik7DQoJaW50IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsNCglpZihpdGRldi0+bXdk bWFbdW5pdF0gIT0gTVdETUFfT0ZGKQ0KCQlpdDgyMTJfcHJvZ3JhbShkcml2ZSwgaXRkZXYtPm13 ZG1hW3VuaXRdKTsNCglyZXR1cm4gX19pZGVfZG1hX2JlZ2luKGRyaXZlKTsNCn0NCg0KLyoqDQog KglpdDgyMTJfZG1hX3dyaXRlCS0JRE1BIGhvb2sNCiAqCUBkcml2ZTogZHJpdmUgZm9yIERNQSBz dG9wDQogKg0KICoJVGhlIElUODIxMiBoYXMgYSBzaW5nbGUgdGltaW5nIHJlZ2lzdGVyIGZvciBN V0RNQSBhbmQgZm9yIFBJTw0KICoJb3BlcmF0aW9ucy4gQXMgd2UgZmxpcCBiYWNrIGFuZCBmb3J0 aCB3ZSBoYXZlIHRvIHJlbG9hZCB0aGUNCiAqCWNsb2NrLg0KICoNCiAqCUZJWE1FOiBmb3IgMHgx MCBtb2RlbCB3ZSBzaG91bGQgcmVwcm9ncmFtIFVETUEgaGVyZQ0KICovDQogDQpzdGF0aWMgaW50 IGl0ODIxMl9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkNCnsNCglpZGVfaHdpZl90ICpod2lm ID0gSFdJRihkcml2ZSk7DQoJaW50IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsNCglzdHJ1 Y3QgaXQ4MjEyX2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOw0KCWludCByZXQg PSBfX2lkZV9kbWFfZW5kKGRyaXZlKTsNCglpZihpdGRldi0+bXdkbWFbdW5pdF0gIT0gTVdETUFf T0ZGKQ0KCQlpdDgyMTJfcHJvZ3JhbShkcml2ZSwgaXRkZXYtPnBpb1t1bml0XSk7DQoJcmV0dXJu IHJldDsNCn0NCg0KCQ0KLyoqDQogKglpdDgyMTJfdHVuZV9jaGlwc2V0CS0Jc2V0IGNvbnRyb2xs ZXIgdGltaW5ncw0KICoJQGRyaXZlOiBEcml2ZSB0byBzZXQgdXANCiAqCUB4ZmVyc3BlZWQ6IHNw ZWVkIHdlIHdhbnQgdG8gYWNoaWV2ZQ0KICoNCiAqCVR1bmUgdGhlIElURSBjaGlwc2V0IGZvciB0 aGUgZGVzaXJlZCBtb2RlLiBJZiB3ZSBjYW4ndCBhY2hpZXZlDQogKgl0aGUgZGVzaXJlZCBtb2Rl IHRoZW4gdHVuZSBmb3IgYSBsb3dlciBvbmUsIGJ1dCB1bHRpbWF0ZWx5DQogKgltYWtlIHRoZSB0 aGluZyB3b3JrLg0KICovDQogDQpzdGF0aWMgaW50IGl0ODIxMl90dW5lX2NoaXBzZXQgKGlkZV9k cml2ZV90ICpkcml2ZSwgYnl0ZSB4ZmVyc3BlZWQpDQp7DQoNCglpZGVfaHdpZl90ICpod2lmCT0g SFdJRihkcml2ZSk7DQoJc3RydWN0IGl0ODIxMl9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0 YShod2lmKTsNCgl1OCBzcGVlZAkJPSBpZGVfcmF0ZV9maWx0ZXIoaXQ4MjEyX3JhdGVtYXNrKGRy aXZlKSwgeGZlcnNwZWVkKTsNCgkJCQkgICAgDQoJc3dpdGNoKHNwZWVkKSB7DQoJCWNhc2UgWEZF Ul9QSU9fNDoNCgkJY2FzZSBYRkVSX1BJT18zOg0KCQljYXNlIFhGRVJfUElPXzI6DQoJCWNhc2Ug WEZFUl9QSU9fMToNCgkJY2FzZSBYRkVSX1BJT18wOg0KCQkJaWYoIWl0ZGV2LT5zbWFydCkNCgkJ CQlpdDgyMTJfdHVuZXByb2MoZHJpdmUsIChzcGVlZCAtIFhGRVJfUElPXzApKTsNCgkJCWJyZWFr Ow0KCQkvKiBNV0RNQSB0dW5pbmcgaXMgcmVhbGx5IGhhcmQgYmVjYXVzZSBvdXIgTVdETUEgYW5k IFBJTw0KCQkgICB0aW1pbmdzIGFyZSBrZXB0IGluIHRoZSBzYW1lIHBsYWNlLiBXZSBjYW4gc3dp dGNoIGluIHRoZSANCgkJICAgaG9zdCBkbWEgb24vb2ZmIGNhbGxiYWNrcyAqLw0KCQljYXNlIFhG RVJfTVdfRE1BXzI6DQoJCWNhc2UgWEZFUl9NV19ETUFfMToNCgkJY2FzZSBYRkVSX01XX0RNQV8w Og0KCQkJaWYoIWl0ZGV2LT5zbWFydCkNCgkJCQlpdDgyMTJfdHVuZV9td2RtYShkcml2ZSwgKHNw ZWVkIC0gWEZFUl9NV19ETUFfMCkpOw0KCQkJYnJlYWs7DQoJCWNhc2UgWEZFUl9VRE1BXzY6DQoJ CWNhc2UgWEZFUl9VRE1BXzU6DQoJCWNhc2UgWEZFUl9VRE1BXzQ6DQoJCWNhc2UgWEZFUl9VRE1B XzM6DQoJCWNhc2UgWEZFUl9VRE1BXzI6DQoJCWNhc2UgWEZFUl9VRE1BXzE6DQoJCWNhc2UgWEZF Ul9VRE1BXzA6DQoJCQlpZighaXRkZXYtPnNtYXJ0KQ0KCQkJCWl0ODIxMl90dW5lX3VkbWEoZHJp dmUsIChzcGVlZCAtIFhGRVJfVURNQV8wKSk7DQoJCQlicmVhazsNCgkJZGVmYXVsdDoNCgkJCXJl dHVybiAxOw0KCX0NCgkvKg0KCSAqCUluIHNtYXJ0IG1vZGUgdGhlIGNsb2NraW5nIGlzIGRvbmUg YnkgdGhlIGhvc3QgY29udHJvbGxlcg0KCSAqIAlzbm9vcGluZyB0aGUgbW9kZSB3ZSBwaWNrZWQu IFRoZSByZXN0IG9mIGl0IGlzIG5vdCBvdXIgcHJvYmxlbQ0KCSAqLw0KCXJldHVybiAoaWRlX2Nv bmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpKTsNCn0NCg0KLyoqDQogKgljb25maWdfY2hp cHNldF9mb3JfZG1hCS0JY29uZmlndXJlIGZvciBETUENCiAqCUBkcml2ZTogZHJpdmUgdG8gY29u ZmlndXJlDQogKg0KICoJQ2FsbGVkIGJ5IHRoZSBJREUgbGF5ZXIgd2hlbiBpdCB3YW50cyB0aGUg dGltaW5ncyBzZXQgdXAuDQogKi8NCiANCnN0YXRpYyBpbnQgY29uZmlnX2NoaXBzZXRfZm9yX2Rt YSAoaWRlX2RyaXZlX3QgKmRyaXZlKQ0Kew0KCXU4IHNwZWVkCT0gaWRlX2RtYV9zcGVlZChkcml2 ZSwgaXQ4MjEyX3JhdGVtYXNrKGRyaXZlKSk7DQoNCgljb25maWdfY2hpcHNldF9mb3JfcGlvKGRy aXZlLCAhc3BlZWQpOw0KDQoJaWYgKCFzcGVlZCkNCgkJcmV0dXJuIDA7DQoNCglpZiAoaWRlX3Nl dF94ZmVyX3JhdGUoZHJpdmUsIHNwZWVkKSkNCgkJcmV0dXJuIDA7DQoNCglpZiAoIWRyaXZlLT5p bml0X3NwZWVkKQ0KCQlkcml2ZS0+aW5pdF9zcGVlZCA9IHNwZWVkOw0KDQoJcmV0dXJuIGlkZV9k bWFfZW5hYmxlKGRyaXZlKTsNCn0NCg0KLyoqDQogKglpdDgyMTJfY29uZmlndXJlX2RyaXZlX2Zv cl9kbWEJLQlzZXQgdXAgZm9yIERNQSB0cmFuc2ZlcnMNCiAqCUBkcml2ZTogZHJpdmUgd2UgYXJl IGdvaW5nIHRvIHNldCB1cA0KICoNCiAqCVNldCB1cCB0aGUgZHJpdmUgZm9yIERNQSwgdHVuZSB0 aGUgY29udHJvbGxlciBhbmQgZHJpdmUgYXMgDQogKglyZXF1aXJlZC4gSWYgdGhlIGRyaXZlIGlz bid0IHN1aXRhYmxlIGZvciBETUEgb3Igd2UgaGl0DQogKglvdGhlciBwcm9ibGVtcyB0aGVuIHdl IHdpbGwgZHJvcCBkb3duIHRvIFBJTyBhbmQgc2V0IHVwDQogKglQSU8gYXBwcm9wcmlhdGVseQ0K ICovDQogDQpzdGF0aWMgaW50IGl0ODIxMl9jb25maWdfZHJpdmVfZm9yX2RtYSAoaWRlX2RyaXZl X3QgKmRyaXZlKQ0Kew0KCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsNCglzdHJ1Y3Qg aGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7DQoNCglpZiAoKGlkLT5jYXBhYmlsaXR5ICYgMSkg IT0gMCAmJiBkcml2ZS0+YXV0b2RtYSkgew0KCQkvKiBDb25zdWx0IHRoZSBsaXN0IG9mIGtub3du ICJiYWQiIGRyaXZlcyAqLw0KCQlpZiAoX19pZGVfZG1hX2JhZF9kcml2ZShkcml2ZSkpDQoJCQln b3RvIGZhc3RfYXRhX3BpbzsNCg0KCQlpZiAoKGlkLT5maWVsZF92YWxpZCAmIDQpICYmIGl0ODIx Ml9yYXRlbWFzayhkcml2ZSkpIHsNCgkJCWlmIChpZC0+ZG1hX3VsdHJhICYgaHdpZi0+dWx0cmFf bWFzaykgew0KCQkJCS8qIEZvcmNlIGlmIENhcGFibGUgVWx0cmFETUEgKi8NCgkJCQlpbnQgZG1h ID0gY29uZmlnX2NoaXBzZXRfZm9yX2RtYShkcml2ZSk7DQoJCQkJaWYgKChpZC0+ZmllbGRfdmFs aWQgJiAyKSAmJiAhZG1hKQ0KCQkJCQlnb3RvIHRyeV9kbWFfbW9kZXM7DQoJCQl9DQoJCX0gZWxz ZSBpZiAoaWQtPmZpZWxkX3ZhbGlkICYgMikgew0KdHJ5X2RtYV9tb2RlczoNCgkJCWlmICgoaWQt PmRtYV9td29yZCAmIGh3aWYtPm13ZG1hX21hc2spIHx8DQoJCQkgICAgKGlkLT5kbWFfMXdvcmQg JiBod2lmLT5zd2RtYV9tYXNrKSkgew0KCQkJCS8qIEZvcmNlIGlmIENhcGFibGUgcmVndWxhciBE TUEgbW9kZXMgKi8NCgkJCQlpZiAoIWNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEoZHJpdmUpKQ0KCQkJ CQlnb3RvIG5vX2RtYV9zZXQ7DQoJCQl9DQoJCX0gZWxzZSBpZiAoX19pZGVfZG1hX2dvb2RfZHJp dmUoZHJpdmUpICYmDQoJCQkgICAoaWQtPmVpZGVfZG1hX3RpbWUgPCAxNTApKSB7DQoJCQkvKiBD b25zdWx0IHRoZSBsaXN0IG9mIGtub3duICJnb29kIiBkcml2ZXMgKi8NCgkJCWlmICghY29uZmln X2NoaXBzZXRfZm9yX2RtYShkcml2ZSkpDQoJCQkJZ290byBub19kbWFfc2V0Ow0KCQl9IGVsc2Ug ew0KCQkJZ290byBmYXN0X2F0YV9waW87DQoJCX0NCgkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb24o ZHJpdmUpOw0KCX0gZWxzZSBpZiAoKGlkLT5jYXBhYmlsaXR5ICYgOCkgfHwgKGlkLT5maWVsZF92 YWxpZCAmIDIpKSB7DQpmYXN0X2F0YV9waW86DQpub19kbWFfc2V0Og0KCQljb25maWdfY2hpcHNl dF9mb3JfcGlvKGRyaXZlLCAxKTsNCgkJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHko ZHJpdmUpOw0KCX0NCgkvKiBJT1JEWSBub3Qgc3VwcG9ydGVkICovDQoJcmV0dXJuIDA7DQp9DQoN Ci8qKg0KICoJaW5pdF9jaGlwc2V0X2l0ODIxMgktCXNldCB1cCBhbiBJVEUgZGV2aWNlDQogKglA ZGV2OiBQQ0kgZGV2aWNlDQogKglAbmFtZTogZGV2aWNlIG5hbWUNCiAqDQogKi8NCg0Kc3RhdGlj IHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2l0ODIxMihzdHJ1Y3QgcGNpX2Rl diAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQ0Kew0KCXJldHVybiAwOw0KfQ0KDQovKioNCiAqCWF0 YTY2X2l0ODIxMgktCWNoZWNrIGZvciA4MCBwaW4gY2FibGUNCiAqCUBod2lmOiBpbnRlcmZhY2Ug dG8gY2hlY2sNCiAqDQogKglDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIGFuIEFUQTY2IGNhcGFi bGUgY2FibGUgb24gdGhlDQogKglpbnRlcmZhY2UuIE5vdGUgdGhhdCB0aGUgZmlybXdhcmUgd3Jp dGVzIGJpdHMgNC03IGhhdmluZyBkb25lIA0KICoJdGhlIGRyaXZlIHNpZGUgc2FtcGxpbmcuIFRo aXMgbWF5IGltcGFjdCBob3RwbHVnLg0KICovDQoNCnN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZp bml0IGF0YTY2X2l0ODIxMihpZGVfaHdpZl90ICpod2lmKQ0Kew0KCXUxNiBpb2NmZzsNCgkNCglw Y2lfcmVhZF9jb25maWdfd29yZChod2lmLT5wY2lfZGV2LCAweDQwLCAmaW9jZmcpOw0KCWlmKGlv Y2ZnICYgKDEgPDwgKDQgKyAyKmh3aWYtPmNoYW5uZWwpKSkNCgkJcmV0dXJuIDE7DQoJcmV0dXJu IDA7DQp9DQoNCi8qKg0KICoJaW5pdF9od2lmX2l0ODIxMgktCXNldCB1cCBod2lmIHN0cnVjdHMN CiAqCUBod2lmOiBpbnRlcmZhY2UgdG8gc2V0IHVwDQogKg0KICoJV2UgZG8gdGhlIGJhc2ljIHNl dCB1cCBvZiB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZS4gVGhlIElUODIxMg0KICoJcmVxdWlyZXMg c2V2ZXJhbCBjdXN0b20gaGFuZGxlcnMgc28gd2Ugb3ZlcnJpZGUgdGhlIGRlZmF1bHQNCiAqCWlk ZSBETUEgaGFuZGxlcnMgYXBwcm9wcmlhdGVseQ0KICovDQoNCnN0YXRpYyB2b2lkIF9fZGV2aW5p dCBpbml0X2h3aWZfaXQ4MjEyKGlkZV9od2lmX3QgKmh3aWYpDQp7DQoJc3RydWN0IGl0ODIxMl9k ZXYgKmlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXQ4MjEyX2RldiksIEdGUF9LRVJORUwp Ow0KCXU4IGNvbmY7DQoJDQoJaWYoaWRldiA9PSBOVUxMKQ0KCXsNCgkJcHJpbnRrKEtFUk5fRVJS ICJpdDgyMTI6IG91dCBvZiBtZW1vcnksIGZhbGxpbmcgYmFjayB0byBsZWdhY3kgYmVoYXZpb3Vy LlxuIik7DQoJCWdvdG8gZmFsbGJhY2s7DQoJfQ0KCW1lbXNldChpZGV2LCAwLCBzaXplb2YoKmlk ZXYpKTsNCglpZGVfc2V0X2h3aWZkYXRhKGh3aWYsIGlkZXYpOw0KCQ0KCXBjaV9yZWFkX2NvbmZp Z19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTAsICZjb25mKTsNCglpZihjb25mICYgMSkNCgl7DQoJ CWlmKGh3aWYtPmNoYW5uZWwgPT0gMCkNCgkJCXByaW50ayhLRVJOX0lORk8gIml0ODIxMjogY29u dHJvbGxlciBpbiBzbWFydCBtb2RlLlxuIik7DQoJCWlkZXYtPnNtYXJ0ID0gMTsNCgl9DQoJZWxz ZSBpZihod2lmLT5jaGFubmVsID09IDApDQoJCXByaW50ayhLRVJOX0lORk8gIml0ODIxMjogY29u dHJvbGxlciBpbiBwYXNzIHRocm91Z2ggbW9kZS5cbiIpOw0KCQkNCglwY2lfcmVhZF9jb25maWdf Ynl0ZShod2lmLT5wY2lfZGV2LCAweDUwLCAmY29uZik7DQoJaWYgKGNvbmYgJiAoMSA8PCAoMSAr IGh3aWYtPmNoYW5uZWwpKSkNCgkJaWRldi0+Y2xvY2tfbW9kZSA9IEFUQV81MDsNCgllbHNlDQoJ CWlkZXYtPmNsb2NrX21vZGUgPSBBVEFfNjY7DQoJCQ0KCWlkZXYtPndhbnRbMF1bMV0gPSBBVEFf QU5ZOw0KCWlkZXYtPndhbnRbMV1bMV0gPSBBVEFfQU5ZOw0KCQkNCglwcmludGsoS0VSTl9JTkZP ICJpdDgyMTI6IEJJT1Mgc2VsZXRlZCBhICVkTUh6IGNsb2NrLlxuIiwgaWRldi0+Y2xvY2tfbW9k ZSA9PSBBVEFfNjYgPyA2Njo1MCk7DQoJLyoNCgkgKglOb3QgaW4gdGhlIGRvY3MgYnV0IGFjY29y ZGluZyB0byB0aGUgcmVmZXJlbmNlIGRyaXZlcg0KCSAqCXRoaXMgaXMgbmVjY2Vzc2FyeS4NCgkg Ki8NCglwY2lfcmVhZF9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDA4LCAmY29uZik7DQoJ aWYoY29uZiA9PSAweDEwKQ0KCQlpZGV2LT50aW1pbmcxMCA9IDE7DQojaWYgMAkvKiBOZWVkcyBt b3JlIHJlc2VhcmNoICovDQoJZWxzZQ0KCQlod2lmLT5hdGFwaV9kbWEgPSAxOw0KI2VuZGlmDQoN CglpZihpZGV2LT50aW1pbmcxMCAmJiAhaWRldi0+c21hcnQpDQoJew0KCQlwcmludGsoS0VSTl9X QVJOSU5HICJpdDgyMTI6IERNQSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBvbiByZXZpc2lv biAweDEwIGluIHBhc3MgdGhyb3VnaC5cbiIpOw0KCQlnb3RvIGZhbGxiYWNrOw0KCX0NCgkJDQoJ aHdpZi0+c3BlZWRwcm9jID0gJml0ODIxMl90dW5lX2NoaXBzZXQ7DQoJaHdpZi0+dHVuZXByb2MJ PSAmaXQ4MjEyX3R1bmVwcm9jOw0KCQ0KCS8qIE1XRE1BL1BJTyBjbG9jayBzd2l0Y2hpbmcgZm9y IHBhc3MgdGhyb3VnaCBtb2RlICovDQoJaWYoIWlkZXYtPnNtYXJ0KQ0KCXsNCgkJaHdpZi0+aWRl X2RtYV9iZWdpbiA9ICZpdDgyMTJfZG1hX2JlZ2luOw0KCQlod2lmLT5pZGVfZG1hX2VuZCA9ICZp dDgyMTJfZG1hX2VuZDsNCgl9DQoNCglpZiAoIWh3aWYtPmRtYV9iYXNlKQ0KCQlnb3RvIGZhbGxi YWNrOw0KDQoJaHdpZi0+dWx0cmFfbWFzayA9IDB4N2Y7DQoJaHdpZi0+bXdkbWFfbWFzayA9IDB4 MDc7DQoJaHdpZi0+c3dkbWFfbWFzayA9IDB4MDc7DQoNCglod2lmLT5pZGVfZG1hX2NoZWNrID0g Jml0ODIxMl9jb25maWdfZHJpdmVfZm9yX2RtYTsNCglpZiAoIShod2lmLT51ZG1hX2ZvdXIpKQ0K CQlod2lmLT51ZG1hX2ZvdXIgPSBhdGE2Nl9pdDgyMTIoaHdpZik7DQoNCgkvKg0KCSAqCVRoZSBC SU9TIG9mdGVuIGRvZXNuJ3Qgc2V0IHVwIERNQSBvbiB0aGlzIGNvbnRyb2xsZXINCgkgKglzbyB3 ZSBhbHdheXMgZG8gaXQuDQoJICovDQoNCglod2lmLT5hdXRvZG1hID0gMTsNCglod2lmLT5kcml2 ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7DQoJaHdpZi0+ZHJpdmVzWzFdLmF1dG9kbWEg PSBod2lmLT5hdXRvZG1hOw0KCXJldHVybjsNCg0KZmFsbGJhY2s6DQoJaHdpZi0+YXV0b2RtYSA9 IDA7DQoJaHdpZi0+ZHJpdmVzWzBdLmF1dG90dW5lID0gMTsNCglod2lmLT5kcml2ZXNbMV0uYXV0 b3R1bmUgPSAxOw0KCXJldHVybjsNCn0NCg0KI2RlZmluZSBERUNMQVJFX0lURV9ERVYobmFtZV9z dHIpCQkJXA0KCXsJCQkJCQlcDQoJCS5uYW1lCQk9IG5hbWVfc3RyLAkJXA0KCQkuaW5pdF9jaGlw c2V0CT0gaW5pdF9jaGlwc2V0X2l0ODIxMiwJXA0KCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2l0 ODIxMiwJXA0KCQkuY2hhbm5lbHMJPSAyLAkJCVwNCgkJLmF1dG9kbWEJPSBBVVRPRE1BLAkJXA0K CQkuYm9vdGFibGUJPSBPTl9CT0FSRCwJCVwNCgl9DQoNCnN0YXRpYyBpZGVfcGNpX2RldmljZV90 IGl0ODIxMl9jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7DQoJLyogMCAqLyBERUNMQVJFX0lU RV9ERVYoIklUODIxMiIpLA0KfTsNCg0KLyoqDQogKglpdDgyMTJfaW5pdF9vbmUJLQlwY2kgbGF5 ZXIgZGlzY292ZXJ5IGVudHJ5DQogKglAZGV2OiBQQ0kgZGV2aWNlDQogKglAaWQ6IGlkZW50IHRh YmxlIGVudHJ5DQogKg0KICoJQ2FsbGVkIGJ5IHRoZSBQQ0kgY29kZSB3aGVuIGl0IGZpbmRzIGFu IElURTgyMTIgY29udHJvbGxlci4NCiAqCVdlIHRoZW4gdXNlIHRoZSBJREUgUENJIGdlbmVyaWMg aGVscGVyIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmsuDQogKi8NCiANCnN0YXRpYyBpbnQgX19kZXZp bml0IGl0ODIxMl9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNp X2RldmljZV9pZCAqaWQpDQp7DQoJaWRlX3NldHVwX3BjaV9kZXZpY2UoZGV2LCAmaXQ4MjEyX2No aXBzZXRzW2lkLT5kcml2ZXJfZGF0YV0pOw0KCXJldHVybiAwOw0KfQ0KDQpzdGF0aWMgc3RydWN0 IHBjaV9kZXZpY2VfaWQgaXQ4MjEyX3BjaV90YmxbXSA9IHsNCgl7IFBDSV9WRU5ET1JfSURfSVRF LCBQQ0lfREVWSUNFX0lEX0lURV84MjEyLCAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwg MH0sDQoJeyAwLCB9LA0KfTsNCg0KTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGl0ODIxMl9wY2lf dGJsKTsNCg0Kc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsNCgkubmFtZQkJPSAi SVRFODIxMiBJREUiLA0KCS5pZF90YWJsZQk9IGl0ODIxMl9wY2lfdGJsLA0KCS5wcm9iZQkJPSBp dDgyMTJfaW5pdF9vbmUsDQp9Ow0KDQpzdGF0aWMgaW50IGl0ODIxMl9pZGVfaW5pdCh2b2lkKQ0K ew0KCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsNCn0NCg0KbW9kdWxl X2luaXQoaXQ4MjEyX2lkZV9pbml0KTsNCg0KTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsNCk1P RFVMRV9ERVNDUklQVElPTigiUENJIGRyaXZlciBtb2R1bGUgZm9yIHRoZSBJVEUgODIxMiIpOw0K TU9EVUxFX0xJQ0VOU0UoIkdQTCIpOw0K --=-ku2X0uBFfx26/lJ9XND+--