From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793954929; b=BD/ZiXKLe2VXAuvkhPU0OwH7kfIvO9lsANw7trbx96CPVNGYzA6C7K9goctDB6Bgtl7t 2yyPZ+KpQpTkLwDJpEHIO6zf33HmJ7Q2VOJykZWhdrKYyof7b5sn/kGm33jgTNGaHy1t+ QmgS1bgFdY4lIxJL1kbiZfKzBwm50CkIT+j1f2EDdweBJWPIVeBWADju3bV2kxuofc+FO rYygLD9LTf/8cZR26R8RMhVnEiCcaCOmq6MuXFeT6sZtFQSr2GTa/Pm6mVKt4Se4mhL/U vAKVB1Hm1oRSStR07HEFKlwLaafcxN9iQ3KTuZe+HKDo8DfL+R44zabqxTnet3yoT3g== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793954929; h=Received:DKIM-Signature:Message-ID:From:Subject:Reply-To:To:Cc: In-Reply-To:References:Content-Type:Content-Transfer-Encoding:Date; bh=7q7MnvWEnGcX41XHa+pTWvOl61VfVGVeya0hMBQW9Qw=; b=uPBWJjeV+OgOkwyedjRX7dU9yRgJnUKwHhMeOlOZRUn6MaDhlOMwILDU6lwAGgMKfgLy PhP/fYKPI+1B/hZ5IIGh4O1JgA6F/yXwmDkyYOoQNQbiMadlBKZ6PRGpGTidgCX8aCzjS yl94SVgcqk6QMM1Am3DDrTttX/tzKNXaB6q2egAAsWbH7Eoq4vfNUDUQLP5ztNmSn4nKF izxuWX+GioD/+9Kmggxx7OhDz3yckWa9QPsxRFUO/hSagp93WPoxNne7TEYqGXRwISxzX 9rcs5XZ5ItzU9LvzOKwSnJwF78aoZEmjcGCpoMNi+LryBQfI9rh0ZMTponiYjcmaoYg== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=LI+2jXAv; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2B3BF606A328 for ; Fri, 6 Nov 2026 08:48:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=LI+2jXAv Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7BF911F0089F; Fri, 6 Nov 2026 08:48:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793954928; bh=7q7MnvWEnGcX41XHa+pTWvOl61VfVGVeya0hMBQW9Qw=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=LI+2jXAvx16yM9U6xZJcFpIiRnI4UB2Vu6Xchf8l7t9kvE+mQ8fpZBWieOt3drcL/ EPW2tO0pn4m5JdiLH+Wm/DsnObbHDywUpG/DER6VYPhnN1514mDSymQQx9IwSqy1na VFppdDB+zCdgclOB+h2j8rcbAokAycDY+g6e2uFnd7pAUIlMexsxCH2l4EH0tWUQxI NNHsyiVEJPSYvPIT6Y0ZJxNYv5hXFv9UkQw14gQTY9BY5+Ro7Jyl7lPdhvlxRyyAIU xswn1wLnZ0NuyptwGeN4VmbpzCDPiD06SWLgBfNPAmxj90OZ5TVYM4AUgnZz5/gDSA ax5CGXME1Xm0w== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH 3/3] usb: dwc3: qcom: pass live SS-link state into PHY at suspend entry Reply-To: sashiko-reviews@lists.linux.dev To: "Tapas Rana" Cc: linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com In-Reply-To: <20261106082716.128968-4-tapas.rana@oss.qualcomm.com> References: <20261106082716.128968-1-tapas.rana@oss.qualcomm.com> <20261106082716.128968-4-tapas.rana@oss.qualcomm.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Fri, 06 Nov 2026 08:48:47 +0000 X-Mailing-List: linux-usb@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list Thank you for your contribution! Sashiko AI review found 2 potential issues to consider: - [High] usb: dwc3: qcom: phy_set_mode_ext() called after PHY runtime suspend - [Medium] usb: dwc3: qcom: dwc3_qcom_read_ss_state() broken when CONFIG_USB=3Dm It also noticed 1 related pre-existing issue this patch does not introduce: - [High] usb: dwc3: qcom: NULL pointer dereference in dwc3_qcom_read_usb2_speed() [1] -- commit 98eee22a6981ce3ef452cc8f9ec999a2bf823513 Author: Tapas Rana usb: dwc3: qcom: pass live SS-link state into PHY at suspend entry This commit adds dwc3_qcom_read_ss_state() to check whether a SuperSpeed device is attached on each port's USB3 roothub and passes that state to phy_set_mode_ext() during dwc3_qcom_suspend(). > diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c > index ac68b4218b56b..d4ba095e47eb0 100644 > --- a/drivers/usb/dwc3/dwc3-qcom.c > +++ b/drivers/usb/dwc3/dwc3-qcom.c [ ... ] > @@ -251,6 +253,34 @@ static enum usb_device_speed dwc3_qcom_read_usb2_spe= ed(struct dwc3_qcom *qcom, i > return udev->speed; > } > =20 > +static enum qcom_usb_ss_state dwc3_qcom_read_ss_state(struct dwc3_qcom *= qcom, int port_index) > +{ > + struct usb_device *udev; > + struct usb_hcd __maybe_unused *hcd, *usb3_hcd; > + struct dwc3 *dwc =3D &qcom->dwc; > + > + /* > + * FIXME: Fix this layering violation. > + */ > + hcd =3D platform_get_drvdata(dwc->xhci); > + if (!hcd) > + return QCOM_USB_SS_ABSENT; [Severity: High] This problem wasn't introduced by this patch, but can dwc3_qcom_read_usb2_speed() hit a NULL pointer dereference on hcd [1] if the xHCI driver fails to probe? dwc3_host_init() assigns dwc->xhci before platform_device_add(), and platform_device_add() succeeds even if driver binding fails, leaving dwc->xhci non-NULL with NULL drvdata. During suspend, dwc3_qcom_is_host() sees dwc->xhci and calls dwc3_qcom_read_usb2_speed() right before dwc3_qcom_read_ss_state(), which dereferences hcd->self.root_hub without the !hcd check added here: drivers/usb/dwc3/dwc3-qcom.c:dwc3_qcom_read_usb2_speed() { ... hcd =3D platform_get_drvdata(dwc->xhci); #ifdef CONFIG_USB udev =3D usb_hub_find_child(hcd->self.root_hub, port_index + 1); ... } > + > +#ifdef CONFIG_USB > + usb3_hcd =3D hcd->shared_hcd ? hcd->shared_hcd : hcd; > + if (!usb3_hcd->self.root_hub) > + return QCOM_USB_SS_ABSENT; > + > + udev =3D usb_hub_find_child(usb3_hcd->self.root_hub, port_index + 1); > +#else > + udev =3D NULL; > +#endif > + if (!udev) > + return QCOM_USB_SS_ABSENT; [Severity: Medium] Does #ifdef CONFIG_USB compile out the roothub lookup when CONFIG_USB=3Dm? Because USB is a tristate Kconfig symbol, modular builds define CONFIG_USB_MODULE rather than CONFIG_USB, so dwc3_qcom_read_ss_state() always takes the #else branch and returns QCOM_USB_SS_ABSENT even when a SuperSpeed device is attached. Should this use IS_REACHABLE(CONFIG_USB) or IS_ENABLED(CONFIG_USB)? [ ... ] > @@ -359,8 +389,12 @@ static int dwc3_qcom_suspend(struct dwc3_qcom *qcom,= bool wakeup) > * freezable workqueue. > */ > if (dwc3_qcom_is_host(qcom) && wakeup) { > - for (i =3D 0; i < qcom->num_ports; i++) > + for (i =3D 0; i < qcom->num_ports; i++) { > qcom->ports[i].usb2_speed =3D dwc3_qcom_read_usb2_speed(qcom, i); > + qcom->ports[i].ss_state =3D dwc3_qcom_read_ss_state(qcom, i); > + phy_set_mode_ext(qcom->dwc.usb3_generic_phy[i], PHY_MODE_USB_HOST, > + qcom->ports[i].ss_state); > + } > dwc3_qcom_enable_interrupts(qcom); > } [Severity: High] Isn't phy_set_mode_ext() called here after the USB3 PHY has already entered runtime suspend? Both dwc3_qcom_pm_suspend() and dwc3_qcom_runtime_suspend() call dwc3_pm_suspend() or dwc3_runtime_suspend() before dwc3_qcom_suspend(): drivers/usb/dwc3/dwc3-qcom.c:dwc3_qcom_runtime_suspend() { ... ret =3D dwc3_runtime_suspend(&qcom->dwc); if (ret) return ret; return dwc3_qcom_suspend(qcom, true); } Inside dwc3_suspend_common(), phy_pm_runtime_put_sync() drops the runtime PM reference on dwc->usb3_generic_phy[i], which schedules qmp_combo_runtime_suspend() on the parent QMP combo PHY device while dwc3_qcom_suspend() sleeps in clk_bulk_disable_unprepare() and dwc3_qcom_interconnect_disable(). Because qmp_combo_usb_set_mode() only records qmp->ss_state in memory and QPHY_PCS_AUTONOMOUS_MODE_CTRL is programmed in qmp_combo_runtime_suspend() -> qmp_combo_enable_autonomous_mode() before the PHY clocks are disabled, updating ss_state here happens after the PHY has already programmed autonomous mode with QCOM_USB_SS_UNKNOWN (or the previous cycle's state). [1] https://sashiko.dev/#/bug/linux-14f73483-dc6c-4250-802a-9e0e3203cc91 --=20 Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20261106082716.1289= 68-1-tapas.rana@oss.qualcomm.com?part=3D3 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D60B5606A328 for ; Fri, 6 Nov 2026 08:48:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key, unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=NtHUyqeT; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=LI+2jXAv DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Reply-To:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Date:References: In-Reply-To:Cc:To:Subject:From:Message-ID:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Unsubscribe-Post:List-Owner; bh=TZYhRRpS/VdHVblDoeQ9VBUrxLVKGo3HvPyw/Dx9yJY=; b=NtHUyqeTqvCQmLHddQ/scR8DRY 5cDhSliHrlh9HezeeZ3yBswVaBAAgxdyN5O8Ki3DwauG8yhtHehXrUZ2OHF/dRKpNeshqyrvhVLty 7H0f+MxKF2Q3vGD2uwo9UuryO+rj7sMdhSAFSicxDGsT+RANtJgIeLS1jKSYfcY4/ndMxuFIGytRs fYJEe6n3x6uemA787dY3PYL0jmS1uj5sfyqQa0eNqGxqeU4ls5q327yMHZ+0p2rLz9DpMpxx+DxxG zyEqLkQxOnVeAViWijskKbdCRqavBYyM221ja5cu9TMuuW5beGbuNoC4VpmXiUtTaif6OqYI/76Jz WmEUzlNg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPFcw-0000000Bct1-2ZTW; Fri, 06 Nov 2026 08:48:50 +0000 Received: from sea.source.kernel.org ([172.234.252.31]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xPFcv-0000000Bcsk-1n9D for linux-phy@lists.infradead.org; Fri, 06 Nov 2026 08:48:49 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id E6AF2412BE; Fri, 6 Nov 2026 08:48:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7BF911F0089F; Fri, 6 Nov 2026 08:48:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1793954928; bh=7q7MnvWEnGcX41XHa+pTWvOl61VfVGVeya0hMBQW9Qw=; h=From:Subject:Reply-To:To:Cc:In-Reply-To:References:Date; b=LI+2jXAvx16yM9U6xZJcFpIiRnI4UB2Vu6Xchf8l7t9kvE+mQ8fpZBWieOt3drcL/ EPW2tO0pn4m5JdiLH+Wm/DsnObbHDywUpG/DER6VYPhnN1514mDSymQQx9IwSqy1na VFppdDB+zCdgclOB+h2j8rcbAokAycDY+g6e2uFnd7pAUIlMexsxCH2l4EH0tWUQxI NNHsyiVEJPSYvPIT6Y0ZJxNYv5hXFv9UkQw14gQTY9BY5+Ro7Jyl7lPdhvlxRyyAIU xswn1wLnZ0NuyptwGeN4VmbpzCDPiD06SWLgBfNPAmxj90OZ5TVYM4AUgnZz5/gDSA ax5CGXME1Xm0w== Message-ID: From: sashiko-bot@kernel.org Subject: Re: [PATCH 3/3] usb: dwc3: qcom: pass live SS-link state into PHY at suspend entry To: "Tapas Rana" Cc: linux-phy@lists.infradead.org, linux-usb@vger.kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com In-Reply-To: <20261106082716.128968-4-tapas.rana@oss.qualcomm.com> References: <20261106082716.128968-1-tapas.rana@oss.qualcomm.com> <20261106082716.128968-4-tapas.rana@oss.qualcomm.com> Date: Fri, 06 Nov 2026 08:48:47 +0000 X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: sashiko-reviews@lists.linux.dev X-Archived-By: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" X-Spam-Status: No, score=-8.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 VGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbiEgU2FzaGlrbyBBSSByZXZpZXcgZm91bmQg MiBwb3RlbnRpYWwKaXNzdWVzIHRvIGNvbnNpZGVyOgotIFtIaWdoXSB1c2I6IGR3YzM6IHFjb206 IHBoeV9zZXRfbW9kZV9leHQoKSBjYWxsZWQgYWZ0ZXIgUEhZIHJ1bnRpbWUKICBzdXNwZW5kCi0g W01lZGl1bV0gdXNiOiBkd2MzOiBxY29tOiBkd2MzX3Fjb21fcmVhZF9zc19zdGF0ZSgpIGJyb2tl biB3aGVuCiAgQ09ORklHX1VTQj1tCkl0IGFsc28gbm90aWNlZCAxIHJlbGF0ZWQgcHJlLWV4aXN0 aW5nIGlzc3VlIHRoaXMgcGF0Y2ggZG9lcyBub3QKaW50cm9kdWNlOgotIFtIaWdoXSB1c2I6IGR3 YzM6IHFjb206IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBpbgogIGR3YzNfcWNvbV9yZWFkX3Vz YjJfc3BlZWQoKSBbMV0KLS0KCmNvbW1pdCA5OGVlZTIyYTY5ODFjZTNlZjQ1MmNjOGY5ZWM5OTlh MmJmODIzNTEzCkF1dGhvcjogVGFwYXMgUmFuYSA8dGFwYXMucmFuYUBvc3MucXVhbGNvbW0uY29t PgoKdXNiOiBkd2MzOiBxY29tOiBwYXNzIGxpdmUgU1MtbGluayBzdGF0ZSBpbnRvIFBIWSBhdCBz dXNwZW5kIGVudHJ5CgpUaGlzIGNvbW1pdCBhZGRzIGR3YzNfcWNvbV9yZWFkX3NzX3N0YXRlKCkg dG8gY2hlY2sgd2hldGhlciBhIFN1cGVyU3BlZWQKZGV2aWNlIGlzIGF0dGFjaGVkIG9uIGVhY2gg cG9ydCdzIFVTQjMgcm9vdGh1YiBhbmQgcGFzc2VzIHRoYXQgc3RhdGUgdG8KcGh5X3NldF9tb2Rl X2V4dCgpIGR1cmluZyBkd2MzX3Fjb21fc3VzcGVuZCgpLgoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy91c2IvZHdjMy9kd2MzLXFjb20uYyBiL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1xY29tLmMKPiBp bmRleCBhYzY4YjQyMThiNTZiLi5kNGJhMDk1ZTQ3ZWIwIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMv dXNiL2R3YzMvZHdjMy1xY29tLmMKPiArKysgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtcWNvbS5j ClsgLi4uIF0KPiBAQCAtMjUxLDYgKzI1MywzNCBAQCBzdGF0aWMgZW51bSB1c2JfZGV2aWNlX3Nw ZWVkIGR3YzNfcWNvbV9yZWFkX3VzYjJfc3BlZWQoc3RydWN0IGR3YzNfcWNvbSAqcWNvbSwgaQo+ ICAJcmV0dXJuIHVkZXYtPnNwZWVkOwo+ICB9Cj4gIAo+ICtzdGF0aWMgZW51bSBxY29tX3VzYl9z c19zdGF0ZSBkd2MzX3Fjb21fcmVhZF9zc19zdGF0ZShzdHJ1Y3QgZHdjM19xY29tICpxY29tLCBp bnQgcG9ydF9pbmRleCkKPiArewo+ICsJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Cj4gKwlzdHJ1 Y3QgdXNiX2hjZCBfX21heWJlX3VudXNlZCAqaGNkLCAqdXNiM19oY2Q7Cj4gKwlzdHJ1Y3QgZHdj MyAqZHdjID0gJnFjb20tPmR3YzsKPiArCj4gKwkvKgo+ICsJICogRklYTUU6IEZpeCB0aGlzIGxh eWVyaW5nIHZpb2xhdGlvbi4KPiArCSAqLwo+ICsJaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEo ZHdjLT54aGNpKTsKPiArCWlmICghaGNkKQo+ICsJCXJldHVybiBRQ09NX1VTQl9TU19BQlNFTlQ7 CgpbU2V2ZXJpdHk6IEhpZ2hdClRoaXMgcHJvYmxlbSB3YXNuJ3QgaW50cm9kdWNlZCBieSB0aGlz IHBhdGNoLCBidXQgY2FuCmR3YzNfcWNvbV9yZWFkX3VzYjJfc3BlZWQoKSBoaXQgYSBOVUxMIHBv aW50ZXIgZGVyZWZlcmVuY2Ugb24gaGNkClsxXSBpZiB0aGUgeEhDSSBkcml2ZXIgZmFpbHMgdG8g cHJvYmU/Cgpkd2MzX2hvc3RfaW5pdCgpIGFzc2lnbnMgZHdjLT54aGNpIGJlZm9yZSBwbGF0Zm9y bV9kZXZpY2VfYWRkKCksIGFuZApwbGF0Zm9ybV9kZXZpY2VfYWRkKCkgc3VjY2VlZHMgZXZlbiBp ZiBkcml2ZXIgYmluZGluZyBmYWlscywgbGVhdmluZwpkd2MtPnhoY2kgbm9uLU5VTEwgd2l0aCBO VUxMIGRydmRhdGEuICBEdXJpbmcgc3VzcGVuZCwKZHdjM19xY29tX2lzX2hvc3QoKSBzZWVzIGR3 Yy0+eGhjaSBhbmQgY2FsbHMgZHdjM19xY29tX3JlYWRfdXNiMl9zcGVlZCgpCnJpZ2h0IGJlZm9y ZSBkd2MzX3Fjb21fcmVhZF9zc19zdGF0ZSgpLCB3aGljaCBkZXJlZmVyZW5jZXMKaGNkLT5zZWxm LnJvb3RfaHViIHdpdGhvdXQgdGhlICFoY2QgY2hlY2sgYWRkZWQgaGVyZToKCmRyaXZlcnMvdXNi L2R3YzMvZHdjMy1xY29tLmM6ZHdjM19xY29tX3JlYWRfdXNiMl9zcGVlZCgpIHsKCS4uLgoJaGNk ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZHdjLT54aGNpKTsKCiNpZmRlZiBDT05GSUdfVVNCCgl1 ZGV2ID0gdXNiX2h1Yl9maW5kX2NoaWxkKGhjZC0+c2VsZi5yb290X2h1YiwgcG9ydF9pbmRleCAr IDEpOwoJLi4uCn0KCj4gKwo+ICsjaWZkZWYgQ09ORklHX1VTQgo+ICsJdXNiM19oY2QgPSBoY2Qt PnNoYXJlZF9oY2QgPyBoY2QtPnNoYXJlZF9oY2QgOiBoY2Q7Cj4gKwlpZiAoIXVzYjNfaGNkLT5z ZWxmLnJvb3RfaHViKQo+ICsJCXJldHVybiBRQ09NX1VTQl9TU19BQlNFTlQ7Cj4gKwo+ICsJdWRl diA9IHVzYl9odWJfZmluZF9jaGlsZCh1c2IzX2hjZC0+c2VsZi5yb290X2h1YiwgcG9ydF9pbmRl eCArIDEpOwo+ICsjZWxzZQo+ICsJdWRldiA9IE5VTEw7Cj4gKyNlbmRpZgo+ICsJaWYgKCF1ZGV2 KQo+ICsJCXJldHVybiBRQ09NX1VTQl9TU19BQlNFTlQ7CgpbU2V2ZXJpdHk6IE1lZGl1bV0KRG9l cyAjaWZkZWYgQ09ORklHX1VTQiBjb21waWxlIG91dCB0aGUgcm9vdGh1YiBsb29rdXAgd2hlbiBD T05GSUdfVVNCPW0/CkJlY2F1c2UgVVNCIGlzIGEgdHJpc3RhdGUgS2NvbmZpZyBzeW1ib2wsIG1v ZHVsYXIgYnVpbGRzIGRlZmluZQpDT05GSUdfVVNCX01PRFVMRSByYXRoZXIgdGhhbiBDT05GSUdf VVNCLCBzbyBkd2MzX3Fjb21fcmVhZF9zc19zdGF0ZSgpCmFsd2F5cyB0YWtlcyB0aGUgI2Vsc2Ug YnJhbmNoIGFuZCByZXR1cm5zIFFDT01fVVNCX1NTX0FCU0VOVCBldmVuIHdoZW4gYQpTdXBlclNw ZWVkIGRldmljZSBpcyBhdHRhY2hlZC4gIFNob3VsZCB0aGlzIHVzZSBJU19SRUFDSEFCTEUoQ09O RklHX1VTQikKb3IgSVNfRU5BQkxFRChDT05GSUdfVVNCKT8KClsgLi4uIF0KPiBAQCAtMzU5LDgg KzM4OSwxMiBAQCBzdGF0aWMgaW50IGR3YzNfcWNvbV9zdXNwZW5kKHN0cnVjdCBkd2MzX3Fjb20g KnFjb20sIGJvb2wgd2FrZXVwKQo+ICAJICogZnJlZXphYmxlIHdvcmtxdWV1ZS4KPiAgCSAqLwo+ ICAJaWYgKGR3YzNfcWNvbV9pc19ob3N0KHFjb20pICYmIHdha2V1cCkgewo+IC0JCWZvciAoaSA9 IDA7IGkgPCBxY29tLT5udW1fcG9ydHM7IGkrKykKPiArCQlmb3IgKGkgPSAwOyBpIDwgcWNvbS0+ bnVtX3BvcnRzOyBpKyspIHsKPiAgCQkJcWNvbS0+cG9ydHNbaV0udXNiMl9zcGVlZCA9IGR3YzNf cWNvbV9yZWFkX3VzYjJfc3BlZWQocWNvbSwgaSk7Cj4gKwkJCXFjb20tPnBvcnRzW2ldLnNzX3N0 YXRlID0gZHdjM19xY29tX3JlYWRfc3Nfc3RhdGUocWNvbSwgaSk7Cj4gKwkJCXBoeV9zZXRfbW9k ZV9leHQocWNvbS0+ZHdjLnVzYjNfZ2VuZXJpY19waHlbaV0sIFBIWV9NT0RFX1VTQl9IT1NULAo+ ICsJCQkJCSBxY29tLT5wb3J0c1tpXS5zc19zdGF0ZSk7Cj4gKwkJfQo+ICAJCWR3YzNfcWNvbV9l bmFibGVfaW50ZXJydXB0cyhxY29tKTsKPiAgCX0KCltTZXZlcml0eTogSGlnaF0KSXNuJ3QgcGh5 X3NldF9tb2RlX2V4dCgpIGNhbGxlZCBoZXJlIGFmdGVyIHRoZSBVU0IzIFBIWSBoYXMgYWxyZWFk eQplbnRlcmVkIHJ1bnRpbWUgc3VzcGVuZD8KCkJvdGggZHdjM19xY29tX3BtX3N1c3BlbmQoKSBh bmQgZHdjM19xY29tX3J1bnRpbWVfc3VzcGVuZCgpIGNhbGwKZHdjM19wbV9zdXNwZW5kKCkgb3Ig ZHdjM19ydW50aW1lX3N1c3BlbmQoKSBiZWZvcmUgZHdjM19xY29tX3N1c3BlbmQoKToKCmRyaXZl cnMvdXNiL2R3YzMvZHdjMy1xY29tLmM6ZHdjM19xY29tX3J1bnRpbWVfc3VzcGVuZCgpIHsKCS4u LgoJcmV0ID0gZHdjM19ydW50aW1lX3N1c3BlbmQoJnFjb20tPmR3Yyk7CglpZiAocmV0KQoJCXJl dHVybiByZXQ7CgoJcmV0dXJuIGR3YzNfcWNvbV9zdXNwZW5kKHFjb20sIHRydWUpOwp9CgpJbnNp ZGUgZHdjM19zdXNwZW5kX2NvbW1vbigpLCBwaHlfcG1fcnVudGltZV9wdXRfc3luYygpIGRyb3Bz IHRoZQpydW50aW1lIFBNIHJlZmVyZW5jZSBvbiBkd2MtPnVzYjNfZ2VuZXJpY19waHlbaV0sIHdo aWNoIHNjaGVkdWxlcwpxbXBfY29tYm9fcnVudGltZV9zdXNwZW5kKCkgb24gdGhlIHBhcmVudCBR TVAgY29tYm8gUEhZIGRldmljZSB3aGlsZQpkd2MzX3Fjb21fc3VzcGVuZCgpIHNsZWVwcyBpbiBj bGtfYnVsa19kaXNhYmxlX3VucHJlcGFyZSgpIGFuZApkd2MzX3Fjb21faW50ZXJjb25uZWN0X2Rp c2FibGUoKS4KCkJlY2F1c2UgcW1wX2NvbWJvX3VzYl9zZXRfbW9kZSgpIG9ubHkgcmVjb3JkcyBx bXAtPnNzX3N0YXRlIGluIG1lbW9yeSBhbmQKUVBIWV9QQ1NfQVVUT05PTU9VU19NT0RFX0NUUkwg aXMgcHJvZ3JhbW1lZCBpbgpxbXBfY29tYm9fcnVudGltZV9zdXNwZW5kKCkgLT4gcW1wX2NvbWJv X2VuYWJsZV9hdXRvbm9tb3VzX21vZGUoKSBiZWZvcmUKdGhlIFBIWSBjbG9ja3MgYXJlIGRpc2Fi bGVkLCB1cGRhdGluZyBzc19zdGF0ZSBoZXJlIGhhcHBlbnMgYWZ0ZXIgdGhlClBIWSBoYXMgYWxy ZWFkeSBwcm9ncmFtbWVkIGF1dG9ub21vdXMgbW9kZSB3aXRoIFFDT01fVVNCX1NTX1VOS05PV04g KG9yCnRoZSBwcmV2aW91cyBjeWNsZSdzIHN0YXRlKS4KClsxXSBodHRwczovL3Nhc2hpa28uZGV2 LyMvYnVnL2xpbnV4LTE0ZjczNDgzLWRjNmMtNDI1MC04MDJhLTllMGUzMjAzY2M5MQoKLS0gClNh c2hpa28gQUkgcmV2aWV3IMK3IGh0dHBzOi8vc2FzaGlrby5kZXYvIy9wYXRjaHNldC8yMDI2MTEw NjA4MjcxNi4xMjg5NjgtMS10YXBhcy5yYW5hQG9zcy5xdWFsY29tbS5jb20/cGFydD0zCgotLSAK bGludXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1waHlAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw czovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1waHkK