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=-9.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT 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 906D9C65BAF for ; Mon, 3 Dec 2018 03:46:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 58BC52145D for ; Mon, 3 Dec 2018 03:46:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 58BC52145D 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 S1726058AbeLCDpu (ORCPT ); Sun, 2 Dec 2018 22:45:50 -0500 Received: from szxga05-in.huawei.com ([45.249.212.191]:15627 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725789AbeLCDpt (ORCPT ); Sun, 2 Dec 2018 22:45:49 -0500 Received: from DGGEMS412-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 73E36384591E0; Mon, 3 Dec 2018 11:45:42 +0800 (CST) Received: from vm100-107-113-134.huawei.com (100.107.113.134) by DGGEMS412-HUB.china.huawei.com (10.3.19.212) with Microsoft SMTP Server id 14.3.408.0; Mon, 3 Dec 2018 11:45:33 +0800 From: Yu Chen To: , , CC: , , Yu Chen , Greg Kroah-Hartman , Heikki Krogerus , Hans de Goede , Andy Shevchenko , "John Stultz" Subject: [PATCH v1 08/12] usb: roles: Add usb role switch notifier. Date: Mon, 3 Dec 2018 11:45:11 +0800 Message-ID: <20181203034515.91412-9-chenyu56@huawei.com> X-Mailer: git-send-email 2.15.0-rc2 In-Reply-To: <20181203034515.91412-1-chenyu56@huawei.com> References: <20181203034515.91412-1-chenyu56@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [100.107.113.134] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds notifier for drivers want to be informed of the usb role switch. 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. -- --- 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 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yu Chen Subject: [PATCH v1 08/12] usb: roles: Add usb role switch notifier. Date: Mon, 3 Dec 2018 11:45:11 +0800 Message-ID: <20181203034515.91412-9-chenyu56@huawei.com> References: <20181203034515.91412-1-chenyu56@huawei.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <20181203034515.91412-1-chenyu56@huawei.com> Sender: linux-kernel-owner@vger.kernel.org To: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: suzhuangluan@hisilicon.com, kongfei@hisilicon.com, Yu Chen , Greg Kroah-Hartman , Heikki Krogerus , Hans de Goede , Andy Shevchenko , John Stultz List-Id: devicetree@vger.kernel.org This patch adds notifier for drivers want to be informed of the usb role switch. 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. -- --- 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 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: <20181203034515.91412-9-chenyu56@huawei.com> Date: Mon, 3 Dec 2018 11:45:11 +0800 To: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: suzhuangluan@hisilicon.com, kongfei@hisilicon.com, Yu Chen , Greg Kroah-Hartman , Heikki Krogerus , Hans de Goede , Andy Shevchenko , John Stultz List-ID: VGhpcyBwYXRjaCBhZGRzIG5vdGlmaWVyIGZvciBkcml2ZXJzIHdhbnQgdG8gYmUgaW5mb3JtZWQg b2YgdGhlIHVzYiByb2xlIHN3aXRjaC4KCkNjOiBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBs aW51eGZvdW5kYXRpb24ub3JnPgpDYzogSGVpa2tpIEtyb2dlcnVzIDxoZWlra2kua3JvZ2VydXNA bGludXguaW50ZWwuY29tPgpDYzogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4K Q2M6IEFuZHkgU2hldmNoZW5rbyA8YW5keS5zaGV2Y2hlbmtvQGdtYWlsLmNvbT4KQ2M6IEpvaG4g U3R1bHR6IDxqb2huLnN0dWx0ekBsaW5hcm8ub3JnPgpTaWduZWQtb2ZmLWJ5OiBIZWlra2kgS3Jv Z2VydXMgPGhlaWtraS5rcm9nZXJ1c0BsaW51eC5pbnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6IFl1 IENoZW4gPGNoZW55dTU2QGh1YXdlaS5jb20+Ci0tLQp2MDoKVGhlIHBhdGNoIGlzIHByb3ZpZGVk IGJ5IEhlaWtraSBLcm9nZXJ1cy4gSSBtb2RpZmllZCBhbmQgdGVzdCBpdApvbiBIaWtleTk2MCBw bGF0Zm9ybS4KLS0KLS0tCiBkcml2ZXJzL3VzYi9jb21tb24vcm9sZXMuYyB8IDIwICsrKysrKysr KysrKysrKysrKystCiBpbmNsdWRlL2xpbnV4L3VzYi9yb2xlLmggICB8IDQ2ICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDIgZmlsZXMgY2hhbmdlZCwgNjUg aW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2Nv bW1vbi9yb2xlcy5jIGIvZHJpdmVycy91c2IvY29tbW9uL3JvbGVzLmMKaW5kZXggMGY0ODA5MGM1 YzMwLi5iZmQ3YTk4OGI2NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvbW1vbi9yb2xlcy5j CisrKyBiL2RyaXZlcnMvdXNiL2NvbW1vbi9yb2xlcy5jCkBAIC0yMSw2ICsyMSw3IEBAIHN0cnVj dCB1c2Jfcm9sZV9zd2l0Y2ggewogCXN0cnVjdCBkZXZpY2UgZGV2OwogCXN0cnVjdCBtdXRleCBs b2NrOyAvKiBkZXZpY2UgbG9jayovCiAJZW51bSB1c2Jfcm9sZSByb2xlOworCXN0cnVjdCBibG9j a2luZ19ub3RpZmllcl9oZWFkIG5oOwogCiAJLyogRnJvbSBkZXNjcmlwdG9yICovCiAJc3RydWN0 IGRldmljZSAqdXNiMl9wb3J0OwpAQCAtNTAsOCArNTEsMTAgQEAgaW50IHVzYl9yb2xlX3N3aXRj aF9zZXRfcm9sZShzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdywgZW51bSB1c2Jfcm9sZSByb2xl KQogCW11dGV4X2xvY2soJnN3LT5sb2NrKTsKIAogCXJldCA9IHN3LT5zZXQoc3ctPmRldi5wYXJl bnQsIHJvbGUpOwotCWlmICghcmV0KQorCWlmICghcmV0KSB7CiAJCXN3LT5yb2xlID0gcm9sZTsK KwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmc3ctPm5oLCByb2xlLCBOVUxMKTsKKwl9 CiAKIAltdXRleF91bmxvY2soJnN3LT5sb2NrKTsKIApAQCAtNTksNiArNjIsMjAgQEAgaW50IHVz Yl9yb2xlX3N3aXRjaF9zZXRfcm9sZShzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdywgZW51bSB1 c2Jfcm9sZSByb2xlKQogfQogRVhQT1JUX1NZTUJPTF9HUEwodXNiX3JvbGVfc3dpdGNoX3NldF9y b2xlKTsKIAoraW50IHVzYl9yb2xlX3N3aXRjaF9yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgdXNi X3JvbGVfc3dpdGNoICpzdywKKwkJCQkgICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQor eworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3Rlcigmc3ctPm5oLCBuYik7 Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfcm9sZV9zd2l0Y2hfcmVnaXN0ZXJfbm90aWZpZXIp OworCitpbnQgdXNiX3JvbGVfc3dpdGNoX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHVzYl9y b2xlX3N3aXRjaCAqc3csCisJCQkJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0 dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnN3LT5uaCwgbmIpOworfQor RVhQT1JUX1NZTUJPTF9HUEwodXNiX3JvbGVfc3dpdGNoX3VucmVnaXN0ZXJfbm90aWZpZXIpOwor CiAvKioKICAqIHVzYl9yb2xlX3N3aXRjaF9nZXRfcm9sZSAtIEdldCB0aGUgVVNCIHJvbGUgZm9y IGEgc3dpdGNoCiAgKiBAc3c6IFVTQiByb2xlIHN3aXRjaApAQCAtMjk3LDYgKzMxNCw3IEBAIHVz Yl9yb2xlX3N3aXRjaF9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCiAJCXJldHVybiBF UlJfUFRSKC1FTk9NRU0pOwogCiAJbXV0ZXhfaW5pdCgmc3ctPmxvY2spOworCUJMT0NLSU5HX0lO SVRfTk9USUZJRVJfSEVBRCgmc3ctPm5oKTsKIAogCXN3LT5hbGxvd191c2Vyc3BhY2VfY29udHJv bCA9IGRlc2MtPmFsbG93X3VzZXJzcGFjZV9jb250cm9sOwogCXN3LT51c2IyX3BvcnQgPSBkZXNj LT51c2IyX3BvcnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9yb2xlLmggYi9pbmNs dWRlL2xpbnV4L3VzYi9yb2xlLmgKaW5kZXggZWRjNTFiZTRhNzdjLi5jOTdkNGJlOTFhZGEgMTAw NjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL3JvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Vz Yi9yb2xlLmgKQEAgLTQwLDYgKzQwLDggQEAgc3RydWN0IHVzYl9yb2xlX3N3aXRjaF9kZXNjIHsK IAlib29sIGFsbG93X3VzZXJzcGFjZV9jb250cm9sOwogfTsKIAorCisjaWYgSVNfRU5BQkxFRChD T05GSUdfVVNCX1JPTEVfU1dJVENIKQogaW50IHVzYl9yb2xlX3N3aXRjaF9zZXRfcm9sZShzdHJ1 Y3QgdXNiX3JvbGVfc3dpdGNoICpzdywgZW51bSB1c2Jfcm9sZSByb2xlKTsKIGVudW0gdXNiX3Jv bGUgdXNiX3JvbGVfc3dpdGNoX2dldF9yb2xlKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3KTsK IHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnVzYl9yb2xlX3N3aXRjaF9nZXQoc3RydWN0IGRldmlj ZSAqZGV2KTsKQEAgLTQ5LDUgKzUxLDQ5IEBAIHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKgogdXNi X3JvbGVfc3dpdGNoX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKIAkJCSBjb25zdCBz dHJ1Y3QgdXNiX3JvbGVfc3dpdGNoX2Rlc2MgKmRlc2MpOwogdm9pZCB1c2Jfcm9sZV9zd2l0Y2hf dW5yZWdpc3RlcihzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdyk7CitpbnQgdXNiX3JvbGVfc3dp dGNoX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3LAorCQkJCSAg ICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworaW50IHVzYl9yb2xlX3N3aXRjaF91bnJl Z2lzdGVyX25vdGlmaWVyKHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3LAorCQkJCQlzdHJ1Y3Qg bm90aWZpZXJfYmxvY2sgKm5iKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCB1c2Jfcm9sZV9z d2l0Y2hfc2V0X3JvbGUoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3csCisJCWVudW0gdXNiX3Jv bGUgcm9sZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBlbnVtIHVzYl9yb2xl IHVzYl9yb2xlX3N3aXRjaF9nZXRfcm9sZShzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoICpzdykKK3sK KwlyZXR1cm4gVVNCX1JPTEVfTk9ORTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3Jv bGVfc3dpdGNoICp1c2Jfcm9sZV9zd2l0Y2hfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwly ZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVzYl9yb2xl X3N3aXRjaF9wdXQoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3cpIHsgfQorCitzdGF0aWMgaW5s aW5lIHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKgordXNiX3JvbGVfc3dpdGNoX3JlZ2lzdGVyKHN0 cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNoX2Rl c2MgKmRlc2MpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCB1c2Jfcm9sZV9zd2l0Y2hfdW5yZWdpc3RlcihzdHJ1Y3QgdXNiX3JvbGVfc3dpdGNo ICpzdykgeyB9CisKK3N0YXRpYyBpbnQgdXNiX3JvbGVfc3dpdGNoX3JlZ2lzdGVyX25vdGlmaWVy KHN0cnVjdCB1c2Jfcm9sZV9zd2l0Y2ggKnN3LAorCQkJCSAgICAgIHN0cnVjdCBub3RpZmllcl9i bG9jayAqbmIpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgdXNiX3JvbGVf c3dpdGNoX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqc3csCisJ CQkJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9Cisj ZW5kaWYKIAogI2VuZGlmIC8qIF9fTElOVVhfVVNCX1JPTEVfSCAqLwo=