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=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS 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 8BD88C04EB9 for ; Tue, 4 Dec 2018 01:07:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5B9D42146D for ; Tue, 4 Dec 2018 01:07:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5B9D42146D Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.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 S1726058AbeLDBHV (ORCPT ); Mon, 3 Dec 2018 20:07:21 -0500 Received: from szxga06-in.huawei.com ([45.249.212.32]:45421 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725943AbeLDBHU (ORCPT ); Mon, 3 Dec 2018 20:07:20 -0500 Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 0C0905C853305; Tue, 4 Dec 2018 09:07:17 +0800 (CST) Received: from [127.0.0.1] (10.142.63.192) by DGGEMS405-HUB.china.huawei.com (10.3.19.205) with Microsoft SMTP Server id 14.3.408.0; Tue, 4 Dec 2018 09:07:09 +0800 CC: , , , , , , Greg Kroah-Hartman , Hans de Goede , "Andy Shevchenko" , John Stultz Subject: Re: [PATCH v1 08/12] usb: roles: Add usb role switch notifier. To: Heikki Krogerus References: <20181203034515.91412-1-chenyu56@huawei.com> <20181203034515.91412-9-chenyu56@huawei.com> <20181203123824.GE24338@kuha.fi.intel.com> From: Chen Yu Message-ID: Date: Tue, 4 Dec 2018 09:07:08 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2 MIME-Version: 1.0 In-Reply-To: <20181203123824.GE24338@kuha.fi.intel.com> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 8bit X-Originating-IP: [10.142.63.192] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2018/12/3 20:38, Heikki Krogerus wrote: > 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. > OK. Thanks! >> -- >> --- >> 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, > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chen Yu Subject: Re: [PATCH v1 08/12] usb: roles: Add usb role switch notifier. Date: Tue, 4 Dec 2018 09:07:08 +0800 Message-ID: References: <20181203034515.91412-1-chenyu56@huawei.com> <20181203034515.91412-9-chenyu56@huawei.com> <20181203123824.GE24338@kuha.fi.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <20181203123824.GE24338@kuha.fi.intel.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: Heikki Krogerus Cc: wangbinghui@hisilicon.com, 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: devicetree@vger.kernel.org On 2018/12/3 20:38, Heikki Krogerus wrote: > 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. > OK. Thanks! >> -- >> --- >> 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, > 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: Yu Chen Message-Id: Date: Tue, 4 Dec 2018 09:07:08 +0800 To: Heikki Krogerus Cc: wangbinghui@hisilicon.com, 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: T24gMjAxOC8xMi8zIDIwOjM4LCBIZWlra2kgS3JvZ2VydXMgd3JvdGU6Cj4gT24gTW9uLCBEZWMg MDMsIDIwMTggYXQgMTE6NDU6MTFBTSArMDgwMCwgWXUgQ2hlbiB3cm90ZToKPj4gVGhpcyBwYXRj aCBhZGRzIG5vdGlmaWVyIGZvciBkcml2ZXJzIHdhbnQgdG8gYmUgaW5mb3JtZWQgb2YgdGhlIHVz YiByb2xlIHN3aXRjaC4KPiAKPiBJIHRoaW5rIGluIHRoaXMgY2FzZSBpdCB3b3VsZCBiZSBnb29k IHRvIGV4cGxhaW4gYSBsaXR0bGUgZm9yIHdoYXQgd2UKPiBuZWVkIHRoZSBub3RpZmllciBmb3Iu Cj4gCj4+IENjOiBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3Jn Pgo+PiBDYzogSGVpa2tpIEtyb2dlcnVzIDxoZWlra2kua3JvZ2VydXNAbGludXguaW50ZWwuY29t Pgo+PiBDYzogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KPj4gQ2M6IEFuZHkg U2hldmNoZW5rbyA8YW5keS5zaGV2Y2hlbmtvQGdtYWlsLmNvbT4KPj4gQ2M6IEpvaG4gU3R1bHR6 IDxqb2huLnN0dWx0ekBsaW5hcm8ub3JnPgo+PiBTaWduZWQtb2ZmLWJ5OiBIZWlra2kgS3JvZ2Vy dXMgPGhlaWtraS5rcm9nZXJ1c0BsaW51eC5pbnRlbC5jb20+Cj4+IFNpZ25lZC1vZmYtYnk6IFl1 IENoZW4gPGNoZW55dTU2QGh1YXdlaS5jb20+Cj4+Cj4+IC0tCj4+IHYwOgo+PiBUaGUgcGF0Y2gg aXMgcHJvdmlkZWQgYnkgSGVpa2tpIEtyb2dlcnVzLiBJIG1vZGlmaWVkIGFuZCB0ZXN0IGl0Cj4+ IG9uIEhpa2V5OTYwIHBsYXRmb3JtLgo+IAo+IEkgZG9uJ3QgdGhpbmsgSSBhY3R1YWxseSBtYWRl IGEgInBhdGNoIiBmb3IgdGhpcy4gVGhlICJkaWZmIiBJIG1hZGUKPiBzaG93aW5nIHRoZSBpZGVh IGRvZXMgbm90IGNvdW50LCBzbyB5b3Ugc2hvdWxkIG5vdCBzaWduIG9mZiB0aGUgcGF0Y2gKPiB3 aXRoIG15IGFkZHJlc3MuCj4gCj4gSW4gdGhpcyBjYXNlIEkgYmVsaWV2ZSBzb21ldGhpbmcgbGlr ZSAiU3VnZ2VzdGVkLWJ5IiBzaG91bGQgYmUgdXNlZAo+IGluc3RlYWQgb2YgU29CIHRhZzoKPiAK PiAgICAgICAgIFN1Z2dlc3RlZC1ieTogSGVpa2tpIEtyb2dlcnVzIDxoZWlra2kua3JvZ2VydXNA bGludXguaW50ZWwuY29tPgo+IAo+IFNpZGUgbm90ZTogSWYgdGhpcyB3YXMgZnJvbSBtZSwgdGhl biB0aGVyZSBzaG91bGQgYmUgImZyb20iIGxpbmUgd2l0aAo+IG15IGFkZHJlc3MgYXMgd2VsbC4K PiAKCk9LLiBUaGFua3PvvIEKPj4gLS0KPj4gLS0tCj4+ICBkcml2ZXJzL3VzYi9jb21tb24vcm9s ZXMuYyB8IDIwICsrKysrKysrKysrKysrKysrKystCj4+ICBpbmNsdWRlL2xpbnV4L3VzYi9yb2xl LmggICB8IDQ2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysK Pj4gIDIgZmlsZXMgY2hhbmdlZCwgNjUgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+Pgo+ PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29tbW9uL3JvbGVzLmMgYi9kcml2ZXJzL3VzYi9j b21tb24vcm9sZXMuYwo+PiBpbmRleCAwZjQ4MDkwYzVjMzAuLmJmZDdhOTg4YjY0YyAxMDA2NDQK Pj4gLS0tIGEvZHJpdmVycy91c2IvY29tbW9uL3JvbGVzLmMKPj4gKysrIGIvZHJpdmVycy91c2Iv Y29tbW9uL3JvbGVzLmMKPj4gQEAgLTIxLDYgKzIxLDcgQEAgc3RydWN0IHVzYl9yb2xlX3N3aXRj aCB7Cj4+ICAJc3RydWN0IGRldmljZSBkZXY7Cj4+ICAJc3RydWN0IG11dGV4IGxvY2s7IC8qIGRl dmljZSBsb2NrKi8KPj4gIAllbnVtIHVzYl9yb2xlIHJvbGU7Cj4+ICsJc3RydWN0IGJsb2NraW5n X25vdGlmaWVyX2hlYWQgbmg7Cj4+ICAKPj4gIAkvKiBGcm9tIGRlc2NyaXB0b3IgKi8KPj4gIAlz dHJ1Y3QgZGV2aWNlICp1c2IyX3BvcnQ7Cj4+IEBAIC01MCw4ICs1MSwxMCBAQCBpbnQgdXNiX3Jv bGVfc3dpdGNoX3NldF9yb2xlKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3LCBlbnVtIHVzYl9y b2xlIHJvbGUpCj4+ICAJbXV0ZXhfbG9jaygmc3ctPmxvY2spOwo+PiAgCj4+ICAJcmV0ID0gc3ct PnNldChzdy0+ZGV2LnBhcmVudCwgcm9sZSk7Cj4+IC0JaWYgKCFyZXQpCj4+ICsJaWYgKCFyZXQp IHsKPj4gIAkJc3ctPnJvbGUgPSByb2xlOwo+PiArCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2No YWluKCZzdy0+bmgsIHJvbGUsIE5VTEwpOwo+PiArCX0KPj4gIAo+PiAgCW11dGV4X3VubG9jaygm c3ctPmxvY2spOwo+PiAgCj4+IEBAIC01OSw2ICs2MiwyMCBAQCBpbnQgdXNiX3JvbGVfc3dpdGNo X3NldF9yb2xlKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3LCBlbnVtIHVzYl9yb2xlIHJvbGUp Cj4+ICB9Cj4+ICBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfcm9sZV9zd2l0Y2hfc2V0X3JvbGUpOwo+ PiAgCj4+ICtpbnQgdXNiX3JvbGVfc3dpdGNoX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB1c2Jf cm9sZV9zd2l0Y2ggKnN3LAo+PiArCQkJCSAgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIp Cj4+ICt7Cj4+ICsJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZzdy0+ bmgsIG5iKTsKPj4gK30KPj4gK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9yb2xlX3N3aXRjaF9yZWdp c3Rlcl9ub3RpZmllcik7Cj4+ICsKPj4gK2ludCB1c2Jfcm9sZV9zd2l0Y2hfdW5yZWdpc3Rlcl9u b3RpZmllcihzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdywKPj4gKwkJCQkJc3RydWN0IG5vdGlm aWVyX2Jsb2NrICpuYikKPj4gK3sKPj4gKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5f dW5yZWdpc3Rlcigmc3ctPm5oLCBuYik7Cj4+ICt9Cj4+ICtFWFBPUlRfU1lNQk9MX0dQTCh1c2Jf cm9sZV9zd2l0Y2hfdW5yZWdpc3Rlcl9ub3RpZmllcik7Cj4+ICsKPj4gIC8qKgo+PiAgICogdXNi X3JvbGVfc3dpdGNoX2dldF9yb2xlIC0gR2V0IHRoZSBVU0Igcm9sZSBmb3IgYSBzd2l0Y2gKPj4g ICAqIEBzdzogVVNCIHJvbGUgc3dpdGNoCj4+IEBAIC0yOTcsNiArMzE0LDcgQEAgdXNiX3JvbGVf c3dpdGNoX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKPj4gIAkJcmV0dXJuIEVSUl9Q VFIoLUVOT01FTSk7Cj4+ICAKPj4gIAltdXRleF9pbml0KCZzdy0+bG9jayk7Cj4+ICsJQkxPQ0tJ TkdfSU5JVF9OT1RJRklFUl9IRUFEKCZzdy0+bmgpOwo+PiAgCj4+ICAJc3ctPmFsbG93X3VzZXJz cGFjZV9jb250cm9sID0gZGVzYy0+YWxsb3dfdXNlcnNwYWNlX2NvbnRyb2w7Cj4+ICAJc3ctPnVz YjJfcG9ydCA9IGRlc2MtPnVzYjJfcG9ydDsKPj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgv dXNiL3JvbGUuaCBiL2luY2x1ZGUvbGludXgvdXNiL3JvbGUuaAo+PiBpbmRleCBlZGM1MWJlNGE3 N2MuLmM5N2Q0YmU5MWFkYSAxMDA2NDQKPj4gLS0tIGEvaW5jbHVkZS9saW51eC91c2Ivcm9sZS5o Cj4+ICsrKyBiL2luY2x1ZGUvbGludXgvdXNiL3JvbGUuaAo+PiBAQCAtNDAsNiArNDAsOCBAQCBz dHJ1Y3QgdXNiX3JvbGVfc3dpdGNoX2Rlc2Mgewo+PiAgCWJvb2wgYWxsb3dfdXNlcnNwYWNlX2Nv bnRyb2w7Cj4+ICB9Owo+PiAgCj4+ICsKPj4gKyNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfUk9M RV9TV0lUQ0gpCj4+ICBpbnQgdXNiX3JvbGVfc3dpdGNoX3NldF9yb2xlKHN0cnVjdCB1c2Jfcm9s ZV9zd2l0Y2ggKnN3LCBlbnVtIHVzYl9yb2xlIHJvbGUpOwo+PiAgZW51bSB1c2Jfcm9sZSB1c2Jf cm9sZV9zd2l0Y2hfZ2V0X3JvbGUoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3cpOwo+PiAgc3Ry dWN0IHVzYl9yb2xlX3N3aXRjaCAqdXNiX3JvbGVfc3dpdGNoX2dldChzdHJ1Y3QgZGV2aWNlICpk ZXYpOwo+PiBAQCAtNDksNSArNTEsNDkgQEAgc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqCj4+ICB1 c2Jfcm9sZV9zd2l0Y2hfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAo+PiAgCQkJIGNv bnN0IHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2hfZGVzYyAqZGVzYyk7Cj4+ICB2b2lkIHVzYl9yb2xl X3N3aXRjaF91bnJlZ2lzdGVyKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3KTsKPj4gK2ludCB1 c2Jfcm9sZV9zd2l0Y2hfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAq c3csCj4+ICsJCQkJICAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7Cj4+ICtpbnQgdXNi X3JvbGVfc3dpdGNoX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAq c3csCj4+ICsJCQkJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwo+PiArI2Vsc2UKPj4gK3N0 YXRpYyBpbmxpbmUgaW50IHVzYl9yb2xlX3N3aXRjaF9zZXRfcm9sZShzdHJ1Y3QgdXNiX3JvbGVf c3dpdGNoICpzdywKPj4gKwkJZW51bSB1c2Jfcm9sZSByb2xlKQo+PiArewo+PiArCXJldHVybiAw Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIGVudW0gdXNiX3JvbGUgdXNiX3JvbGVfc3dp dGNoX2dldF9yb2xlKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3KQo+PiArewo+PiArCXJldHVy biBVU0JfUk9MRV9OT05FOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2Jf cm9sZV9zd2l0Y2ggKnVzYl9yb2xlX3N3aXRjaF9nZXQoc3RydWN0IGRldmljZSAqZGV2KQo+PiAr ewo+PiArCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5s aW5lIHZvaWQgdXNiX3JvbGVfc3dpdGNoX3B1dChzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdykg eyB9Cj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqCj4+ICt1 c2Jfcm9sZV9zd2l0Y2hfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAo+PiArCQkJIGNv bnN0IHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2hfZGVzYyAqZGVzYykKPj4gK3sKPj4gKwlyZXR1cm4g RVJSX1BUUigtRU5PREVWKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlubGluZSB2b2lkIHVzYl9y b2xlX3N3aXRjaF91bnJlZ2lzdGVyKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3KSB7IH0KPj4g Kwo+PiArc3RhdGljIGludCB1c2Jfcm9sZV9zd2l0Y2hfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0 IHVzYl9yb2xlX3N3aXRjaCAqc3csCj4+ICsJCQkJICAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2Nr ICpuYikKPj4gK3sKPj4gKwlyZXR1cm4gLUVOT0RFVjsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlu dCB1c2Jfcm9sZV9zd2l0Y2hfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgdXNiX3JvbGVfc3dp dGNoICpzdywKPj4gKwkJCQkJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKPj4gK3sKPj4gKwly ZXR1cm4gLUVOT0RFVjsKPj4gK30KPj4gKyNlbmRpZgo+PiAgCj4+ICAjZW5kaWYgLyogX19MSU5V WF9VU0JfUk9MRV9IICovCj4+IC0tIAo+PiAyLjE1LjAtcmMyCj4gCj4gdGhhbmtzLAo+Cg==