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=-13.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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 59782C48BC2 for ; Wed, 23 Jun 2021 13:05:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 424BA6108E for ; Wed, 23 Jun 2021 13:05:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230520AbhFWNHV (ORCPT ); Wed, 23 Jun 2021 09:07:21 -0400 Received: from esa.microchip.iphmx.com ([68.232.153.233]:3412 "EHLO esa.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230461AbhFWNHU (ORCPT ); Wed, 23 Jun 2021 09:07:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1624453503; x=1655989503; h=message-id:subject:from:to:cc:date:in-reply-to: references:mime-version:content-transfer-encoding; bh=M7B/HtMHdJOJXKEZrylCHaNSZqDWrKwGNR7ZU9nPVJg=; b=I6B+B4bs2Mc0WzMjfoKd5kZzxj8tQ6zNvzCsO8CkYAM/p/R/5d/He+sv 0OMWt6C0ZUL0QZGLS8U60ZeoDC96EbOeUAedcCRL2r01inGnc3leohSDC 4+zAU3HQYWAYW1V8fsWDrTdRO4PYN7szfraJJe7lT0crIu69hy6z56uic FvQn+I+TxvXetUVhfuXXL2Bh6OCUz5YrxOC+Jy16q80VDARwCLM5IT1yu ASpPuclOPaENntAO4JT7ashIp24iU3bWaviOW0Dv6H8KEbTyKKevEGugb FgYOmQye5SBd41xk1VU5YyalsJdpWRGjS6rw9TAXDLsP/CJNeNcbRJLaz Q==; IronPort-SDR: wnj/F1BCLui7CCja60zDgDzVh1q/ia46tYx2a97QvSKaGlRtnKdXxH+tcT/Udcee4V92Ei0TNQ dyKbzP2wkFRkuoA4tM3s/wLJIWGjmTanhI73CfITcXGWSU7clmOhc3MinZtwM6+Iay/e6PXsmn LaPM6F13O0/Dk9/4ER4xPTLS+nmPYSJ74gPJ9APqt0KWqvkRu/Di6cZdx6jbmNZv1RTbP/WkkQ 2KBlKa4bEC+vlvrdaOoGcPhgejPGl3H5PG6TpHUSeXND7bLcQOJrgIhhPbvm7V9YwWK4LR8RO9 ky8= X-IronPort-AV: E=Sophos;i="5.83,293,1616482800"; d="scan'208";a="133164106" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa1.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 23 Jun 2021 06:05:01 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2; Wed, 23 Jun 2021 06:05:00 -0700 Received: from [10.205.21.35] (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2176.2 via Frontend Transport; Wed, 23 Jun 2021 06:04:54 -0700 Message-ID: Subject: Re: [PATCH net-next v4 03/10] net: sparx5: add hostmode with phylink support From: Steen Hegelund To: "Russell King (Oracle)" CC: "David S. Miller" , Jakub Kicinski , Andrew Lunn , Microchip Linux Driver Support , Alexandre Belloni , Madalin Bucur , Mark Einon , Masahiro Yamada , Arnd Bergmann , Philipp Zabel , "Simon Horman" , , , , Bjarni Jonasson , Lars Povlsen Date: Wed, 23 Jun 2021 15:04:53 +0200 In-Reply-To: <20210621142628.GM22278@shell.armlinux.org.uk> References: <20210615085034.1262457-1-steen.hegelund@microchip.com> <20210615085034.1262457-4-steen.hegelund@microchip.com> <20210621142628.GM22278@shell.armlinux.org.uk> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.40.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Russell, Thanks for your comments. On Mon, 2021-06-21 at 15:26 +0100, Russell King (Oracle) wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > On Tue, Jun 15, 2021 at 10:50:27AM +0200, Steen Hegelund wrote: > > This patch adds netdevs and phylink support for the ports in the switch. > > It also adds register based injection and extraction for these ports. > > > > Frame DMA support for injection and extraction will be added in a later > > series. > > > > Signed-off-by: Steen Hegelund > > Signed-off-by: Bjarni Jonasson > > Signed-off-by: Lars Povlsen > > Hi, > > While looking at this patch, I found sparx5_destroy_netdev() which seems > to be unreferenced - it may be referenced in a future patch. However, > this means that while sparx5_create_port() creates the phylink > structure, there is nothing in this patch that cleans it up. Yes the sparx5_destroy_netdev() is currently being added in a later patch. I will move it here instead. > > I'm puzzled by the call to phylink_disconnect_phy() in > sparx5_destroy_netdev() too - surely if we get to the point of tearing > down stuff that we've created at initialisation, the interface had > better be down? Yes the unregister_netdev is missing. I will add that before the phylink is destroyed. > > > diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_phylink.c > > b/drivers/net/ethernet/microchip/sparx5/sparx5_phylink.c > > new file mode 100644 > > index 000000000000..c17a3502645a > > --- /dev/null > > +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_phylink.c > > @@ -0,0 +1,185 @@ > > +// SPDX-License-Identifier: GPL-2.0+ > > +/* Microchip Sparx5 Switch driver > > + * > > + * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include "sparx5_main_regs.h" > > +#include "sparx5_main.h" > > + > > +static void sparx5_phylink_validate(struct phylink_config *config, > > +                                 unsigned long *supported, > > +                                 struct phylink_link_state *state) > > +{ > > +     struct sparx5_port *port = netdev_priv(to_net_dev(config->dev)); > > +     __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = { 0, }; > > + > > +     phylink_set(mask, Autoneg); > > +     phylink_set_port_modes(mask); > > +     phylink_set(mask, Pause); > > +     phylink_set(mask, Asym_Pause); > > + > > +     switch (state->interface) { > > +     case PHY_INTERFACE_MODE_5GBASER: > > +     case PHY_INTERFACE_MODE_10GBASER: > > +     case PHY_INTERFACE_MODE_25GBASER: > > +     case PHY_INTERFACE_MODE_NA: > > +             if (port->conf.bandwidth == SPEED_5000) > > +                     phylink_set(mask, 5000baseT_Full); > > +             if (port->conf.bandwidth == SPEED_10000) { > > +                     phylink_set(mask, 5000baseT_Full); > > +                     phylink_set(mask, 10000baseT_Full); > > +                     phylink_set(mask, 10000baseCR_Full); > > +                     phylink_set(mask, 10000baseSR_Full); > > +                     phylink_set(mask, 10000baseLR_Full); > > +                     phylink_set(mask, 10000baseLRM_Full); > > +                     phylink_set(mask, 10000baseER_Full); > > +             } > > +             if (port->conf.bandwidth == SPEED_25000) { > > +                     phylink_set(mask, 5000baseT_Full); > > +                     phylink_set(mask, 10000baseT_Full); > > +                     phylink_set(mask, 10000baseCR_Full); > > +                     phylink_set(mask, 10000baseSR_Full); > > +                     phylink_set(mask, 10000baseLR_Full); > > +                     phylink_set(mask, 10000baseLRM_Full); > > +                     phylink_set(mask, 10000baseER_Full); > > +                     phylink_set(mask, 25000baseCR_Full); > > +                     phylink_set(mask, 25000baseSR_Full); > > +             } > > I really need to fix phylink so we shouldn't be lying about which > speeds are supported over a 10GBASER link... but that's something > for the future. > > > +static bool port_conf_has_changed(struct sparx5_port_config *a, struct sparx5_port_config *b) > > +{ > > +     if (a->speed != b->speed || > > +         a->portmode != b->portmode || > > +         a->autoneg != b->autoneg || > > +         a->pause != b->pause || > > +         a->power_down != b->power_down || > > +         a->media != b->media) > > +             return true; > > +     return false; > > +} > > Should this be positioned somewhere else rather than in the middle of > the sparx5 phylink functions (top of file maybe?) I will move it to the top. > > > +static void sparx5_phylink_mac_config(struct phylink_config *config, > > +                                   unsigned int mode, > > +                                   const struct phylink_link_state *state) > > +{ > > +     struct sparx5_port *port = netdev_priv(to_net_dev(config->dev)); > > + > > +     port->conf.autoneg = state->an_enabled; > > +     port->conf.pause = state->pause; > > What are you doing with state->pause? It looks to me like you're using > both of these to carry configuration to pcs_config? Hmm. I have now removed that, and will the pcs_config() to collect the advertised pause mode. > > Generally, an_enabled can be pulled out of the advertising mask, it > should always reflect ETHTOOL_LINK_MODE_Autoneg_BIT. The "pause" > interpretation of the pause bits here are somewhat hardware specific. > It depends whether the MAC automatically receives state information > from the PCS or not. If the hardware does, then MLO_PAUSE_AN indicates > whether that should be permitted or not. > > Otherwise, the advertising mask in pcs_config() indicates which pause > modes should be advertised, and the tx_pause/rx_pause in the > *_link_up() indicates what should actually be set. OK. I will use the pcs_config() to collect the advertising mode and the .._link_up() to collect the configuration value. > > Thanks. > > -- > RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ > FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last! -- BR Steen -=-=-=-=-=-=-=-=-=-=-=-=-=-= steen.hegelund@microchip.com 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=-14.1 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 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 6A97AC4743C for ; Wed, 23 Jun 2021 13:07:05 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 3461961076 for ; Wed, 23 Jun 2021 13:07:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3461961076 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=microchip.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org 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:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:CC: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=bfXflE7pmDHdPbMyiB/yYDMgS/D+tBqzWy4pOMjG6lc=; b=uS+UPbiC6mTgbZ llyjFzNb8DsmICmTcMY0F1bPZM8/nYLXugLLASSvwme+zLqH/7l53SENtF1Gh0hU7h3wvOa4AnJGK 863nuDKUK4/9VCKbQn4QsUwoybRY2IlsnPTAoj7OAQTlXf/XWkChUjdBkW83fugJ+/Za8/ps2rleJ qYT2a125kbgFBw0g/VbOXYa+Tm9wYOA0hrS0yNKsFTVZMsUNgRy5qdQLQKSt2M4JC67/9tB4Cw46E kkLcNbZYThvtIc9BZ/xw+H4Z+ieXdH4PtaVpvigWAj8ZMYWkuxItS3LeNefNdv8RruyRB8fO+rJ/5 9Emh0jU26FRWA/wclqtA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lw2Z6-00Aimn-VK; Wed, 23 Jun 2021 13:05:13 +0000 Received: from esa.microchip.iphmx.com ([68.232.153.233]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lw2Z1-00Aikl-QY for linux-arm-kernel@lists.infradead.org; Wed, 23 Jun 2021 13:05:10 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1624453507; x=1655989507; h=message-id:subject:from:to:cc:date:in-reply-to: references:mime-version:content-transfer-encoding; bh=M7B/HtMHdJOJXKEZrylCHaNSZqDWrKwGNR7ZU9nPVJg=; b=S5kl+nKGTI4TEqVF4++dUBxc9/ti6yRY/+B9nCPpc2nMYHtnwDBAo1sN UIz1p+xgh76MKpt27BveAeVzJKZEkNaOuqPFFgsP7Rn1Qj/8or4eAA5vk vtlif3nvQZVqQE+n0d8Gv+/Ccx6gmEsRtrRRX//yUqTx6i/sSiH2FOm31 NYygZv3zOnExOQmtRXdk6Pr86IJjUjKCx6SRdqG9KRE6oubN1tMAT2Ls5 sRo3e2v8URt64H8Xrg97DlSaCmy4+BL/FW+wbS2/lMI27Dne6BYs29BCR Si+aoF7KiUDAC5lKG4BTt11MCDoto9hzAKtJ66H52FY3A49mRISHGc3/g w==; IronPort-SDR: wnj/F1BCLui7CCja60zDgDzVh1q/ia46tYx2a97QvSKaGlRtnKdXxH+tcT/Udcee4V92Ei0TNQ dyKbzP2wkFRkuoA4tM3s/wLJIWGjmTanhI73CfITcXGWSU7clmOhc3MinZtwM6+Iay/e6PXsmn LaPM6F13O0/Dk9/4ER4xPTLS+nmPYSJ74gPJ9APqt0KWqvkRu/Di6cZdx6jbmNZv1RTbP/WkkQ 2KBlKa4bEC+vlvrdaOoGcPhgejPGl3H5PG6TpHUSeXND7bLcQOJrgIhhPbvm7V9YwWK4LR8RO9 ky8= X-IronPort-AV: E=Sophos;i="5.83,293,1616482800"; d="scan'208";a="133164106" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa1.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 23 Jun 2021 06:05:01 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2; Wed, 23 Jun 2021 06:05:00 -0700 Received: from [10.205.21.35] (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2176.2 via Frontend Transport; Wed, 23 Jun 2021 06:04:54 -0700 Message-ID: Subject: Re: [PATCH net-next v4 03/10] net: sparx5: add hostmode with phylink support From: Steen Hegelund To: "Russell King (Oracle)" CC: "David S. Miller" , Jakub Kicinski , Andrew Lunn , Microchip Linux Driver Support , Alexandre Belloni , Madalin Bucur , Mark Einon , Masahiro Yamada , Arnd Bergmann , Philipp Zabel , "Simon Horman" , , , , Bjarni Jonasson , Lars Povlsen Date: Wed, 23 Jun 2021 15:04:53 +0200 In-Reply-To: <20210621142628.GM22278@shell.armlinux.org.uk> References: <20210615085034.1262457-1-steen.hegelund@microchip.com> <20210615085034.1262457-4-steen.hegelund@microchip.com> <20210621142628.GM22278@shell.armlinux.org.uk> User-Agent: Evolution 3.40.2 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210623_060507_923355_5B10A60A X-CRM114-Status: GOOD ( 38.76 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgUnVzc2VsbCwKClRoYW5rcyBmb3IgeW91ciBjb21tZW50cy4KCk9uIE1vbiwgMjAyMS0wNi0y MSBhdCAxNToyNiArMDEwMCwgUnVzc2VsbCBLaW5nIChPcmFjbGUpIHdyb3RlOgo+IEVYVEVSTkFM IEVNQUlMOiBEbyBub3QgY2xpY2sgbGlua3Mgb3Igb3BlbiBhdHRhY2htZW50cyB1bmxlc3MgeW91 IGtub3cgdGhlIGNvbnRlbnQgaXMgc2FmZQo+IAo+IE9uIFR1ZSwgSnVuIDE1LCAyMDIxIGF0IDEw OjUwOjI3QU0gKzAyMDAsIFN0ZWVuIEhlZ2VsdW5kIHdyb3RlOgo+ID4gVGhpcyBwYXRjaCBhZGRz IG5ldGRldnMgYW5kIHBoeWxpbmsgc3VwcG9ydCBmb3IgdGhlIHBvcnRzIGluIHRoZSBzd2l0Y2gu Cj4gPiBJdCBhbHNvIGFkZHMgcmVnaXN0ZXIgYmFzZWQgaW5qZWN0aW9uIGFuZCBleHRyYWN0aW9u IGZvciB0aGVzZSBwb3J0cy4KPiA+IAo+ID4gRnJhbWUgRE1BIHN1cHBvcnQgZm9yIGluamVjdGlv biBhbmQgZXh0cmFjdGlvbiB3aWxsIGJlIGFkZGVkIGluIGEgbGF0ZXIKPiA+IHNlcmllcy4KPiA+ IAo+ID4gU2lnbmVkLW9mZi1ieTogU3RlZW4gSGVnZWx1bmQgPHN0ZWVuLmhlZ2VsdW5kQG1pY3Jv Y2hpcC5jb20+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBCamFybmkgSm9uYXNzb24gPGJqYXJuaS5qb25h c3NvbkBtaWNyb2NoaXAuY29tPgo+ID4gU2lnbmVkLW9mZi1ieTogTGFycyBQb3Zsc2VuIDxsYXJz LnBvdmxzZW5AbWljcm9jaGlwLmNvbT4KPiAKPiBIaSwKPiAKPiBXaGlsZSBsb29raW5nIGF0IHRo aXMgcGF0Y2gsIEkgZm91bmQgc3Bhcng1X2Rlc3Ryb3lfbmV0ZGV2KCkgd2hpY2ggc2VlbXMKPiB0 byBiZSB1bnJlZmVyZW5jZWQgLSBpdCBtYXkgYmUgcmVmZXJlbmNlZCBpbiBhIGZ1dHVyZSBwYXRj aC4gSG93ZXZlciwKPiB0aGlzIG1lYW5zIHRoYXQgd2hpbGUgc3Bhcng1X2NyZWF0ZV9wb3J0KCkg Y3JlYXRlcyB0aGUgcGh5bGluawo+IHN0cnVjdHVyZSwgdGhlcmUgaXMgbm90aGluZyBpbiB0aGlz IHBhdGNoIHRoYXQgY2xlYW5zIGl0IHVwLgoKWWVzIHRoZSBzcGFyeDVfZGVzdHJveV9uZXRkZXYo KSBpcyBjdXJyZW50bHkgYmVpbmcgYWRkZWQgaW4gYSBsYXRlciBwYXRjaC4gCkkgd2lsbCBtb3Zl IGl0IGhlcmUgaW5zdGVhZC4gCgo+IAo+IEknbSBwdXp6bGVkIGJ5IHRoZSBjYWxsIHRvIHBoeWxp bmtfZGlzY29ubmVjdF9waHkoKSBpbgo+IHNwYXJ4NV9kZXN0cm95X25ldGRldigpIHRvbyAtIHN1 cmVseSBpZiB3ZSBnZXQgdG8gdGhlIHBvaW50IG9mIHRlYXJpbmcKPiBkb3duIHN0dWZmIHRoYXQg d2UndmUgY3JlYXRlZCBhdCBpbml0aWFsaXNhdGlvbiwgdGhlIGludGVyZmFjZSBoYWQKPiBiZXR0 ZXIgYmUgZG93bj8KClllcyB0aGUgdW5yZWdpc3Rlcl9uZXRkZXYgaXMgbWlzc2luZy4gSSB3aWxs IGFkZCB0aGF0IGJlZm9yZSB0aGUgcGh5bGluayBpcyBkZXN0cm95ZWQuCgo+IAo+ID4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JvY2hpcC9zcGFyeDUvc3Bhcng1X3BoeWxp bmsuYwo+ID4gYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyb2NoaXAvc3Bhcng1L3NwYXJ4NV9w aHlsaW5rLmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwMDAwMDAu LmMxN2EzNTAyNjQ1YQo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvZHJpdmVycy9uZXQvZXRo ZXJuZXQvbWljcm9jaGlwL3NwYXJ4NS9zcGFyeDVfcGh5bGluay5jCj4gPiBAQCAtMCwwICsxLDE4 NSBAQAo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKwo+ID4gKy8qIE1p Y3JvY2hpcCBTcGFyeDUgU3dpdGNoIGRyaXZlcgo+ID4gKyAqCj4gPiArICogQ29weXJpZ2h0IChj KSAyMDIxIE1pY3JvY2hpcCBUZWNobm9sb2d5IEluYy4gYW5kIGl0cyBzdWJzaWRpYXJpZXMuCj4g PiArICovCj4gPiArCj4gPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ID4gKyNpbmNsdWRl IDxsaW51eC9waHlsaW5rLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgo+ID4gKyNp bmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvc2ZwLmg+Cj4g PiArCj4gPiArI2luY2x1ZGUgInNwYXJ4NV9tYWluX3JlZ3MuaCIKPiA+ICsjaW5jbHVkZSAic3Bh cng1X21haW4uaCIKPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBzcGFyeDVfcGh5bGlua192YWxpZGF0 ZShzdHJ1Y3QgcGh5bGlua19jb25maWcgKmNvbmZpZywKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxv bmcgKnN1cHBvcnRlZCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBwaHlsaW5rX2xpbmtfc3RhdGUgKnN0 YXRlKQo+ID4gK3sKPiA+ICvCoMKgwqDCoCBzdHJ1Y3Qgc3Bhcng1X3BvcnQgKnBvcnQgPSBuZXRk ZXZfcHJpdih0b19uZXRfZGV2KGNvbmZpZy0+ZGV2KSk7Cj4gPiArwqDCoMKgwqAgX19FVEhUT09M X0RFQ0xBUkVfTElOS19NT0RFX01BU0sobWFzaykgPSB7IDAsIH07Cj4gPiArCj4gPiArwqDCoMKg wqAgcGh5bGlua19zZXQobWFzaywgQXV0b25lZyk7Cj4gPiArwqDCoMKgwqAgcGh5bGlua19zZXRf cG9ydF9tb2RlcyhtYXNrKTsKPiA+ICvCoMKgwqDCoCBwaHlsaW5rX3NldChtYXNrLCBQYXVzZSk7 Cj4gPiArwqDCoMKgwqAgcGh5bGlua19zZXQobWFzaywgQXN5bV9QYXVzZSk7Cj4gPiArCj4gPiAr wqDCoMKgwqAgc3dpdGNoIChzdGF0ZS0+aW50ZXJmYWNlKSB7Cj4gPiArwqDCoMKgwqAgY2FzZSBQ SFlfSU5URVJGQUNFX01PREVfNUdCQVNFUjoKPiA+ICvCoMKgwqDCoCBjYXNlIFBIWV9JTlRFUkZB Q0VfTU9ERV8xMEdCQVNFUjoKPiA+ICvCoMKgwqDCoCBjYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV8y NUdCQVNFUjoKPiA+ICvCoMKgwqDCoCBjYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9OQToKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHBvcnQtPmNvbmYuYmFuZHdpZHRoID09IFNQRUVE XzUwMDApCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwaHls aW5rX3NldChtYXNrLCA1MDAwYmFzZVRfRnVsbCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlmIChwb3J0LT5jb25mLmJhbmR3aWR0aCA9PSBTUEVFRF8xMDAwMCkgewo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGh5bGlua19zZXQobWFzaywgNTAw MGJhc2VUX0Z1bGwpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcGh5bGlua19zZXQobWFzaywgMTAwMDBiYXNlVF9GdWxsKTsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBoeWxpbmtfc2V0KG1hc2ssIDEwMDAwYmFzZUNS X0Z1bGwpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGh5 bGlua19zZXQobWFzaywgMTAwMDBiYXNlU1JfRnVsbCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwaHlsaW5rX3NldChtYXNrLCAxMDAwMGJhc2VMUl9GdWxs KTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBoeWxpbmtf c2V0KG1hc2ssIDEwMDAwYmFzZUxSTV9GdWxsKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHBoeWxpbmtfc2V0KG1hc2ssIDEwMDAwYmFzZUVSX0Z1bGwpOwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlmIChwb3J0LT5jb25mLmJhbmR3aWR0aCA9PSBTUEVFRF8yNTAwMCkgewo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGh5bGlua19zZXQobWFzaywgNTAw MGJhc2VUX0Z1bGwpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcGh5bGlua19zZXQobWFzaywgMTAwMDBiYXNlVF9GdWxsKTsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBoeWxpbmtfc2V0KG1hc2ssIDEwMDAwYmFzZUNS X0Z1bGwpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGh5 bGlua19zZXQobWFzaywgMTAwMDBiYXNlU1JfRnVsbCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwaHlsaW5rX3NldChtYXNrLCAxMDAwMGJhc2VMUl9GdWxs KTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBoeWxpbmtf c2V0KG1hc2ssIDEwMDAwYmFzZUxSTV9GdWxsKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHBoeWxpbmtfc2V0KG1hc2ssIDEwMDAwYmFzZUVSX0Z1bGwpOwo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGh5bGlua19zZXQo bWFzaywgMjUwMDBiYXNlQ1JfRnVsbCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBwaHlsaW5rX3NldChtYXNrLCAyNTAwMGJhc2VTUl9GdWxsKTsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+IAo+IEkgcmVhbGx5IG5lZWQgdG8gZml4IHBoeWxp bmsgc28gd2Ugc2hvdWxkbid0IGJlIGx5aW5nIGFib3V0IHdoaWNoCj4gc3BlZWRzIGFyZSBzdXBw b3J0ZWQgb3ZlciBhIDEwR0JBU0VSIGxpbmsuLi4gYnV0IHRoYXQncyBzb21ldGhpbmcKPiBmb3Ig dGhlIGZ1dHVyZS4KPiAKPiA+ICtzdGF0aWMgYm9vbCBwb3J0X2NvbmZfaGFzX2NoYW5nZWQoc3Ry dWN0IHNwYXJ4NV9wb3J0X2NvbmZpZyAqYSwgc3RydWN0IHNwYXJ4NV9wb3J0X2NvbmZpZyAqYikK PiA+ICt7Cj4gPiArwqDCoMKgwqAgaWYgKGEtPnNwZWVkICE9IGItPnNwZWVkIHx8Cj4gPiArwqDC oMKgwqDCoMKgwqDCoCBhLT5wb3J0bW9kZSAhPSBiLT5wb3J0bW9kZSB8fAo+ID4gK8KgwqDCoMKg wqDCoMKgwqAgYS0+YXV0b25lZyAhPSBiLT5hdXRvbmVnIHx8Cj4gPiArwqDCoMKgwqDCoMKgwqDC oCBhLT5wYXVzZSAhPSBiLT5wYXVzZSB8fAo+ID4gK8KgwqDCoMKgwqDCoMKgwqAgYS0+cG93ZXJf ZG93biAhPSBiLT5wb3dlcl9kb3duIHx8Cj4gPiArwqDCoMKgwqDCoMKgwqDCoCBhLT5tZWRpYSAh PSBiLT5tZWRpYSkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHRydWU7Cj4g PiArwqDCoMKgwqAgcmV0dXJuIGZhbHNlOwo+ID4gK30KPiAKPiBTaG91bGQgdGhpcyBiZSBwb3Np dGlvbmVkIHNvbWV3aGVyZSBlbHNlIHJhdGhlciB0aGFuIGluIHRoZSBtaWRkbGUgb2YKPiB0aGUg c3Bhcng1IHBoeWxpbmsgZnVuY3Rpb25zICh0b3Agb2YgZmlsZSBtYXliZT8pCgpJIHdpbGwgbW92 ZSBpdCB0byB0aGUgdG9wLgoKPiAKPiA+ICtzdGF0aWMgdm9pZCBzcGFyeDVfcGh5bGlua19tYWNf Y29uZmlnKHN0cnVjdCBwaHlsaW5rX2NvbmZpZyAqY29uZmlnLAo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVu c2lnbmVkIGludCBtb2RlLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IHN0cnVjdCBwaHlsaW5rX2xp bmtfc3RhdGUgKnN0YXRlKQo+ID4gK3sKPiA+ICvCoMKgwqDCoCBzdHJ1Y3Qgc3Bhcng1X3BvcnQg KnBvcnQgPSBuZXRkZXZfcHJpdih0b19uZXRfZGV2KGNvbmZpZy0+ZGV2KSk7Cj4gPiArCj4gPiAr wqDCoMKgwqAgcG9ydC0+Y29uZi5hdXRvbmVnID0gc3RhdGUtPmFuX2VuYWJsZWQ7Cj4gPiArwqDC oMKgwqAgcG9ydC0+Y29uZi5wYXVzZSA9IHN0YXRlLT5wYXVzZTsKPiAKPiBXaGF0IGFyZSB5b3Ug ZG9pbmcgd2l0aCBzdGF0ZS0+cGF1c2U/IEl0IGxvb2tzIHRvIG1lIGxpa2UgeW91J3JlIHVzaW5n Cj4gYm90aCBvZiB0aGVzZSB0byBjYXJyeSBjb25maWd1cmF0aW9uIHRvIHBjc19jb25maWc/CgpI bW0uICBJIGhhdmUgbm93IHJlbW92ZWQgdGhhdCwgYW5kIHdpbGwgdGhlIHBjc19jb25maWcoKSB0 byBjb2xsZWN0IHRoZSBhZHZlcnRpc2VkIHBhdXNlIG1vZGUuCgo+IAo+IEdlbmVyYWxseSwgYW5f ZW5hYmxlZCBjYW4gYmUgcHVsbGVkIG91dCBvZiB0aGUgYWR2ZXJ0aXNpbmcgbWFzaywgaXQKPiBz aG91bGQgYWx3YXlzIHJlZmxlY3QgRVRIVE9PTF9MSU5LX01PREVfQXV0b25lZ19CSVQuIFRoZSAi cGF1c2UiCj4gaW50ZXJwcmV0YXRpb24gb2YgdGhlIHBhdXNlIGJpdHMgaGVyZSBhcmUgc29tZXdo YXQgaGFyZHdhcmUgc3BlY2lmaWMuCj4gSXQgZGVwZW5kcyB3aGV0aGVyIHRoZSBNQUMgYXV0b21h dGljYWxseSByZWNlaXZlcyBzdGF0ZSBpbmZvcm1hdGlvbgo+IGZyb20gdGhlIFBDUyBvciBub3Qu IElmIHRoZSBoYXJkd2FyZSBkb2VzLCB0aGVuIE1MT19QQVVTRV9BTiBpbmRpY2F0ZXMKPiB3aGV0 aGVyIHRoYXQgc2hvdWxkIGJlIHBlcm1pdHRlZCBvciBub3QuCj4gCj4gT3RoZXJ3aXNlLCB0aGUg YWR2ZXJ0aXNpbmcgbWFzayBpbiBwY3NfY29uZmlnKCkgaW5kaWNhdGVzIHdoaWNoIHBhdXNlCj4g bW9kZXMgc2hvdWxkIGJlIGFkdmVydGlzZWQsIGFuZCB0aGUgdHhfcGF1c2UvcnhfcGF1c2UgaW4g dGhlCj4gKl9saW5rX3VwKCkgaW5kaWNhdGVzIHdoYXQgc2hvdWxkIGFjdHVhbGx5IGJlIHNldC4K Ck9LLiBJIHdpbGwgdXNlIHRoZSBwY3NfY29uZmlnKCkgdG8gY29sbGVjdCB0aGUgYWR2ZXJ0aXNp bmcgbW9kZSBhbmQgdGhlIC4uX2xpbmtfdXAoKSB0byBjb2xsZWN0IHRoZQpjb25maWd1cmF0aW9u IHZhbHVlLgoKPiAKPiBUaGFua3MuCj4gCj4gLS0KPiBSTUsncyBQYXRjaCBzeXN0ZW06IGh0dHBz Oi8vd3d3LmFybWxpbnV4Lm9yZy51ay9kZXZlbG9wZXIvcGF0Y2hlcy8KPiBGVFRQIGlzIGhlcmUh IDQwTWJwcyBkb3duIDEwTWJwcyB1cC4gRGVjZW50IGNvbm5lY3Rpdml0eSBhdCBsYXN0IQoKLS0g CkJSClN0ZWVuCgotPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09CnN0ZWVuLmhlZ2VsdW5kQG1p Y3JvY2hpcC5jb20KCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFybS1rZXJuZWwK