From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Mack Subject: Re: M-Audio FTU issues Date: Fri, 24 Jun 2011 17:23:37 +0200 Message-ID: References: <4E045058.6000405@showlabor.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=000e0cd155ba21411c04a676c982 Return-path: Received: from mail-pw0-f51.google.com (mail-pw0-f51.google.com [209.85.160.51]) by alsa0.perex.cz (Postfix) with ESMTP id 00FD624619 for ; Fri, 24 Jun 2011 17:23:38 +0200 (CEST) Received: by pwi18 with SMTP id 18so1992512pwi.38 for ; Fri, 24 Jun 2011 08:23:37 -0700 (PDT) In-Reply-To: <4E045058.6000405@showlabor.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: alsa-devel-bounces@alsa-project.org Errors-To: alsa-devel-bounces@alsa-project.org To: Felix Homann Cc: Takashi Iwai , =?ISO-8859-1?Q?Aur=E9lien_Leblond?= , alsa-devel@alsa-project.org, Clemens Ladisch , Grant Diffey List-Id: alsa-devel@alsa-project.org --000e0cd155ba21411c04a676c982 Content-Type: text/plain; charset=ISO-8859-1 On Fri, Jun 24, 2011 at 10:52 AM, Felix Homann wrote: > Please, make sure you have the routing "diagonal", i.e. "DIn i - Out j" is > set to 0% if i !=j and 100% if i == j. I've attached a small bash script to > accomplish this. After plugging the device in all playback volumes are > initially at 100%. I could not notice the clicks then unless it turned the > volume very very loud (I guess aplay plays back on all channels, which blurs > the clicks). Thanks, that helped. It was indeed the mixer settings that caused the distortion and hid the streaming errors. I can now hear the clicks with the current mainline driver. Attached is a preliminary patch that implements implicit feedback mode, and it works fine for the playback channel (without any clicks now). However, there are still some corner cases that need attention, and currently, the kernel crashes when you start playback and capture streams at the same time. So please don't use it in full-duplex more for now, you have been warned. I've investigated in many ways to implement this nicely, but it's quite tricky as it breaks the current driver layout in multiple ways, regardless which way I go. These were the approaches: 1. Like I posted last year, I wanted to just collect the number of received frames when capturing data and modify snd_audio_next_packet_size() so that it approximates to the number of samples received in the record stream. This didn't work as easily because the streaming loop ended up queueing 0-byte packets which the hardware doesn't like at all. It will stop streaming and won't recover after the first empty packet was sent. Hence, sending data at a fix urb rate seems no way to go, at least for the FTU. 2. I tried to treat the record stream as sync endpoint and trick around with the callbacks for sync urbs, but that breaks several assumptions made in the code all over, mostly regarding the maximum packet size. 3. The most promising approach (the one implemented in the attached patch) splits the urb's size calculation from the actual ops.prepare() handler and re-uses the ops.prepare() from a new function called queue_next_out_urb(). For this, our complete_urb function must be modified to not automatically requeue the next out urb but leave it to the capture stream's retire callbacks when to fire the next out packet (and here, we will ignore 0-byte input packets and not send out 0-byte out urbs). A new counter variable (next_out_urb) is needed for that. The problem, however, is that we now have to check when to actually start and stop the capture stream: - We have to start it (and put it to pause mode) once the playback starts and switch over to the real callback once the user starts the capture PCM stream - We also have to start it if the user only wants to capture PCM, without playback. - We can stop it if the user was only using capture PCM or playback PCM streams. - But we cannot stop it if it still serves as feedback source for a running playback PCM. I started to implement some logic for this, but I'm not really happy with it yet. Some reference counting would be much better than what I currently have, but I don't see a good solution yet. Maybe I've been looking at this for too long now, and someone else has an idea? I have a split version of this patchset here locally, but I think the consolidated version is easier to test for now. Feedback more than welcome. Thanks, Daniel --000e0cd155ba21411c04a676c982 Content-Type: application/octet-stream; name="ftu.diff" Content-Disposition: attachment; filename="ftu.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gpbab9oh1 ZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oIGIvaW5jbHVkZS9saW51eC91c2Iv Y2g5LmgKaW5kZXggMGZkM2ZiZC4uMGYxMzhkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91 c2IvY2g5LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvY2g5LmgKQEAgLTM3Nyw2ICszNzcsMTEg QEAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHsKICNkZWZpbmUgVVNCX0VORFBPSU5U X05VTUJFUl9NQVNLCTB4MGYJLyogaW4gYkVuZHBvaW50QWRkcmVzcyAqLwogI2RlZmluZSBVU0Jf RU5EUE9JTlRfRElSX01BU0sJCTB4ODAKIAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfTUFT SwkJMHgzMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNBR0VfREFUQQkJMHgwMAorI2RlZmluZSBV U0JfRU5EUE9JTlRfVVNBR0VfRkVFREJBQ0sJMHgxMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfVVNB R0VfSU1QTElDSVRfRkIJMHgyMAkvKiBJbXBsaWNpdCBmZWVkYmFjayBEYXRhIGVuZHBvaW50ICov CisKICNkZWZpbmUgVVNCX0VORFBPSU5UX1NZTkNUWVBFCQkweDBjCiAjZGVmaW5lIFVTQl9FTkRQ T0lOVF9TWU5DX05PTkUJCSgwIDw8IDIpCiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9TWU5DX0FTWU5D CQkoMSA8PCAyKQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2NhcmQuaCBiL3NvdW5kL3VzYi9jYXJk LmgKaW5kZXggYWU0MjUxZC4uYjliYTEzMiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhcmQuaAor KysgYi9zb3VuZC91c2IvY2FyZC5oCkBAIC0zLDcgKzMsNyBAQAogCiAjZGVmaW5lIE1BWF9QQUNL UwkyMAogI2RlZmluZSBNQVhfUEFDS1NfSFMJKE1BWF9QQUNLUyAqIDgpCS8qIGluIGhpZ2ggc3Bl ZWQgbW9kZSAqLwotI2RlZmluZSBNQVhfVVJCUwk4CisjZGVmaW5lIE1BWF9VUkJTCTE2CiAjZGVm aW5lIFNZTkNfVVJCUwk0CS8qIGFsd2F5cyBmb3VyIHVyYnMgZm9yIHN5bmMgKi8KICNkZWZpbmUg TUFYX1FVRVVFCTI0CS8qIHRyeSBub3QgdG8gZXhjZWVkIHRoaXMgcXVldWUgbGVuZ3RoLCBpbiBt cyAqLwogCkBAIC0zNiw5ICszNiwxMSBAQCBzdHJ1Y3Qgc25kX3VyYl9jdHggewogCXN0cnVjdCBz bmRfdXNiX3N1YnN0cmVhbSAqc3ViczsKIAlpbnQgaW5kZXg7CS8qIGluZGV4IGZvciB1cmIgYXJy YXkgKi8KIAlpbnQgcGFja2V0czsJLyogbnVtYmVyIG9mIHBhY2tldHMgcGVyIHVyYiAqLworCWlu dCBwYWNrZXRfc2l6ZVtNQVhfUEFDS1NfSFNdOyAvKiBzaXplIG9mIHBhY2tldHMgZm9yIG5leHQg c3VibWlzc2lvbiAqLwogfTsKIAogc3RydWN0IHNuZF91cmJfb3BzIHsKKwlpbnQgKCpwcmVwYXJl X3NpemUpKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3Vicywgc3RydWN0IHNuZF9wY21fcnVu dGltZSAqcnVudGltZSwgc3RydWN0IHVyYiAqdSk7CiAJaW50ICgqcHJlcGFyZSkoc3RydWN0IHNu ZF91c2Jfc3Vic3RyZWFtICpzdWJzLCBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLCBz dHJ1Y3QgdXJiICp1KTsKIAlpbnQgKCpyZXRpcmUpKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAq c3Vicywgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwgc3RydWN0IHVyYiAqdSk7CiAJ aW50ICgqcHJlcGFyZV9zeW5jKShzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsIHN0cnVj dCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsIHN0cnVjdCB1cmIgKnUpOwpAQCAtNzMsNiArNzUs OCBAQCBzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gewogCXVuc2lnbmVkIGludCBmaWxsX21heDog MTsJLyogZmlsbCBtYXggcGFja2V0IHNpemUgYWx3YXlzICovCiAJdW5zaWduZWQgaW50IHR4ZnJf cXVpcms6MTsJLyogYWxsb3cgc3ViLWZyYW1lIGFsaWdubWVudCAqLwogCXVuc2lnbmVkIGludCBm bXRfdHlwZTsJCS8qIFVTQiBhdWRpbyBmb3JtYXQgdHlwZSAoMS0zKSAqLworCXVuc2lnbmVkIGlu dCBuZXh0X291dF91cmI7CS8qIGluZGV4IG9mIG5leHQgVVJCIHRvIHVzZSBmb3Igb3V0cHV0CisJ CQkJCSAgIChpbXBsaWNpdCBmZWVkYmFjayBtb2RlIG9ubHkpICovCiAKIAl1bnNpZ25lZCBpbnQg cnVubmluZzogMTsJLyogcnVubmluZyBzdGF0dXMgKi8KIApAQCAtMTAzLDYgKzEwNyw4IEBAIHN0 cnVjdCBzbmRfdXNiX3N0cmVhbSB7CiAJdW5zaWduZWQgaW50IGZtdF90eXBlOwkJLyogVVNCIGF1 ZGlvIGZvcm1hdCB0eXBlICgxLTMpICovCiAJc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtIHN1YnN0 cmVhbVsyXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgaW50IGltcGxpY2l0 X2ZlZWRiYWNrOiAxOyAJLyogc3RyZWFtIHVzZXMgaXRzIGNhcHR1cmUgZGF0YQorCQkJCQkJICAg c3Vic3RyZWFtIHRvIGNsb2NrIGl0cyBwbGF5YmFjayBzdWJzdHJlYW0gKi8KIH07CiAKICNlbmRp ZiAvKiBfX1VTQkFVRElPX0NBUkRfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3BjbS5jIGIv c291bmQvdXNiL3BjbS5jCmluZGV4IGI4ZGNiZjQuLjFjZDFkYjIgMTAwNjQ0Ci0tLSBhL3NvdW5k L3VzYi9wY20uYworKysgYi9zb3VuZC91c2IvcGNtLmMKQEAgLTE4NSw3ICsxODUsOCBAQCBpbnQg c25kX3VzYl9pbml0X3BpdGNoKHN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwLCBpbnQgaWZhY2Us CiAvKgogICogZmluZCBhIG1hdGNoaW5nIGZvcm1hdCBhbmQgc2V0IHVwIHRoZSBpbnRlcmZhY2UK ICAqLwotc3RhdGljIGludCBzZXRfZm9ybWF0KHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3Vi cywgc3RydWN0IGF1ZGlvZm9ybWF0ICpmbXQpCitpbnQgc25kX3VzYl9zZXRfcGNtX2Zvcm1hdChz dHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkgICBzdHJ1Y3QgYXVkaW9mb3JtYXQg KmZtdCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gc3Vicy0+ZGV2OwogCXN0cnVjdCB1 c2JfaG9zdF9pbnRlcmZhY2UgKmFsdHM7CkBAIC0yMDYsNiArMjA3LDggQEAgc3RhdGljIGludCBz ZXRfZm9ybWF0KHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3Vicywgc3RydWN0IGF1ZGlvZm9y bWF0ICpmbXQpCiAJaWYgKGZtdCA9PSBzdWJzLT5jdXJfYXVkaW9mbXQpCiAJCXJldHVybiAwOwog CitwcmludGsoS0VSTl9FUlIgIiVzKCkgOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCiAJ LyogY2xvc2UgdGhlIG9sZCBpbnRlcmZhY2UgKi8KIAlpZiAoc3Vicy0+aW50ZXJmYWNlID49IDAg JiYgc3Vicy0+aW50ZXJmYWNlICE9IGZtdC0+aWZhY2UpIHsKIAkJaWYgKHVzYl9zZXRfaW50ZXJm YWNlKHN1YnMtPmRldiwgc3Vicy0+aW50ZXJmYWNlLCAwKSA8IDApIHsKQEAgLTI5Miw2ICsyOTUs MTEgQEAgc3RhdGljIGludCBzZXRfZm9ybWF0KHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3Vi cywgc3RydWN0IGF1ZGlvZm9ybWF0ICpmbXQpCiAJaWYgKGZtdC0+YXR0cmlidXRlcyAmIFVBQ19F UF9DU19BVFRSX0ZJTExfTUFYKQogCQlzdWJzLT5maWxsX21heCA9IDE7CiAKKwlpZiAoIWlzX3Bs YXliYWNrICYmCisJICAgIChmbXQtPmVwX2F0dHIgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFT SykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQyAmJgorCSAgICAoZm10LT5lcF9hdHRyICYgVVNC X0VORFBPSU5UX1VTQUdFX01BU0spID09IFVTQl9FTkRQT0lOVF9VU0FHRV9JTVBMSUNJVF9GQikK KwkJc3Vicy0+c3RyZWFtLT5pbXBsaWNpdF9mZWVkYmFjayA9IDE7CisKIAlpZiAoKGVyciA9IHNu ZF91c2JfaW5pdF9waXRjaChzdWJzLT5zdHJlYW0tPmNoaXAsIHN1YnMtPmludGVyZmFjZSwgYWx0 cywgZm10KSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yOTksNiArMzA3LDkgQEAgc3RhdGlj IGludCBzZXRfZm9ybWF0KHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3Vicywgc3RydWN0IGF1 ZGlvZm9ybWF0ICpmbXQpCiAKIAlzbmRfdXNiX3NldF9mb3JtYXRfcXVpcmsoc3VicywgZm10KTsK IAorCWlmIChzdWJzLT5zdHJlYW0tPmltcGxpY2l0X2ZlZWRiYWNrKQorCQlzbmRfcHJpbnRrKEtF Uk5fSU5GTyAib3BlcmF0aW5nIGluIGltcGxpY2l0IGZlZWRiYWNrIG1vZGVcbiIpOworCiAjaWYg MAogCXByaW50ayhLRVJOX0RFQlVHCiAJICAgICAgICJzZXR0aW5nIGRvbmU6IGZvcm1hdCA9ICVk LCByYXRlID0gJWQuLiVkLCBjaGFubmVscyA9ICVkXG4iLApAQCAtMzQ3LDcgKzM1OCwxNiBAQCBz dGF0aWMgaW50IHNuZF91c2JfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vi c3RyZWFtLAogCWNoYW5nZWQgPSBzdWJzLT5jdXJfYXVkaW9mbXQgIT0gZm10IHx8CiAJCXN1YnMt PnBlcmlvZF9ieXRlcyAhPSBwYXJhbXNfcGVyaW9kX2J5dGVzKGh3X3BhcmFtcykgfHwKIAkJc3Vi cy0+Y3VyX3JhdGUgIT0gcmF0ZTsKLQlpZiAoKHJldCA9IHNldF9mb3JtYXQoc3VicywgZm10KSkg PCAwKQorCisJaWYgKHN1YnMtPnN0cmVhbS0+aW1wbGljaXRfZmVlZGJhY2spIHsKKwkJc3RydWN0 IHNuZF91c2Jfc3Vic3RyZWFtICpvdGhlciA9CisJCQkmc3Vicy0+c3RyZWFtLT5zdWJzdHJlYW1b IXN1YnMtPmRpcmVjdGlvbl07CisKKwkJaWYgKG90aGVyICYmIG90aGVyLT5ydW5uaW5nICYmIGNo YW5nZWQpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICgocmV0ID0gc25kX3VzYl9zZXRf cGNtX2Zvcm1hdChzdWJzLCBmbXQpKSA8IDApCiAJCXJldHVybiByZXQ7CiAKIAlpZiAoc3Vicy0+ Y3VyX3JhdGUgIT0gcmF0ZSkgewpAQCAtODE1LDYgKzgzNSw5IEBAIHN0YXRpYyBpbnQgc25kX3Vz Yl9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBkaXJl Y3Rpb24pCiAJc3RydWN0IHNuZF91c2Jfc3RyZWFtICphcyA9IHNuZF9wY21fc3Vic3RyZWFtX2No aXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMgPSAmYXMtPnN1 YnN0cmVhbVtkaXJlY3Rpb25dOwogCisJaWYgKHNuZF91c2JfY2FwdHVyZV9zdWJzX3VzZWRfYnlf cGxheWJhY2soc3VicykpCisJCXJldHVybiAwOworCiAJaWYgKCFhcy0+Y2hpcC0+c2h1dGRvd24g JiYgc3Vicy0+aW50ZXJmYWNlID49IDApIHsKIAkJdXNiX3NldF9pbnRlcmZhY2Uoc3Vicy0+ZGV2 LCBzdWJzLT5pbnRlcmZhY2UsIDApOwogCQlzdWJzLT5pbnRlcmZhY2UgPSAtMTsKZGlmZiAtLWdp dCBhL3NvdW5kL3VzYi9wY20uaCBiL3NvdW5kL3VzYi9wY20uaAppbmRleCBlZDNlMjgzLi45ZTAy Y2Y4IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcGNtLmgKKysrIGIvc291bmQvdXNiL3BjbS5oCkBA IC0zLDYgKzMsOSBAQAogCiB2b2lkIHNuZF91c2Jfc2V0X3BjbV9vcHMoc3RydWN0IHNuZF9wY20g KnBjbSwgaW50IHN0cmVhbSk7CiAKK2ludCBzbmRfdXNiX3NldF9wY21fZm9ybWF0KHN0cnVjdCBz bmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCSAgIHN0cnVjdCBhdWRpb2Zvcm1hdCAqZm10KTsK KwogaW50IHNuZF91c2JfaW5pdF9waXRjaChzdHJ1Y3Qgc25kX3VzYl9hdWRpbyAqY2hpcCwgaW50 IGlmYWNlLAogCQkgICAgICAgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0cywKIAkJICAg ICAgIHN0cnVjdCBhdWRpb2Zvcm1hdCAqZm10KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9xdWly a3MuYyBiL3NvdW5kL3VzYi9xdWlya3MuYwppbmRleCAwOTBlMTkzLi4xMzUzNjYzIDEwMDY0NAot LS0gYS9zb3VuZC91c2IvcXVpcmtzLmMKKysrIGIvc291bmQvdXNiL3F1aXJrcy5jCkBAIC02NDQs NiArNjQ0LDEwIEBAIHZvaWQgc25kX3VzYl9zZXRfZm9ybWF0X3F1aXJrKHN0cnVjdCBzbmRfdXNi X3N1YnN0cmVhbSAqc3VicywKIAljYXNlIFVTQl9JRCgweDA0MWUsIDB4M2YxOSk6IC8qIEUtTXUg MDIwNCBVU0IgKi8KIAkJc2V0X2Zvcm1hdF9lbXVfcXVpcmsoc3VicywgZm10KTsKIAkJYnJlYWs7 CisJY2FzZSBVU0JfSUQoMHgwNzYzLCAweDIwODApOiAvKiBNLUF1ZGlvIEZhc3RUcmFjayBVbHRy YSAqLworCWNhc2UgVVNCX0lEKDB4MDc2MywgMHgyMDgxKToKKwkJc3Vicy0+c3RyZWFtLT5pbXBs aWNpdF9mZWVkYmFjayA9IDE7CisJCWJyZWFrOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvc291bmQv dXNiL3VyYi5jIGIvc291bmQvdXNiL3VyYi5jCmluZGV4IGUxODQzNDkuLjNiN2E4MWIgMTAwNjQ0 Ci0tLSBhL3NvdW5kL3VzYi91cmIuYworKysgYi9zb3VuZC91c2IvdXJiLmMKQEAgLTI5LDYgKzI5 LDI1IEBACiAjaW5jbHVkZSAidXJiLmgiCiAjaW5jbHVkZSAicGNtLmgiCiAKKy8qIFN0cmVhbWlu ZyBtb2RlcworICoKKyAqIFRoaXMgZHJpdmVyIGNhbiBvcGVyYXRlIGluIGRpZmZlcmVudCBzdHJl YW1pbmcgbW9kZXMgd2hpY2ggdXNlIHRoZSBpbnRlcm5hbAorICogZnVuY3Rpb25zIG9mIHRoaXMg ZmlsZSBkaWZmZXJlbnRseS4KKyAqCisgKiBPbmUgaXMgaW5kZXBlbmRlbnQgaW5wdXQgYW5kIG91 dHB1dCBzdHJlYW1pbmcgd2hpY2ggaXMgdGhlIGRlZmF1bHQgYW5kIG1vc3QKKyAqIHVzdWFsIGZv ciBVU0IgYXVkaW8gZGV2aWNlcy4gSU4gZW5kcG9pbnRzIChkZXZpY2Ugc2lua3MpIGNhbiBlaXRo ZXIgdGFrZSBhbnkKKyAqIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgc2VudCBvciBwcm92aWRlIGEg c3luYyBlbmRwb2ludCB0byB0ZWxsIHRoZSBob3N0IGF0CisgKiB3aGljaCBkYXRhIHJhdGUgdGhl IHN0cmVhbSBydW5zIGF0LiBUaGlzIHN0cmVhbWluZyBtb2RlbCBhbGxvd3MgcGxheWJhY2sgYW5k CisgKiBjYXB0dXJlIHN0cmVhbXMgdG8gYmUgc3RhcnRlZCBpbmRlcGVuZGVudGx5LgorICoKKyAq IFRoZSBvdGhlciBpcyBhbiAnaW1wbGljaXQgZmVlZGJhY2sgbW9kZScgaW4gd2hpY2ggdGhlIGRl dmljZSBkb2VzIG5vdCB0ZWxsCisgKiB0aGUgaG9zdCBpdHMgc3BlZWQgdGhyb3VnaCBhbiBzeW5j IGVuZHBvaW50IGJ1dCBleHBlY3RzIHRoZSBkcml2ZXIgdG8gYWx3YXlzCisgKiByZWNlaXZlIHRo ZSByZWNvcmQgc3RyZWFtIGFuZCB1c2UgdGhlIGRhdGEgcmF0ZSB0byBkZXRlcm1pbmUgdGhlIGFj dHVhbAorICogZGV2aWNlIHNwZWVkLiBGb3IgdGhlIFVTQiBzaWRlLCB0aGlzIG1lYW5zIHRoYXQg dGhlIGRyaXZlciBoYXMgdG8gcXVldWUKKyAqIGNhcHR1cmUgVVJCcyBldmVuIGlmIHRoZSB1c2Vy c3BhY2UgaXMgbm90IGludGVyZXN0ZWQgaW4gYWN0dWFsIGNhcHR1cmUgZGF0YS4KKyAqCisgKi8K KwogLyoKICAqIGNvbnZlcnQgYSBzYW1wbGluZyByYXRlIGludG8gb3VyIGZ1bGwgc3BlZWQgZm9y bWF0IChmcy8xMDAwIGluIFExNi4xNikKICAqIHRoaXMgd2lsbCBvdmVyZmxvdyBhdCBhcHByb3gg NTI0IGtIegpAQCAtMTM1LDEwICsxNTQsMjYgQEAgc3RhdGljIGludCB3YWl0X2NsZWFyX3VyYnMo c3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzKQogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50 ZXJydXB0aWJsZSgxKTsKIAl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkp OwogCWlmIChhbGl2ZSkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidGltZW91dDogc3RpbGwgJWQg YWN0aXZlIHVyYnMuLlxuIiwgYWxpdmUpOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ0aW1lb3V0 OiBzdGlsbCAlZCBhY3RpdmUgdXJicyAoJXMpXG4iLAorCQkJICAgYWxpdmUsIHN1YnMtPmRpcmVj dGlvbiA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUgPworCQkJCQkJImNhcHR1cmUiIDogInBs YXliYWNrIik7CiAJcmV0dXJuIDA7CiB9CiAKK2ludCBzbmRfdXNiX2NhcHR1cmVfc3Vic191c2Vk X2J5X3BsYXliYWNrKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqY2FwdHVyZSkKK3sKKwlzdHJ1 Y3Qgc25kX3VzYl9zdHJlYW0gKnN0cmVhbSA9IGNhcHR1cmUtPnN0cmVhbTsKKwlzdHJ1Y3Qgc25k X3VzYl9zdWJzdHJlYW0gKnBsYXliYWNrID0gJnN0cmVhbS0+c3Vic3RyZWFtW1NORFJWX1BDTV9T VFJFQU1fUExBWUJBQ0tdOworCisJaWYgKCFwbGF5YmFjaykKKwkJcmV0dXJuIDA7CisKKwlpZiAo Y2FwdHVyZS0+ZGlyZWN0aW9uICE9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcmV0dXJu IDA7CisKKwlyZXR1cm4gc3RyZWFtLT5pbXBsaWNpdF9mZWVkYmFjayAmJiBwbGF5YmFjay0+cnVu bmluZzsKK30KKwogLyoKICAqIHJlbGVhc2UgYSBzdWJzdHJlYW0KICAqLwpAQCAtMTQ2LDYgKzE4 MSw5IEBAIHZvaWQgc25kX3VzYl9yZWxlYXNlX3N1YnN0cmVhbV91cmJzKHN0cnVjdCBzbmRfdXNi X3N1YnN0cmVhbSAqc3VicywgaW50IGZvcmNlKQogewogCWludCBpOwogCisJaWYgKHNuZF91c2Jf Y2FwdHVyZV9zdWJzX3VzZWRfYnlfcGxheWJhY2soc3VicykpCisJCXJldHVybjsKKwogCS8qIHN0 b3AgdXJicyAodG8gYmUgc3VyZSkgKi8KIAlkZWFjdGl2YXRlX3VyYnMoc3VicywgZm9yY2UsIDEp OwogCXdhaXRfY2xlYXJfdXJicyhzdWJzKTsKQEAgLTE2OCwxNyArMjA2LDM0IEBAIHN0YXRpYyB2 b2lkIHNuZF9jb21wbGV0ZV91cmIoc3RydWN0IHVyYiAqdXJiKQogCXN0cnVjdCBzbmRfdXJiX2N0 eCAqY3R4ID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicyA9 IGN0eC0+c3ViczsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGN0eC0+ c3Vicy0+cGNtX3N1YnN0cmVhbTsKKwlpbnQgaXNfcGxheWJhY2sgPSBzdWJzLT5kaXJlY3Rpb24g PT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzsKIAlpbnQgZXJyID0gMDsKIAogCWlmICgoc3Vi cy0+cnVubmluZyAmJiBzdWJzLT5vcHMucmV0aXJlKHN1YnMsIHN1YnN0cmVhbS0+cnVudGltZSwg dXJiKSkgfHwKLQkgICAgIXN1YnMtPnJ1bm5pbmcgfHwgLyogY2FuIGJlIHN0b3BwZWQgZHVyaW5n IHJldGlyZSBjYWxsYmFjayAqLwotCSAgICAoZXJyID0gc3Vicy0+b3BzLnByZXBhcmUoc3Vicywg c3Vic3RyZWFtLT5ydW50aW1lLCB1cmIpKSA8IDAgfHwKLQkgICAgKGVyciA9IHVzYl9zdWJtaXRf dXJiKHVyYiwgR0ZQX0FUT01JQykpIDwgMCkgewotCQljbGVhcl9iaXQoY3R4LT5pbmRleCwgJnN1 YnMtPmFjdGl2ZV9tYXNrKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXNuZF9wcmludGQoS0VSTl9F UlIgImNhbm5vdCBzdWJtaXQgdXJiIChlcnIgPSAlZClcbiIsIGVycik7Ci0JCQlzbmRfcGNtX3N0 b3Aoc3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfWFJVTik7Ci0JCX0KKwkgICAgIXN1YnMtPnJ1 bm5pbmcgLyogY2FuIGJlIHN0b3BwZWQgZHVyaW5nIHJldGlyZSBjYWxsYmFjayAqLykKKwkJZ290 byBleGl0X2NsZWFyX2JpdDsKKworCS8qCisJICogRm9yIGRldmljZXMgdGhhdCBvcGVyYXRlIGlu IGltcGxpY2l0IGZlZWRiYWNrIG1vZGUsIHdlIHdvbid0IHJlcXVldWUKKwkgKiB0aGUgVVJCIGF0 IHRoaXMgcG9pbnQuIEluc3RlYWQsIHdlIHdpbGwgd2FpdCBmb3IgdGhlIG5leHQgcmVjb3JkCisJ ICogaW5wdXQgcGFja2V0IHRvIGFycml2ZSBhbmQgcXVldWUgYSBwYWNrZXQgZnJvbSB0aGUgY29y cmVzcG9uZGluZworCSAqIHJldGlyZSBjYWxsYmFjay4KKwkgKi8KKwlpZiAoaXNfcGxheWJhY2sg JiYgc3Vicy0+c3RyZWFtLT5pbXBsaWNpdF9mZWVkYmFjaykKKwkJZ290byBleGl0X2NsZWFyX2Jp dDsKKworCWlmICgoZXJyID0gc3Vicy0+b3BzLnByZXBhcmUoc3Vicywgc3Vic3RyZWFtLT5ydW50 aW1lLCB1cmIpKSA9PSAwICYmCisJICAgIChlcnIgPSBzdWJzLT5vcHMucHJlcGFyZV9zaXplKHN1 YnMsIHN1YnN0cmVhbS0+cnVudGltZSwgdXJiKSkgPT0gMCAmJgorCSAgICAoZXJyID0gdXNiX3N1 Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgPCAwKQorCQlyZXR1cm47CisKKwkvKiBmYWxsIHRo cm91Z2ggKi8KKworZXhpdF9jbGVhcl9iaXQ6CisJY2xlYXJfYml0KGN0eC0+aW5kZXgsICZzdWJz LT5hY3RpdmVfbWFzayk7CisJaWYgKGVyciA8IDApIHsKKwkJc25kX3ByaW50ZChLRVJOX0VSUiAi Y2Fubm90IHN1Ym1pdCB1cmIgKGVyciA9ICVkKVxuIiwgZXJyKTsKKwkJc25kX3BjbV9zdG9wKHN1 YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOwogCX0KIH0KIApAQCAtMjUwLDcgKzMwNSw3 IEBAIGludCBzbmRfdXNiX2luaXRfc3Vic3RyZWFtX3VyYnMoc3RydWN0IHNuZF91c2Jfc3Vic3Ry ZWFtICpzdWJzLAogCWVsc2UKIAkJcGFja3NfcGVyX21zID0gMTsKIAotCWlmIChpc19wbGF5YmFj aykgeworCWlmIChpc19wbGF5YmFjayAmJiAhc3Vicy0+c3RyZWFtLT5pbXBsaWNpdF9mZWVkYmFj aykgewogCQl1cmJfcGFja3MgPSBtYXgoY2hpcC0+bnJwYWNrcywgMSk7CiAJCXVyYl9wYWNrcyA9 IG1pbih1cmJfcGFja3MsICh1bnNpZ25lZCBpbnQpTUFYX1BBQ0tTKTsKIAl9IGVsc2UKQEAgLTI2 MCw3ICszMTUsNyBAQCBpbnQgc25kX3VzYl9pbml0X3N1YnN0cmVhbV91cmJzKHN0cnVjdCBzbmRf dXNiX3N1YnN0cmVhbSAqc3VicywKIAkJdXJiX3BhY2tzID0gbWluKHVyYl9wYWNrcywgMVUgPDwg c3Vicy0+c3luY2ludGVydmFsKTsKIAogCS8qIGRlY2lkZSBob3cgbWFueSBwYWNrZXRzIHRvIGJl IHVzZWQgKi8KLQlpZiAoaXNfcGxheWJhY2spIHsKKwlpZiAoaXNfcGxheWJhY2sgJiYgIXN1YnMt PnN0cmVhbS0+aW1wbGljaXRfZmVlZGJhY2spIHsKIAkJdW5zaWduZWQgaW50IG1pbnNpemUsIG1h eHBhY2tzOwogCQkvKiBkZXRlcm1pbmUgaG93IHNtYWxsIGEgcGFja2V0IGNhbiBiZSAqLwogCQlt aW5zaXplID0gKHN1YnMtPmZyZXFuID4+ICgxNiAtIHN1YnMtPmRhdGFpbnRlcnZhbCkpCkBAIC0z MjAsNiArMzc1LDkgQEAgaW50IHNuZF91c2JfaW5pdF9zdWJzdHJlYW1fdXJicyhzdHJ1Y3Qgc25k X3VzYl9zdWJzdHJlYW0gKnN1YnMsCiAJCXUtPnVyYi0+Y29tcGxldGUgPSBzbmRfY29tcGxldGVf dXJiOwogCX0KIAorCWlmIChzdWJzLT5zdHJlYW0tPmltcGxpY2l0X2ZlZWRiYWNrKQorCQlzdWJz LT5zeW5jcGlwZSA9IDA7CisKIAlpZiAoc3Vicy0+c3luY3BpcGUpIHsKIAkJLyogYWxsb2NhdGUg YW5kIGluaXRpYWxpemUgc3luYyB1cmJzICovCiAJCXN1YnMtPnN5bmNidWYgPSB1c2JfYWxsb2Nf Y29oZXJlbnQoc3Vicy0+ZGV2LCBTWU5DX1VSQlMgKiA0LApAQCAtNDEwLDYgKzQ2OCwxNSBAQCBz dGF0aWMgaW50IHJldGlyZV9jYXB0dXJlX3N5bmNfdXJiKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVh bSAqc3VicywKIH0KIAogLyoKKyAqIHByZXBhcmUgZGF0YSBzaXplcyBmb3IgY2FwdXR1cmUgdXJi cy4gbm90aGluZyB0byBkby4gKi8KK3N0YXRpYyBpbnQgcHJlcGFyZV9jYXB0dXJlX3NpemVfdXJi KHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKKwkJCQkgICAgc3RydWN0IHNuZF9wY21f cnVudGltZSAqcnVudGltZSwKKwkJCQkgICAgc3RydWN0IHVyYiAqdXJiKQoreworCXJldHVybiAw OworfQorCisvKgogICogcHJlcGFyZSB1cmIgZm9yIGNhcHR1cmUgZGF0YSBwaXBlCiAgKgogICog ZmlsbCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggb2YgZWFjaCBkZXNjcmlwdG9yLgpAQCAtNDM4LDEx ICs1MDUsOTMgQEAgc3RhdGljIGludCBwcmVwYXJlX2NhcHR1cmVfdXJiKHN0cnVjdCBzbmRfdXNi X3N1YnN0cmVhbSAqc3VicywKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBxdWV1ZV9uZXh0 X3BsYXliYWNrX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKmNhcHR1cmUsCisJCQkJICAg c3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCQkgICBzdHJ1Y3QgdXJiICppbl91 cmIpCit7CisJdW5zaWduZWQgaW50IHN0cmlkZSA9IHJ1bnRpbWUtPmZyYW1lX2JpdHMgPj4gMzsK Kwl1bnNpZ25lZCBpbnQgYnl0ZXMgPSAwLCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Ry dWN0IHNuZF91cmJfY3R4ICppbl9jdHggPSBpbl91cmItPmNvbnRleHQ7CisJc3RydWN0IHNuZF91 c2Jfc3Vic3RyZWFtICpwbGF5YmFjayA9CisJCSZjYXB0dXJlLT5zdHJlYW0tPnN1YnN0cmVhbVtT TkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKKwlzdHJ1Y3Qgc25kX3VyYl9jdHggKm91dF9jdHg7 CisJc3RydWN0IHVyYiAqb3V0X3VyYjsKKwlpbnQgZXJyOworCisJLyogdGhpcyBtYXkgaGFwcGVu IGR1cmluZyBzdWJzdHJlYW0gdHJhbnNpdGlvbnMgKi8KKwlpZiAoc3RyaWRlID09IDApCisJCXJl dHVybiAwOworCisJaWYgKCFwbGF5YmFjay0+cnVubmluZykKKwkJcmV0dXJuIDA7CisKKwkvKiBD b3VudCBvdmVyYWxsIHBhY2tldCBzaXplICovCisJZm9yIChpID0gMDsgaSA8IGluX2N0eC0+cGFj a2V0czsgaSsrKQorCQlpZiAoaW5fdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgPT0gMCkK KwkJCWJ5dGVzICs9IGluX3VyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwor CS8qIHNraXAgZW1wdHkgcGFja2V0cy4gQXQgbGVhc3QgTS1BdWRpbydzIEZhc3QgVHJhY2sgVWx0 cmEgc3RvcHMKKwkgKiBzdHJlYW1pbmcgb25jZSBpdCByZWNlaXZlZCBhIDAtYnl0ZSBPVVQgVVJC ICovCisJaWYgKGJ5dGVzID09IDApCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUo JmNhcHR1cmUtPmxvY2ssIGZsYWdzKTsKKwlvdXRfY3R4ID0gJnBsYXliYWNrLT5kYXRhdXJiW3Bs YXliYWNrLT5uZXh0X291dF91cmJdOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcHR1cmUt PmxvY2ssIGZsYWdzKTsKKworCW91dF91cmIgPSBvdXRfY3R4LT51cmI7CisKKwkvKiBJZiB0aGUg b3V0cHV0IHVyYiBpcyBzdGlsbCBpbiB1c2UsIHdlIGhhdmUgdG8gZHJvcCB0aGlzIHBhY2tldC4K KwkgKiBUaGlzIHVzdWFsbHkgb25seSBvY2N1cnMgd2hlbiB0aGUgc3RyZWFtIGlzIHN0YXJ0aW5n ICovCisJaWYgKHRlc3RfYml0KG91dF9jdHgtPmluZGV4LCAmcGxheWJhY2stPmFjdGl2ZV9tYXNr KSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgaW5ib3VuZCBw YWNrZXQgYW5kIHByZXBhcmUgdGhlIGxlbmd0aHMKKwkgKiBmb3Igb3V0cHV0IHBhY2tldHMuIFRo ZSBPVVQgcGFja2V0IHdlIGFyZSBhYm91dCB0byBzZW5kIHdpbGwKKwkgKiBoYXZlIHRoZSBzYW1l IGFtb3VudCBvZiBwYXlsb2FkIHRoYW4gdGhlIElOIHBhY2tldCB3ZSBqdXN0CisJICogcmVjZWl2 ZWQuCisJICovCisKKwlvdXRfY3R4LT5wYWNrZXRzID0gaW5fY3R4LT5wYWNrZXRzOworCWZvciAo aSA9IDA7IGkgPCBpbl9jdHgtPnBhY2tldHM7IGkrKykgeworCQlpZiAoaW5fdXJiLT5pc29fZnJh bWVfZGVzY1tpXS5zdGF0dXMgPT0gMCkKKwkJCW91dF9jdHgtPnBhY2tldF9zaXplW2ldID0KKwkJ CQlpbl91cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGggLyBzdHJpZGU7CisJCWVs c2UKKwkJCW91dF9jdHgtPnBhY2tldF9zaXplW2ldID0gMDsKKwl9CisKKwllcnIgPSBwbGF5YmFj ay0+b3BzLnByZXBhcmUocGxheWJhY2ssIHBsYXliYWNrLT5wY21fc3Vic3RyZWFtLT5ydW50aW1l LCBvdXRfdXJiKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHVzYl9z dWJtaXRfdXJiKG91dF91cmIsIEdGUF9BVE9NSUMpOworCWlmIChlcnIgPCAwKSB7CisJCXNuZF9w cmludGsoS0VSTl9FUlIgIiVzKCk6IFVuYWJsZSB0byBzdWJtaXQgdXJiICMlZDogJWRcbiIsCisJ CQkJX19mdW5jX18sIG91dF9jdHgtPmluZGV4LCBlcnIpOworCQlzbmRfcGNtX3N0b3AoY2FwdHVy ZS0+cGNtX3N1YnN0cmVhbSwgU05EUlZfUENNX1NUQVRFX1hSVU4pOworCQlzbmRfcGNtX3N0b3Ao cGxheWJhY2stPnBjbV9zdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9YUlVOKTsKKwkJcmV0dXJu IGVycjsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FwdHVyZS0+bG9jaywgZmxh Z3MpOworCQlzZXRfYml0KG91dF9jdHgtPmluZGV4LCAmcGxheWJhY2stPmFjdGl2ZV9tYXNrKTsK KwkJcGxheWJhY2stPm5leHRfb3V0X3VyYisrOworCQlwbGF5YmFjay0+bmV4dF9vdXRfdXJiICU9 IHBsYXliYWNrLT5udXJiczsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FwdHVyZS0+bG9j aywgZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogcHJvY2VzcyBhZnRlciBj YXB0dXJlIGNvbXBsZXRlCiAgKgogICogY29weSB0aGUgZGF0YSBmcm9tIGVhY2ggZGVzY3RpcHRv ciB0byB0aGUgcGNtIGJ1ZmZlciwgYW5kCiAgKiB1cGRhdGUgdGhlIGN1cnJlbnQgcG9zaXRpb24u CisgKgorICogRm9yIGltcGxpY2l0IGZlZWRiYWNrIG1vZGUsIGV2ZW50dWFsbHkgY2FsbCBxdWV1 ZV9uZXh0X3BsYXliYWNrX3VyYigpLgogICovCiBzdGF0aWMgaW50IHJldGlyZV9jYXB0dXJlX3Vy YihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCiAJCQkgICAgICBzdHJ1Y3Qgc25kX3Bj bV9ydW50aW1lICpydW50aW1lLApAQCAtNDk5LDE2ICs2NDgsMjQgQEAgc3RhdGljIGludCByZXRp cmVfY2FwdHVyZV91cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzLAogCX0KIAlpZiAo cGVyaW9kX2VsYXBzZWQpCiAJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vicy0+cGNtX3N1YnN0 cmVhbSk7CisKKwlpZiAoc3Vicy0+c3RyZWFtLT5pbXBsaWNpdF9mZWVkYmFjaykKKwkJcmV0dXJu IHF1ZXVlX25leHRfcGxheWJhY2tfdXJiKHN1YnMsIHJ1bnRpbWUsIHVyYik7CisKIAlyZXR1cm4g MDsKIH0KIAogLyoKLSAqIFByb2Nlc3MgYWZ0ZXIgY2FwdHVyZSBjb21wbGV0ZSB3aGVuIHBhdXNl ZC4gIE5vdGhpbmcgdG8gZG8uCisgKiBQcm9jZXNzIGFmdGVyIGNhcHR1cmUgY29tcGxldGUgd2hl biBwYXVzZWQuCisgKiBGb3IgaW1wbGljaXQgZmVlZGJhY2sgbW9kZSwgZXZlbnR1YWxseSBjYWxs IHF1ZXVlX25leHRfcGxheWJhY2tfdXJiKCkuCiAgKi8KIHN0YXRpYyBpbnQgcmV0aXJlX3BhdXNl ZF9jYXB0dXJlX3VyYihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCiAJCQkJICAgICBz dHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lLAogCQkJCSAgICAgc3RydWN0IHVyYiAqdXJi KQogeworCWlmIChzdWJzLT5zdHJlYW0tPmltcGxpY2l0X2ZlZWRiYWNrKQorCQlyZXR1cm4gcXVl dWVfbmV4dF9wbGF5YmFja191cmIoc3VicywgcnVudGltZSwgdXJiKTsKKwogCXJldHVybiAwOwog fQogCkBAIC02MTUsNiArNzcyLDI1IEBAIHN0YXRpYyBpbnQgc25kX3VzYl9hdWRpb19uZXh0X3Bh Y2tldF9zaXplKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicykKIH0KIAogLyoKKyAqIFBy ZXBhcmUgdXJiIGRhdGEgc2l6ZXMgZm9yIGFzeW5jaHJvbm91cyBvdXRwdXQgc3RyZWFtaW5nLgor ICogVGhpcyBpcyBzZXBlcmF0ZWQgZnJvbSB0aGUgY29kZSB0aGF0IGZpbGxzIHRoZSBkYXRhIGJl Y2F1c2Ugc3luY3Jvbm91cworICogc3RyZWFtaW5nIChpbiBpbXBsaWNpdCBmZWVkYmFjayBtb2Rl KSB1c2VzIGEgZGlmZmVyZW50IG1ldGhvZCB0byBkZXRlcm1pbmUKKyAqIHRoZSBvdXRwdXQgZGF0 YSBwYWNrZXQgc2l6ZXMuCisgKi8KK3N0YXRpYyBpbnQgcHJlcGFyZV9wbGF5YmFja19zaXplX3Vy YihzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3Bj bV9ydW50aW1lICpydW50aW1lLAorCQkJCSAgICAgc3RydWN0IHVyYiAqdXJiKQoreworCWludCBp OworCXN0cnVjdCBzbmRfdXJiX2N0eCAqY3R4ID0gdXJiLT5jb250ZXh0OworCisJZm9yIChpID0g MDsgaSA8IGN0eC0+cGFja2V0czsgKytpKQorCQljdHgtPnBhY2tldF9zaXplW2ldID0gc25kX3Vz Yl9hdWRpb19uZXh0X3BhY2tldF9zaXplKHN1YnMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAg KiBQcmVwYXJlIHVyYiBmb3Igc3RyZWFtaW5nIGJlZm9yZSBwbGF5YmFjayBzdGFydHMgb3Igd2hl biBwYXVzZWQuCiAgKgogICogV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSwgc28gd2Ugc2VuZCBzaWxl bmNlLgpAQCAtNjMwLDcgKzgwNiw3IEBAIHN0YXRpYyBpbnQgcHJlcGFyZV9ub2RhdGFfcGxheWJh Y2tfdXJiKHN0cnVjdCBzbmRfdXNiX3N1YnN0cmVhbSAqc3VicywKIAlvZmZzID0gMDsKIAl1cmIt PmRldiA9IGN0eC0+c3Vicy0+ZGV2OwogCWZvciAoaSA9IDA7IGkgPCBjdHgtPnBhY2tldHM7ICsr aSkgewotCQljb3VudHMgPSBzbmRfdXNiX2F1ZGlvX25leHRfcGFja2V0X3NpemUoc3Vicyk7CisJ CWNvdW50cyA9IGN0eC0+cGFja2V0X3NpemVbaV07CiAJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0u b2Zmc2V0ID0gb2ZmcyAqIHN0cmlkZTsKIAkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5sZW5ndGgg PSBjb3VudHMgKiBzdHJpZGU7CiAJCW9mZnMgKz0gY291bnRzOwpAQCAtNjY4LDcgKzg0NCw3IEBA IHN0YXRpYyBpbnQgcHJlcGFyZV9wbGF5YmFja191cmIoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFt ICpzdWJzLAogCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSAwOwogCXNwaW5fbG9ja19pcnFzYXZl KCZzdWJzLT5sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IGN0eC0+cGFja2V0czsgaSsr KSB7Ci0JCWNvdW50cyA9IHNuZF91c2JfYXVkaW9fbmV4dF9wYWNrZXRfc2l6ZShzdWJzKTsKKwkJ Y291bnRzID0gY3R4LT5wYWNrZXRfc2l6ZVtpXTsKIAkJLyogc2V0IHVwIGRlc2NyaXB0b3IgKi8K IAkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQgPSBmcmFtZXMgKiBzdHJpZGU7CiAJCXVy Yi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoID0gY291bnRzICogc3RyaWRlOwpAQCAtNzg2LDYg Kzk2MiwxMCBAQCBzdGF0aWMgaW50IHN0YXJ0X3VyYnMoc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFt ICpzdWJzLCBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydQogCWZvciAoaSA9IDA7IGkgPCBzdWJz LT5udXJiczsgaSsrKSB7CiAJCWlmIChzbmRfQlVHX09OKCFzdWJzLT5kYXRhdXJiW2ldLnVyYikp CiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHN1YnMtPm9wcy5wcmVwYXJlX3NpemUoc3Vicywg cnVudGltZSwgc3Vicy0+ZGF0YXVyYltpXS51cmIpIDwgMCkgeworCQkJc25kX3ByaW50ayhLRVJO X0VSUiAiY2Fubm90IHByZXBhcmUgZGF0YXBpcGUgZm9yIHVyYiAlZFxuIiwgaSk7CisJCQlnb3Rv IF9fZXJyb3I7CisJCX0KIAkJaWYgKHN1YnMtPm9wcy5wcmVwYXJlKHN1YnMsIHJ1bnRpbWUsIHN1 YnMtPmRhdGF1cmJbaV0udXJiKSA8IDApIHsKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5v dCBwcmVwYXJlIGRhdGFwaXBlIGZvciB1cmIgJWRcbiIsIGkpOwogCQkJZ290byBfX2Vycm9yOwpA QCAtODA1LDYgKzk4NSw3IEBAIHN0YXRpYyBpbnQgc3RhcnRfdXJicyhzdHJ1Y3Qgc25kX3VzYl9z dWJzdHJlYW0gKnN1YnMsIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1CiAJc3Vicy0+YWN0aXZl X21hc2sgPSAwOwogCXN1YnMtPnVubGlua19tYXNrID0gMDsKIAlzdWJzLT5ydW5uaW5nID0gMTsK KwogCWZvciAoaSA9IDA7IGkgPCBzdWJzLT5udXJiczsgaSsrKSB7CiAJCWVyciA9IHVzYl9zdWJt aXRfdXJiKHN1YnMtPmRhdGF1cmJbaV0udXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKGVyciA8IDAp IHsKQEAgLTg0MCwxMiArMTAyMSwxNCBAQCBzdGF0aWMgaW50IHN0YXJ0X3VyYnMoc3RydWN0IHNu ZF91c2Jfc3Vic3RyZWFtICpzdWJzLCBzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydQogICovCiBz dGF0aWMgc3RydWN0IHNuZF91cmJfb3BzIGF1ZGlvX3VyYl9vcHNbMl0gPSB7CiAJeworCQkucHJl cGFyZV9zaXplID0JcHJlcGFyZV9wbGF5YmFja19zaXplX3VyYiwKIAkJLnByZXBhcmUgPQlwcmVw YXJlX25vZGF0YV9wbGF5YmFja191cmIsCiAJCS5yZXRpcmUgPQlyZXRpcmVfcGxheWJhY2tfdXJi LAogCQkucHJlcGFyZV9zeW5jID0JcHJlcGFyZV9wbGF5YmFja19zeW5jX3VyYiwKIAkJLnJldGly ZV9zeW5jID0JcmV0aXJlX3BsYXliYWNrX3N5bmNfdXJiLAogCX0sCiAJeworCQkucHJlcGFyZV9z aXplID0JcHJlcGFyZV9jYXB0dXJlX3NpemVfdXJiLAogCQkucHJlcGFyZSA9CXByZXBhcmVfY2Fw dHVyZV91cmIsCiAJCS5yZXRpcmUgPQlyZXRpcmVfY2FwdHVyZV91cmIsCiAJCS5wcmVwYXJlX3N5 bmMgPQlwcmVwYXJlX2NhcHR1cmVfc3luY191cmIsCkBAIC04OTIsNiArMTA3NSwxOCBAQCBpbnQg c25kX3VzYl9zdWJzdHJlYW1fcGxheWJhY2tfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJl YW0gKnN1YnN0cmVhbSwgaW50CiAJCXN1YnMtPm9wcy5wcmVwYXJlID0gcHJlcGFyZV9wbGF5YmFj a191cmI7CiAJCXJldHVybiAwOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwkJaWYg KHN1YnMtPnN0cmVhbS0+aW1wbGljaXRfZmVlZGJhY2spIHsKKwkJCXN0cnVjdCBzbmRfdXNiX3N1 YnN0cmVhbSAqY2FwdHVyZSA9CisJCQkJJnN1YnMtPnN0cmVhbS0+c3Vic3RyZWFtW1NORFJWX1BD TV9TVFJFQU1fQ0FQVFVSRV07CisJCQlpZiAoY2FwdHVyZSAmJgorCQkJICAgIGNhcHR1cmUtPnBj bV9zdWJzdHJlYW0gJiYKKwkJCSAgICBjYXB0dXJlLT5wY21fc3Vic3RyZWFtLT5ydW50aW1lKSB7 CisJCQkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9CisJCQkJCWNhcHR1cmUtPnBj bV9zdWJzdHJlYW0tPnJ1bnRpbWU7CisJCQkJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgIT0g U05EUlZfUENNX1NUQVRFX09QRU4pCisJCQkJCWRlYWN0aXZhdGVfdXJicyhjYXB0dXJlLCAwLCAw KTsKKwkJCX0KKwkJfQogCQlyZXR1cm4gZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDApOwogCWNh c2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKIAkJc3Vicy0+b3BzLnByZXBhcmUgPSBw cmVwYXJlX25vZGF0YV9wbGF5YmFja191cmI7CkBAIC05MDgsOCArMTEwMywxNSBAQCBpbnQgc25k X3VzYl9zdWJzdHJlYW1fY2FwdHVyZV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAq c3Vic3RyZWFtLCBpbnQgYwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dF Ul9TVEFSVDoKIAkJc3Vicy0+b3BzLnJldGlyZSA9IHJldGlyZV9jYXB0dXJlX3VyYjsKLQkJcmV0 dXJuIHN0YXJ0X3VyYnMoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lKTsKKwkJaWYgKCFzdWJzLT5y dW5uaW5nKQorCQkJcmV0dXJuIHN0YXJ0X3VyYnMoc3Vicywgc3Vic3RyZWFtLT5ydW50aW1lKTsK KworCQlyZXR1cm4gMDsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWlmIChzbmRf dXNiX2NhcHR1cmVfc3Vic191c2VkX2J5X3BsYXliYWNrKHN1YnMpKSB7CisJCQlzdWJzLT5vcHMu cmV0aXJlID0gcmV0aXJlX3BhdXNlZF9jYXB0dXJlX3VyYjsKKwkJCXJldHVybiAwOworCQl9CiAJ CXJldHVybiBkZWFjdGl2YXRlX3VyYnMoc3VicywgMCwgMCk7CiAJY2FzZSBTTkRSVl9QQ01fVFJJ R0dFUl9QQVVTRV9QVVNIOgogCQlzdWJzLT5vcHMucmV0aXJlID0gcmV0aXJlX3BhdXNlZF9jYXB0 dXJlX3VyYjsKQEAgLTkyMiwxOCArMTEyNCw5MCBAQCBpbnQgc25kX3VzYl9zdWJzdHJlYW1fY2Fw dHVyZV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgYwog CXJldHVybiAtRUlOVkFMOwogfQogCisvKgorICogRmFrZSBhIHN0YXJ0IGZvciB0aGUgY2FwdHVy ZSBzdHJlYW0uCisgKiBPbmx5IHVzZWQgZm9yIGltcGxpY2l0IGZlZWRiYWNrIG1vZGUuCisgKi8K K3N0YXRpYyBpbnQgc3RhcnRfY2FwdHVyZV9zdHJlYW0oc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFt ICpwbGF5YmFjaywKKwkJCQlzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKmNhcHR1cmUsCisJCQkJ c3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlpbnQgZXJyOworCisKK3VzYl9z ZXRfaW50ZXJmYWNlKGNhcHR1cmUtPmRldiwgMiwgMSk7CisKKwljYXB0dXJlLT5vcHMucHJlcGFy ZSA9IHByZXBhcmVfY2FwdHVyZV91cmI7CisJY2FwdHVyZS0+b3BzLnJldGlyZSA9IHJldGlyZV9w YXVzZWRfY2FwdHVyZV91cmI7CisJY2FwdHVyZS0+cGNtX3N1YnN0cmVhbSA9IHBsYXliYWNrLT5w Y21fc3Vic3RyZWFtOworCWVyciA9IHNuZF91c2Jfc2V0X3BjbV9mb3JtYXQoY2FwdHVyZSwgcGxh eWJhY2stPmN1cl9hdWRpb2ZtdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9 IHNuZF91c2JfaW5pdF9zdWJzdHJlYW1fdXJicyhjYXB0dXJlLCBwbGF5YmFjay0+cGVyaW9kX2J5 dGVzLAorCQkJCQkgIHBsYXliYWNrLT5jdXJfcmF0ZSwKKwkJCQkJICAocGxheWJhY2stPmN1cnBh Y2tzaXplIC8KKwkJCQkJICAgcGxheWJhY2stPmN1cmZyYW1lc2l6ZSkgKiA4KTsKKwlpZiAoZXJy KQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHN0YXJ0X3VyYnMoY2FwdHVyZSwgcnVudGltZSk7 Cit9CisKIGludCBzbmRfdXNiX3N1YnN0cmVhbV9wcmVwYXJlKHN0cnVjdCBzbmRfdXNiX3N1YnN0 cmVhbSAqc3VicywKIAkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCiB7 CiAJLyogY2xlYXIgdXJicyAodG8gYmUgc3VyZSkgKi8KLQlkZWFjdGl2YXRlX3VyYnMoc3Vicywg MCwgMSk7Ci0Jd2FpdF9jbGVhcl91cmJzKHN1YnMpOworCWlmICghc25kX3VzYl9jYXB0dXJlX3N1 YnNfdXNlZF9ieV9wbGF5YmFjayhzdWJzKSkgeworCQlkZWFjdGl2YXRlX3VyYnMoc3VicywgMCwg MSk7CisJCXdhaXRfY2xlYXJfdXJicyhzdWJzKTsKKwl9CiAKLQkvKiBmb3IgcGxheWJhY2ssIHN1 Ym1pdCB0aGUgVVJCcyBub3c7IG90aGVyd2lzZSwgdGhlIGZpcnN0IGh3cHRyX2RvbmUKLQkgKiB1 cGRhdGVzIGZvciBhbGwgVVJCcyB3b3VsZCBoYXBwZW4gYXQgdGhlIHNhbWUgdGltZSB3aGVuIHN0 YXJ0aW5nICovCiAJaWYgKHN1YnMtPmRpcmVjdGlvbiA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlC QUNLKSB7CiAJCXN1YnMtPm9wcy5wcmVwYXJlID0gcHJlcGFyZV9ub2RhdGFfcGxheWJhY2tfdXJi OwotCQlyZXR1cm4gc3RhcnRfdXJicyhzdWJzLCBydW50aW1lKTsKKworCQlpZiAoc3Vicy0+c3Ry ZWFtLT5pbXBsaWNpdF9mZWVkYmFjaykgeworCQkJc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpj YXB0dXJlID0KKwkJCQkmc3Vicy0+c3RyZWFtLT5zdWJzdHJlYW1bU05EUlZfUENNX1NUUkVBTV9D QVBUVVJFXTsKKworCQkJaWYgKCFjYXB0dXJlKSB7CisJCQkJc25kX3ByaW50ayhLRVJOX0VSUiAi VW5hYmxlIHRvIHN0YXJ0IGltcGxpY2l0IGZlZWRiYWNrIG1vZGUgIgorCQkJCQkgICAid2l0aG91 dCBjYXB0dXJlIHN0cmVhbVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCS8q CisJCQkgKiBNYXJrIHRoZSBzdHJlYW0gcnVubmluZyB3aXRob3V0IGNhbGxpbmcgc3RhcnRfdXJi cygpLgorCQkJICogV2UgZG9uJ3Qgd2FudCB0byBxdWV1ZSBhbnkgVVJCcyB5ZXQgYXQgdGhpcyBw b2ludAorCQkJICovCisJCQlzdWJzLT5hY3RpdmVfbWFzayA9IDA7CisJCQlzdWJzLT51bmxpbmtf bWFzayA9IDA7CisJCQlzdWJzLT5ydW5uaW5nID0gMTsKKworCQkJLyoKKwkJCSAqIGlmIHRoaXMg c3RyZWFtIGlzIGluIGltcGxpY2l0IGZlZWRiYWNrIG1vZGUsIHN0YXJ0IHRoZQorCQkJICogY2Fw dHVyZSBzdHJlYW0gbm93IGFzIHRoZSBwbGF5YmFjayBzdHJlYW0gcmVsaWVzIG9uIHRoZQorCQkJ ICogYW1vdW50IG9mIGRhdGEgd2Ugc2VlIG9uIHRoZSBjYXB0dXJlIElOIGVuZHBvaW50LgorCQkJ ICovCisJCQlpZiAoIWNhcHR1cmUtPnJ1bm5pbmcpIHsKKwkJCQlpbnQgZXJyID0gc3RhcnRfY2Fw dHVyZV9zdHJlYW0oc3VicywgY2FwdHVyZSwgcnVudGltZSk7CisJCQkJaWYgKGVyciA8IDApIHsK KwkJCQkJZGVhY3RpdmF0ZV91cmJzKHN1YnMsIDAsIDApOworCQkJCQlyZXR1cm4gZXJyOworCQkJ CX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBGb3IgcGxheWJhY2ssIHN1Ym1pdCB0 aGUgVVJCcyBub3c7IG90aGVyd2lzZSwgdGhlCisJCQkgKiBmaXJzdCBod3B0cl9kb25lIHVwZGF0 ZXMgZm9yIGFsbCBVUkJzIHdvdWxkIGhhcHBlbgorCQkJICogYXQgdGhlIHNhbWUgdGltZSB3aGVu IHN0YXJ0aW5nLgorCQkJICogSG93ZXZlciwgZG9uJ3Qgc3RhcnQgdGhlIHN0cmVhbSBoZXJlIGlm IHdlIGFyZSBpbgorCQkJICogaW1wbGljaXQgZmVlZGJhY2sgc3RyZWFtIG1vZGUgLSBhbGwgT1VU IFVSQnMgd2lsbAorCQkJICogYmUgcXVldWVkIG9uY2UgZGF0YSBpcyByZWNlaXZlZCBvbiB0aGUg SU4gZW5kcG9vaW50CisJCQkgKiBpbiB0aGlzIGNhc2UuCisJCQkgKi8KKwkJCXJldHVybiBzdGFy dF91cmJzKHN1YnMsIHJ1bnRpbWUpOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQg YS9zb3VuZC91c2IvdXJiLmggYi9zb3VuZC91c2IvdXJiLmgKaW5kZXggODg4ZGEzOC4uNTkzYTll MSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VyYi5oCisrKyBiL3NvdW5kL3VzYi91cmIuaApAQCAt MTcsNSArMTcsNiBAQCBpbnQgc25kX3VzYl9zdWJzdHJlYW1fcHJlcGFyZShzdHJ1Y3Qgc25kX3Vz Yl9zdWJzdHJlYW0gKnN1YnMsCiAKIGludCBzbmRfdXNiX3N1YnN0cmVhbV9wbGF5YmFja190cmln Z2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKTsKIGludCBz bmRfdXNiX3N1YnN0cmVhbV9jYXB0dXJlX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFt ICpzdWJzdHJlYW0sIGludCBjbWQpOworaW50IHNuZF91c2JfY2FwdHVyZV9zdWJzX3VzZWRfYnlf cGxheWJhY2soc3RydWN0IHNuZF91c2Jfc3Vic3RyZWFtICpzdWJzdHJlYW0pOwogCiAjZW5kaWYg LyogX19VU0JBVURJT19VUkJfSCAqLwo= --000e0cd155ba21411c04a676c982 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline --000e0cd155ba21411c04a676c982--