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=-15.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_SANE_2 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 14EC9C433E0 for ; Tue, 19 Jan 2021 07:02:15 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A110523131 for ; Tue, 19 Jan 2021 07:02:14 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A110523131 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=9cRaUa3VGy1eLsNXGfl9VM/KzmTU8STF12pQn1qa3xo=; b=O1fQovfO43UZY/gIgDeYIHEC/ BqOLuOKz2TzMnwiDLX+J6de3e1Yf+a0fbYT/tKgWww4N9mFMxddmUlkv6jswI2WR1O/YpapIEyvAR UKxHGkYpsrwb9ja/dsoojL//Kn7xEk6+grnpwixUZfKSY9LjUeXG+N7HA5Pml8bODkQ3RoeXCFVSK 0YsTs+S2Qyoy828jlBLRn85Fkd941glzC65UFFvyAnD7+qs5nlXVZZxB9zSH2vYyj9Xl1E8G0pI1e N03aDN3YglG1dBYy20l5zmiVNyNNOgf0omH9hmhg3rxRCF4MSqmEZj2I9yO1yJgYrBNsAB4F76Uuu tatYZb/sw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l1l1b-0007oD-4c; Tue, 19 Jan 2021 07:01:59 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l1l1X-0007n4-F1 for linux-mediatek@lists.infradead.org; Tue, 19 Jan 2021 07:01:57 +0000 X-UUID: 15b36021292e43afb9e0ae2811427f67-20210118 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=6V5zD/iXHA0wDTMuAHf0jHgOG6fsknw3TmnvLpL2RoM=; b=Y7Gu0PfWeFqEUIrgeLvQNNslCffta/OHQMQifHC7q4cLgkSV/sZyvboGkcB5NRQnZR/MrIbkhr2RSW8WB817I6N3FdGrN6PEwKMY/nPNJ4MrDawdq1ShNL9TJy3xM7oI/3BjuEkv3p8EvBkVPRnojh/j53jUTYXPEqvD2DpDlCo=; X-UUID: 15b36021292e43afb9e0ae2811427f67-20210118 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 675608031; Mon, 18 Jan 2021 23:01:53 -0800 Received: from MTKMBS31N1.mediatek.inc (172.27.4.69) by MTKMBS62N1.mediatek.inc (172.29.193.41) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 18 Jan 2021 22:57:08 -0800 Received: from MTKCAS32.mediatek.inc (172.27.4.184) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 19 Jan 2021 14:57:05 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS32.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 19 Jan 2021 14:57:04 +0800 Message-ID: <1611039425.12761.2.camel@mhfsdcap03> Subject: Re: [RFC PATCH v3 1/5] usb: xhci-mtk: improve bandwidth scheduling with multi-TT From: Chunfeng Yun To: Ikjoon Jang Date: Tue, 19 Jan 2021 14:57:05 +0800 In-Reply-To: References: <1608629682-8535-1-git-send-email-chunfeng.yun@mediatek.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: F9F112484B25E67B7DA334E6D5373F16DB43BB880BF7764171F09A6E318CC0E52000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210119_020155_808890_1950CA73 X-CRM114-Status: GOOD ( 27.06 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Yaqii Wu , Zhanyong Wang , Zhanyong Wang , linux-usb@vger.kernel.org, open list , Tianping Fang , "moderated list:ARM/Mediatek SoC support" Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Wed, 2021-01-13 at 17:43 +0800, Ikjoon Jang wrote: > On Tue, Dec 22, 2020 at 5:35 PM Chunfeng Yun wrote: > > > > From: Zhanyong Wang > > > > After inserted the usb type-c 3.5mm dongle with headset, dmesg showed: > > usb 1-1.1: new full-speed USB device number 5 using xhci-mtk > > usb 1-1.1: New USB device found, idVendor=05ac, idProduct=110a, bcdDevice=26.11 > > usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 > > usb 1-1.1: Product: USB-C to 3.5mm Headphone Jack Adapter > > usb 1-1.1: Manufacturer: Apple, Inc. > > usb 1-1.1: SerialNumber: DWH915501TFJKLTAM > > xhci-mtk 11200000.xhci: Not enough bandwidth! > > usb 1-1.1: can't set config #2, error -28 > > > > improve low-speed/full-speed INT/ISOC bandwidth scheduling with USB > > muli-TT. > > > > Signed-off-by: Yaqii Wu > > Signed-off-by: Chunfeng Yun > > --- > > v2~v3: no changes > > --- > > drivers/usb/host/xhci-mtk-sch.c | 91 ++++++++++++++++++++++++++++----- > > drivers/usb/host/xhci-mtk.h | 8 ++- > > 2 files changed, 84 insertions(+), 15 deletions(-) > > mode change 100644 => 100755 drivers/usb/host/xhci-mtk-sch.c > > > > diff --git a/drivers/usb/host/xhci-mtk-sch.c b/drivers/usb/host/xhci-mtk-sch.c > > old mode 100644 > > new mode 100755 > > index 45c54d56ecbd..94292b9bbc63 > > --- a/drivers/usb/host/xhci-mtk-sch.c > > +++ b/drivers/usb/host/xhci-mtk-sch.c > > @@ -383,7 +383,9 @@ static int check_sch_tt(struct usb_device *udev, > > u32 fs_budget_start; > > u32 start_ss, last_ss; > > u32 start_cs, last_cs; > > - int i; > > + u32 num_esit, base; > > + int i, j; > > + u32 tmp; > > > > start_ss = offset % 8; > > fs_budget_start = (start_ss + 1) % 8; > > @@ -398,10 +400,13 @@ static int check_sch_tt(struct usb_device *udev, > > if (!(start_ss == 7 || last_ss < 6)) > > return -ERANGE; > > > > - for (i = 0; i < sch_ep->cs_count; i++) > > - if (test_bit(offset + i, tt->split_bit_map)) > > + for (i = 0; i < sch_ep->cs_count; i++) { > > + if (test_bit(offset + i, tt->ss_bit_map)) > > return -ERANGE; > > > > + if (test_bit(offset + i, tt->cs_bit_map)) > > + return -ERANGE; > > + } > > Are there any reasons for doing this? > Why can only one split packet be scheduled in a u-frame for isochronous out? > This looks like overkill. [From DR]: We will calculate the number of uframes based on the isoc out ep maxp. Except for the last uframe, all other consumed bandwidth is 188. But to be safe, we also count the bandwidth consumed by the last SS as 188. > > > } else { > > u32 cs_count = DIV_ROUND_UP(sch_ep->maxpkt, FS_PAYLOAD_MAX); > > > > @@ -428,8 +433,10 @@ static int check_sch_tt(struct usb_device *udev, > > if (cs_count > 7) > > cs_count = 7; /* HW limit */ > > > > - for (i = 0; i < cs_count + 2; i++) { > > - if (test_bit(offset + i, tt->split_bit_map)) > > + if (test_bit(offset, tt->ss_bit_map)) > > + return -ERANGE; > > + for (i = 0; i < cs_count; i++) { > > + if (test_bit(offset + 2 + i, tt->cs_bit_map)) > > return -ERANGE; > > } > > > > same here. It would be much better to understand > if you can provide some counterexamples of schedule > that can happen when this bitmap checking logic is omitted. [From DR] Maybe you are right, it will indeed double check. I will delete the bandwidth check, and then perform a regression test. > > > @@ -445,11 +452,22 @@ static int check_sch_tt(struct usb_device *udev, > > sch_ep->num_budget_microframes = sch_ep->esit; > > } > > > > + num_esit = XHCI_MTK_MAX_ESIT / sch_ep->esit; > > + for (i = 0; i < num_esit; i++) { > > + base = sch_ep->offset + i * sch_ep->esit; > > + for (j = 0; j < sch_ep->num_budget_microframes; j++) { > > + tmp = tt->fs_bus_bw[base + j] > > + + sch_ep->bw_cost_per_microframe; > > + if (tmp > FS_PAYLOAD_MAX) > > + return -ERANGE; > > + } > > + } > > I guess this is enough to check the bandwidth limit of the > lower speed bus without a bitmap. [From DR]As explained in issue tracker that ss cannot be overlapped. This is a hub compatibility issue. Therefore we need bitmap to prevent ss overlap. Thanks > > > + > > return 0; > > } > > > > static void update_sch_tt(struct usb_device *udev, > > - struct mu3h_sch_ep_info *sch_ep) > > + struct mu3h_sch_ep_info *sch_ep, bool used) > > { > > struct mu3h_sch_tt *tt = sch_ep->sch_tt; > > u32 base, num_esit; > > @@ -458,11 +476,52 @@ static void update_sch_tt(struct usb_device *udev, > > num_esit = XHCI_MTK_MAX_ESIT / sch_ep->esit; > > for (i = 0; i < num_esit; i++) { > > base = sch_ep->offset + i * sch_ep->esit; > > - for (j = 0; j < sch_ep->num_budget_microframes; j++) > > - set_bit(base + j, tt->split_bit_map); > > + for (j = 0; j < sch_ep->num_budget_microframes; j++) { > > + if (used) > > + set_bit(base + j, tt->split_bit_map); > > + else > > + clear_bit(base + j, tt->split_bit_map); > > + } > > + > > + if (sch_ep->ep_type == ISOC_OUT_EP) { > > + for (j = 0; j < sch_ep->num_budget_microframes; j++) { > > + if (used) { > > + set_bit(base + j, tt->ss_bit_map); > > + set_bit(base + j, tt->cs_bit_map); > > + tt->fs_bus_bw[base + j] += > > + sch_ep->bw_cost_per_microframe; > > + } else { > > + clear_bit(base + j, tt->ss_bit_map); > > + clear_bit(base + j, tt->cs_bit_map); > > + tt->fs_bus_bw[base + j] -= > > + sch_ep->bw_cost_per_microframe; > > + } > > + } > > + } else { > > + if (used) > > + set_bit(base, tt->ss_bit_map); > > + else > > + clear_bit(base, tt->ss_bit_map); > > + > > + for (j = 0; j < sch_ep->cs_count; j++) { > > + if (used) { > > + set_bit(base + 2 + j, tt->cs_bit_map); > > + > > + tt->fs_bus_bw[base + 2 + j] += > > + sch_ep->bw_cost_per_microframe; > > + } else { > > + clear_bit(base + 2 + j, tt->cs_bit_map); > > + tt->fs_bus_bw[base + 2 + j] -= > > + sch_ep->bw_cost_per_microframe; > > + } > > + } > > + } > > } > > > > - list_add_tail(&sch_ep->tt_endpoint, &tt->ep_list); > > + if (used) > > + list_add_tail(&sch_ep->tt_endpoint, &tt->ep_list); > > + else > > + list_del(&sch_ep->tt_endpoint); > > } > > > > static int check_sch_bw(struct usb_device *udev, > > @@ -470,6 +529,7 @@ static int check_sch_bw(struct usb_device *udev, > > { > > u32 offset; > > u32 esit; > > + u32 boundary; > > u32 min_bw; > > u32 min_index; > > u32 worst_bw; > > @@ -487,10 +547,13 @@ static int check_sch_bw(struct usb_device *udev, > > */ > > min_bw = ~0; > > min_index = 0; > > + boundary = esit; > > min_cs_count = sch_ep->cs_count; > > min_num_budget = sch_ep->num_budget_microframes; > > for (offset = 0; offset < esit; offset++) { > > if (is_fs_or_ls(udev->speed)) { > > + if (sch_ep->ep_type != ISOC_OUT_EP) > > + boundary = esit + 1; > > ret = check_sch_tt(udev, sch_ep, offset); > > if (ret) > > continue; > > @@ -498,7 +561,7 @@ static int check_sch_bw(struct usb_device *udev, > > tt_offset_ok = true; > > } > > > > - if ((offset + sch_ep->num_budget_microframes) > sch_ep->esit) > > + if ((offset + sch_ep->num_budget_microframes) > boundary) > > break; > > > > worst_bw = get_max_bw(sch_bw, sch_ep, offset); > > @@ -532,7 +595,7 @@ static int check_sch_bw(struct usb_device *udev, > > if (!tt_offset_ok) > > return -ERANGE; > > > > - update_sch_tt(udev, sch_ep); > > + update_sch_tt(udev, sch_ep, 1); > > } > > > > /* update bus bandwidth info */ > > @@ -696,12 +759,12 @@ void xhci_mtk_drop_ep_quirk(struct usb_hcd *hcd, struct usb_device *udev, > > > > list_for_each_entry(sch_ep, &sch_bw->bw_ep_list, endpoint) { > > if (sch_ep->ep == ep) { > > - update_bus_bw(sch_bw, sch_ep, 0); > > - list_del(&sch_ep->endpoint); > > if (is_fs_or_ls(udev->speed)) { > > - list_del(&sch_ep->tt_endpoint); > > + update_sch_tt(udev, sch_ep, 0); > > drop_tt(udev); > > } > > + update_bus_bw(sch_bw, sch_ep, 0); > > + list_del(&sch_ep->endpoint); > > kfree(sch_ep); > > break; > > } > > diff --git a/drivers/usb/host/xhci-mtk.h b/drivers/usb/host/xhci-mtk.h > > index a93cfe817904..323b281933b9 100644 > > --- a/drivers/usb/host/xhci-mtk.h > > +++ b/drivers/usb/host/xhci-mtk.h > > @@ -21,12 +21,18 @@ > > > > /** > > * @split_bit_map: used to avoid split microframes overlay > > + * @ss_bit_map: used to avoid start split microframes overlay > > + * @cs_bit_map: used to avoid complete split microframes overlay > > + * @fs_bus_bw: array to keep track of bandwidth already used at full speed > > * @ep_list: Endpoints using this TT > > * @usb_tt: usb TT related > > * @tt_port: TT port number > > */ > > struct mu3h_sch_tt { > > DECLARE_BITMAP(split_bit_map, XHCI_MTK_MAX_ESIT); > > + DECLARE_BITMAP(ss_bit_map, XHCI_MTK_MAX_ESIT); > > + DECLARE_BITMAP(cs_bit_map, XHCI_MTK_MAX_ESIT + 1); > > + u32 fs_bus_bw[XHCI_MTK_MAX_ESIT]; > > struct list_head ep_list; > > struct usb_tt *usb_tt; > > int tt_port; > > @@ -42,7 +48,7 @@ struct mu3h_sch_tt { > > * two bandwidth domains, one for IN eps and another for OUT eps. > > */ > > struct mu3h_sch_bw_info { > > - u32 bus_bw[XHCI_MTK_MAX_ESIT]; > > + u32 bus_bw[XHCI_MTK_MAX_ESIT + 1]; > > struct list_head bw_ep_list; > > }; > > > > -- > > 2.18.0 > > _______________________________________________ > > Linux-mediatek mailing list > > Linux-mediatek@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-mediatek _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek 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=-17.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_SANE_2 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 16F34C433DB for ; Tue, 19 Jan 2021 06:58:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BE35523125 for ; Tue, 19 Jan 2021 06:58:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729993AbhASG6j (ORCPT ); Tue, 19 Jan 2021 01:58:39 -0500 Received: from Mailgw01.mediatek.com ([1.203.163.78]:10994 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1729933AbhASG6F (ORCPT ); Tue, 19 Jan 2021 01:58:05 -0500 X-UUID: 04314350465449a08a2f308ccde18276-20210119 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=6V5zD/iXHA0wDTMuAHf0jHgOG6fsknw3TmnvLpL2RoM=; b=Y7Gu0PfWeFqEUIrgeLvQNNslCffta/OHQMQifHC7q4cLgkSV/sZyvboGkcB5NRQnZR/MrIbkhr2RSW8WB817I6N3FdGrN6PEwKMY/nPNJ4MrDawdq1ShNL9TJy3xM7oI/3BjuEkv3p8EvBkVPRnojh/j53jUTYXPEqvD2DpDlCo=; X-UUID: 04314350465449a08a2f308ccde18276-20210119 Received: from mtkcas32.mediatek.inc [(172.27.4.253)] by mailgw01.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1859219330; Tue, 19 Jan 2021 14:57:07 +0800 Received: from MTKCAS32.mediatek.inc (172.27.4.184) by MTKMBS31N1.mediatek.inc (172.27.4.69) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 19 Jan 2021 14:57:05 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS32.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 19 Jan 2021 14:57:04 +0800 Message-ID: <1611039425.12761.2.camel@mhfsdcap03> Subject: Re: [RFC PATCH v3 1/5] usb: xhci-mtk: improve bandwidth scheduling with multi-TT From: Chunfeng Yun To: Ikjoon Jang CC: Yaqii Wu , Zhanyong Wang , Zhanyong Wang , , open list , Tianping Fang , "moderated list:ARM/Mediatek SoC support" Date: Tue, 19 Jan 2021 14:57:05 +0800 In-Reply-To: References: <1608629682-8535-1-git-send-email-chunfeng.yun@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: F9F112484B25E67B7DA334E6D5373F16DB43BB880BF7764171F09A6E318CC0E52000:8 X-MTK: N Content-Transfer-Encoding: base64 Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org T24gV2VkLCAyMDIxLTAxLTEzIGF0IDE3OjQzICswODAwLCBJa2pvb24gSmFuZyB3cm90ZToNCj4g T24gVHVlLCBEZWMgMjIsIDIwMjAgYXQgNTozNSBQTSBDaHVuZmVuZyBZdW4gPGNodW5mZW5nLnl1 bkBtZWRpYXRlay5jb20+IHdyb3RlOg0KPiA+DQo+ID4gRnJvbTogWmhhbnlvbmcgV2FuZyA8emhh bnlvbmcud2FuZ0BtZWRpYXRlay5jb20+DQo+ID4NCj4gPiBBZnRlciBpbnNlcnRlZCB0aGUgdXNi IHR5cGUtYyAzLjVtbSBkb25nbGUgd2l0aCBoZWFkc2V0LCBkbWVzZyBzaG93ZWQ6DQo+ID4gdXNi IDEtMS4xOiBuZXcgZnVsbC1zcGVlZCBVU0IgZGV2aWNlIG51bWJlciA1IHVzaW5nIHhoY2ktbXRr DQo+ID4gdXNiIDEtMS4xOiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9MDVhYywgaWRQ cm9kdWN0PTExMGEsIGJjZERldmljZT0yNi4xMQ0KPiA+IHVzYiAxLTEuMTogTmV3IFVTQiBkZXZp Y2Ugc3RyaW5nczogTWZyPTEsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTMNCj4gPiB1c2IgMS0x LjE6IFByb2R1Y3Q6IFVTQi1DIHRvIDMuNW1tIEhlYWRwaG9uZSBKYWNrIEFkYXB0ZXINCj4gPiB1 c2IgMS0xLjE6IE1hbnVmYWN0dXJlcjogQXBwbGUsIEluYy4NCj4gPiB1c2IgMS0xLjE6IFNlcmlh bE51bWJlcjogRFdIOTE1NTAxVEZKS0xUQU0NCj4gPiB4aGNpLW10ayAxMTIwMDAwMC54aGNpOiBO b3QgZW5vdWdoIGJhbmR3aWR0aCENCj4gPiB1c2IgMS0xLjE6IGNhbid0IHNldCBjb25maWcgIzIs IGVycm9yIC0yOA0KPiA+DQo+ID4gaW1wcm92ZSBsb3ctc3BlZWQvZnVsbC1zcGVlZCBJTlQvSVNP QyBiYW5kd2lkdGggc2NoZWR1bGluZyB3aXRoIFVTQg0KPiA+IG11bGktVFQuDQo+ID4NCj4gPiBT aWduZWQtb2ZmLWJ5OiBZYXFpaSBXdSA8eWFxaWkud3VAbWVkaWF0ZWsuY29tPg0KPiA+IFNpZ25l ZC1vZmYtYnk6IENodW5mZW5nIFl1biA8Y2h1bmZlbmcueXVuQG1lZGlhdGVrLmNvbT4NCj4gPiAt LS0NCj4gPiB2Mn52Mzogbm8gY2hhbmdlcw0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL3VzYi9ob3N0 L3hoY2ktbXRrLXNjaC5jIHwgOTEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tDQo+ ID4gIGRyaXZlcnMvdXNiL2hvc3QveGhjaS1tdGsuaCAgICAgfCAgOCArKy0NCj4gPiAgMiBmaWxl cyBjaGFuZ2VkLCA4NCBpbnNlcnRpb25zKCspLCAxNSBkZWxldGlvbnMoLSkNCj4gPiAgbW9kZSBj aGFuZ2UgMTAwNjQ0ID0+IDEwMDc1NSBkcml2ZXJzL3VzYi9ob3N0L3hoY2ktbXRrLXNjaC5jDQo+ ID4NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW10ay1zY2guYyBiL2Ry aXZlcnMvdXNiL2hvc3QveGhjaS1tdGstc2NoLmMNCj4gPiBvbGQgbW9kZSAxMDA2NDQNCj4gPiBu ZXcgbW9kZSAxMDA3NTUNCj4gPiBpbmRleCA0NWM1NGQ1NmVjYmQuLjk0MjkyYjliYmM2Mw0KPiA+ IC0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tdGstc2NoLmMNCj4gPiArKysgYi9kcml2ZXJz L3VzYi9ob3N0L3hoY2ktbXRrLXNjaC5jDQo+ID4gQEAgLTM4Myw3ICszODMsOSBAQCBzdGF0aWMg aW50IGNoZWNrX3NjaF90dChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwNCj4gPiAgICAgICAgIHUz MiBmc19idWRnZXRfc3RhcnQ7DQo+ID4gICAgICAgICB1MzIgc3RhcnRfc3MsIGxhc3Rfc3M7DQo+ ID4gICAgICAgICB1MzIgc3RhcnRfY3MsIGxhc3RfY3M7DQo+ID4gLSAgICAgICBpbnQgaTsNCj4g PiArICAgICAgIHUzMiBudW1fZXNpdCwgYmFzZTsNCj4gPiArICAgICAgIGludCBpLCBqOw0KPiA+ ICsgICAgICAgdTMyIHRtcDsNCj4gPg0KPiA+ICAgICAgICAgc3RhcnRfc3MgPSBvZmZzZXQgJSA4 Ow0KPiA+ICAgICAgICAgZnNfYnVkZ2V0X3N0YXJ0ID0gKHN0YXJ0X3NzICsgMSkgJSA4Ow0KPiA+ IEBAIC0zOTgsMTAgKzQwMCwxMyBAQCBzdGF0aWMgaW50IGNoZWNrX3NjaF90dChzdHJ1Y3QgdXNi X2RldmljZSAqdWRldiwNCj4gPiAgICAgICAgICAgICAgICAgaWYgKCEoc3RhcnRfc3MgPT0gNyB8 fCBsYXN0X3NzIDwgNikpDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FUkFO R0U7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjaF9lcC0+Y3Nf Y291bnQ7IGkrKykNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVzdF9iaXQob2Zm c2V0ICsgaSwgdHQtPnNwbGl0X2JpdF9tYXApKQ0KPiA+ICsgICAgICAgICAgICAgICBmb3IgKGkg PSAwOyBpIDwgc2NoX2VwLT5jc19jb3VudDsgaSsrKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgaWYgKHRlc3RfYml0KG9mZnNldCArIGksIHR0LT5zc19iaXRfbWFwKSkNCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVJBTkdFOw0KPiA+DQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RfYml0KG9mZnNldCArIGksIHR0LT5jc19iaXRf bWFwKSkNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVJBTkdF Ow0KPiA+ICsgICAgICAgICAgICAgICB9DQo+IA0KPiBBcmUgdGhlcmUgYW55IHJlYXNvbnMgZm9y IGRvaW5nIHRoaXM/DQo+IFdoeSBjYW4gb25seSBvbmUgc3BsaXQgcGFja2V0IGJlIHNjaGVkdWxl ZCBpbiBhIHUtZnJhbWUgZm9yIGlzb2Nocm9ub3VzIG91dD8NCj4gVGhpcyBsb29rcyBsaWtlIG92 ZXJraWxsLg0KW0Zyb20gRFJdOiBXZSB3aWxsIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHVmcmFt ZXMgYmFzZWQgb24gdGhlIGlzb2Mgb3V0DQplcCBtYXhwLiBFeGNlcHQgZm9yIHRoZSBsYXN0IHVm cmFtZSwgYWxsIG90aGVyIGNvbnN1bWVkIGJhbmR3aWR0aCBpcw0KMTg4LiBCdXQgdG8gYmUgc2Fm ZSwgd2UgYWxzbyBjb3VudCB0aGUgYmFuZHdpZHRoIGNvbnN1bWVkIGJ5IHRoZSBsYXN0IFNTDQph cyAxODguDQoNCj4gDQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+ICAgICAgICAgICAgICAgICB1 MzIgY3NfY291bnQgPSBESVZfUk9VTkRfVVAoc2NoX2VwLT5tYXhwa3QsIEZTX1BBWUxPQURfTUFY KTsNCj4gPg0KPiA+IEBAIC00MjgsOCArNDMzLDEwIEBAIHN0YXRpYyBpbnQgY2hlY2tfc2NoX3R0 KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LA0KPiA+ICAgICAgICAgICAgICAgICBpZiAoY3NfY291 bnQgPiA3KQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGNzX2NvdW50ID0gNzsgLyogSFcg bGltaXQgKi8NCj4gPg0KPiA+IC0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3NfY291 bnQgKyAyOyBpKyspIHsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVzdF9iaXQo b2Zmc2V0ICsgaSwgdHQtPnNwbGl0X2JpdF9tYXApKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAo dGVzdF9iaXQob2Zmc2V0LCB0dC0+c3NfYml0X21hcCkpDQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgcmV0dXJuIC1FUkFOR0U7DQo+ID4gKyAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkg PCBjc19jb3VudDsgaSsrKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3Rf Yml0KG9mZnNldCArIDIgKyBpLCB0dC0+Y3NfYml0X21hcCkpDQo+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICByZXR1cm4gLUVSQU5HRTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0K PiA+DQo+IA0KPiBzYW1lIGhlcmUuIEl0IHdvdWxkIGJlIG11Y2ggYmV0dGVyIHRvIHVuZGVyc3Rh bmQNCj4gaWYgeW91IGNhbiBwcm92aWRlIHNvbWUgY291bnRlcmV4YW1wbGVzIG9mIHNjaGVkdWxl DQo+IHRoYXQgY2FuIGhhcHBlbiB3aGVuIHRoaXMgYml0bWFwIGNoZWNraW5nIGxvZ2ljIGlzIG9t aXR0ZWQuDQpbRnJvbSBEUl0gTWF5YmUgeW91IGFyZSByaWdodCwgaXQgd2lsbCBpbmRlZWQgZG91 YmxlIGNoZWNrLiBJIHdpbGwNCmRlbGV0ZSB0aGUgYmFuZHdpZHRoIGNoZWNrLCBhbmQgdGhlbiBw ZXJmb3JtIGEgcmVncmVzc2lvbiB0ZXN0Lg0KDQo+IA0KPiA+IEBAIC00NDUsMTEgKzQ1MiwyMiBA QCBzdGF0aWMgaW50IGNoZWNrX3NjaF90dChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwNCj4gPiAg ICAgICAgICAgICAgICAgICAgICAgICBzY2hfZXAtPm51bV9idWRnZXRfbWljcm9mcmFtZXMgPSBz Y2hfZXAtPmVzaXQ7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiArICAgICAgIG51bV9lc2l0ID0g WEhDSV9NVEtfTUFYX0VTSVQgLyBzY2hfZXAtPmVzaXQ7DQo+ID4gKyAgICAgICBmb3IgKGkgPSAw OyBpIDwgbnVtX2VzaXQ7IGkrKykgew0KPiA+ICsgICAgICAgICAgICAgICBiYXNlID0gc2NoX2Vw LT5vZmZzZXQgKyBpICogc2NoX2VwLT5lc2l0Ow0KPiA+ICsgICAgICAgICAgICAgICBmb3IgKGog PSAwOyBqIDwgc2NoX2VwLT5udW1fYnVkZ2V0X21pY3JvZnJhbWVzOyBqKyspIHsNCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICB0bXAgPSB0dC0+ZnNfYnVzX2J3W2Jhc2UgKyBqXQ0KPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2NoX2VwLT5id19jb3N0X3Blcl9taWNyb2Zy YW1lOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPiBGU19QQVlMT0FEX01B WCkNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVJBTkdFOw0K PiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICB9DQo+IA0KPiBJIGd1ZXNzIHRoaXMg aXMgZW5vdWdoIHRvIGNoZWNrIHRoZSBiYW5kd2lkdGggbGltaXQgb2YgdGhlDQo+IGxvd2VyIHNw ZWVkIGJ1cyB3aXRob3V0IGEgYml0bWFwLg0KW0Zyb20gRFJdQXMgZXhwbGFpbmVkIGluIGlzc3Vl IHRyYWNrZXIgdGhhdCBzcyBjYW5ub3QgYmUgb3ZlcmxhcHBlZC4NClRoaXMgaXMgYSBodWIgY29t cGF0aWJpbGl0eSBpc3N1ZS4gVGhlcmVmb3JlIHdlIG5lZWQgYml0bWFwIHRvIHByZXZlbnQNCnNz IG92ZXJsYXAuDQoNClRoYW5rcw0KPiANCj4gPiArDQo+ID4gICAgICAgICByZXR1cm4gMDsNCj4g PiAgfQ0KPiA+DQo+ID4gIHN0YXRpYyB2b2lkIHVwZGF0ZV9zY2hfdHQoc3RydWN0IHVzYl9kZXZp Y2UgKnVkZXYsDQo+ID4gLSAgICAgICBzdHJ1Y3QgbXUzaF9zY2hfZXBfaW5mbyAqc2NoX2VwKQ0K PiA+ICsgICAgICAgc3RydWN0IG11M2hfc2NoX2VwX2luZm8gKnNjaF9lcCwgYm9vbCB1c2VkKQ0K PiA+ICB7DQo+ID4gICAgICAgICBzdHJ1Y3QgbXUzaF9zY2hfdHQgKnR0ID0gc2NoX2VwLT5zY2hf dHQ7DQo+ID4gICAgICAgICB1MzIgYmFzZSwgbnVtX2VzaXQ7DQo+ID4gQEAgLTQ1OCwxMSArNDc2 LDUyIEBAIHN0YXRpYyB2b2lkIHVwZGF0ZV9zY2hfdHQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYs DQo+ID4gICAgICAgICBudW1fZXNpdCA9IFhIQ0lfTVRLX01BWF9FU0lUIC8gc2NoX2VwLT5lc2l0 Ow0KPiA+ICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lc2l0OyBpKyspIHsNCj4gPiAgICAg ICAgICAgICAgICAgYmFzZSA9IHNjaF9lcC0+b2Zmc2V0ICsgaSAqIHNjaF9lcC0+ZXNpdDsNCj4g PiAtICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNjaF9lcC0+bnVtX2J1ZGdldF9taWNy b2ZyYW1lczsgaisrKQ0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHNldF9iaXQoYmFzZSAr IGosIHR0LT5zcGxpdF9iaXRfbWFwKTsNCj4gPiArICAgICAgICAgICAgICAgZm9yIChqID0gMDsg aiA8IHNjaF9lcC0+bnVtX2J1ZGdldF9taWNyb2ZyYW1lczsgaisrKSB7DQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgaWYgKHVzZWQpDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzZXRfYml0KGJhc2UgKyBqLCB0dC0+c3BsaXRfYml0X21hcCk7DQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgZWxzZQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y2xlYXJfYml0KGJhc2UgKyBqLCB0dC0+c3BsaXRfYml0X21hcCk7DQo+ID4gKyAgICAgICAgICAg ICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIGlmIChzY2hfZXAtPmVwX3R5cGUgPT0g SVNPQ19PVVRfRVApIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBq IDwgc2NoX2VwLT5udW1fYnVkZ2V0X21pY3JvZnJhbWVzOyBqKyspIHsNCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VkKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHNldF9iaXQoYmFzZSArIGosIHR0LT5zc19iaXRfbWFwKTsN Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2JpdChiYXNl ICsgaiwgdHQtPmNzX2JpdF9tYXApOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB0dC0+ZnNfYnVzX2J3W2Jhc2UgKyBqXSArPQ0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaF9lcC0+YndfY29zdF9wZXJfbWlj cm9mcmFtZTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2JpdChiYXNl ICsgaiwgdHQtPnNzX2JpdF9tYXApOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjbGVhcl9iaXQoYmFzZSArIGosIHR0LT5jc19iaXRfbWFwKTsNCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHQtPmZzX2J1c19id1tiYXNlICsg al0gLT0NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzY2hfZXAtPmJ3X2Nvc3RfcGVyX21pY3JvZnJhbWU7DQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAg ICAgICAgICAgICB9IGVsc2Ugew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2Vk KQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2JpdChiYXNlLCB0dC0+ c3NfYml0X21hcCk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYml0KGJhc2UsIHR0LT5zc19iaXRfbWFw KTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNj aF9lcC0+Y3NfY291bnQ7IGorKykgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaWYgKHVzZWQpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc2V0X2JpdChiYXNlICsgMiArIGosIHR0LT5jc19iaXRfbWFwKTsNCj4gPiArDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0LT5mc19idXNfYndbYmFzZSAr IDIgKyBqXSArPQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNjaF9lcC0+YndfY29zdF9wZXJfbWljcm9mcmFtZTsNCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNsZWFyX2JpdChiYXNlICsgMiArIGosIHR0LT5jc19iaXRfbWFwKTsN Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHQtPmZzX2J1c19i d1tiYXNlICsgMiArIGpdIC09DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc2NoX2VwLT5id19jb3N0X3Blcl9taWNyb2ZyYW1lOw0KPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg IH0NCj4gPiArICAgICAgICAgICAgICAgfQ0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gLSAgICAg ICBsaXN0X2FkZF90YWlsKCZzY2hfZXAtPnR0X2VuZHBvaW50LCAmdHQtPmVwX2xpc3QpOw0KPiA+ ICsgICAgICAgaWYgKHVzZWQpDQo+ID4gKyAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJnNj aF9lcC0+dHRfZW5kcG9pbnQsICZ0dC0+ZXBfbGlzdCk7DQo+ID4gKyAgICAgICBlbHNlDQo+ID4g KyAgICAgICAgICAgICAgIGxpc3RfZGVsKCZzY2hfZXAtPnR0X2VuZHBvaW50KTsNCj4gPiAgfQ0K PiA+DQo+ID4gIHN0YXRpYyBpbnQgY2hlY2tfc2NoX2J3KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2 LA0KPiA+IEBAIC00NzAsNiArNTI5LDcgQEAgc3RhdGljIGludCBjaGVja19zY2hfYncoc3RydWN0 IHVzYl9kZXZpY2UgKnVkZXYsDQo+ID4gIHsNCj4gPiAgICAgICAgIHUzMiBvZmZzZXQ7DQo+ID4g ICAgICAgICB1MzIgZXNpdDsNCj4gPiArICAgICAgIHUzMiBib3VuZGFyeTsNCj4gPiAgICAgICAg IHUzMiBtaW5fYnc7DQo+ID4gICAgICAgICB1MzIgbWluX2luZGV4Ow0KPiA+ICAgICAgICAgdTMy IHdvcnN0X2J3Ow0KPiA+IEBAIC00ODcsMTAgKzU0NywxMyBAQCBzdGF0aWMgaW50IGNoZWNrX3Nj aF9idyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwNCj4gPiAgICAgICAgICAqLw0KPiA+ICAgICAg ICAgbWluX2J3ID0gfjA7DQo+ID4gICAgICAgICBtaW5faW5kZXggPSAwOw0KPiA+ICsgICAgICAg Ym91bmRhcnkgPSBlc2l0Ow0KPiA+ICAgICAgICAgbWluX2NzX2NvdW50ID0gc2NoX2VwLT5jc19j b3VudDsNCj4gPiAgICAgICAgIG1pbl9udW1fYnVkZ2V0ID0gc2NoX2VwLT5udW1fYnVkZ2V0X21p Y3JvZnJhbWVzOw0KPiA+ICAgICAgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBlc2l0OyBv ZmZzZXQrKykgew0KPiA+ICAgICAgICAgICAgICAgICBpZiAoaXNfZnNfb3JfbHModWRldi0+c3Bl ZWQpKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaF9lcC0+ZXBfdHlwZSAh PSBJU09DX09VVF9FUCkNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5k YXJ5ID0gZXNpdCArIDE7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2hlY2tf c2NoX3R0KHVkZXYsIHNjaF9lcCwgb2Zmc2V0KTsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg ICBpZiAocmV0KQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7 DQo+ID4gQEAgLTQ5OCw3ICs1NjEsNyBAQCBzdGF0aWMgaW50IGNoZWNrX3NjaF9idyhzdHJ1Y3Qg dXNiX2RldmljZSAqdWRldiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0 X29mZnNldF9vayA9IHRydWU7DQo+ID4gICAgICAgICAgICAgICAgIH0NCj4gPg0KPiA+IC0gICAg ICAgICAgICAgICBpZiAoKG9mZnNldCArIHNjaF9lcC0+bnVtX2J1ZGdldF9taWNyb2ZyYW1lcykg PiBzY2hfZXAtPmVzaXQpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICgob2Zmc2V0ICsgc2NoX2Vw LT5udW1fYnVkZ2V0X21pY3JvZnJhbWVzKSA+IGJvdW5kYXJ5KQ0KPiA+ICAgICAgICAgICAgICAg ICAgICAgICAgIGJyZWFrOw0KPiA+DQo+ID4gICAgICAgICAgICAgICAgIHdvcnN0X2J3ID0gZ2V0 X21heF9idyhzY2hfYncsIHNjaF9lcCwgb2Zmc2V0KTsNCj4gPiBAQCAtNTMyLDcgKzU5NSw3IEBA IHN0YXRpYyBpbnQgY2hlY2tfc2NoX2J3KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LA0KPiA+ICAg ICAgICAgICAgICAgICBpZiAoIXR0X29mZnNldF9vaykNCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gLUVSQU5HRTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICB1cGRhdGVfc2No X3R0KHVkZXYsIHNjaF9lcCk7DQo+ID4gKyAgICAgICAgICAgICAgIHVwZGF0ZV9zY2hfdHQodWRl diwgc2NoX2VwLCAxKTsNCj4gPiAgICAgICAgIH0NCj4gPg0KPiA+ICAgICAgICAgLyogdXBkYXRl IGJ1cyBiYW5kd2lkdGggaW5mbyAqLw0KPiA+IEBAIC02OTYsMTIgKzc1OSwxMiBAQCB2b2lkIHho Y2lfbXRrX2Ryb3BfZXBfcXVpcmsoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVzYl9kZXZp Y2UgKnVkZXYsDQo+ID4NCj4gPiAgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkoc2NoX2VwLCAm c2NoX2J3LT5id19lcF9saXN0LCBlbmRwb2ludCkgew0KPiA+ICAgICAgICAgICAgICAgICBpZiAo c2NoX2VwLT5lcCA9PSBlcCkgew0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9i dXNfYncoc2NoX2J3LCBzY2hfZXAsIDApOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIGxp c3RfZGVsKCZzY2hfZXAtPmVuZHBvaW50KTsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBp ZiAoaXNfZnNfb3JfbHModWRldi0+c3BlZWQpKSB7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBsaXN0X2RlbCgmc2NoX2VwLT50dF9lbmRwb2ludCk7DQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfc2NoX3R0KHVkZXYsIHNjaF9lcCwgMCk7DQo+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wX3R0KHVkZXYpOw0KPiA+ICAg ICAgICAgICAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1cGRh dGVfYnVzX2J3KHNjaF9idywgc2NoX2VwLCAwKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICBsaXN0X2RlbCgmc2NoX2VwLT5lbmRwb2ludCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAga2ZyZWUoc2NoX2VwKTsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCj4g PiAgICAgICAgICAgICAgICAgfQ0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3ho Y2ktbXRrLmggYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbXRrLmgNCj4gPiBpbmRleCBhOTNjZmU4 MTc5MDQuLjMyM2IyODE5MzNiOSAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3ho Y2ktbXRrLmgNCj4gPiArKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbXRrLmgNCj4gPiBAQCAt MjEsMTIgKzIxLDE4IEBADQo+ID4NCj4gPiAgLyoqDQo+ID4gICAqIEBzcGxpdF9iaXRfbWFwOiB1 c2VkIHRvIGF2b2lkIHNwbGl0IG1pY3JvZnJhbWVzIG92ZXJsYXkNCj4gPiArICogQHNzX2JpdF9t YXA6IHVzZWQgdG8gYXZvaWQgc3RhcnQgc3BsaXQgbWljcm9mcmFtZXMgb3ZlcmxheQ0KPiA+ICsg KiBAY3NfYml0X21hcDogdXNlZCB0byBhdm9pZCBjb21wbGV0ZSBzcGxpdCBtaWNyb2ZyYW1lcyBv dmVybGF5DQo+ID4gKyAqIEBmc19idXNfYnc6IGFycmF5IHRvIGtlZXAgdHJhY2sgb2YgYmFuZHdp ZHRoIGFscmVhZHkgdXNlZCBhdCBmdWxsIHNwZWVkDQo+ID4gICAqIEBlcF9saXN0OiBFbmRwb2lu dHMgdXNpbmcgdGhpcyBUVA0KPiA+ICAgKiBAdXNiX3R0OiB1c2IgVFQgcmVsYXRlZA0KPiA+ICAg KiBAdHRfcG9ydDogVFQgcG9ydCBudW1iZXINCj4gPiAgICovDQo+ID4gIHN0cnVjdCBtdTNoX3Nj aF90dCB7DQo+ID4gICAgICAgICBERUNMQVJFX0JJVE1BUChzcGxpdF9iaXRfbWFwLCBYSENJX01U S19NQVhfRVNJVCk7DQo+ID4gKyAgICAgICBERUNMQVJFX0JJVE1BUChzc19iaXRfbWFwLCBYSENJ X01US19NQVhfRVNJVCk7DQo+ID4gKyAgICAgICBERUNMQVJFX0JJVE1BUChjc19iaXRfbWFwLCBY SENJX01US19NQVhfRVNJVCArIDEpOw0KPiA+ICsgICAgICAgdTMyIGZzX2J1c19id1tYSENJX01U S19NQVhfRVNJVF07DQo+ID4gICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGVwX2xpc3Q7DQo+ID4g ICAgICAgICBzdHJ1Y3QgdXNiX3R0ICp1c2JfdHQ7DQo+ID4gICAgICAgICBpbnQgdHRfcG9ydDsN Cj4gPiBAQCAtNDIsNyArNDgsNyBAQCBzdHJ1Y3QgbXUzaF9zY2hfdHQgew0KPiA+ICAgKiB0d28g YmFuZHdpZHRoIGRvbWFpbnMsIG9uZSBmb3IgSU4gZXBzIGFuZCBhbm90aGVyIGZvciBPVVQgZXBz Lg0KPiA+ICAgKi8NCj4gPiAgc3RydWN0IG11M2hfc2NoX2J3X2luZm8gew0KPiA+IC0gICAgICAg dTMyIGJ1c19id1tYSENJX01US19NQVhfRVNJVF07DQo+ID4gKyAgICAgICB1MzIgYnVzX2J3W1hI Q0lfTVRLX01BWF9FU0lUICsgMV07DQo+ID4gICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGJ3X2Vw X2xpc3Q7DQo+ID4gIH07DQo+ID4NCj4gPiAtLQ0KPiA+IDIuMTguMA0KPiA+IF9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+ID4gTGludXgtbWVkaWF0ZWsg bWFpbGluZyBsaXN0DQo+ID4gTGludXgtbWVkaWF0ZWtAbGlzdHMuaW5mcmFkZWFkLm9yZw0KPiA+ IGh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbWVkaWF0 ZWsNCg0K