From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64471C04EB9 for ; Mon, 3 Dec 2018 12:38:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 34DCA20850 for ; Mon, 3 Dec 2018 12:38:31 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 34DCA20850 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726495AbeLCMjW (ORCPT ); Mon, 3 Dec 2018 07:39:22 -0500 Received: from mga11.intel.com ([192.55.52.93]:48552 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725975AbeLCMjW (ORCPT ); Mon, 3 Dec 2018 07:39:22 -0500 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Dec 2018 04:38:28 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,310,1539673200"; d="scan'208";a="126616935" Received: from kuha.fi.intel.com ([10.237.72.189]) by fmsmga001.fm.intel.com with SMTP; 03 Dec 2018 04:38:24 -0800 Received: by kuha.fi.intel.com (sSMTP sendmail emulation); Mon, 03 Dec 2018 14:38:24 +0200 Date: Mon, 3 Dec 2018 14:38:24 +0200 From: Heikki Krogerus To: Yu Chen Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, suzhuangluan@hisilicon.com, kongfei@hisilicon.com, Greg Kroah-Hartman , Hans de Goede , Andy Shevchenko , John Stultz Subject: Re: [PATCH v1 08/12] usb: roles: Add usb role switch notifier. Message-ID: <20181203123824.GE24338@kuha.fi.intel.com> References: <20181203034515.91412-1-chenyu56@huawei.com> <20181203034515.91412-9-chenyu56@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20181203034515.91412-9-chenyu56@huawei.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Dec 03, 2018 at 11:45:11AM +0800, Yu Chen wrote: > This patch adds notifier for drivers want to be informed of the usb role switch. I think in this case it would be good to explain a little for what we need the notifier for. > Cc: Greg Kroah-Hartman > Cc: Heikki Krogerus > Cc: Hans de Goede > Cc: Andy Shevchenko > Cc: John Stultz > Signed-off-by: Heikki Krogerus > Signed-off-by: Yu Chen > > -- > v0: > The patch is provided by Heikki Krogerus. I modified and test it > on Hikey960 platform. I don't think I actually made a "patch" for this. The "diff" I made showing the idea does not count, so you should not sign off the patch with my address. In this case I believe something like "Suggested-by" should be used instead of SoB tag: Suggested-by: Heikki Krogerus Side note: If this was from me, then there should be "from" line with my address as well. > -- > --- > drivers/usb/common/roles.c | 20 +++++++++++++++++++- > include/linux/usb/role.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 65 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/common/roles.c b/drivers/usb/common/roles.c > index 0f48090c5c30..bfd7a988b64c 100644 > --- a/drivers/usb/common/roles.c > +++ b/drivers/usb/common/roles.c > @@ -21,6 +21,7 @@ struct usb_role_switch { > struct device dev; > struct mutex lock; /* device lock*/ > enum usb_role role; > + struct blocking_notifier_head nh; > > /* From descriptor */ > struct device *usb2_port; > @@ -50,8 +51,10 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role) > mutex_lock(&sw->lock); > > ret = sw->set(sw->dev.parent, role); > - if (!ret) > + if (!ret) { > sw->role = role; > + blocking_notifier_call_chain(&sw->nh, role, NULL); > + } > > mutex_unlock(&sw->lock); > > @@ -59,6 +62,20 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role) > } > EXPORT_SYMBOL_GPL(usb_role_switch_set_role); > > +int usb_role_switch_register_notifier(struct usb_role_switch *sw, > + struct notifier_block *nb) > +{ > + return blocking_notifier_chain_register(&sw->nh, nb); > +} > +EXPORT_SYMBOL_GPL(usb_role_switch_register_notifier); > + > +int usb_role_switch_unregister_notifier(struct usb_role_switch *sw, > + struct notifier_block *nb) > +{ > + return blocking_notifier_chain_unregister(&sw->nh, nb); > +} > +EXPORT_SYMBOL_GPL(usb_role_switch_unregister_notifier); > + > /** > * usb_role_switch_get_role - Get the USB role for a switch > * @sw: USB role switch > @@ -297,6 +314,7 @@ usb_role_switch_register(struct device *parent, > return ERR_PTR(-ENOMEM); > > mutex_init(&sw->lock); > + BLOCKING_INIT_NOTIFIER_HEAD(&sw->nh); > > sw->allow_userspace_control = desc->allow_userspace_control; > sw->usb2_port = desc->usb2_port; > diff --git a/include/linux/usb/role.h b/include/linux/usb/role.h > index edc51be4a77c..c97d4be91ada 100644 > --- a/include/linux/usb/role.h > +++ b/include/linux/usb/role.h > @@ -40,6 +40,8 @@ struct usb_role_switch_desc { > bool allow_userspace_control; > }; > > + > +#if IS_ENABLED(CONFIG_USB_ROLE_SWITCH) > int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role); > enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw); > struct usb_role_switch *usb_role_switch_get(struct device *dev); > @@ -49,5 +51,49 @@ struct usb_role_switch * > usb_role_switch_register(struct device *parent, > const struct usb_role_switch_desc *desc); > void usb_role_switch_unregister(struct usb_role_switch *sw); > +int usb_role_switch_register_notifier(struct usb_role_switch *sw, > + struct notifier_block *nb); > +int usb_role_switch_unregister_notifier(struct usb_role_switch *sw, > + struct notifier_block *nb); > +#else > +static inline int usb_role_switch_set_role(struct usb_role_switch *sw, > + enum usb_role role) > +{ > + return 0; > +} > + > +static inline enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw) > +{ > + return USB_ROLE_NONE; > +} > + > +static inline struct usb_role_switch *usb_role_switch_get(struct device *dev) > +{ > + return ERR_PTR(-ENODEV); > +} > + > +static inline void usb_role_switch_put(struct usb_role_switch *sw) { } > + > +static inline struct usb_role_switch * > +usb_role_switch_register(struct device *parent, > + const struct usb_role_switch_desc *desc) > +{ > + return ERR_PTR(-ENODEV); > +} > + > +static inline void usb_role_switch_unregister(struct usb_role_switch *sw) { } > + > +static int usb_role_switch_register_notifier(struct usb_role_switch *sw, > + struct notifier_block *nb) > +{ > + return -ENODEV; > +} > + > +static int usb_role_switch_unregister_notifier(struct usb_role_switch *sw, > + struct notifier_block *nb) > +{ > + return -ENODEV; > +} > +#endif > > #endif /* __LINUX_USB_ROLE_H */ > -- > 2.15.0-rc2 thanks, -- heikki From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v1,08/12] usb: roles: Add usb role switch notifier. From: Heikki Krogerus Message-Id: <20181203123824.GE24338@kuha.fi.intel.com> Date: Mon, 3 Dec 2018 14:38:24 +0200 To: Yu Chen Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, suzhuangluan@hisilicon.com, kongfei@hisilicon.com, Greg Kroah-Hartman , Hans de Goede , Andy Shevchenko , John Stultz List-ID: T24gTW9uLCBEZWMgMDMsIDIwMTggYXQgMTE6NDU6MTFBTSArMDgwMCwgWXUgQ2hlbiB3cm90ZToK PiBUaGlzIHBhdGNoIGFkZHMgbm90aWZpZXIgZm9yIGRyaXZlcnMgd2FudCB0byBiZSBpbmZvcm1l ZCBvZiB0aGUgdXNiIHJvbGUgc3dpdGNoLgoKSSB0aGluayBpbiB0aGlzIGNhc2UgaXQgd291bGQg YmUgZ29vZCB0byBleHBsYWluIGEgbGl0dGxlIGZvciB3aGF0IHdlCm5lZWQgdGhlIG5vdGlmaWVy IGZvci4KCj4gQ2M6IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5v cmc+Cj4gQ2M6IEhlaWtraSBLcm9nZXJ1cyA8aGVpa2tpLmtyb2dlcnVzQGxpbnV4LmludGVsLmNv bT4KPiBDYzogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KPiBDYzogQW5keSBT aGV2Y2hlbmtvIDxhbmR5LnNoZXZjaGVua29AZ21haWwuY29tPgo+IENjOiBKb2huIFN0dWx0eiA8 am9obi5zdHVsdHpAbGluYXJvLm9yZz4KPiBTaWduZWQtb2ZmLWJ5OiBIZWlra2kgS3JvZ2VydXMg PGhlaWtraS5rcm9nZXJ1c0BsaW51eC5pbnRlbC5jb20+Cj4gU2lnbmVkLW9mZi1ieTogWXUgQ2hl biA8Y2hlbnl1NTZAaHVhd2VpLmNvbT4KPiAKPiAtLQo+IHYwOgo+IFRoZSBwYXRjaCBpcyBwcm92 aWRlZCBieSBIZWlra2kgS3JvZ2VydXMuIEkgbW9kaWZpZWQgYW5kIHRlc3QgaXQKPiBvbiBIaWtl eTk2MCBwbGF0Zm9ybS4KCkkgZG9uJ3QgdGhpbmsgSSBhY3R1YWxseSBtYWRlIGEgInBhdGNoIiBm b3IgdGhpcy4gVGhlICJkaWZmIiBJIG1hZGUKc2hvd2luZyB0aGUgaWRlYSBkb2VzIG5vdCBjb3Vu dCwgc28geW91IHNob3VsZCBub3Qgc2lnbiBvZmYgdGhlIHBhdGNoCndpdGggbXkgYWRkcmVzcy4K CkluIHRoaXMgY2FzZSBJIGJlbGlldmUgc29tZXRoaW5nIGxpa2UgIlN1Z2dlc3RlZC1ieSIgc2hv dWxkIGJlIHVzZWQKaW5zdGVhZCBvZiBTb0IgdGFnOgoKICAgICAgICBTdWdnZXN0ZWQtYnk6IEhl aWtraSBLcm9nZXJ1cyA8aGVpa2tpLmtyb2dlcnVzQGxpbnV4LmludGVsLmNvbT4KClNpZGUgbm90 ZTogSWYgdGhpcyB3YXMgZnJvbSBtZSwgdGhlbiB0aGVyZSBzaG91bGQgYmUgImZyb20iIGxpbmUg d2l0aApteSBhZGRyZXNzIGFzIHdlbGwuCgo+IC0tCj4gLS0tCj4gIGRyaXZlcnMvdXNiL2NvbW1v bi9yb2xlcy5jIHwgMjAgKysrKysrKysrKysrKysrKysrKy0KPiAgaW5jbHVkZS9saW51eC91c2Iv cm9sZS5oICAgfCA0NiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCj4gIDIgZmlsZXMgY2hhbmdlZCwgNjUgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+ IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb21tb24vcm9sZXMuYyBiL2RyaXZlcnMvdXNi L2NvbW1vbi9yb2xlcy5jCj4gaW5kZXggMGY0ODA5MGM1YzMwLi5iZmQ3YTk4OGI2NGMgMTAwNjQ0 Cj4gLS0tIGEvZHJpdmVycy91c2IvY29tbW9uL3JvbGVzLmMKPiArKysgYi9kcml2ZXJzL3VzYi9j b21tb24vcm9sZXMuYwo+IEBAIC0yMSw2ICsyMSw3IEBAIHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2gg ewo+ICAJc3RydWN0IGRldmljZSBkZXY7Cj4gIAlzdHJ1Y3QgbXV0ZXggbG9jazsgLyogZGV2aWNl IGxvY2sqLwo+ICAJZW51bSB1c2Jfcm9sZSByb2xlOwo+ICsJc3RydWN0IGJsb2NraW5nX25vdGlm aWVyX2hlYWQgbmg7Cj4gIAo+ICAJLyogRnJvbSBkZXNjcmlwdG9yICovCj4gIAlzdHJ1Y3QgZGV2 aWNlICp1c2IyX3BvcnQ7Cj4gQEAgLTUwLDggKzUxLDEwIEBAIGludCB1c2Jfcm9sZV9zd2l0Y2hf c2V0X3JvbGUoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3csIGVudW0gdXNiX3JvbGUgcm9sZSkK PiAgCW11dGV4X2xvY2soJnN3LT5sb2NrKTsKPiAgCj4gIAlyZXQgPSBzdy0+c2V0KHN3LT5kZXYu cGFyZW50LCByb2xlKTsKPiAtCWlmICghcmV0KQo+ICsJaWYgKCFyZXQpIHsKPiAgCQlzdy0+cm9s ZSA9IHJvbGU7Cj4gKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmc3ctPm5oLCByb2xl LCBOVUxMKTsKPiArCX0KPiAgCj4gIAltdXRleF91bmxvY2soJnN3LT5sb2NrKTsKPiAgCj4gQEAg LTU5LDYgKzYyLDIwIEBAIGludCB1c2Jfcm9sZV9zd2l0Y2hfc2V0X3JvbGUoc3RydWN0IHVzYl9y b2xlX3N3aXRjaCAqc3csIGVudW0gdXNiX3JvbGUgcm9sZSkKPiAgfQo+ICBFWFBPUlRfU1lNQk9M X0dQTCh1c2Jfcm9sZV9zd2l0Y2hfc2V0X3JvbGUpOwo+ICAKPiAraW50IHVzYl9yb2xlX3N3aXRj aF9yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdywKPiArCQkJCSAg ICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCj4gK3sKPiArCXJldHVybiBibG9ja2luZ19u b3RpZmllcl9jaGFpbl9yZWdpc3Rlcigmc3ctPm5oLCBuYik7Cj4gK30KPiArRVhQT1JUX1NZTUJP TF9HUEwodXNiX3JvbGVfc3dpdGNoX3JlZ2lzdGVyX25vdGlmaWVyKTsKPiArCj4gK2ludCB1c2Jf cm9sZV9zd2l0Y2hfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpz dywKPiArCQkJCQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQo+ICt7Cj4gKwlyZXR1cm4gYmxv Y2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3Rlcigmc3ctPm5oLCBuYik7Cj4gK30KPiArRVhQ T1JUX1NZTUJPTF9HUEwodXNiX3JvbGVfc3dpdGNoX3VucmVnaXN0ZXJfbm90aWZpZXIpOwo+ICsK PiAgLyoqCj4gICAqIHVzYl9yb2xlX3N3aXRjaF9nZXRfcm9sZSAtIEdldCB0aGUgVVNCIHJvbGUg Zm9yIGEgc3dpdGNoCj4gICAqIEBzdzogVVNCIHJvbGUgc3dpdGNoCj4gQEAgLTI5Nyw2ICszMTQs NyBAQCB1c2Jfcm9sZV9zd2l0Y2hfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAo+ICAJ CXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+ICAKPiAgCW11dGV4X2luaXQoJnN3LT5sb2NrKTsK PiArCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmc3ctPm5oKTsKPiAgCj4gIAlzdy0+YWxs b3dfdXNlcnNwYWNlX2NvbnRyb2wgPSBkZXNjLT5hbGxvd191c2Vyc3BhY2VfY29udHJvbDsKPiAg CXN3LT51c2IyX3BvcnQgPSBkZXNjLT51c2IyX3BvcnQ7Cj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUv bGludXgvdXNiL3JvbGUuaCBiL2luY2x1ZGUvbGludXgvdXNiL3JvbGUuaAo+IGluZGV4IGVkYzUx YmU0YTc3Yy4uYzk3ZDRiZTkxYWRhIDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3Jv bGUuaAo+ICsrKyBiL2luY2x1ZGUvbGludXgvdXNiL3JvbGUuaAo+IEBAIC00MCw2ICs0MCw4IEBA IHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2hfZGVzYyB7Cj4gIAlib29sIGFsbG93X3VzZXJzcGFjZV9j b250cm9sOwo+ICB9Owo+ICAKPiArCj4gKyNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfUk9MRV9T V0lUQ0gpCj4gIGludCB1c2Jfcm9sZV9zd2l0Y2hfc2V0X3JvbGUoc3RydWN0IHVzYl9yb2xlX3N3 aXRjaCAqc3csIGVudW0gdXNiX3JvbGUgcm9sZSk7Cj4gIGVudW0gdXNiX3JvbGUgdXNiX3JvbGVf c3dpdGNoX2dldF9yb2xlKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3KTsKPiAgc3RydWN0IHVz Yl9yb2xlX3N3aXRjaCAqdXNiX3JvbGVfc3dpdGNoX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYpOwo+ IEBAIC00OSw1ICs1MSw0OSBAQCBzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICoKPiAgdXNiX3JvbGVf c3dpdGNoX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKPiAgCQkJIGNvbnN0IHN0cnVj dCB1c2Jfcm9sZV9zd2l0Y2hfZGVzYyAqZGVzYyk7Cj4gIHZvaWQgdXNiX3JvbGVfc3dpdGNoX3Vu cmVnaXN0ZXIoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3cpOwo+ICtpbnQgdXNiX3JvbGVfc3dp dGNoX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3LAo+ICsJCQkJ ICAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7Cj4gK2ludCB1c2Jfcm9sZV9zd2l0Y2hf dW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdywKPiArCQkJCQlz dHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKPiArI2Vsc2UKPiArc3RhdGljIGlubGluZSBpbnQg dXNiX3JvbGVfc3dpdGNoX3NldF9yb2xlKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3LAo+ICsJ CWVudW0gdXNiX3JvbGUgcm9sZSkKPiArewo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRp YyBpbmxpbmUgZW51bSB1c2Jfcm9sZSB1c2Jfcm9sZV9zd2l0Y2hfZ2V0X3JvbGUoc3RydWN0IHVz Yl9yb2xlX3N3aXRjaCAqc3cpCj4gK3sKPiArCXJldHVybiBVU0JfUk9MRV9OT05FOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnVzYl9yb2xlX3N3aXRj aF9nZXQoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlyZXR1cm4gRVJSX1BUUigtRU5PREVW KTsKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIHVzYl9yb2xlX3N3aXRjaF9wdXQoc3Ry dWN0IHVzYl9yb2xlX3N3aXRjaCAqc3cpIHsgfQo+ICsKPiArc3RhdGljIGlubGluZSBzdHJ1Y3Qg dXNiX3JvbGVfc3dpdGNoICoKPiArdXNiX3JvbGVfc3dpdGNoX3JlZ2lzdGVyKHN0cnVjdCBkZXZp Y2UgKnBhcmVudCwKPiArCQkJIGNvbnN0IHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2hfZGVzYyAqZGVz YykKPiArewo+ICsJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Cj4gK30KPiArCj4gK3N0YXRpYyBp bmxpbmUgdm9pZCB1c2Jfcm9sZV9zd2l0Y2hfdW5yZWdpc3RlcihzdHJ1Y3QgdXNiX3JvbGVfc3dp dGNoICpzdykgeyB9Cj4gKwo+ICtzdGF0aWMgaW50IHVzYl9yb2xlX3N3aXRjaF9yZWdpc3Rlcl9u b3RpZmllcihzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdywKPiArCQkJCSAgICAgIHN0cnVjdCBu b3RpZmllcl9ibG9jayAqbmIpCj4gK3sKPiArCXJldHVybiAtRU5PREVWOwo+ICt9Cj4gKwo+ICtz dGF0aWMgaW50IHVzYl9yb2xlX3N3aXRjaF91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB1c2Jf cm9sZV9zd2l0Y2ggKnN3LAo+ICsJCQkJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCj4gK3sK PiArCXJldHVybiAtRU5PREVWOwo+ICt9Cj4gKyNlbmRpZgo+ICAKPiAgI2VuZGlmIC8qIF9fTElO VVhfVVNCX1JPTEVfSCAqLwo+IC0tIAo+IDIuMTUuMC1yYzIKCnRoYW5rcywK