From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Vasquez Subject: [PATCH] qla2xxx - perform proper SNS scans with ISP2200 HBAs. [1/3] (Resend) Date: Tue, 27 Jan 2004 14:35:25 -0800 Sender: linux-scsi-owner@vger.kernel.org Message-ID: <1075242925.6053.67.camel@dieplab1> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-7XyKGqh1nv024MAlfkvL" Return-path: Received: from [198.70.193.2] ([198.70.193.2]:3449 "EHLO avexch01.qlogic.com") by vger.kernel.org with ESMTP id S265143AbUA0Wc5 (ORCPT ); Tue, 27 Jan 2004 17:32:57 -0500 List-Id: linux-scsi@vger.kernel.org To: James Bottomley Cc: linux-scsi@vger.kernel.org --=-7XyKGqh1nv024MAlfkvL Content-Type: text/plain Content-Transfer-Encoding: 7bit James, The 2200 firmware doesn't support the MS IOCB interface the driver uses to issue CT commands to the SNS. Basically, I had to forward-port some code from the 6.x driver to get the SNS calls to go through. I've had several machines (mixture of 2200s/ 2300s/others with loop and fabric connections) running with this patch for the past week. Please apply. Regards, Andrew Vasquez --=-7XyKGqh1nv024MAlfkvL Content-Type: application/octet-stream; name="QL3_sns_fix_2200-262rc2.diff" Content-Description: QL3_sns_fix_2200-262rc2.diff Content-Disposition: attachment; filename="QL3_sns_fix_2200-262rc2.diff" Content-Transfer-Encoding: base64 ZGlmZiAtTnVyZCAtWCAvcm9vdC9Ecml2ZXJzLzgueC9kb250ZGlmZi1iayBsaW51eC0yLjYuMi1y YzIvZHJpdmVycy9zY3NpL3FsYTJ4eHgtb3JpZy9xbGFfZGVmLmggbGludXgtMi42LjItcmMyL2Ry aXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAotLS0gbGludXgtMi42LjItcmMyL2RyaXZlcnMv c2NzaS9xbGEyeHh4LW9yaWcvcWxhX2RlZi5oCTIwMDQtMDEtMjIgMDg6NDU6MjAuMDIzMzUyNjMy IC0wODAwCisrKyBsaW51eC0yLjYuMi1yYzIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5o CTIwMDQtMDEtMjIgMDg6NDY6MDkuMzE2ODU4ODgwIC0wODAwCkBAIC0xODkwLDYgKzE4OTAsNjAg QEAKIAl9IHA7CiB9OwogCisvKgorICogU05TIGNvbW1hbmQgc3RydWN0dXJlcyAtLSBmb3IgMjIw MCBjb21wYXRhYmlsaXR5LgorICovCisjZGVmaW5lCVJGVF9JRF9TTlNfU0NNRF9MRU4JMjIKKyNk ZWZpbmUJUkZUX0lEX1NOU19DTURfU0laRQk2MAorI2RlZmluZQlSRlRfSURfU05TX0RBVEFfU0la RQkxNgorCisjZGVmaW5lCVJGRl9JRF9TTlNfU0NNRF9MRU4JOAorI2RlZmluZQlSRkZfSURfU05T X0NNRF9TSVpFCTMyCisjZGVmaW5lCVJGRl9JRF9TTlNfREFUQV9TSVpFCTE2CisKKyNkZWZpbmUJ Uk5OX0lEX1NOU19TQ01EX0xFTgkxMAorI2RlZmluZQlSTk5fSURfU05TX0NNRF9TSVpFCTM2Cisj ZGVmaW5lCVJOTl9JRF9TTlNfREFUQV9TSVpFCTE2CisKKyNkZWZpbmUJR0FfTlhUX1NOU19TQ01E X0xFTgk2CisjZGVmaW5lCUdBX05YVF9TTlNfQ01EX1NJWkUJMjgKKyNkZWZpbmUJR0FfTlhUX1NO U19EQVRBX1NJWkUJKDYyMCArIDE2KQorCisjZGVmaW5lCUdJRF9QVF9TTlNfU0NNRF9MRU4JNgor I2RlZmluZQlHSURfUFRfU05TX0NNRF9TSVpFCTI4CisjZGVmaW5lCUdJRF9QVF9TTlNfREFUQV9T SVpFCShNQVhfRklCUkVfREVWSUNFUyAqIDQgKyAxNikKKworI2RlZmluZQlHUE5fSURfU05TX1ND TURfTEVOCTYKKyNkZWZpbmUJR1BOX0lEX1NOU19DTURfU0laRQkyOAorI2RlZmluZQlHUE5fSURf U05TX0RBVEFfU0laRQkoOCArIDE2KQorCisjZGVmaW5lCUdOTl9JRF9TTlNfU0NNRF9MRU4JNgor I2RlZmluZQlHTk5fSURfU05TX0NNRF9TSVpFCTI4CisjZGVmaW5lCUdOTl9JRF9TTlNfREFUQV9T SVpFCSg4ICsgMTYpCisKK3N0cnVjdCBzbnNfY21kX3BrdCB7CisJdW5pb24geworCQlzdHJ1Y3Qg eworCQkJdWludDE2X3QgYnVmZmVyX2xlbmd0aDsKKwkJCXVpbnQxNl90IHJlc2VydmVkXzE7CisJ CQl1aW50MzJfdCBidWZmZXJfYWRkcmVzc1syXTsKKwkJCXVpbnQxNl90IHN1YmNvbW1hbmRfbGVu Z3RoOworCQkJdWludDE2X3QgcmVzZXJ2ZWRfMjsKKwkJCXVpbnQxNl90IHN1YmNvbW1hbmQ7CisJ CQl1aW50MTZfdCBzaXplOworCQkJdWludDMyX3QgcmVzZXJ2ZWRfMzsKKwkJCXVpbnQ4X3QgcGFy YW1bMzZdOworCQl9IGNtZDsKKworCQl1aW50OF90IHJmdF9kYXRhW1JGVF9JRF9TTlNfREFUQV9T SVpFXTsKKwkJdWludDhfdCByZmZfZGF0YVtSRkZfSURfU05TX0RBVEFfU0laRV07CisJCXVpbnQ4 X3Qgcm5uX2RhdGFbUk5OX0lEX1NOU19EQVRBX1NJWkVdOworCQl1aW50OF90IGdhbl9kYXRhW0dB X05YVF9TTlNfREFUQV9TSVpFXTsKKwkJdWludDhfdCBnaWRfZGF0YVtHSURfUFRfU05TX0RBVEFf U0laRV07CisJCXVpbnQ4X3QgZ3BuX2RhdGFbR1BOX0lEX1NOU19EQVRBX1NJWkVdOworCQl1aW50 OF90IGdubl9kYXRhW0dOTl9JRF9TTlNfREFUQV9TSVpFXTsKKwl9IHA7Cit9OwogCiAvKiBJTyBk ZXNjcmlwdG9ycyAqLwogI2RlZmluZSBNQVhfSU9fREVTQ1JJUFRPUlMJMzIKQEAgLTIxNjQsMTAg KzIyMTgsMTQgQEAKIAl1aW50OF90IHJzY25faW5fcHRyOwogCXVpbnQ4X3QgcnNjbl9vdXRfcHRy OwogCisJLyogU05TIGNvbW1hbmQgaW50ZXJmYWNlcy4gKi8KIAltc19pb2NiX2VudHJ5X3QJCSpt c19pb2NiOwogCWRtYV9hZGRyX3QJCW1zX2lvY2JfZG1hOwogCXN0cnVjdCBjdF9zbnNfcGt0CSpj dF9zbnM7CiAJZG1hX2FkZHJfdAkJY3Rfc25zX2RtYTsKKwkvKiBTTlMgY29tbWFuZCBpbnRlcmZh Y2VzIGZvciAyMjAwLiAqLworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKwlkbWFfYWRk cl90CQlzbnNfY21kX2RtYTsKIAogCXBpZF90CQkJZHBjX3BpZDsKIAlpbnQJCQlkcGNfc2hvdWxk X2RpZTsKZGlmZiAtTnVyZCAtWCAvcm9vdC9Ecml2ZXJzLzgueC9kb250ZGlmZi1iayBsaW51eC0y LjYuMi1yYzIvZHJpdmVycy9zY3NpL3FsYTJ4eHgtb3JpZy9xbGFfZ3MuYyBsaW51eC0yLjYuMi1y YzIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKLS0tIGxpbnV4LTIuNi4yLXJjMi9kcml2 ZXJzL3Njc2kvcWxhMnh4eC1vcmlnL3FsYV9ncy5jCTIwMDQtMDEtMjIgMDg6NDU6MjAuMDI0MzUy NDgwIC0wODAwCisrKyBsaW51eC0yLjYuMi1yYzIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dz LmMJMjAwNC0wMS0yMiAwODo0NjowOS4zMjA4NTgyNzIgLTA4MDAKQEAgLTMxLDYgKzMxLDE3IEBA CiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjdF9zbnNfcmVxICoKIHFsYTJ4MDBfcHJlcF9jdF9yZXEo c3RydWN0IGN0X3Nuc19yZXEgKiwgdWludDE2X3QsIHVpbnQxNl90KTsKIAorc3RhdGljIGlubGlu ZSBzdHJ1Y3Qgc25zX2NtZF9wa3QgKgorcWxhMngwMF9wcmVwX3Nuc19jbWQoc2NzaV9xbGFfaG9z dF90ICosIHVpbnQxNl90LCB1aW50MTZfdCwgdWludDE2X3QpOworCitzdGF0aWMgaW50IHFsYTJ4 MDBfc25zX2dhX254dChzY3NpX3FsYV9ob3N0X3QgKiwgZmNfcG9ydF90ICopOworc3RhdGljIGlu dCBxbGEyeDAwX3Nuc19naWRfcHQoc2NzaV9xbGFfaG9zdF90ICosIHN3X2luZm9fdCAqKTsKK3N0 YXRpYyBpbnQgcWxhMngwMF9zbnNfZ3BuX2lkKHNjc2lfcWxhX2hvc3RfdCAqLCBzd19pbmZvX3Qg Kik7CitzdGF0aWMgaW50IHFsYTJ4MDBfc25zX2dubl9pZChzY3NpX3FsYV9ob3N0X3QgKiwgc3df aW5mb190ICopOworc3RhdGljIGludCBxbGEyeDAwX3Nuc19yZnRfaWQoc2NzaV9xbGFfaG9zdF90 ICopOworc3RhdGljIGludCBxbGEyeDAwX3Nuc19yZmZfaWQoc2NzaV9xbGFfaG9zdF90ICopOwor c3RhdGljIGludCBxbGEyeDAwX3Nuc19ybm5faWQoc2NzaV9xbGFfaG9zdF90ICopOworCiAvKioK ICAqIHFsYTJ4MDBfcHJlcF9tc19pb2NiKCkgLSBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCIGZpZWxk cyBmb3IgU05TIENUIHF1ZXJ5LgogICogQGhhOiBIQSBjb250ZXh0CkBAIC05MCw2ICsxMDEsNyBA QAogCXJldHVybiAoY3RfcmVxKTsKIH0KIAorCiAvKioKICAqIHFsYTJ4MDBfZ2Ffbnh0KCkgLSBT TlMgc2NhbiBmb3IgZmFicmljIGRldmljZXMgdmlhIEdBX05YVCBjb21tYW5kLgogICogQGhhOiBI QSBjb250ZXh0CkBAIC0xMDYsNiArMTE4LDEwIEBACiAJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3Jl cTsKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOwogCisJaWYgKElTX1FMQTIyMDAoaGEpKSB7 CisJCXJldHVybiAocWxhMngwMF9zbnNfZ2Ffbnh0KGhhLCBmY3BvcnQpKTsKKwl9CisKIAkvKiBJ c3N1ZSBHQV9OWFQgKi8KIAkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCiAJbXNfcGt0ID0g cWxhMngwMF9wcmVwX21zX2lvY2IoaGEsIEdBX05YVF9SRVFfU0laRSwgR0FfTlhUX1JTUF9TSVpF KTsKQEAgLTE5MCw2ICsyMDYsMTAgQEAKIAogCXN0cnVjdCBjdF9zbnNfZ2lkX3B0X2RhdGEgKmdp ZF9kYXRhOwogCisJaWYgKElTX1FMQTIyMDAoaGEpKSB7CisJCXJldHVybiAocWxhMngwMF9zbnNf Z2lkX3B0KGhhLCBsaXN0KSk7CisJfQorCiAJZ2lkX2RhdGEgPSBOVUxMOwogCiAJLyogSXNzdWUg R0lEX1BUICovCkBAIC0yNjMsNiArMjgzLDEwIEBACiAJc3RydWN0IGN0X3Nuc19yZXEJKmN0X3Jl cTsKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOwogCisJaWYgKElTX1FMQTIyMDAoaGEpKSB7 CisJCXJldHVybiAocWxhMngwMF9zbnNfZ3BuX2lkKGhhLCBsaXN0KSk7CisJfQorCiAJZm9yIChp ID0gMDsgaSA8IE1BWF9GSUJSRV9ERVZJQ0VTOyBpKyspIHsKIAkJLyogSXNzdWUgR1BOX0lEICov CiAJCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KQEAgLTMwOCw3ICszMzIsNyBAQAogfQog CiAvKioKLSAqIHFsYTJ4MDBfZ25uX2lkKCkgLSBTTlMgR2V0IE5vZGUgTmFtZSAoR1BOX0lEKSBx dWVyeS4KKyAqIHFsYTJ4MDBfZ25uX2lkKCkgLSBTTlMgR2V0IE5vZGUgTmFtZSAoR05OX0lEKSBx dWVyeS4KICAqIEBoYTogSEEgY29udGV4dAogICogQGxpc3Q6IHN3aXRjaCBpbmZvIGVudHJpZXMg dG8gcG9wdWxhdGUKICAqCkBAIC0zMjQsNiArMzQ4LDEwIEBACiAJc3RydWN0IGN0X3Nuc19yZXEJ KmN0X3JlcTsKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOwogCisJaWYgKElTX1FMQTIyMDAo aGEpKSB7CisJCXJldHVybiAocWxhMngwMF9zbnNfZ25uX2lkKGhhLCBsaXN0KSk7CisJfQorCiAJ Zm9yIChpID0gMDsgaSA8IE1BWF9GSUJSRV9ERVZJQ0VTOyBpKyspIHsKIAkJLyogSXNzdWUgR05O X0lEICovCiAJCS8qIFByZXBhcmUgY29tbW9uIE1TIElPQ0IgKi8KQEAgLTQ2Miw2ICs0OTAsMTAg QEAKIAlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOwogCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9y c3A7CiAKKwlpZiAoSVNfUUxBMjIwMChoYSkpIHsKKwkJcmV0dXJuIChxbGEyeDAwX3Nuc19yZnRf aWQoaGEpKTsKKwl9CisKIAkvKiBJc3N1ZSBSRlRfSUQgKi8KIAkvKiBQcmVwYXJlIGNvbW1vbiBN UyBJT0NCICovCiAJbXNfcGt0ID0gcWxhMngwMF9wcmVwX21zX2lvY2IoaGEsIFJGVF9JRF9SRVFf U0laRSwgUkZUX0lEX1JTUF9TSVpFKTsKQEAgLTUxNiw2ICs1NDgsMTAgQEAKIAlzdHJ1Y3QgY3Rf c25zX3JlcQkqY3RfcmVxOwogCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CiAKKwlpZiAoSVNf UUxBMjIwMChoYSkpIHsKKwkJcmV0dXJuIChxbGEyeDAwX3Nuc19yZmZfaWQoaGEpKTsKKwl9CisK IAkvKiBJc3N1ZSBSRkZfSUQgKi8KIAkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCiAJbXNf cGt0ID0gcWxhMngwMF9wcmVwX21zX2lvY2IoaGEsIFJGRl9JRF9SRVFfU0laRSwgUkZGX0lEX1JT UF9TSVpFKTsKQEAgLTU2OSw2ICs2MDUsMTAgQEAKIAlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVx OwogCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CiAKKwlpZiAoSVNfUUxBMjIwMChoYSkpIHsK KwkJcmV0dXJuIChxbGEyeDAwX3Nuc19ybm5faWQoaGEpKTsKKwl9CisKIAkvKiBJc3N1ZSBSTk5f SUQgKi8KIAkvKiBQcmVwYXJlIGNvbW1vbiBNUyBJT0NCICovCiAJbXNfcGt0ID0gcWxhMngwMF9w cmVwX21zX2lvY2IoaGEsIFJOTl9JRF9SRVFfU0laRSwgUk5OX0lEX1JTUF9TSVpFKTsKQEAgLTYy NCw2ICs2NjQsMTIgQEAKIAlzdHJ1Y3QgY3Rfc25zX3JlcQkqY3RfcmVxOwogCXN0cnVjdCBjdF9z bnNfcnNwCSpjdF9yc3A7CiAKKwlpZiAoSVNfUUxBMjIwMChoYSkpIHsKKwkJREVCVUcyKHByaW50 aygic2NzaSglbGQpOiBSU05OX0lEIGNhbGwgdW5zdXBwb3J0ZWQgb24gIgorCQkgICAgIklTUDIy MDAuXG4iLCBoYS0+aG9zdF9ubykpOworCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKKwl9CisKIAkv KiBJc3N1ZSBSU05OX05OICovCiAJLyogUHJlcGFyZSBjb21tb24gTVMgSU9DQiAqLwogCS8qICAg UmVxdWVzdCBzaXplIGFkanVzdGVkIGFmdGVyIENUIHByZXBhcmF0aW9uICovCkBAIC02NzksMyAr NzI1LDQ1NCBAQAogCiAJcmV0dXJuIChydmFsKTsKIH0KKworCisvKioKKyAqIHFsYTJ4MDBfcHJl cF9zbnNfY21kKCkgLSBQcmVwYXJlIGNvbW1vbiBTTlMgY29tbWFuZCByZXF1ZXN0IGZpZWxkcyBm b3IgcXVlcnkuCisgKiBAaGE6IEhBIGNvbnRleHQKKyAqIEBjbWQ6IEdTIGNvbW1hbmQKKyAqIEBz Y21kX2xlbjogU3ViY29tbWFuZCBsZW5ndGgKKyAqIEBkYXRhX3NpemU6IHJlc3BvbnNlIHNpemUg aW4gYnl0ZXMKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgQGhhJ3Mgc25zX2NtZC4K KyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc25zX2NtZF9wa3QgKgorcWxhMngwMF9wcmVwX3Nu c19jbWQoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgY21kLCB1aW50MTZfdCBzY21kX2xl biwKKyAgICB1aW50MTZfdCBkYXRhX3NpemUpCit7CisJdWludDE2X3QJCXdjOworCXN0cnVjdCBz bnNfY21kX3BrdAkqc25zX2NtZDsKKworCXNuc19jbWQgPSBoYS0+c25zX2NtZDsKKwltZW1zZXQo c25zX2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOworCXdjID0gZGF0YV9zaXpl IC8gMjsJCQkvKiBTaXplIGluIDE2Yml0IHdvcmRzLiAqLworCXNuc19jbWQtPnAuY21kLmJ1ZmZl cl9sZW5ndGggPSBjcHVfdG9fbGUxNih3Yyk7CisJc25zX2NtZC0+cC5jbWQuYnVmZmVyX2FkZHJl c3NbMF0gPSBjcHVfdG9fbGUzMihMU0QoaGEtPnNuc19jbWRfZG1hKSk7CisJc25zX2NtZC0+cC5j bWQuYnVmZmVyX2FkZHJlc3NbMV0gPSBjcHVfdG9fbGUzMihNU0QoaGEtPnNuc19jbWRfZG1hKSk7 CisJc25zX2NtZC0+cC5jbWQuc3ViY29tbWFuZF9sZW5ndGggPSBjcHVfdG9fbGUxNihzY21kX2xl bik7CisJc25zX2NtZC0+cC5jbWQuc3ViY29tbWFuZCA9IGNwdV90b19sZTE2KGNtZCk7CisJd2Mg PSAoZGF0YV9zaXplIC0gMTYpIC8gNDsJCS8qIFNpemUgaW4gMzJiaXQgd29yZHMuICovCisJc25z X2NtZC0+cC5jbWQuc2l6ZSA9IGNwdV90b19sZTE2KHdjKTsKKworCXJldHVybiAoc25zX2NtZCk7 Cit9CisKKy8qKgorICogcWxhMngwMF9zbnNfZ2Ffbnh0KCkgLSBTTlMgc2NhbiBmb3IgZmFicmlj IGRldmljZXMgdmlhIEdBX05YVCBjb21tYW5kLgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAZmNw b3J0OiBmY3BvcnQgZW50cnkgdG8gdXBkYXRlZAorICoKKyAqIFRoaXMgY29tbWFuZCB1c2VzIHRo ZSBvbGQgRXhlY3R1dGUgU05TIENvbW1hbmQgbWFpbGJveCByb3V0aW5lLgorICoKKyAqIFJldHVy bnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3Nuc19nYV9ueHQoc2Nz aV9xbGFfaG9zdF90ICpoYSwgZmNfcG9ydF90ICpmY3BvcnQpCit7CisJaW50CQlydmFsOworCisJ c3RydWN0IHNuc19jbWRfcGt0CSpzbnNfY21kOworCisJLyogSXNzdWUgR0FfTlhULiAqLworCS8q IFByZXBhcmUgU05TIGNvbW1hbmQgcmVxdWVzdC4gKi8KKwlzbnNfY21kID0gcWxhMngwMF9wcmVw X3Nuc19jbWQoaGEsIEdBX05YVF9DTUQsIEdBX05YVF9TTlNfU0NNRF9MRU4sCisJICAgIEdBX05Y VF9TTlNfREFUQV9TSVpFKTsKKworCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgYXJndW1lbnRzIC0t IHBvcnRfaWQuICovCisJc25zX2NtZC0+cC5jbWQucGFyYW1bMF0gPSBmY3BvcnQtPmRfaWQuYi5h bF9wYTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVsxXSA9IGZjcG9ydC0+ZF9pZC5iLmFyZWE7CisJ c25zX2NtZC0+cC5jbWQucGFyYW1bMl0gPSBmY3BvcnQtPmRfaWQuYi5kb21haW47CisKKwkvKiBF eGVjdXRlIFNOUyBjb21tYW5kLiAqLworCXJ2YWwgPSBxbGEyeDAwX3NlbmRfc25zKGhhLCBoYS0+ c25zX2NtZF9kbWEsIEdBX05YVF9TTlNfQ01EX1NJWkUgLyAyLAorCSAgICBzaXplb2Yoc3RydWN0 IHNuc19jbWRfcGt0KSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJLypFTVBUWSov CisJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgU2VuZCBTTlMgZmFpbGVkICgl ZCkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwl9IGVsc2UgaWYgKHNuc19jbWQt PnAuZ2FuX2RhdGFbOF0gIT0gMHg4MCB8fAorCSAgICBzbnNfY21kLT5wLmdhbl9kYXRhWzldICE9 IDB4MDIpIHsKKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBmYWlsZWQsIHJl amVjdGVkIHJlcXVlc3QsICIKKwkJICAgICJnYV9ueHRfcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsK KwkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLmdhbl9kYXRhLCAxNikp OworCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKKwl9IGVsc2UgeworCQkvKiBQb3B1bGF0 ZSBmY19wb3J0X3QgZW50cnkuICovCisJCWZjcG9ydC0+ZF9pZC5iLmRvbWFpbiA9IHNuc19jbWQt PnAuZ2FuX2RhdGFbMTddOworCQlmY3BvcnQtPmRfaWQuYi5hcmVhID0gc25zX2NtZC0+cC5nYW5f ZGF0YVsxOF07CisJCWZjcG9ydC0+ZF9pZC5iLmFsX3BhID0gc25zX2NtZC0+cC5nYW5fZGF0YVsx OV07CisKKwkJbWVtY3B5KGZjcG9ydC0+bm9kZV9uYW1lLCAmc25zX2NtZC0+cC5nYW5fZGF0YVsy ODRdLCBXV05fU0laRSk7CisJCW1lbWNweShmY3BvcnQtPnBvcnRfbmFtZSwgJnNuc19jbWQtPnAu Z2FuX2RhdGFbMjBdLCBXV05fU0laRSk7CisKKwkJaWYgKHNuc19jbWQtPnAuZ2FuX2RhdGFbMTZd ICE9IE5TX05fUE9SVF9UWVBFICYmCisJCSAgICBzbnNfY21kLT5wLmdhbl9kYXRhWzE2XSAhPSBO U19OTF9QT1JUX1RZUEUpCisJCQlmY3BvcnQtPmRfaWQuYi5kb21haW4gPSAweGYwOworCisJCURF QlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgZW50cnkgLSAiCisJCSAgICAibm4gJTAy eCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkgICAgInBuICUwMnglMDJ4JTAyeCUw MnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkJ ICAgIGhhLT5ob3N0X25vLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMF0sIGZjcG9ydC0+bm9k ZV9uYW1lWzFdLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMl0sIGZjcG9ydC0+bm9kZV9uYW1l WzNdLAorCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbNF0sIGZjcG9ydC0+bm9kZV9uYW1lWzVdLAor CQkgICAgZmNwb3J0LT5ub2RlX25hbWVbNl0sIGZjcG9ydC0+bm9kZV9uYW1lWzddLAorCQkgICAg ZmNwb3J0LT5wb3J0X25hbWVbMF0sIGZjcG9ydC0+cG9ydF9uYW1lWzFdLAorCQkgICAgZmNwb3J0 LT5wb3J0X25hbWVbMl0sIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAorCQkgICAgZmNwb3J0LT5wb3J0 X25hbWVbNF0sIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVb Nl0sIGZjcG9ydC0+cG9ydF9uYW1lWzddLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBm Y3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwl9CisK KwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc25zX2dpZF9wdCgpIC0gU05T IHNjYW4gZm9yIGZhYnJpYyBkZXZpY2VzIHZpYSBHSURfUFQgY29tbWFuZC4KKyAqIEBoYTogSEEg Y29udGV4dAorICogQGxpc3Q6IHN3aXRjaCBpbmZvIGVudHJpZXMgdG8gcG9wdWxhdGUKKyAqCisg KiBUaGlzIGNvbW1hbmQgdXNlcyB0aGUgb2xkIEV4ZWN0dXRlIFNOUyBDb21tYW5kIG1haWxib3gg cm91dGluZS4KKyAqCisgKiBOT1RFOiBOb24tTnhfUG9ydHMgYXJlIG5vdCByZXF1ZXN0ZWQuCisg KgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc25z X2dpZF9wdChzY3NpX3FsYV9ob3N0X3QgKmhhLCBzd19pbmZvX3QgKmxpc3QpCit7CisJaW50CQly dmFsOworCisJdWludDE2X3QJaTsKKwl1aW50OF90CQkqZW50cnk7CisJc3RydWN0IHNuc19jbWRf cGt0CSpzbnNfY21kOworCisJLyogSXNzdWUgR0lEX1BULiAqLworCS8qIFByZXBhcmUgU05TIGNv bW1hbmQgcmVxdWVzdC4gKi8KKwlzbnNfY21kID0gcWxhMngwMF9wcmVwX3Nuc19jbWQoaGEsIEdJ RF9QVF9DTUQsIEdJRF9QVF9TTlNfU0NNRF9MRU4sCisJICAgIEdJRF9QVF9TTlNfREFUQV9TSVpF KTsKKworCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgYXJndW1lbnRzIC0tIHBvcnRfdHlwZS4gKi8K KwlzbnNfY21kLT5wLmNtZC5wYXJhbVswXSA9IE5TX05YX1BPUlRfVFlQRTsKKworCS8qIEV4ZWN1 dGUgU05TIGNvbW1hbmQuICovCisJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5zbnNf Y21kX2RtYSwgR0lEX1BUX1NOU19DTURfU0laRSAvIDIsCisJICAgIHNpemVvZihzdHJ1Y3Qgc25z X2NtZF9wa3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJ REVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5c biIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5n aWRfZGF0YVs4XSAhPSAweDgwIHx8CisJICAgIHNuc19jbWQtPnAuZ2lkX2RhdGFbOV0gIT0gMHgw MikgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0lEX1BUIGZhaWxlZCwgcmVqZWN0 ZWQgcmVxdWVzdCwgIgorCQkgICAgImdpZF9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJV RzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAuZ2lkX2RhdGEsIDE2KSk7CisJCXJ2 YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCS8qIFNldCBwb3J0IElEcyBp biBzd2l0Y2ggaW5mbyBsaXN0LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJQlJFX0RFVklD RVM7IGkrKykgeworCQkJZW50cnkgPSAmc25zX2NtZC0+cC5naWRfZGF0YVsoaSAqIDQpICsgMTZd OworCQkJbGlzdFtpXS5kX2lkLmIuZG9tYWluID0gZW50cnlbMV07CisJCQlsaXN0W2ldLmRfaWQu Yi5hcmVhID0gZW50cnlbMl07CisJCQlsaXN0W2ldLmRfaWQuYi5hbF9wYSA9IGVudHJ5WzNdOwor CisJCQkvKiBMYXN0IG9uZSBleGl0LiAqLworCQkJaWYgKGVudHJ5WzBdICYgQklUXzcpIHsKKwkJ CQlsaXN0W2ldLmRfaWQuYi5yc3ZkXzEgPSBlbnRyeVswXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJ fQorCisJCS8qCisJCSAqIElmIHdlJ3ZlIHVzZWQgYWxsIGF2YWlsYWJsZSBzbG90cywgdGhlbiB0 aGUgc3dpdGNoIGlzCisJCSAqIHJlcG9ydGluZyBiYWNrIG1vcmUgZGV2aWNlcyB0aGF0IHdlIGNh biBoYW5kbGUgd2l0aCB0aGlzCisJCSAqIHNpbmdsZSBjYWxsLiAgUmV0dXJuIGEgZmFpbGVkIHN0 YXR1cywgYW5kIGxldCBHQV9OWFQgaGFuZGxlCisJCSAqIHRoZSBvdmVybG9hZC4KKwkJICovCisJ CWlmIChpID09IE1BWF9GSUJSRV9ERVZJQ0VTKSAKKwkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJ TEVEOworCX0KKworCXJldHVybiAocnZhbCk7Cit9CisKKy8qKgorICogcWxhMngwMF9zbnNfZ3Bu X2lkKCkgLSBTTlMgR2V0IFBvcnQgTmFtZSAoR1BOX0lEKSBxdWVyeS4KKyAqIEBoYTogSEEgY29u dGV4dAorICogQGxpc3Q6IHN3aXRjaCBpbmZvIGVudHJpZXMgdG8gcG9wdWxhdGUKKyAqCisgKiBU aGlzIGNvbW1hbmQgdXNlcyB0aGUgb2xkIEV4ZWN0dXRlIFNOUyBDb21tYW5kIG1haWxib3ggcm91 dGluZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludAorcWxh MngwMF9zbnNfZ3BuX2lkKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHN3X2luZm9fdCAqbGlzdCkKK3sK KwlpbnQJCXJ2YWw7CisKKwl1aW50MTZfdAlpOworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2Nt ZDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRklCUkVfREVWSUNFUzsgaSsrKSB7CisJCS8qIElz c3VlIEdQTl9JRCAqLworCQkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCisJCXNu c19jbWQgPSBxbGEyeDAwX3ByZXBfc25zX2NtZChoYSwgR1BOX0lEX0NNRCwKKwkJICAgIEdQTl9J RF9TTlNfU0NNRF9MRU4sIEdQTl9JRF9TTlNfREFUQV9TSVpFKTsKKworCQkvKiBQcmVwYXJlIFNO UyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLiAqLworCQlzbnNfY21kLT5wLmNtZC5wYXJh bVswXSA9IGxpc3RbaV0uZF9pZC5iLmFsX3BhOworCQlzbnNfY21kLT5wLmNtZC5wYXJhbVsxXSA9 IGxpc3RbaV0uZF9pZC5iLmFyZWE7CisJCXNuc19jbWQtPnAuY21kLnBhcmFtWzJdID0gbGlzdFtp XS5kX2lkLmIuZG9tYWluOworCisJCS8qIEV4ZWN1dGUgU05TIGNvbW1hbmQuICovCisJCXJ2YWwg PSBxbGEyeDAwX3NlbmRfc25zKGhhLCBoYS0+c25zX2NtZF9kbWEsCisJCSAgICBHUE5fSURfU05T X0NNRF9TSVpFIC8gMiwgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOworCQlpZiAocnZhbCAh PSBRTEFfU1VDQ0VTUykgeworCQkJLypFTVBUWSovCisJCQlERUJVRzJfMyhwcmludGsoInNjc2ko JWxkKTogR1BOX0lEIFNlbmQgU05TIGZhaWxlZCAiCisJCQkgICAgIiglZCkuXG4iLCBoYS0+aG9z dF9ubywgcnZhbCkpOworCQl9IGVsc2UgaWYgKHNuc19jbWQtPnAuZ3BuX2RhdGFbOF0gIT0gMHg4 MCB8fAorCQkgICAgc25zX2NtZC0+cC5ncG5fZGF0YVs5XSAhPSAweDAyKSB7CisJCQlERUJVRzJf MyhwcmludGsoInNjc2koJWxkKTogR1BOX0lEIGZhaWxlZCwgcmVqZWN0ZWQgIgorCQkJICAgICJy ZXF1ZXN0LCBncG5fcnNwOlxuIiwgaGEtPmhvc3Rfbm8pKTsKKwkJCURFQlVHMl8zKHFsYTJ4MDBf ZHVtcF9idWZmZXIoc25zX2NtZC0+cC5ncG5fZGF0YSwgMTYpKTsKKwkJCXJ2YWwgPSBRTEFfRlVO Q1RJT05fRkFJTEVEOworCQl9IGVsc2UgeworCQkJLyogU2F2ZSBwb3J0bmFtZSAqLworCQkJbWVt Y3B5KGxpc3RbaV0ucG9ydF9uYW1lLCAmc25zX2NtZC0+cC5ncG5fZGF0YVsxNl0sCisJCQkgICAg V1dOX1NJWkUpOworCQl9CisKKwkJLyogTGFzdCBkZXZpY2UgZXhpdC4gKi8KKwkJaWYgKGxpc3Rb aV0uZF9pZC5iLnJzdmRfMSAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChydmFsKTsK K30KKworLyoqCisgKiBxbGEyeDAwX3Nuc19nbm5faWQoKSAtIFNOUyBHZXQgTm9kZSBOYW1lIChH Tk5fSUQpIHF1ZXJ5LgorICogQGhhOiBIQSBjb250ZXh0CisgKiBAbGlzdDogc3dpdGNoIGluZm8g ZW50cmllcyB0byBwb3B1bGF0ZQorICoKKyAqIFRoaXMgY29tbWFuZCB1c2VzIHRoZSBvbGQgRXhl Y3R1dGUgU05TIENvbW1hbmQgbWFpbGJveCByb3V0aW5lLgorICoKKyAqIFJldHVybnMgMCBvbiBz dWNjZXNzLgorICovCitzdGF0aWMgaW50CitxbGEyeDAwX3Nuc19nbm5faWQoc2NzaV9xbGFfaG9z dF90ICpoYSwgc3dfaW5mb190ICpsaXN0KQoreworCWludAkJcnZhbDsKKworCXVpbnQxNl90CWk7 CisJc3RydWN0IHNuc19jbWRfcGt0CSpzbnNfY21kOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9G SUJSRV9ERVZJQ0VTOyBpKyspIHsKKwkJLyogSXNzdWUgR05OX0lEICovCisJCS8qIFByZXBhcmUg U05TIGNvbW1hbmQgcmVxdWVzdC4gKi8KKwkJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21k KGhhLCBHTk5fSURfQ01ELAorCQkgICAgR05OX0lEX1NOU19TQ01EX0xFTiwgR05OX0lEX1NOU19E QVRBX1NJWkUpOworCisJCS8qIFByZXBhcmUgU05TIGNvbW1hbmQgYXJndW1lbnRzIC0tIHBvcnRf aWQuICovCisJCXNuc19jbWQtPnAuY21kLnBhcmFtWzBdID0gbGlzdFtpXS5kX2lkLmIuYWxfcGE7 CisJCXNuc19jbWQtPnAuY21kLnBhcmFtWzFdID0gbGlzdFtpXS5kX2lkLmIuYXJlYTsKKwkJc25z X2NtZC0+cC5jbWQucGFyYW1bMl0gPSBsaXN0W2ldLmRfaWQuYi5kb21haW47CisKKwkJLyogRXhl Y3V0ZSBTTlMgY29tbWFuZC4gKi8KKwkJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5z bnNfY21kX2RtYSwKKwkJICAgIEdOTl9JRF9TTlNfQ01EX1NJWkUgLyAyLCBzaXplb2Yoc3RydWN0 IHNuc19jbWRfcGt0KSk7CisJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkvKkVNUFRZ Ki8KKwkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHTk5fSUQgU2VuZCBTTlMgZmFpbGVk ICIKKwkJCSAgICAiKCVkKS5cbiIsIGhhLT5ob3N0X25vLCBydmFsKSk7CisJCX0gZWxzZSBpZiAo c25zX2NtZC0+cC5nbm5fZGF0YVs4XSAhPSAweDgwIHx8CisJCSAgICBzbnNfY21kLT5wLmdubl9k YXRhWzldICE9IDB4MDIpIHsKKwkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHTk5fSUQg ZmFpbGVkLCByZWplY3RlZCAiCisJCQkgICAgInJlcXVlc3QsIGdubl9yc3A6XG4iLCBoYS0+aG9z dF9ubykpOworCQkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLmdubl9k YXRhLCAxNikpOworCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0gZWxzZSB7CisJ CQkvKiBTYXZlIG5vZGVuYW1lICovCisJCQltZW1jcHkobGlzdFtpXS5ub2RlX25hbWUsICZzbnNf Y21kLT5wLmdubl9kYXRhWzE2XSwKKwkJCSAgICBXV05fU0laRSk7CisKKwkJCURFQlVHMl8zKHBy aW50aygic2NzaSglbGQpOiBHSURfUFQgZW50cnkgLSAiCisJCQkgICAgIm5uICUwMnglMDJ4JTAy eCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCSAgICAicG4gJTAyeCUwMnglMDJ4JTAyeCUwMngl MDJ4JTAyeCUwMnggIgorCQkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkJCSAgICBo YS0+aG9zdF9ubywKKwkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVswXSwgbGlzdFtpXS5ub2RlX25h bWVbMV0sCisJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbMl0sIGxpc3RbaV0ubm9kZV9uYW1lWzNd LAorCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzRdLCBsaXN0W2ldLm5vZGVfbmFtZVs1XSwKKwkJ CSAgICBsaXN0W2ldLm5vZGVfbmFtZVs2XSwgbGlzdFtpXS5ub2RlX25hbWVbN10sCisJCQkgICAg bGlzdFtpXS5wb3J0X25hbWVbMF0sIGxpc3RbaV0ucG9ydF9uYW1lWzFdLAorCQkJICAgIGxpc3Rb aV0ucG9ydF9uYW1lWzJdLCBsaXN0W2ldLnBvcnRfbmFtZVszXSwKKwkJCSAgICBsaXN0W2ldLnBv cnRfbmFtZVs0XSwgbGlzdFtpXS5wb3J0X25hbWVbNV0sCisJCQkgICAgbGlzdFtpXS5wb3J0X25h bWVbNl0sIGxpc3RbaV0ucG9ydF9uYW1lWzddLAorCQkJICAgIGxpc3RbaV0uZF9pZC5iLmRvbWFp biwgbGlzdFtpXS5kX2lkLmIuYXJlYSwKKwkJCSAgICBsaXN0W2ldLmRfaWQuYi5hbF9wYSkpOwor CQl9CisKKwkJLyogTGFzdCBkZXZpY2UgZXhpdC4gKi8KKwkJaWYgKGxpc3RbaV0uZF9pZC5iLnJz dmRfMSAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChydmFsKTsKK30KKworLyoqCisg KiBxbGEyeDAwX3NuZF9yZnRfaWQoKSAtIFNOUyBSZWdpc3RlciBGQy00IFRZUEVzIChSRlRfSUQp IHN1cHBvcnRlZCBieSB0aGUgSEJBLgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogVGhpcyBj b21tYW5kIHVzZXMgdGhlIG9sZCBFeGVjdHV0ZSBTTlMgQ29tbWFuZCBtYWlsYm94IHJvdXRpbmUu CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBf c25zX3JmdF9pZChzY3NpX3FsYV9ob3N0X3QgKmhhKQoreworCWludAkJcnZhbDsKKworCXN0cnVj dCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKworCS8qIElzc3VlIFJGVF9JRC4gKi8KKwkvKiBQcmVw YXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCisJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNf Y21kKGhhLCBSRlRfSURfQ01ELCBSRlRfSURfU05TX1NDTURfTEVOLAorCSAgICBSRlRfSURfU05T X0RBVEFfU0laRSk7CisKKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0 X2lkLCBGQy00IHR5cGVzICovCisJc25zX2NtZC0+cC5jbWQucGFyYW1bMF0gPSBoYS0+ZF9pZC5i LmFsX3BhOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzFdID0gaGEtPmRfaWQuYi5hcmVhOworCXNu c19jbWQtPnAuY21kLnBhcmFtWzJdID0gaGEtPmRfaWQuYi5kb21haW47CisKKwlzbnNfY21kLT5w LmNtZC5wYXJhbVs1XSA9IDB4MDE7CQkJLyogRkNQLTMgKi8KKworCS8qIEV4ZWN1dGUgU05TIGNv bW1hbmQuICovCisJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5zbnNfY21kX2RtYSwg UkZUX0lEX1NOU19DTURfU0laRSAvIDIsCisJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3Qp KTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMo cHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCisJCSAg ICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5yZnRfZGF0YVs4 XSAhPSAweDgwIHx8CisJICAgIHNuc19jbWQtPnAucmZ0X2RhdGFbOV0gIT0gMHgwMikgeworCQlE RUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUkZUX0lEIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVz dCwgIgorCQkgICAgInJmdF9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzJfMyhxbGEy eDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAucmZ0X2RhdGEsIDE2KSk7CisJCXJ2YWwgPSBRTEFf RlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTog UkZUX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisK KwlyZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc25zX3JmZl9pZCgpIC0gU05T IFJlZ2lzdGVyIEZDLTQgRmVhdHVyZXMgKFJGRl9JRCkgc3VwcG9ydGVkIGJ5IHRoZQorICogSEJB LgorICogQGhhOiBIQSBjb250ZXh0CisgKgorICogVGhpcyBjb21tYW5kIHVzZXMgdGhlIG9sZCBF eGVjdHV0ZSBTTlMgQ29tbWFuZCBtYWlsYm94IHJvdXRpbmUuCisgKgorICogUmV0dXJucyAwIG9u IHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc25zX3JmZl9pZChzY3NpX3FsYV9o b3N0X3QgKmhhKQoreworCWludAkJcnZhbDsKKworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2Nt ZDsKKworCS8qIElzc3VlIFJGRl9JRC4gKi8KKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVl c3QuICovCisJc25zX2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKGhhLCBSRkZfSURfQ01ELCBS RkZfSURfU05TX1NDTURfTEVOLAorCSAgICBSRkZfSURfU05TX0RBVEFfU0laRSk7CisKKwkvKiBQ cmVwYXJlIFNOUyBjb21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLCBGQy00IGZlYXR1cmUsIEZD LTQgdHlwZSAqLworCXNuc19jbWQtPnAuY21kLnBhcmFtWzBdID0gaGEtPmRfaWQuYi5hbF9wYTsK KwlzbnNfY21kLT5wLmNtZC5wYXJhbVsxXSA9IGhhLT5kX2lkLmIuYXJlYTsKKwlzbnNfY21kLT5w LmNtZC5wYXJhbVsyXSA9IGhhLT5kX2lkLmIuZG9tYWluOworCisJc25zX2NtZC0+cC5jbWQucGFy YW1bNl0gPSAweDA4OwkJCS8qIFNDU0kgLSBGQ1AgKi8KKworCS8qIEV4ZWN1dGUgU05TIGNvbW1h bmQuICovCisJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEsIGhhLT5zbnNfY21kX2RtYSwgUkZG X0lEX1NOU19DTURfU0laRSAvIDIsCisJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsK KwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVNUFRZKi8KKwkJREVCVUcyXzMocHJp bnRrKCJzY3NpKCVsZCk6IFJGRl9JRCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCisJCSAgICBo YS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5yZmZfZGF0YVs4XSAh PSAweDgwIHx8CisJICAgIHNuc19jbWQtPnAucmZmX2RhdGFbOV0gIT0gMHgwMikgeworCQlERUJV RzJfMyhwcmludGsoInNjc2koJWxkKTogUkZGX0lEIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwg IgorCQkgICAgInJmZl9yc3A6XG4iLCBoYS0+aG9zdF9ubykpOworCQlERUJVRzJfMyhxbGEyeDAw X2R1bXBfYnVmZmVyKHNuc19jbWQtPnAucmZmX2RhdGEsIDE2KSk7CisJCXJ2YWwgPSBRTEFfRlVO Q1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZG X0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEtPmhvc3Rfbm8pKTsKKwl9CisKKwly ZXR1cm4gKHJ2YWwpOworfQorCisvKioKKyAqIHFsYTJ4MDBfc25zX3Jubl9pZCgpIC0gU05TIFJl Z2lzdGVyIE5vZGUgTmFtZSAoUk5OX0lEKSBvZiB0aGUgSEJBLgorICogSEJBLgorICogQGhhOiBI QSBjb250ZXh0CisgKgorICogVGhpcyBjb21tYW5kIHVzZXMgdGhlIG9sZCBFeGVjdHV0ZSBTTlMg Q29tbWFuZCBtYWlsYm94IHJvdXRpbmUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisg Ki8KK3N0YXRpYyBpbnQKK3FsYTJ4MDBfc25zX3Jubl9pZChzY3NpX3FsYV9ob3N0X3QgKmhhKQor eworCWludAkJcnZhbDsKKworCXN0cnVjdCBzbnNfY21kX3BrdAkqc25zX2NtZDsKKworCS8qIElz c3VlIFJOTl9JRC4gKi8KKwkvKiBQcmVwYXJlIFNOUyBjb21tYW5kIHJlcXVlc3QuICovCisJc25z X2NtZCA9IHFsYTJ4MDBfcHJlcF9zbnNfY21kKGhhLCBSTk5fSURfQ01ELCBSTk5fSURfU05TX1ND TURfTEVOLAorCSAgICBSTk5fSURfU05TX0RBVEFfU0laRSk7CisKKwkvKiBQcmVwYXJlIFNOUyBj b21tYW5kIGFyZ3VtZW50cyAtLSBwb3J0X2lkLCBub2RlbmFtZS4gKi8KKwlzbnNfY21kLT5wLmNt ZC5wYXJhbVswXSA9IGhhLT5kX2lkLmIuYWxfcGE7CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMV0g PSBoYS0+ZF9pZC5iLmFyZWE7CisJc25zX2NtZC0+cC5jbWQucGFyYW1bMl0gPSBoYS0+ZF9pZC5i LmRvbWFpbjsKKworCXNuc19jbWQtPnAuY21kLnBhcmFtWzRdID0gaGEtPmluaXRfY2ItPm5vZGVf bmFtZVs3XTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVs1XSA9IGhhLT5pbml0X2NiLT5ub2RlX25h bWVbNl07CisJc25zX2NtZC0+cC5jbWQucGFyYW1bNl0gPSBoYS0+aW5pdF9jYi0+bm9kZV9uYW1l WzVdOworCXNuc19jbWQtPnAuY21kLnBhcmFtWzddID0gaGEtPmluaXRfY2ItPm5vZGVfbmFtZVs0 XTsKKwlzbnNfY21kLT5wLmNtZC5wYXJhbVs4XSA9IGhhLT5pbml0X2NiLT5ub2RlX25hbWVbM107 CisJc25zX2NtZC0+cC5jbWQucGFyYW1bOV0gPSBoYS0+aW5pdF9jYi0+bm9kZV9uYW1lWzJdOwor CXNuc19jbWQtPnAuY21kLnBhcmFtWzEwXSA9IGhhLT5pbml0X2NiLT5ub2RlX25hbWVbMV07CisJ c25zX2NtZC0+cC5jbWQucGFyYW1bMTFdID0gaGEtPmluaXRfY2ItPm5vZGVfbmFtZVswXTsKKwor CS8qIEV4ZWN1dGUgU05TIGNvbW1hbmQuICovCisJcnZhbCA9IHFsYTJ4MDBfc2VuZF9zbnMoaGEs IGhhLT5zbnNfY21kX2RtYSwgUk5OX0lEX1NOU19DTURfU0laRSAvIDIsCisJICAgIHNpemVvZihz dHJ1Y3Qgc25zX2NtZF9wa3QpKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQkvKkVN UFRZKi8KKwkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBTZW5kIFNOUyBmYWls ZWQgKCVkKS5cbiIsCisJCSAgICBoYS0+aG9zdF9ubywgcnZhbCkpOworCX0gZWxzZSBpZiAoc25z X2NtZC0+cC5ybm5fZGF0YVs4XSAhPSAweDgwIHx8CisJICAgIHNuc19jbWQtPnAucm5uX2RhdGFb OV0gIT0gMHgwMikgeworCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUk5OX0lEIGZhaWxl ZCwgcmVqZWN0ZWQgcmVxdWVzdCwgIgorCQkgICAgInJubl9yc3A6XG4iLCBoYS0+aG9zdF9ubykp OworCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAucm5uX2RhdGEsIDE2 KSk7CisJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCX0gZWxzZSB7CisJCURFQlVHMihw cmludGsoInNjc2koJWxkKTogUk5OX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAorCQkgICAgaGEt Pmhvc3Rfbm8pKTsKKwl9CisKKwlyZXR1cm4gKHJ2YWwpOworfQpkaWZmIC1OdXJkIC1YIC9yb290 L0RyaXZlcnMvOC54L2RvbnRkaWZmLWJrIGxpbnV4LTIuNi4yLXJjMi9kcml2ZXJzL3Njc2kvcWxh Mnh4eC1vcmlnL3FsYV9vcy5jIGxpbnV4LTIuNi4yLXJjMi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9x bGFfb3MuYwotLS0gbGludXgtMi42LjItcmMyL2RyaXZlcnMvc2NzaS9xbGEyeHh4LW9yaWcvcWxh X29zLmMJMjAwNC0wMS0yMiAwODo0NToyMC4wMjkzNTE3MjAgLTA4MDAKKysrIGxpbnV4LTIuNi4y LXJjMi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwkyMDA0LTAxLTIyIDA4OjQ2OjA5LjMy NTg1NzUxMiAtMDgwMApAQCAtMjk5OCwzNyArMjk5OCw1OSBAQAogCQl9CiAJCWhhLT5tYnhfc2Vt X3Bvb2xfdGFpbCA9IHRtcF9xX3RhaWw7CiAKLQkJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFs bG9jYXRlZCBmb3IgTVMgSU9DQiAqLwotCQloYS0+bXNfaW9jYiA9IHBjaV9hbGxvY19jb25zaXN0 ZW50KGhhLT5wZGV2LAotCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCksICZoYS0+bXNfaW9j Yl9kbWEpOwotCQlpZiAoaGEtPm1zX2lvY2IgPT0gTlVMTCkgewotCQkJLyogZXJyb3IgKi8KLQkJ CXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24g ZmFpbGVkIC0gbXNfaW9jYlxuIik7CisJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgU05TIGNvbW1h bmRzICovCisJCWlmIChJU19RTEEyMjAwKGhhKSkgeworCQkJLyogR2V0IGNvbnNpc3RlbnQgbWVt b3J5IGFsbG9jYXRlZCBmb3IgU05TIGNvbW1hbmRzICovCisJCQloYS0+c25zX2NtZCA9IHBjaV9h bGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LAorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9w a3QpLCAmaGEtPnNuc19jbWRfZG1hKTsKKwkJCWlmIChoYS0+c25zX2NtZCA9PSBOVUxMKSB7CisJ CQkJLyogZXJyb3IgKi8KKwkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJICAg ICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBzbnNfY21kXG4iKTsKIAotCQkJcWxhMngwMF9t ZW1fZnJlZShoYSk7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwot CQkJc2NoZWR1bGVfdGltZW91dChIWi8xMCk7CisJCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7CisJ CQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90 aW1lb3V0KEhaLzEwKTsKIAotCQkJY29udGludWU7Ci0JCX0KLQkJbWVtc2V0KGhhLT5tc19pb2Ni LCAwLCBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlt ZW1zZXQoaGEtPnNuc19jbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKKwkJfSBl bHNlIGlmICghSVNfUUxBMjEwMChoYSkpIHsKKwkJCS8qIEdldCBjb25zaXN0ZW50IG1lbW9yeSBh bGxvY2F0ZWQgZm9yIE1TIElPQ0IgKi8KKwkJCWhhLT5tc19pb2NiID0gcGNpX2FsbG9jX2NvbnNp c3RlbnQoaGEtPnBkZXYsCisJCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCksICZoYS0+bXNf aW9jYl9kbWEpOworCQkJaWYgKGhhLT5tc19pb2NiID09IE5VTEwpIHsKKwkJCQkvKiBlcnJvciAq LworCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkgICAgIk1lbW9yeSBBbGxv Y2F0aW9uIGZhaWxlZCAtIG1zX2lvY2JcbiIpOwogCi0JCS8qIEdldCBjb25zaXN0ZW50IG1lbW9y eSBhbGxvY2F0ZWQgZm9yIENUIFNOUyBjb21tYW5kcyAqLwotCQloYS0+Y3Rfc25zID0gcGNpX2Fs bG9jX2NvbnNpc3RlbnQoaGEtPnBkZXYsCi0JCSAgICBzaXplb2Yoc3RydWN0IGN0X3Nuc19wa3Qp LCAmaGEtPmN0X3Nuc19kbWEpOwotCQlpZiAoaGEtPmN0X3NucyA9PSBOVUxMKSB7Ci0JCQkvKiBl cnJvciAqLwotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJNZW1vcnkg QWxsb2NhdGlvbiBmYWlsZWQgLSBjdF9zbnNcbiIpOworCQkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEp OworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1 bGVfdGltZW91dChIWi8xMCk7CiAKLQkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOwotCQkJc2V0X2N1 cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoSFov MTApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbWVtc2V0KGhhLT5tc19pb2NiLCAwLCBzaXpl b2YobXNfaW9jYl9lbnRyeV90KSk7CiAKLQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIEdldCBj b25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIENUIFNOUworCQkJICogY29tbWFuZHMKKwkJ CSAqLworCQkJaGEtPmN0X3NucyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGhhLT5wZGV2LAorCQkJ ICAgIHNpemVvZihzdHJ1Y3QgY3Rfc25zX3BrdCksICZoYS0+Y3Rfc25zX2RtYSk7CisJCQlpZiAo aGEtPmN0X3NucyA9PSBOVUxMKSB7CisJCQkJLyogZXJyb3IgKi8KKwkJCQlxbGFfcHJpbnRrKEtF Uk5fV0FSTklORywgaGEsCisJCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBjdF9z bnNcbiIpOworCisJCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7CisJCQkJc2V0X2N1cnJlbnRfc3Rh dGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKKwor CQkJCWNvbnRpbnVlOworCQkJfQorCQkJbWVtc2V0KGhhLT5jdF9zbnMsIDAsIHNpemVvZihzdHJ1 Y3QgY3Rfc25zX3BrdCkpOwogCQl9Ci0JCW1lbXNldChoYS0+Y3Rfc25zLCAwLCBzaXplb2Yoc3Ry dWN0IGN0X3Nuc19wa3QpKTsKIAogCQkvKiBHZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVk IGZvciBHZXQgUG9ydCBEYXRhYmFzZSBjbWQgKi8KIAkJaGEtPmlvZGVzY19wZCA9IHBjaV9hbGxv Y19jb25zaXN0ZW50KGhhLT5wZGV2LApAQCAtMzExOSw2ICszMTQxLDEyIEBACiAJCXBjaV9mcmVl X2NvbnNpc3RlbnQoaGEtPnBkZXYsIFBPUlRfREFUQUJBU0VfU0laRSwKIAkJICAgIGhhLT5pb2Rl c2NfcGQsIGhhLT5pb2Rlc2NfcGRfZG1hKTsKIAl9CisKKwlpZiAoaGEtPnNuc19jbWQpIHsKKwkJ cGNpX2ZyZWVfY29uc2lzdGVudChoYS0+cGRldiwKKwkJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2Nt ZF9wa3QpLCBoYS0+c25zX2NtZCwgaGEtPnNuc19jbWRfZG1hKTsKKwl9CisKIAlpZiAoaGEtPmN0 X3NucykgewogCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhhLT5wZGV2LAogCQkgICAgc2l6ZW9mKHN0 cnVjdCBjdF9zbnNfcGt0KSwgaGEtPmN0X3NucywgaGEtPmN0X3Nuc19kbWEpOwo= --=-7XyKGqh1nv024MAlfkvL--