From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eu1sys200aog110.obsmtp.com ([207.126.144.129]) by canuck.infradead.org with smtps (Exim 4.76 #1 (Red Hat Linux)) id 1REjTM-0006sG-Uf for linux-mtd@lists.infradead.org; Fri, 14 Oct 2011 15:15:01 +0000 Message-ID: <4E9851EB.8070909@st.com> Date: Fri, 14 Oct 2011 16:14:51 +0100 From: Angus CLARK MIME-Version: 1.0 To: linux-mtd@lists.infradead.org Subject: Re: nand_base.c:nand_get_flash_type() test results References: <4E95B1B4.7040603@st.com> <1318600673.12351.131.camel@sauron> In-Reply-To: <1318600673.12351.131.camel@sauron> Content-Type: multipart/mixed; boundary="------------020109080200070805030108" Cc: Artem Bityutskiy List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , This is a multi-part message in MIME format. --------------020109080200070805030108 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit On 10/14/2011 02:57 PM, Artem Bityutskiy wrote: > On Wed, 2011-10-12 at 16:26 +0100, Angus CLARK wrote: >> Hi All, >> >> While attempting to add support for some of the more recent NAND devices, I >> ended up refactoring nand_get_flash_type() code. The refactoring was primarily >> aimed at simplifying the way in which the growing number 'READID' decoding >> exceptions could be accommodated. > > Why not to send the refactored code as well? > Well, mostly to avoid criticism of it not being based on the mtd-2.6 tree :-) I have attached the file 'nand_id_decode.c' which includes most of the relevant code. If there is interest, I am happy to port to mtd-2.6, but testing on this version would be limited to compilation and nandsim. Cheers, Angus --------------020109080200070805030108 Content-Type: text/plain; name="nand_id_decode.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="nand_id_decode.c" LyoKICogIGRyaXZlcnMvbXRkL25hbmQvbmFuZF9pZF9kZWNvZGUuYwogKgogKiAgRGV0ZXJt aW5lIE5BTkQgZGV2aWNlIHByb3BlcnRpZXMgYnkgZGVjb2RpbmcgdGhlIFJFQURJRCBzdHJp bmcKICoKICogIFRoZSBmb2xsb3dpbmcgY29kZSBhdHRlbXB0cyB0byBlbmNhcHN1bGF0ZSB0 aGUga25vd2xlZGdlIGluCiAqICBtdGQtMi42KDIwMTEtMDctMDkpOm5hbmRfYmFzZS5jOm5h bmRfZ2V0X2ZsYXNoX3R5cGUoKSwgcmVmYWN0b3JlZCBhY2NvcmRpbmcKICogIHRvIHRocmVl IGJhc2ljIHNjaGVtZXM6CiAqCiAqCSdJRCAyJyAgICAgICA6IGV4dHJhY3QgcHJvcGVydGll cyBmcm9tIGRldmljZSB0YWJsZS4gIEZvciAyLWJ5dGUgSURzLAogKiAgICAgICAgICAgICAg ICAgICAgIG9yIHdoZXJlIGRldmljZSBJRCBnaXZlcyBhIG5vbi16ZXJvIHBhZ2Utc2l6ZQog KiAgICAgICAgICAgICAgICAgICAgIChTUCBkZXZpY2VzKS4KICoKICoJJ0V4dGVuZGVkIElE JzogZGVjb2RlIHByb3BlcnRpZXMgZnJvbSBJRCBzdHJpbmcgd2hlcmUgcG9zc2libGUsIGZh bGxpbmcKICoJICAgICAgICAgICAgICAgYmFjayB0byBkZXZpY2UgdGFibGUuICBGb3IgMy80 LzUtYnl0ZSBJRHMuCiAqCiAqCSdJRCA2JyAgICAgICA6IGRlY29kZSBwcm9wZXJ0aWVzIGZy b20gSUQgc3RyaW5nIHdoZXJlIHBvc3NpYmxlLCBmYWxsaW5nCiAqCSAgICAgICAgICAgICAg IGJhY2sgdG8gZGV2aWNlIHRhYmxlLiAgRm9yIDYtYnl0ZSBJRHMuCiAqCiAqICBUaGUgcmVm YWN0b3JpbmcgaXMgcHJpbWFyaWx5IGFpbWVkIGF0IHNpbXBsaWZ5aW5nIHRoZSB3YXkgaW4g d2hpY2ggZGVjb2RpbmcKICogIGV4Y2VwdGlvbnMgKGdyb3dpbmcgZmFzdCEpIGNhbiBiZSBh Y2NvbW9kYXRlZC4KICoKICogIFRlc3RlZCBvbiBhbGwgZGV2aWNlcyBmb3VuZCBpbgogKiAg aHR0cDovL3d3dy5saW51eC1tdGQuaW5mcmFkZWFkLm9yZy9uYW5kLWRhdGEvbmFuZGRhdGEu aHRtbCAoMjAxMS0wNy0wOSksCiAqICBFWENMVURJTkcgdGhlIGZvbGxvd2luZzoKICoKICog ICAgICAtICdPTkZJLW9ubHknOiAgUkVBRElEIGlzIGluc3VmZmljaWVudCB0byBkZWNvZGUg YWxsIHByb3BlcnRpZXMuCiAqCiAqICAgICAgLSBUb3NoaWJhIGRldmljZXM6IGRhdGFzaGVl dHMgb25seSBwcmVzZW50IGRlY29kZSB0YWJsZSwgbm90IGFjdHVhbAogKiAgICAgICAgICAg ICAgICAgICAgICAgICBSRUFESUQgc3RyaW5ncy4KICoKICoKICogIEF1dGhvcjogQW5ndXMg Q2xhcmsgPEFuZ3VzLkNsYXJrQHN0LmNvbT4KICogIENvcHlyaWdodCAoYykgMjAxMiBTVE1p Y3JvZWxlY3Ryb25pY3MgTGltaXRlZAogKiAKICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAg TWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYwogKiAgTGljZW5zZSBWZXJzaW9uIDIuMCBvbmx5LiAgU2VlIGxpbnV4 L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAqICAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K ICoKICovCgojaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgojaW5jbHVkZSA8bGludXgvbXRk L25hbmQuaD4KCnN0YXRpYyBzdHJ1Y3QgbmFuZF9mbGFzaF9kZXYgKnNlYXJjaF9uYW5kX2Zs YXNoX2Rldih1aW50OF90IGlkKTsKc3RhdGljIGludCBuYW5kX2RlY29kZV9pZF8yKHN0cnVj dCBtdGRfaW5mbyAqbXRkLAoJCQkgICAgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKCQkJICAg IHN0cnVjdCBuYW5kX2ZsYXNoX2RldiAqdHlwZSwKCQkJICAgIHVpbnQ4X3QgKmlkLCBpbnQg aWRfbGVuKTsKc3RhdGljIGludCBuYW5kX2RlY29kZV9pZF9leHQoc3RydWN0IG10ZF9pbmZv ICptdGQsCgkJCSAgICAgIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCgkJCSAgICAgIHN0cnVj dCBuYW5kX2ZsYXNoX2RldiAqdHlwZSwKCQkJICAgICAgdWludDhfdCAqaWQsIGludCBpZF9s ZW4pOwpzdGF0aWMgaW50IG5hbmRfZGVjb2RlX2lkXzYoc3RydWN0IG10ZF9pbmZvICptdGQs CgkJCSAgICBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAoJCQkgICAgc3RydWN0IG5hbmRfZmxh c2hfZGV2ICp0eXBlLAoJCQkgICAgdWludDhfdCAqaWQsIGludCBpZF9sZW4pOwpzdGF0aWMg dm9pZCBuYW5kX2RlY29kZV9pZF9iYm0oc3RydWN0IG10ZF9pbmZvICptdGQsCgkJCSAgICAg ICBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAoJCQkgICAgICAgdWludDhfdCAqaWQsIGludCBp ZF9sZW4pOwoKaW50IG5hbmRfZGVjb2RlX2lkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1 Y3QgbmFuZF9jaGlwICpjaGlwLAoJCSAgIHVpbnQ4X3QgKmlkLCBpbnQgaWRfbGVuKQp7Cglz dHJ1Y3QgbmFuZF9mbGFzaF9kZXYgKnR5cGUgPSBOVUxMOwoJaW50IHJldCA9IDA7CgoJLyoK CSAqIEZpbmQgJ25hbmRfZmxhc2hfZGV2JyBpbiB0YWJsZQoJICovCgl0eXBlID0gc2VhcmNo X25hbmRfZmxhc2hfZGV2KGlkWzFdKTsKCWlmICghdHlwZSkgewoJCXByX2VycigiW01URF1b TkFORF06JXM6IGZhaWxlZCB0byBmaW5kIE5BTkQgIgoJCSAgICAgICAiZGV2aWNlIElEIFsl MDJ4XSBpbiB0YWJsZVxuIiwgX19mdW5jX18sIGlkWzFdKTsKCQlyZXR1cm4gMTsKCX0KCgkv KgoJICogRGVjb2RlIElEIHN0cmluZwoJICovCglpZiAoaWRfbGVuID09IDIgfHwgdHlwZS0+ cGFnZXNpemUpCgkJcmV0ID0gbmFuZF9kZWNvZGVfaWRfMihtdGQsIGNoaXAsIHR5cGUsIGlk LCBpZF9sZW4pOwoJZWxzZSBpZiAoaWRfbGVuIDw9IDUpCgkJcmV0ID0gbmFuZF9kZWNvZGVf aWRfZXh0KG10ZCwgY2hpcCwgdHlwZSwgaWQsIGlkX2xlbik7CgllbHNlIGlmIChpZF9sZW4g PT0gNikKCQlyZXQgPSBuYW5kX2RlY29kZV9pZF82KG10ZCwgY2hpcCwgdHlwZSwgaWQsIGlk X2xlbik7CgllbHNlCgkJcmV0ID0gMTsKCglpZiAocmV0KSB7CgkJcHJfZXJyKCJbTVREXVtO QU5EXTolczpmYWlsZWQgdG8gZGVjb2RlIE5BTkQgIgoJCSAgICAgICAiZGV2aWNlIElEXG4i LCBfX2Z1bmNfXyk7CgkJcmV0dXJuIHJldDsKCX0KCQoJLyoKCSAqIERldGVybWluZSBiYWQt YmxvY2sgbWFya2VyIHNjaGVtZQoJICovCgluYW5kX2RlY29kZV9pZF9iYm0obXRkLCBjaGlw LCBpZCwgaWRfbGVuKTsKCQoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTF9HUEwobmFuZF9k ZWNvZGVfaWQpOwoKc3RhdGljIHN0cnVjdCBuYW5kX2ZsYXNoX2RldiAqc2VhcmNoX25hbmRf Zmxhc2hfZGV2KHVpbnQ4X3QgaWQpCnsKCXN0cnVjdCBuYW5kX2ZsYXNoX2RldiAqZGV2aWNl OwoKCWZvciAoZGV2aWNlID0gbmFuZF9mbGFzaF9pZHM7IGRldmljZS0+bmFtZSAhPSBOVUxM OyBkZXZpY2UrKykgewoJCWlmIChkZXZpY2UtPmlkID09IGlkKQoJCQlyZXR1cm4gZGV2aWNl OwoJfQoJCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIGludCBuYW5kX2RlY29kZV9pZF8yKHN0 cnVjdCBtdGRfaW5mbyAqbXRkLAoJCQkgICAgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKCQkJ ICAgIHN0cnVjdCBuYW5kX2ZsYXNoX2RldiAqdHlwZSwKCQkJICAgIHVpbnQ4X3QgKmlkLCBp bnQgaWRfbGVuKQp7CgltdGQtPndyaXRlc2l6ZSA9IHR5cGUtPnBhZ2VzaXplOwoJbXRkLT5v b2JzaXplID0gdHlwZS0+cGFnZXNpemUgLyAzMjsKCWNoaXAtPmNoaXBzaXplID0gKCh1aW50 NjRfdCl0eXBlLT5jaGlwc2l6ZSkgPDwgMjA7CgkKCS8qIFNQQU5TSU9OL0FNRCAoUzMwTUwt UCBPUk5BTkQpIGhhcyBub24tc3RhbmRhcmQgYmxvY2sgc2l6ZSAqLwoJaWYgKGlkWzBdID09 IE5BTkRfTUZSX0FNRCkKCQltdGQtPmVyYXNlc2l6ZSA9IDUxMiAqIDEwMjQ7CgllbHNlCgkJ bXRkLT5lcmFzZXNpemUgPSB0eXBlLT5lcmFzZXNpemU7CgkKCS8qIEdldCBjaGlwIG9wdGlv bnMgZnJvbSB0YWJsZSAqLwoJY2hpcC0+b3B0aW9ucyAmPSB+TkFORF9DSElQT1BUSU9OU19N U0s7CgljaGlwLT5vcHRpb25zIHw9IHR5cGUtPm9wdGlvbnMgJiBOQU5EX0NISVBPUFRJT05T X01TSzsKCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9OT19BVVRPSU5DUjsKCWlmIChtdGQtPndy aXRlc2l6ZSA+IDUxMikKCQljaGlwLT5vcHRpb25zIHw9IE5BTkRfTk9fUkVBRFJEWTsKCgkv KiBBc3N1bWUgc29tZSBkZWZhdWx0cyAqLwoJY2hpcC0+Yml0c19wZXJfY2VsbCA9IDE7Cglj aGlwLT5jZWxsaW5mbyA9IDA7CgljaGlwLT5wbGFuZXNfcGVyX2NoaXAgPSAxOwoJY2hpcC0+ bHVuc19wZXJfY2hpcCA9IDE7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbmFuZF9kZWNv ZGVfaWRfZXh0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAoJCQkgICAgICBzdHJ1Y3QgbmFuZF9j aGlwICpjaGlwLAoJCQkgICAgICBzdHJ1Y3QgbmFuZF9mbGFzaF9kZXYgKnR5cGUsCgkJCSAg ICAgIHVpbnQ4X3QgKmlkLCBpbnQgaWRfbGVuKQp7Cgl1aW50OF90IGRhdGE7CgoJaWYgKGlk X2xlbiA8IDMgfHwgaWRfbGVuID4gNSkgewoJCXByX2VycigiW01URF1bTkFORF06JXM6IGlu dmFsaWQgSUQgbGVuZ3RoIFslZF1cbiIsCgkJICAgICAgIF9fZnVuY19fLCBpZF9sZW4pOwoJ CXJldHVybiAxOwoJfQoKCS8qIENsZWFyIGNoaXAgb3B0aW9ucyAqLwoJY2hpcC0+b3B0aW9u cyAmPSB+TkFORF9DSElQT1BUSU9OU19NU0s7CgoJLyogSUQ0OiBQbGFuZXMvQ2hpcCBTaXpl ICovCglpZiAoaWRbMF0gPT0gTkFORF9NRlJfSFlOSVggJiYgaWRfbGVuID09IDUgJiYgaWRb NF0gPT0gMCAmJgoJICAgIChpZFsxXSA9PSAweERBIHx8IGlkWzFdID09IDB4Q0EpKSB7CgkJ LyogTm9uLXN0YW5kYXJkIGRlY29kZTogSFkyN1VGMDgyRzJBLCBIWTI3VUYxNjJHMkEgKi8K CQljaGlwLT5wbGFuZXNfcGVyX2NoaXAgPSAyOwoJCWNoaXAtPmNoaXBzaXplID0gKDEyOCAq IDEwMjQgKiAxMDI0KSAqIGNoaXAtPnBsYW5lc19wZXJfY2hpcDsKCX0gZWxzZSBpZiAoaWRf bGVuID09IDUpIHsKCQkvKiAgIC0gUGxhbmVzIHBlciBjaGlwOiBJRDRbMzoyXSAqLwoJCWRh dGEgPSAoaWRbNF0gPj4gMikgJiAweDM7CgkJY2hpcC0+cGxhbmVzX3Blcl9jaGlwID0gMSA8 PCBkYXRhOwoJCQoJCS8qICAgLSBQbGFuZSBzaXplOiBJRDRbNjo0XSwgbXVsdGlwbGVzIG9m IDhNaUIgKi8KCQlkYXRhID0gKGlkWzRdID4+IDQpICYgMHg3OwoJCWNoaXAtPmNoaXBzaXpl ID0gKDggKiAxMDI0ICogMTAyNCkgPDwgZGF0YTsJLyogcGxhbmUgc2l6ZSAqLwoJCWNoaXAt PmNoaXBzaXplICo9IGNoaXAtPnBsYW5lc19wZXJfY2hpcDsJLyogY2hpcCBzaXplICovCgl9 IGVsc2UgewoJCS8qIEZhbGwtYmFjayB0byB0YWJsZSAqLwoJCWNoaXAtPnBsYW5lc19wZXJf Y2hpcCA9IDE7CgkJY2hpcC0+Y2hpcHNpemUgPSAoKCh1aW50NjRfdCl0eXBlLT5jaGlwc2l6 ZSkgPDwgMjApOwoJfQoKCS8qIElEMzogUGFnZS9PT0IvQmxvY2sgU2l6ZSAqLwoJaWYgKGlk X2xlbiA+PSA0KSB7CgkJLyogICAtIFBhZ2UgU2l6ZTogSUQzWzE6MF0gKi8KCQlkYXRhID0g aWRbM10gJiAweDM7CgkJbXRkLT53cml0ZXNpemUgPSAxMDI0IDw8IGRhdGE7IC8qIG11bHRp cGxlcyBvZiAxayAqLwoKCQkvKiAgIC0gT09CIFNpemU6IElEM1syXSAqLwoJCWRhdGEgPSAo aWRbM10gPj4gMikgJiAweDE7CgkJbXRkLT5vb2JzaXplID0gOCA8PCBkYXRhOwkJLyogcGVy IDUxMiAqLwoJCW10ZC0+b29ic2l6ZSAqPSBtdGQtPndyaXRlc2l6ZSAvIDUxMjsJLyogcGVy IHBhZ2UgKi8KCgkJLyogICAtIEJsb2NrIFNpemU6IElEM1s1OjRdICovCgkJZGF0YSA9IChp ZFszXSA+PiA0KSAmIDB4MzsKCQltdGQtPmVyYXNlc2l6ZSA9ICg2NCAqIDEwMjQpIDw8IGRh dGE7IC8qIG11bHRpcGxlcyBvZiA2NGsgKi8KCgkJLyogICAtIEJ1cyBXaWR0aDsgSUQzWzZd ICovCgkJaWYgKChpZFszXSA+PiA2KSAmIDB4MSkKCQkJY2hpcC0+b3B0aW9ucyB8PSBOQU5E X0JVU1dJRFRIXzE2OwoJfSBlbHNlIHsKCQkvKiBGYWxsLWJhY2sgdG8gdGFibGUgKi8KCQlt dGQtPndyaXRlc2l6ZSA9IHR5cGUtPnBhZ2VzaXplOwoJCW10ZC0+b29ic2l6ZSA9IHR5cGUt PnBhZ2VzaXplIC8gMzI7CgkJaWYgKHR5cGUtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2 KQoJCQljaGlwLT5vcHRpb25zIHw9IE5BTkRfQlVTV0lEVEhfMTY7Cgl9CgoJLyogU29tZSBk ZWZhdWx0ICdjaGlwJyBvcHRpb25zICovCgljaGlwLT5vcHRpb25zIHw9IE5BTkRfTk9fQVVU T0lOQ1I7CglpZiAoY2hpcC0+cGxhbmVzX3Blcl9jaGlwID4gMSkKCQljaGlwLT5vcHRpb25z IHw9IE5BTkRfTVVMVElQTEFORV9SRUFEOwoJCglpZiAobXRkLT53cml0ZXNpemUgPiA1MTIp CgkJY2hpcC0+b3B0aW9ucyB8PSBOQU5EX05PX1JFQURSRFk7CgoJaWYgKGlkWzBdID09IE5B TkRfTUZSX1NBTVNVTkcgJiYgbXRkLT53cml0ZXNpemUgPiA1MTIpCgkJY2hpcC0+b3B0aW9u cyB8PSBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUzsKCQoJLyogSUQyOiBQYWNrYWdlL0NlbGwv RmVhdHVyZXMgKi8KCS8qICAgTm90ZSwgSUQyIGludmFsaWQsIG9yIGRvY3VtZW50ZWQgYXMg ImRvbid0IGNhcmUiIG9uIGNlcnRhaW4gZGV2aWNlcwoJICogICAoYXNzdW1lIHNvbWUgZGVm YXVsdHMpCgkgKi8KCWlmIChpZF9sZW4gPT0gNCAmJiBpZFswXSA9PSBOQU5EX01GUl9IWU5J WCAmJgoJICAgIChpZFsxXSA9PSAweEYxIHx8IGlkWzFdID09IDB4QzEgfHwgaWRbMV0gPT0g MHhBMSB8fCBpZFsxXSA9PSAweEFEIHx8CgkgICAgIGlkWzFdID09IDB4REEgfHwgaWRbMV0g PT0gMHhDQSkpIHsKCQkvKiBIWTI3e1UsU31GezA4LDE2fTFHMk07CgkJICogSFkyN1VGezA4 LDE2fTJHMk0KCQkgKi8KCQljaGlwLT5sdW5zX3Blcl9jaGlwID0gMTsKCQljaGlwLT5iaXRz X3Blcl9jZWxsID0gMTsKCQljaGlwLT5jZWxsaW5mbyA9IDA7CgkJY2hpcC0+b3B0aW9ucyB8 PSAoTkFORF9DQUNIRVBSRyB8CgkJCQkgIE5BTkRfQ0FDSEVSRCB8CgkJCQkgIE5BTkRfQ09Q WUJBQ0spOwoJfSBlbHNlIGlmIChpZF9sZW4gPT0gNCAmJiBpZFswXSA9PSBOQU5EX01GUl9N SUNST04gJiYKCQkgICAoaWRbMV0gPT0gMHhEQSB8fCBpZFsxXSA9PSAweENBIHx8IGlkWzFd ID09IDB4REMgfHwKCQkgICAgaWRbMV0gPT0gMHhDQyB8fCBpZFsxXSA9PSAweEFBIHx8IGlk WzFdID09IDB4QkEpKSB7CgkJLyogTVQyOUYyR3swOCwxNn1BQUI7CgkJICogTVQyOUY0R3sw OCwxNn1CQUI7CgkJICogTVQyOUYyR3swOCwxNn1Be0EsQn1DOwoJCSAqIE1UMjlGNEcwOEJB QwoJCSAqLwoJCWNoaXAtPmx1bnNfcGVyX2NoaXAgPSAxOwoJCWNoaXAtPmJpdHNfcGVyX2Nl bGwgPSAxOwoJCWNoaXAtPmNlbGxpbmZvID0gMDsKCQljaGlwLT5vcHRpb25zIHw9IChOQU5E X0NBQ0hFUFJHIHwKCQkJCSAgTkFORF9DQUNIRVJEIHwKCQkJCSAgTkFORF9DT1BZQkFDSyk7 Cgl9IGVsc2UgaWYgKGlkX2xlbiA9PSA0ICYmIGlkWzBdID09IE5BTkRfTUZSX1NBTVNVTkcg JiYKCQkgICAoaWRbMV0gPT0gMHhGMSB8fCBpZFsxXSA9PSAweEExKSkgewoJCS8qIEs5RjFH MDh7VSxRfUEgKi8KCQljaGlwLT5sdW5zX3Blcl9jaGlwID0gMTsKCQljaGlwLT5iaXRzX3Bl cl9jZWxsID0gMTsKCQljaGlwLT5jZWxsaW5mbyA9IDA7CgkJY2hpcC0+b3B0aW9ucyB8PSAo TkFORF9DQUNIRVBSRyB8CgkJCQkgIE5BTkRfQ0FDSEVSRCB8CgkJCQkgIE5BTkRfQ09QWUJB Q0spOwoJfSBlbHNlIHsKCQkvKiAgIC0gTFVOczogSUQyWzE6MF0gKi8KCQlkYXRhID0gaWRb Ml0gJiAweDM7CgkJY2hpcC0+bHVuc19wZXJfY2hpcCA9IDB4MSA8PCBkYXRhOwoKCQkvKiAg IC0gQ2VsbCBsZXZlbHM6IElEMlszOjJdICovCgkJZGF0YSA9IChpZFsyXSA+PiAyKSAmIDB4 MzsKCQljaGlwLT5iaXRzX3Blcl9jZWxsID0gZGF0YSArIDE7CgoJCS8qICAgLSBJbnRlcmxl YXZlOiBJRDJbNl0gKi8KCQlpZiAoKGlkWzJdID4+IDYpICYgMHgxKQoJCQljaGlwLT5vcHRp b25zIHw9IE5BTkRfTVVMVElMVU47CgoJCS8qICAgLSBDYWNoZSBQcm9ncmFtOiBJRDJbN10g Ki8KCQlpZiAoKGlkWzJdID4+IDcpICYgMHgxKQoJCQljaGlwLT5vcHRpb25zIHw9IE5BTkRf Q0FDSEVQUkc7CgoJCS8qICAgLSBDb3B5IHRvICdjZWxsaW5mbycgKi8KCQljaGlwLT5jZWxs aW5mbyA9IGlkWzJdOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IG5hbmRfZGVjb2Rl X2lkXzYoc3RydWN0IG10ZF9pbmZvICptdGQsCgkJCSAgICBzdHJ1Y3QgbmFuZF9jaGlwICpj aGlwLAoJCQkgICAgc3RydWN0IG5hbmRfZmxhc2hfZGV2ICp0eXBlLAoJCQkgICAgdWludDhf dCAqaWQsIGludCBpZF9sZW4pCnsKCXVpbnQ4X3QgZGF0YTsKCglpZiAoaWRfbGVuICE9IDYp IHsKCQlwcl9lcnIoIltNVERdW05BTkRdOiVzOiBpbnZhbGlkIElEIGxlbmd0aCBbJWRdXG4i LAoJCSAgICAgICBfX2Z1bmNfXywgaWRfbGVuKTsKCQlyZXR1cm4gMTsKCX0KCgljaGlwLT5j aGlwc2l6ZSA9ICgoKHVpbnQ2NF90KXR5cGUtPmNoaXBzaXplKSA8PCAyMCk7CgoJLyogSUQ0 OiBQbGFuZXMgKi8KCS8qICAgLSBOdW1iZXI6IElENFszOjJdICovCglkYXRhID0gKGlkWzRd ID4+IDIpICYgMHgzOwoJY2hpcC0+cGxhbmVzX3Blcl9jaGlwID0gMSA8PCBkYXRhOwoKCS8q IElEMzogUGFnZS9PT0IvQmxvY2sgU2l6ZSAqLwoJLyogICAtIFBhZ2UgU2l6ZTogIElEM1sx OjBdICovCglkYXRhID0gaWRbM10gJiAweDM7CgltdGQtPndyaXRlc2l6ZSA9IDIwNDggPDwg ZGF0YTsgLyogbXVsdGlwbGVzIG9mIDJrICovCgoJLyogICAtIE9PQiBTaXplOiBJRDNbNiwz OjJdICovCglkYXRhID0gKChpZFszXSA+PiA0KSAmIDB4NCkgfCAoKGlkWzNdID4+IDIpICYg MHgzKTsKCWlmIChpZFswXSA9PSBOQU5EX01GUl9TQU1TVU5HKSB7CgkJc3dpdGNoIChkYXRh KSB7CgkJY2FzZSAxOgoJCQltdGQtPm9vYnNpemUgPSAxMjg7CgkJCWJyZWFrOwoJCWNhc2Ug MjoKCQkJbXRkLT5vb2JzaXplID0gMjE4OwoJCQlicmVhazsKCQljYXNlIDM6CgkJCW10ZC0+ b29ic2l6ZSA9IDQwMDsKCQkJYnJlYWs7CgkJY2FzZSA0OgoJCQltdGQtPm9vYnNpemUgPSA0 MzY7CgkJCWJyZWFrOwoJCWNhc2UgNToKCQkJbXRkLT5vb2JzaXplID0gNjQwOwoJCQlicmVh azsKCQlkZWZhdWx0OgoJCQlwcl9lcnIoIltNVERdW05BTkRdOiVzOiB1bmtub3duIE9PQiBz aXplXG4iLAoJCQkgICAgICAgX19mdW5jX18pOwoJCQlyZXR1cm4gMTsKCQkJYnJlYWs7CgkJ fQoJfSBlbHNlIHsKCQlzd2l0Y2ggKGRhdGEpIHsKCQljYXNlIDA6CgkJCW10ZC0+b29ic2l6 ZSA9IDEyODsKCQkJYnJlYWs7CgkJY2FzZSAxOgoJCQltdGQtPm9vYnNpemUgPSAyMjQ7CgkJ CWJyZWFrOwoJCWNhc2UgMjoKCQkJbXRkLT5vb2JzaXplID0gNDQ4OwoJCQlicmVhazsKCQlk ZWZhdWx0OgoJCQlwcl9lcnIoIltNVERdW05BTkRdOiVzOiB1bmtub3duIE9PQiBzaXplXG4i LAoJCQkgICAgICAgX19mdW5jX18pOwoJCQlicmVhazsKCQl9Cgl9CgoJLyogICAtIEJsb2Nr IFNpemU6IElEM1s3LDU6NF0gKi8KCWRhdGEgPSAoKGlkWzNdID4+IDUpICYgMHg0KSB8ICgo aWRbM10gPj4gNCkgJiAweDMpOwoJc3dpdGNoIChkYXRhKSB7CgljYXNlIDA6CgljYXNlIDE6 CgljYXNlIDI6CgkJbXRkLT5lcmFzZXNpemUgPSAoMTI4ICogMTAyNCkgPDwgZGF0YTsKCQli cmVhazsKCWNhc2UgMzoKCQlpZiAoaWRbMF0gPT0gTkFORF9NRlJfU0FNU1VORykKCQkJbXRk LT5lcmFzZXNpemUgPSAoMTAyNCAqIDEwMjQpOwoJCWVsc2UKCQkJbXRkLT5lcmFzZXNpemUg PSAoNzY4ICogMTAyNCk7CgkJYnJlYWs7CgljYXNlIDQ6CgljYXNlIDU6CgkJbXRkLT5lcmFz ZXNpemUgPSAoMTAyNCAqIDEwMjQpIDw8IChkYXRhIC0gNCk7CgkJYnJlYWs7CglkZWZhdWx0 OgoJCXByX2VycigiW01URF1bTkFORF06JXM6IHVua25vd24gYmxvY2sgc2l6ZVxuIiwKCQkg ICAgICAgX19mdW5jX18pOwoJCXJldHVybiAxOwoJCWJyZWFrOwoJfQoKCS8qIFNvbWUgZGVm YXVsdCAnY2hpcCcgb3B0aW9ucyAqLwoJY2hpcC0+b3B0aW9ucyAmPSB+TkFORF9DSElQT1BU SU9OU19NU0s7CgljaGlwLT5vcHRpb25zIHw9IE5BTkRfTk9fQVVUT0lOQ1I7CglpZiAoY2hp cC0+cGxhbmVzX3Blcl9jaGlwID4gMSkKCQljaGlwLT5vcHRpb25zIHw9IE5BTkRfTVVMVElQ TEFORV9SRUFEOwoJCglpZiAobXRkLT53cml0ZXNpemUgPiA1MTIpCgkJY2hpcC0+b3B0aW9u cyB8PSBOQU5EX05PX1JFQURSRFk7CgkKCWlmIChpZFswXSA9PSBOQU5EX01GUl9TQU1TVU5H ICYmIG10ZC0+d3JpdGVzaXplID4gNTEyKQoJCWNoaXAtPm9wdGlvbnMgfD0gTkFORF9TQU1T VU5HX0xQX09QVElPTlM7CgoJLyogSUQyOiBQYWNrYWdlL0NlbGwvRmVhdHVyZXMgKi8KCS8q ICAgLSBMVU5zOiBJRDJbMTowXSAqLwoJZGF0YSA9IGlkWzJdICYgMHgzOwoJY2hpcC0+bHVu c19wZXJfY2hpcCA9IDB4MSA8PCBkYXRhOwoKCS8qICAgLSBDZWxsIGxldmVsczogSUQyWzM6 Ml0gKi8KCWRhdGEgPSAoaWRbMl0gPj4gMikgJiAweDM7CgljaGlwLT5iaXRzX3Blcl9jZWxs ID0gZGF0YSArIDE7CgoJLyogICAtIEludGVybGVhdmU6IElEMls2XSAqLwoJaWYgKChpZFsy XSA+PiA2KSAmIDB4MSkKCQljaGlwLT5vcHRpb25zIHw9IE5BTkRfTVVMVElMVU47CgoJLyog ICAtIENhY2hlIFByb2dyYW06IElEMls3XSAqLwoJaWYgKChpZFsyXSA+PiA3KSAmIDB4MSkK CQljaGlwLT5vcHRpb25zIHw9IE5BTkRfQ0FDSEVQUkc7CgoJLyogICAtIENvcHkgdG8gJ2Nl bGxpbmZvJyAqLwoJY2hpcC0+Y2VsbGluZm8gPSBpZFsyXTsKCgkvKiBCdXMgV2lkdGgsIGZy b20gdGFibGUgKi8KCWNoaXAtPm9wdGlvbnMgfD0gKHR5cGUtPm9wdGlvbnMgJiBOQU5EX0JV U1dJRFRIXzE2KTsKCglyZXR1cm4gMDsKfQoKCi8qCiAqIEhldXJpc3RpY3MgZm9yIGZhY3Rv cnktcHJvZ3JhbW1lZCBiYWQtYmxvY2sgbWFya2VyIChCQk0pIHNjaGVtZXMsIGxhcmdlbHkK ICogYmFzZWQgb24gY29kZSBpbiBtdGQtMi42ICgyMDExLTA3LTA5KQogKiBuYW5kX2Jhc2Uu YzpuYW5kX2dldF9mbGFzaF90eXBlKCksIGFuZCBkYXRhc2hlZXRzIGZvciBkZXZpY2VzIGlu CiAqIGh0dHA6Ly93d3cubGludXgtbXRkLmluZnJhZGVhZC5vcmcvbmFuZC1kYXRhL25hbmRk YXRhLmh0bWwgKDIwMTEtMDctMDkpLgogKi8Kc3RhdGljIHZvaWQgbmFuZF9kZWNvZGVfaWRf YmJtKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAoJCQkgICAgICAgc3RydWN0IG5hbmRfY2hpcCAq Y2hpcCwKCQkJICAgICAgIHVpbnQ4X3QgKmlkLCBpbnQgaWRfbGVuKQp7CgkvKgoJICogU29t ZSBzcGVjaWFsIGNhc2VzIGZpcnN0CgkgKi8KCQoJLyogSHluaXggSFkyN1VTMTYxMnsxLDJ9 QjogM3JkIHdvcmQgZm9yIHgxNiBkZXZpY2UhICovCglpZiAoaWRbMF0gPT0gTkFORF9NRlJf SFlOSVggJiYgaWRbMV0gPT0gMHg1NikgewoJCWNoaXAtPmJidF9vcHRpb25zID0gKE5BTkRf QkJNX1BBR0VfMCB8CgkJCQkgICAgIE5BTkRfQkJNX1BBR0VfMSB8CgkJCQkgICAgIE5BTkRf QkJNX0JZVEVfT09CXzUpOwoJCQkJICAgICAKCQlyZXR1cm47Cgl9CgkKCS8qIEh5bml4IEgy N1VBRzhUMkE6IGxhc3QgYW5kIGxhc3QtMiBwYWdlcywgYnl0ZSAwICovCglpZiAoaWRbMF0g PT0gTkFORF9NRlJfSFlOSVggJiYgaWRfbGVuID09IDYgJiYKCSAgICBpZFsxXSA9PSAweEQ1 ICYmIGlkWzJdID09IDB4OTQgJiYgaWRbM10gPT0gMHgyNSAmJgoJICAgIGlkWzRdID09IDB4 NDQgJiYgaWRbNV0gPT0gMHg0MSkgewoJCWNoaXAtPmJidF9vcHRpb25zID0gKE5BTkRfQkJN X1BBR0VfTEFTVCB8CgkJCQkgICAgIE5BTkRfQkJNX1BBR0VfTE1JTjIgfAoJCQkJICAgICBO QU5EX0JCTV9CWVRFX09PQl8wKTsKCQlyZXR1cm47Cgl9CgkKCS8qIE51bW9ueXgvU1QgMksv NEsgcGFnZXMsIHg4IGJ1cyB1c2UgQk9USCBieXRlIDAgYW5kIDUgKGRyaXZlcnMgbWF5Cgkg KiBuZWVkIHRvIGRpc2FibGUgJ2J5dGUgNScgZGVwZW5kaW5nIG9uIEVDQyBsYXlvdXQpCgkg Ki8KCWlmICghKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSAmJgoJICAgIG10 ZC0+d3JpdGVzaXplID49IDIwNDggJiYgaWRbMF0gPT0gTkFORF9NRlJfU1RNSUNSTykgewoJ IAljaGlwLT5iYnRfb3B0aW9ucyA9ICAoTkFORF9CQk1fUEFHRV8wIHwKCQkJCSAgICAgIE5B TkRfQkJNX0JZVEVfT09CXzAgfAoJCQkJICAgICAgTkFORF9CQk1fQllURV9PT0JfNSk7CgkJ cmV0dXJuOwoJfQoKCS8qIFNhbXN1bmcgYW5kIEh5bml4IE1MQyBOQU5EOiBsYXN0IHBhZ2Us IGJ5dGUgMDsgYW5kIDFzdCBwYWdlIGZvciA4S2lCCgkgKiBwYWdlIGRldmljZXMgKi8KCWlm ICgoaWRbMF0gPT0gTkFORF9NRlJfU0FNU1VORyB8fCBpZFswXSA9PSBOQU5EX01GUl9IWU5J WCkgJiYKCSAgICBjaGlwLT5iaXRzX3Blcl9jZWxsID09IDIpIHsKCQljaGlwLT5iYnRfb3B0 aW9ucyA9IE5BTkRfQkJNX1BBR0VfTEFTVCB8IE5BTkRfQkJNX0JZVEVfT09CXzA7CgkJaWYg KG10ZC0+d3JpdGVzaXplID09IDgxOTIpCgkJCWNoaXAtPmJidF9vcHRpb25zIHw9IE5BTkRf QkJNX1BBR0VfMDsKCQlyZXR1cm47Cgl9CgkKCS8qIE1pY3JvbiAyS2lCIHBhZ2UgZGV2aWNl cyB1c2UgMXN0IGFuZCAybmQgcGFnZSwgYnl0ZSAwICovCglpZiAoaWRbMF0gPT0gTkFORF9N RlJfTUlDUk9OICYmIG10ZC0+d3JpdGVzaXplID09IDIwNDgpIHsKCQljaGlwLT5iYnRfb3B0 aW9ucyA9IE5BTkRfQkJNX1BBR0VfMCB8IE5BTkRfQkJNX1BBR0VfMSB8CgkJCU5BTkRfQkJN X0JZVEVfT09CXzA7CgkJcmV0dXJuOwoJfQoKCS8qCgkgKiBGb3IgdGhlIHJlc3QuLi4KCSAq LwoJCgkvKiBTY2FuIGF0IGxlYXN0IHRoZSBmaXJzdCBwYWdlICovCgljaGlwLT5iYnRfb3B0 aW9ucyA9IE5BTkRfQkJNX1BBR0VfMDsKCS8qIEFsc28gMm5kIHBhZ2UgZm9yIFNMQyBTYW1z dW5nLCBIeW5peCwgVG9zaGlhLCBhbmQgQU1EL1NwYW5zaW9uICovCglpZiAoY2hpcC0+Yml0 c19wZXJfY2VsbCA9PSAxICYmCgkgICAgKGlkWzBdID09IE5BTkRfTUZSX1NBTVNVTkcgfHwK CSAgICAgaWRbMF0gPT0gTkFORF9NRlJfSFlOSVggfHwKCSAgICAgaWRbMF0gPT0gTkFORF9N RlJfVE9TSElCQSB8fAoJICAgICBpZFswXSA9PSBOQU5EX01GUl9BTUQpKQoJCWNoaXAtPmJi dF9vcHRpb25zIHw9IE5BTkRfQkJNX1BBR0VfMTsKCgkvKiBTUCB4OCBkZXZpY2VzIHVzZSA2 dGggYnl0ZSBPT0I7IGV2ZXJ5dGhpbmcgZWxzZSB1c2VzIDFzdCBieXRlIE9PQiAqLwoJaWYg KG10ZC0+d3JpdGVzaXplID09IDUxMiAmJiAhKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJ RFRIXzE2KSkKCQljaGlwLT5iYnRfb3B0aW9ucyB8PSBOQU5EX0JCTV9CWVRFX09PQl81OwoJ ZWxzZQoJCWNoaXAtPmJidF9vcHRpb25zIHw9IE5BTkRfQkJNX0JZVEVfT09CXzA7CgkKCXJl dHVybjsKfQo= --------------020109080200070805030108--